This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Starterware/AM4378: PWM example code

Part Number: AM4378


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);
}