S3c6410 linux内核移植(8)---添加pwm驱动,控制lcd背光亮度

一般LCD的背光LED是通过PWM控制,调节PWM的占空比即可调整背光亮度。比如S3C6410的GPF15,即PWM1,可连接LCD的背光控制接口,进行背光控制。内核中pmw配置函数位于”arch/arm/plat-s3c64xx/pwm-s3c6410.c”中的:int s3c6410_timer_setup (int channel, int usec, unsigned long g_tcnt, unsigned long g_tcmp)。

channel 通道这里为通道1

usec 没用到这里随便设为0

g_tcnt 是PWM的周期
g_tcmp 是PWM的占空比

其中g_tcmp与g_tcnt的比值大于0小于1,当这两个值的大小越接近则pwm口输出的电压越大,相应的lcd越亮。当g_tcmp的值为0时lcd灭。需要注意的是由于UT-S3C6410开发板的lcd背光接口没接到pwm控制引脚上,不能通过pwm进行控制背光亮度。

1、 旧版本lcd驱动对应的背光亮度控制

a)在linux中,通过控制sys目录参数修改背光,如:

/sys/devices/platform/s3c-lcd # echo 200 > backlight_level

b)该操作影响/driver/video/samsung/s3cfb.c中函数

static int s3cfb_sysfs_store_backlight_level(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
{

……

}

d)s3cfb_fimd.set_brightness是用户使用的LCD对应参数中的一个函数指针
一般位于/driver/video/samsung/your lcd.c (eg.s3cfb_lte480wv.c)
检查初始化LCD时是否有添加该参数,红色标注:

#define BACKLIGHT_LEVEL_MAX  180

#define BACKLIGHT_LEVEL_MIN 0

static void s3cfb_set_fimd_info(void)

{

……

s3cfb_fimd.set_brightness = s3cfb_set_brightness;

s3cfb_fimd.backlight_min = BACKLIGHT_LEVEL_MIN;

s3cfb_fimd.backlight_max = BACKLIGHT_LEVEL_MAX;

}

上面的s3cfb_set_brightness只是函数指针。

e)s3cfb_set_brightness让我们又跳到了drivers/video/samsung/s3cfb_fimd4x.c中
注意这段需要PWM支持

void s3cfb_set_brightness(int val)
{

int channel = 1; /* must use channel-1 */
int usec = 0;   /* don't care value */
unsigned long tcnt = 1000;
unsigned long tcmp = 0;

if (val < 0)
   val = 0;

if (val > S3CFB_MAX_BRIGHTNESS)
   val = S3CFB_MAX_BRIGHTNESS;

s3cfb_fimd.brightness = val;
tcmp = val * 5;

s3c6410_timer_setup (channel, usec, tcnt, tcmp);

}

f)channel1 即为PWM1,s3c6410_timer_setup函数位于

  arch/arm/plat-s3c64xx/pwm-s3c6410.c上面已经做了分析。

2、 新版本lcd驱动对应的背光亮度控制

a) 修改drivers/video/samsung/Makefile文件

……

obj-$(CONFIG_FB_S3C_V2_LCD9A) += s3cfb2_lcd9a.o backlight_control.o

endif

ifeq ($(CONFIG_FB_S3C_V2_DEBUG),y)

EXTRA_CFLAGS += -DDEBUG

endif

   b) 新建文件drivers/video/samsung/backlight_control.c, 内容为:

  #if  defined(CONFIG_S3C6410_PWM)

#include <linux/init.h>#include <linux/module.h>

#include <linux/miscdevice.h>

#include <linux/moduleparam.h>

#include <linux/platform_device.h>

#include <linux/fs.h>

extern int s3c6410_timer_setup (int channel, int usec, unsigned long g_tcnt, unsigned long g_tcmp);

static ssize_t backlight_read(struct file *filp, char __user *buf, size_t size,

loff_t *ppos)

{

return 0; 

}

static ssize_t backlight_write(struct file *filp, const char __user *buf,

size_t size, loff_t *ppos)

{

unsigned long tcmp = 0; 

unsigned long value = simple_strtoul(buf, NULL, 10);

if (value < 0 || value > 100){

return -ERANGE;

}

tcmp = value * 9;

s3c6410_timer_setup (1, 0, 1000, tcmp);

return size;

}

static struct file_operations dev_ope = {

.owner = THIS_MODULE,

.read = backlight_read,

.write = backlight_write,

};

static struct miscdevice dev_misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = "backlight_level",

.fops = &dev_ope,

};

static int __init backlight_init(void)

{

/* 开机时的lcd亮度设为70 */

s3c6410_timer_setup (1, 0, 1000, 70);

     misc_register(&dev_misc);

return 0;

}

static void __exit backlight_exit(void)

{

     misc_deregister(&dev_misc);

}

MODULE_AUTHOR("xuhuicong");

MODULE_LICENSE("Dual BSD/GPL");

module_init(backlight_init);

module_exit(backlight_exit);

#endif

c) 应用

驱动将生成/dev/backlight_level,通过对/dev/backlight_level写值控制背光,如:# echo 60 > /dev/backlight_level其中写入的值在0—100之间值越大则背光越亮,也可直接通过write函数写入。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值