Tool/software: Starterware
Current now, I need to add pwm in uboot, and I haven't found example of pwm register configuration. I have to refer to pwm driver of kernel, but it is big, and I have split some codes from kernel driver. So I want to know, is there any simple code to enable a pwm in uboot.
Below is my code and I refer to kenrel driver pwm. It can't work, can someone help me. Thanks a lot!!!
/* enable pwm for external watchdog */
#define PWMSS1_BASE 0x48302000
#define PWMSS1_EPWM 0x48302200
#define PWMSS1_CM_OFFSET 0x440
#define CTRL_PWMSS_OFFSET 0x664
#define KHZ_PERIOD 50000
#define KHZ_DUTY 25000
static void wdt_pwm_enable(void)
{
u16 u16_value = 0;
uint32_t u32_value = 0;
struct pwmss_regs *pwmss_ptr = (struct pwmss_regs *)PWMSS1_BASE;
struct pwmss_epwm_regs *pwmss_epwm_ptr = (struct pwmss_epwm_regs *)PWMSS1_EPWM;
printf("step into wdt_pwm_enable\n");
/* module enable */
u32_value = readl(CM_PER + PWMSS1_CM_OFFSET);
u32_value &= ~ ( (3<<16) | (3<<0) ); /* IDLEST & MODULEMODE */
u32_value |= (0<<16) | (2<<0);
writel(u32_value, CM_PER + PWMSS1_CM_OFFSET);
/* pwmss */
/* clock and power */
printf("Line:%d\n", __LINE__);
u32_value = readl(&pwmss_ptr->clkconfig);
u32_value |= (1<<8); /* ePWMCLK_EN */
writel(u32_value, &pwmss_ptr->clkconfig);
printf("Finish clock and power\n");
/* epwm */
/* clock prescale */
u16_value = readw(&pwmss_epwm_ptr->TBCTL);
u16_value &= ~( (7<<7) | (7<<10) ); /* CLKDIV & HSPCLKDIV */
u16_value |= (1<<7);
writew(u16_value, &pwmss_epwm_ptr->TBCTL);
printf("Finish clock prescale\n");
/* period-shadow */
u16_value = readw(&pwmss_epwm_ptr->TBCTL);
u16_value &= ~(1<<3); /* PRDLD */
u16_value |= (0<<3);
writew(u16_value, &pwmss_epwm_ptr->TBCTL);
printf("Finish period-shadow\n");
/* period-set */
writew(KHZ_PERIOD, &pwmss_epwm_ptr->TBPRD);
printf("Finish period-set \n");
/* set up counter */
u16_value = readw(&pwmss_epwm_ptr->TBCTL);
u16_value &= ~(3<<0); /* CTRMODE */
u16_value |= (0<<0);
writew(u16_value, &pwmss_epwm_ptr->TBCTL);
printf("Finish up counter \n");
/* duty */
writew(KHZ_DUTY, &pwmss_epwm_ptr->CMPB);
printf("Finish duty\n");
/* AQSFRC */
u16_value = readw(&pwmss_epwm_ptr->AQSFRC);
u16_value &= ~(3<<6);
u16_value |= (0<<6);
writew(u16_value, &pwmss_epwm_ptr->AQSFRC);
/* AQCSFRC */
u16_value = readw(&pwmss_epwm_ptr->AQCSFRC);
u16_value &= ~(3<<2);
u16_value |= (0<<2);
writew(u16_value, &pwmss_epwm_ptr->AQCSFRC);
/* enable */
u32_value = readl(CTRL_BASE + CTRL_PWMSS_OFFSET);
u32_value |= (1<<1); /* CTRL_PWMSS */
writel(u32_value, CTRL_BASE + CTRL_PWMSS_OFFSET);
printf("Finish enable\n");
/* freerun */
u16_value = readw(&pwmss_epwm_ptr->TBCTL);
u16_value &= ~(3<<14);
u16_value |= (3<<14);
writew(u16_value, &pwmss_epwm_ptr->TBCTL);
}