一般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与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对应参数中的一个函数指针 #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中 void s3cfb_set_brightness(int val) int channel = 1; /* must use channel-1 */ if (val < 0) if (val > S3CFB_MAX_BRIGHTNESS) s3cfb_fimd.brightness = val; 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函数写入。 |
S3c6410 linux内核移植(8)---添加pwm驱动,控制lcd背光亮度
最新推荐文章于 2024-02-04 15:38:11 发布