OMAP LED PWM doesn't work

192 views
Skip to first unread message

jaden

unread,
Jun 1, 2012, 5:09:29 AM6/1/12
to omapdiscuss
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 changed 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)
{
u32 reg;

if (on_off) {

reg = omap4_cm2_read_inst_reg( OMAP4430_CM2_CAM_INST,
OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET);

reg &=~ ((1<<0)|(1<1));

omap4_cm2_write_inst_reg(0x00000002, OMAP4430_CM2_CAM_INST,
OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET);


pr_info(" ************************%s on_off=1***************\n",
__func__); //jaden add 20120531

} else {

reg = omap4_cm2_read_inst_reg( OMAP4430_CM2_CAM_INST,
OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET);

reg &=~ ((1<<0)|(1<1));

omap4_cm2_write_inst_reg(0x00000000, OMAP4430_CM2_CAM_INST,
OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET);

pr_info(" ************************%s on_off=0***************\n",
__func__); //jaden add 20120531


}
}
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). But the oscilloscope
doesn't not reflect anything (the voltage is still low). Can anyone
give us some suggestions to
verify?
Thank you.

Jaden

Aleksandr Kuzemko

unread,
Jun 1, 2012, 10:46:13 AM6/1/12
to omapd...@googlegroups.com

Why do you use 15KHz? We use 128Hz for PWM

2012/6/1 jaden <menzx...@gmail.com>

陳志豪

unread,
Jun 3, 2012, 9:43:02 PM6/3/12
to omapd...@googlegroups.com
Thank you for replying me,   Aleksandr.
I am already using this driver. But it can not be worked.  I am using 15KHz to  avoid acoustic interrupting.  

2012/6/1 Aleksandr Kuzemko <kuze...@gmail.com>

陳志豪

unread,
Jun 3, 2012, 9:55:55 PM6/3/12
to omapd...@googlegroups.com
Sorry  Aleksandr. 

I think that you give me the old version. I apologize to you because of  my careless. 
Thank you again for giving me such information. Thanks a lot. 
Best regards. 
Jaden

2012/6/4 陳志豪 <menzx...@gmail.com>

Aleksandr Kuzemko

unread,
Jun 4, 2012, 3:05:18 AM6/4/12
to omapd...@googlegroups.com
This is latest version that I use on NookTablet hardware. There is another version (for Kindle Fire hardware) You can found it here https://github.com/KFire-Android/kernel_omap

2012/6/4 陳志豪 <menzx...@gmail.com>
Reply all
Reply to author
Forward
0 new messages