基于TWL6032 PWM控制液晶背光亮度
2016-02-02 17:00
246 查看
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背光亮度的调节了。相关文章推荐
- 如何开发Linux内核?
- 仿知乎安卓client滑动删除撤销ListView
- Python【基础第三篇】
- zTree设置选中节点之后出现重复节点
- HDU2050(分平面问题)
- Quartz1.8.5例子(十四)
- uva 10891
- SDL2源代码分析1:初始化(SDL_Init())
- Swift 特殊关键字 与符号
- git warning: LF will be replaced by CRLF in 解决办法
- python 将字符串转化成16进制进行UDP的发送
- 面向对象程序设计 ——第二次作业(2)
- MVC 自定义错误处理
- PHPCMS V9 QQ登录无法正常登录解决方案
- linux shell 编程6 函数获取参数
- Xcode 工程文件“.xcodeproj”文件夹解析
- Ubuntu下软件的相关操作
- 二维码
- 【Elasticsearch】打分策略详解与explain手把手计算
- HDOJ 2074 叠筐