Hello everyone! I encountered a strange problem with pwm driver on DM365 ,the kernel version is 2.6.37. I added a configuration function in file arch\arm\mach-davinci\Board-dm365-ipnc.c as below:
static void dm365_init_pwm(void)
{
unsigned int temp1 = 0;
unsigned int temp2 = 0;
//config pinmux1 to enable pwm0 and pwm1
davinci_cfg_reg(DM365_PWM0);
davinci_cfg_reg(DM365_PWM1);
//enable pwm0
davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, 0, DAVINCI_LPSC_PWM0, PSC_STATE_SYNCRST, 1);
davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, 0, DAVINCI_LPSC_PWM0, PSC_STATE_ENABLE, 1);
//enable pwm1
davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, 0, DAVINCI_LPSC_PWM1, PSC_STATE_SYNCRST, 1);
davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, 0, DAVINCI_LPSC_PWM1, PSC_STATE_ENABLE, 1);
//config pwm0
void __iomem *pwm0_PER = (void __iomem *)IO_ADDRESS(0x01c22000+0x14);
void __iomem *pwm0_PH1D = (void __iomem *)IO_ADDRESS(0x01c22000+0x18);
void __iomem *pwm0_CFG = (void __iomem *)IO_ADDRESS(0x01c22000+0x08);
void __iomem *pwm0_START = (void __iomem *)IO_ADDRESS(0x01c22000+0x0c);
//print its virtual addr
temp2 = (unsigned int)pwm0_PER;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm0_PER=0x%x\n",temp2);
temp1 = __raw_readl(pwm0_PER);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm0_PER=%d\n",temp1);
temp1 = 80000;
__raw_writel(temp1,pwm0_PER);
temp1 = __raw_readl(pwm0_PER);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm0_PER=%d\n",temp1);
temp2 = (unsigned int)pwm0_CFG;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm0_CFG=0x%x\n",temp2);
temp1 = __raw_readl(pwm0_CFG);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm0_CFG=%d\n",temp1);
temp1 = 0x001;
__raw_writel(temp1,pwm0_CFG);
temp1 = __raw_readl(pwm0_CFG);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm0_CFG=%d\n",temp1);
temp2 = (unsigned int)pwm0_PH1D;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm0_PH1D=0x%x\n",temp2);
temp1 = __raw_readl(pwm0_PH1D);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm0_PH1D=%d\n",temp1);
__raw_writel(20000,pwm0_PH1D);
temp1 = __raw_readl(pwm0_PH1D);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm0_PH1D=%d\n",temp1);
temp2 = (unsigned int)pwm0_START;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm0_START=0x%x\n",temp2);
temp1 = __raw_readl(pwm0_START);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm0_Start=%d\n",temp1);
__raw_writel(0x001,pwm0_START);
temp1 = __raw_readl(pwm0_START);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm0_START=%d\n",temp1);
//config pwm1
void __iomem *pwm1_PER = (void __iomem *)IO_ADDRESS(0x01c22400+0x14);
void __iomem *pwm1_PH1D = (void __iomem *)IO_ADDRESS(0x01c22400+0x18);
void __iomem *pwm1_CFG = (void __iomem *)IO_ADDRESS(0x01c22400+0x08);
void __iomem *pwm1_START = (void __iomem *)IO_ADDRESS(0x01c22400+0x0c);
temp2 = (unsigned int)pwm0_PER;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm1_PER=0x%x\n",temp2);
temp1 = __raw_readl(pwm1_PER);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm1_PER=%d\n",temp1);
temp1 = 80000;
__raw_writel(temp1,pwm1_PER);
temp1 = __raw_readl(pwm1_PER);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm1_PER=%d\n",temp1);
temp2 = (unsigned int)pwm1_CFG;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm1_CFG=0x%x\n",temp2);
temp1 = __raw_readl(pwm1_CFG);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm1_CFG=%d\n",temp1);
temp1 = 0x001;
__raw_writel(temp1,pwm1_CFG);
temp1 = __raw_readl(pwm1_CFG);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm1_CFG=%d\n",temp1);
temp2 = (unsigned int)pwm1_PH1D;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm1_PH1D=0x%x\n",temp2);
temp1 = __raw_readl(pwm1_PH1D);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm1_PH1D=%d\n",temp1);
__raw_writel(20000,pwm1_PH1D);
temp1 = __raw_readl(pwm1_PH1D);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm1_PH1D=%d\n",temp1);
temp2 = (unsigned int)pwm0_START;
printk(KERN_INFO "kernel:dm365_init_pwm(),pwm1_START=0x%x\n",temp2);
temp1 = __raw_readl(pwm1_START);
printk(KERN_INFO "kernel:dm365_init_pwm(),Former pwm1_Start=%d\n",temp1);
__raw_writel(0x001,pwm1_START);
temp1 = __raw_readl(pwm1_START);
printk(KERN_INFO "kernel:dm365_init_pwm(),NOW pwm1_START=%d\n",temp1);
}
This simple function is called in dm365_evm_init() ,but the message it printed out really puzzled me a lot :
[ 0.034634] kernel:dm365_init_pwm(),pwm0_PER=0xfec22014
[ 0.034692] kernel:dm365_init_pwm(),Former pwm0_PER=0
[ 0.034731] kernel:dm365_init_pwm(),NOW pwm0_PER=80000
[ 0.034767] kernel:dm365_init_pwm(),pwm0_CFG=0xfec22008
[ 0.034804] kernel:dm365_init_pwm(),Former pwm0_CFG=0
[ 0.034840] kernel:dm365_init_pwm(),NOW pwm0_CFG=1
[ 0.034876] kernel:dm365_init_pwm(),pwm0_PH1D=0xfec22018
[ 0.034913] kernel:dm365_init_pwm(),Former pwm0_PH1D=0
[ 0.034950] kernel:dm365_init_pwm(),NOW pwm0_PH1D=20000
[ 0.034987] kernel:dm365_init_pwm(),pwm0_START=0xfec2200c
[ 0.035025] kernel:dm365_init_pwm(),Former pwm0_Start=0
[ 0.035062] kernel:dm365_init_pwm(),NOW pwm0_START=0
[ 0.035098] kernel:dm365_init_pwm(),pwm1_PER=0xfec22014
[ 0.035134] kernel:dm365_init_pwm(),Former pwm1_PER=0
[ 0.035170] kernel:dm365_init_pwm(),NOW pwm1_PER=80000
[ 0.035207] kernel:dm365_init_pwm(),pwm1_CFG=0xfec22408
[ 0.035244] kernel:dm365_init_pwm(),Former pwm1_CFG=0
[ 0.035280] kernel:dm365_init_pwm(),NOW pwm1_CFG=1
[ 0.035315] kernel:dm365_init_pwm(),pwm1_PH1D=0xfec22418
[ 0.035352] kernel:dm365_init_pwm(),Former pwm1_PH1D=0
[ 0.035389] kernel:dm365_init_pwm(),NOW pwm1_PH1D=20000
[ 0.035426] kernel:dm365_init_pwm(),pwm1_START=0xfec2240c
[ 0.035464] kernel:dm365_init_pwm(),Former pwm1_Start=0
[ 0.035500] kernel:dm365_init_pwm(),NOW pwm1_START=0
I write 0x01 to START register and then read it out , it 's also 0x00, which means i can't write this register. Who can tell me where is the problem?
Thanks in Advance