0引言
目前市场上的液晶显示器,都是指LED背光液晶屏,实际上使用了侧面led二极管作为背光源,替代传统的CCFL荧光背光,即采用了LED背光源的TFT液晶屏幕。相比于传统的CCFL冷阴极背光源液晶显示器,以LED作为背光源的液晶显示器厚度更薄、更加节能。
本文基于PandaBoardES1开发板,利用TWL6032的PWM1输出,控制LCD的背光LED, 通过调节PWM的占空比调整背光亮度。
1 TWL6032芯片介绍
TWL6032是由德州仪器生产,集成了电源管理集成电路,具有强大功能的一款芯片,主要有以下功能:
1) 提供五个可配置的、高效降压变换器;
2) 11个一般用途低压差电压,包括在启动顺序控制稳压器(LDO);
3) USB OTG模块;
4) 实时时钟(RTC)定时器和报警唤醒;
5) SIM and SD/MMC Card探测;
6) 2路数字PWM输出。
TWL6032 PWM输出频率只支持256Hz和512Hz,主要通过I2C总线与CPU进行通信,根据Panda Board ES1开发板资料,CPU OMAP4460与TWL6032通讯的是I2C1。
2 TWL6032PWM寄存器说明
TWL6032是TWL6030的升级版,在寄存器地址空间上与TWL6030完全兼容,因此本文以TWL6030为例进行阐述。
TWL6030内部有4个I2C ID地址,分别是0x12(DVS-I2C Registers)和0x48,0x49,0x4A(CTL-I2C),在Panda Board ES1提供的内核源码中,由./include/linux/twl.h和/drivers/mfd/twl-core.c文件对寄存器地址和读写方式进行了定义,具体参阅相关代码。PWM控制寄存器就位于0x49 ID地址空间。TWL有2路PWM输出,本文使用PWM1,主要有3个寄存器需要说明:PWM1ON(图1),PWM1OFF(图2),TOGGLE3(图3)。
图1
图2
图3
从图1中知道,PWM1ON[7]决定了PWM的频率,PWM1ON[6:0]和PWM1OFF[6:0]共同决定了PWM的占空比。这里需要主要:PWM1ON[6:0] 不能大于PWM1OFF[6:0],并且PWM1ON[6:0]不能等于0。具体的时序参见图4。
图4
3 Linux驱动开发
为了配合NOA1305光线传感器,供系统对LCD背光进行调节,将相关驱动代码添加到了NOA1305.c驱动下。
1)添加设置占空比函数
Static ssize_t set_brightness (struct device *dev,structdevice_attribute *attr, char *buf)
{
struct i2c_client *client = to_i2c_client(dev);
struct noa1305_data *data = i2c_get_clientdata(client);
int ret, brightness;
u8 val = 0;
brightness =simple_strtoul(buf, NULL, 10);
if(brightness >= 255)
returnsprintf(buf, "the brightness to set is bigger than 255");
if(brightness <= 0)
returnsprintf(buf, "the brightness to set is not equal 0 or smaller than0");
if (!data->power_state)
return -EBUSY;
mutex_lock(&data->update_lock);
brightness &= (0x7f);
if (twl_i2c_write_u8(TWL4030_MODULE_PWM0, brightness,0))
returnsprintf(buf, "the brightness to set is error");
if (twl_i2c_write_u8(TWL4030_MODULE_PWM0, 0x7F, 1))
returnsprintf(buf, "the brightness to set is error");
if (twl_i2c_write_u8(TWL6030_MODULE_AUX, 0x01, 2))
returnsprintf(buf, "the brightness to set is error");
mdelay(10);
val &= ~PWM1CTL_MASK;
val |= (PWM1S | PWM1EN);
if (twl_i2c_write_u8(TWL6030_MODULE_AUX, val, 2))
returnsprintf(buf, "the brightness to set is error");
mutex_unlock(&data->update_lock);
return sprintf(buf, "the brightness to set isOK");
}
2)添加sysfs文件:
static DEVICE_ATTR(brightness, 0666,NULL, set_brightness);
3)添加TWL6030_MODULE_AUX索引
在./drivers/mfd/twl-core.c文件中,在变量twl_mapping twl6030_map[]添加{ SUB_CHIP_ID1,TWL6030_BASEADD_AUX },同时在./include/linux/twl.h中根据索引添加定义#define TWL6030_MODULE_AUX 0x1A(本文索引)。
本文介绍了如何使用TWL6032的PWM功能来控制液晶显示器的背光亮度。详细讲解了TWL6032芯片的功能,PWM寄存器设置,并给出了在Linux环境下驱动开发的实现步骤,包括设置占空比的函数和sysfs文件的添加。
3960

被折叠的 条评论
为什么被折叠?



