基于TWL6032 PWM控制液晶背光亮度

本文介绍了如何使用TWL6032的PWM功能来控制液晶显示器的背光亮度。详细讲解了TWL6032芯片的功能,PWM寄存器设置,并给出了在Linux环境下驱动开发的实现步骤,包括设置占空比的函数和sysfs文件的添加。

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(本文索引)。

4总结

编译内核,下载镜像,重新启动系统后,通过操作sysfs文件系统下brightness文件即可实现对LCD背光亮度的调节了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值