Hello:
I met a problem when I want to enable DMTIMER10_PWM to generate 15KHz to
control the LCD backlight. I am using led-omap-pwm.c as my driver to control duty cycle.
And I select system clock as my clock source (38.4MHz). I know which registers I should
set to generate 15KHz. The following is my thoughts:
1. configure EMU18/DMTIMER10_PWM_EVT/AB4 to be PWM mode (PinMux)
2. set GPTIMER10 CLOCK CONTROL register : GPTIMER10 CLOCK CONTROL(0x4a009428):
0x00000002 (selects sys_clk 38.4MHz clock)
3. set TLDR register : select 15KHz :TLDR(0x4808602C): 0xFFFFF5FF
4. set TCLR register : TCLR(0x48086024): 0X00001843 (To be set at last)
Code implement: I am using leds-omap-pwm.c to be my driver.
I have change some places.
static void omap_pwm_led_set_blink(struct omap_pwm_led *led)
{
if (!led->powered)
return;
if (led->on_period != 0 && led->off_period != 0) {
unsigned long load_reg, cmp_reg;
/*******change duty cycle*****/ //jaden change 20120531
// load_reg = 32768 * (led->on_period + led->off_period) / 1000;
// cmp_reg = 32768 * led->on_period / 1000;
load_reg = 38400000 * (led->on_period + led->off_period) / 1000000;
cmp_reg = 38400000 * led->on_period / 1000000;
/*******change duty cycle*****/
omap_dm_timer_stop(led->blink_timer);
omap_dm_timer_set_load(led->blink_timer, 1, -load_reg);
omap_dm_timer_set_match(led->blink_timer, 1, -cmp_reg);
omap_dm_timer_set_pwm(led->blink_timer, 1, 1,
OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
omap_dm_timer_write_counter(led->blink_timer, -2);
omap_dm_timer_start(led->blink_timer);
} else {
omap_dm_timer_set_pwm(led->blink_timer, 1, 1,
OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE);
omap_dm_timer_stop(led->blink_timer);
}
}
static void omap_pwm_led_power_on(struct omap_pwm_led *led)
{
if (led->powered)
return;
led->powered = 1;
/* Select clock */
omap_dm_timer_enable(led->intensity_timer);
omap_dm_timer_set_source(led->intensity_timer, OMAP_TIMER_SRC_32_KHZ);
/* Turn voltage on */
if (led->pdata->set_power != NULL)
led->pdata->set_power(led->pdata, 1);
/* Enable PWM timers */
if (led->blink_timer != NULL) {
omap_dm_timer_enable(led->blink_timer);
/****change clock source*******/ //jaden change 20120531
//omap_dm_timer_set_source(led->blink_timer,
// OMAP_TIMER_SRC_32_KHZ);
omap_dm_timer_set_source(led->blink_timer,
OMAP_TIMER_SRC_SYS_CLK); //to select system_clock
/***********************/
omap_pwm_led_set_blink(led);
}
omap_dm_timer_set_load(led->intensity_timer, 1, 0xffffff00);
}
In board-44xx-tablet.c, I add these following codes.
void test_led_set_power(struct omap_pwm_led_platform_data *self,
int on_off)
{
if (on_off) {
__raw_writel(0x00000004, OMAP2_L4_IO_ADDRESS(GPT_TSICR)); //#define GPT_TSICR 0x48086040
__raw_writel(0x00000001, OMAP2_L4_IO_ADDRESS(GPT_TTGR)); //#define GPT_TTGR 0x48086030
__raw_writel(0x00001843, OMAP2_L4_IO_ADDRESS(GPT_TCLR)); //#define GPT_TCLR 0x48086028
} else {
}
}
static struct omap_pwm_led_platform_data test_pwm = {
.name = "test_pwm",
.blink_timer = 10,
.set_power = test_led_set_power,
};
Here is my situation, I can see my devices name tese_pwm in /sys/class/leds/test_pwm,
and there are few functions I can set (like on_period and off_period). Bbut the oscilloscope
doesn't not reflect anything (the voltage is still low). Do anyone give us some suggestions to
verify?
Thank you.