2440 Linux LCD 详解
背景知识
LCD(液晶显示器)的正常工作需要LCD驱动器和LCD控制器,生产厂商将LCD驱动器以COF/COG的形式与LCD玻璃基板集成在一起,而LCD控制器则由外部电路实现,很多MCU(微控制单元)如S3C2410/2440都集成了LCD控制器,通过这些控制器可以产生控制信号来驱动STN/TFT屏。
S3C2440内部集成了一个功能强大的LCD控制器,该控制器由REGBANK、LCDCDMA、TIMEGEN和VIDPRCS寄存器组成。
REGBANK:包含17个可编程寄存器组和一块256×16的调色板内存,用于配置LCD控制器。
LCDCDMA:专用DMA,自动将视频数据从帧缓冲区传输到LCD驱动器。
TIMEGEN:由可编程逻辑组成,生成必要的控制信号如VSYNC、HSYNC、VCLK和LEND等。
VIDPRCS:接收来自LCDCDMA的数据,转换为合适的数据格式并通过数据端口VD[23:0]传送视频数据到LCD驱动器。
这些组件共同作用,支持不同类型的LCD显示屏。
常见TFT屏工作时序分析
所有显示器显示图像的原理都是从上到下,从左到右,一副图像可以视为一个矩形,由排列整齐的像素点组成,LCD显示图像的过程如下:
1、像素时钟信号(VCLK):显示指针从矩形左上角的第一行第一个点开始逐点显示。
2、水平同步信号(HSYNC):显示指针到达矩形右边结束一行,然后回到左边开始下一行的显示。
3、垂直同步信号(VSYNC):显示指针逐行显示直到矩形右下角完成一幅图的显示。
4、帧切换:为了持续显示图像,需要不断切换到新的图像帧。
时序图中各参数的含义如下:
VBPD:垂直同步信号后的无效行数。
VFBD:垂直同步信号前的无效行数。
VSPW:垂直同步脉冲宽度。
HBPD:水平同步信号开始到有效数据开始之间的VCLK个数。
HFPD:一行有效数据结束到下一个水平同步信号开始之间的VCLK个数。
HSPW:水平同步信号宽度。
这些参数值保存在REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器中,具体操作请参考S3C2410数据手册的LCD部分。
背光驱动移植
LCD背光是通过CPU的LCD_PWR引脚控制的,对应于GPG4引脚,当LCD_PWR输出高电平时打开背光,低电平时关闭背光,为了控制背光,需要在内核中添加背光驱动程序。
编写驱动代码
在内核源码目录linux-2.6.32.24/drivers/video/backlight
下创建文件mini2440_backlight.c
如下:
#include <linux/errno.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/input.h> #include <linux/init.h> #include <linux/serio.h> #include <linux/delay.h> #include <linux/clk.h> #include <linux/miscdevice.h> #include <linux/gpio.h> #include <asm/io.h> #include <asm/irq.h> #include <asm/uaccess.h> #include <mach/regs-clock.h> #include <plat/regs-timer.h> #include <mach/regs-gpio.h> #include <linux/cdev.h> #undef DEBUG #define DEVICE_NAME "backlight" #define DEVICE_MINOR 5 static int mini2440_backlight_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case 0: s3c2410_gpio_setpin(S3C2410_GPG(4), 0); printk(DEVICE_NAME " turn off! "); return 0; case 1: s3c2410_gpio_setpin(S3C2410_GPG(4), 1); printk(DEVICE_NAME " turn on! "); return 0; default: return -EINVAL; } } static struct file_operations dev_fops = { .owner = THIS_MODULE, .ioctl = mini2440_backlight_ioctl, }; static struct miscdevice mini2440_backlight = { .minor = DEVICE_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init mini2440_backlight_init(void) { int ret; ret = misc_register(&mini2440_backlight); if (ret < 0) { printk("Register misc device failed! "); return ret; } s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT); return 0; } static void __exit mini2440_backlight_exit(void) { misc_deregister(&mini2440_backlight); } module_init(mini2440_backlight_init); module_exit(mini2440_backlight_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("singleboy"); MODULE_DESCRIPTION("Backlight control for mini2440");
编译和配置驱动
编译完成后,使用以下命令加载和测试背光驱动:
make make modules_install depmod echo 1 > /sys/class/leds/lcd-backlight/brightness # 打开背光 echo 0 > /sys/class/leds/lcd-backlight/brightness # 关闭背光
通过以上步骤,可以实现对LCD背光的控制。
本文详细介绍了2440 Linux平台下的LCD控制器及其工作原理,重点解析了S3C2440内部集成的LCD控制器结构以及常见TFT屏的工作时序,通过实例讲解了如何在Linux内核中实现LCD背光驱动,为开发和应用提供了全面的指导。
小伙伴们,上文介绍了“2440 linux lcd”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1337894.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复