jaden
unread,Jun 1, 2012, 5:09:29 AM6/1/12Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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