ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LCD 显示与触控屏驱动开发

LCD 显示与触控屏驱动开发 一、LCD 概述LCD 全称是 Liquid Crystal Display也就是液晶显示器是现在最常用到的显示器手机、电脑、各种人机交互设备等基本都用到了 LCD最常见就是手机和电脑显示器了。这里需要注意的是我们所提及的 LCD 不包括触摸功能触摸功能是通过另外的设备实现的LCD 在这里只是输出设备。LCD 的构造是在两片平行的玻璃基板当中放置液晶盒下基板玻璃上设置 TFT薄膜晶体管上基板玻璃上设置彩色滤光片通过 TFT 上的信号与电压改变来控制液晶分子的转动方向从而达到控制每个像素点偏振光出射与否而达到显示目的。1. 像素点与屏幕分辨率屏幕分辨率是指横向像素点个数乘以纵向像素点个数例如 800 乘以 480、1920 乘以 10801080P、2560 乘以 14402K。屏幕尺寸以英寸inch为单位指左上角到右下角之间的距离1 英寸等于 2.54 厘米常见尺寸如 6.22 英寸、4.3 英寸。分辨率相同的情况下屏幕尺寸越小图像显示效果越好尺寸相同的情况下分辨率越高图像显示效果越好。2. 像素点颜色格式像素点的颜色由 RGB 三通道组成常见格式如下RGB888每个像素点占 3 个字节对应 8bit 面板可显示 1670 万色2 的 24 次方每个通道取值范围 0-255对应一字节 8bit可用 unsigned char 表示。RGB565每个像素点占 2 个字节R 占 5 位0-31、G 占 6 位0-63、B 占 5 位0-31。ARGB每个像素点占 4 个字节A 为透明度通道0-255。RGB10101010bit 面板可显示 10 亿色2 的 30 次方成本较高常用于视频剪辑也有 8 抖 10bit 方案。3. 显存显存是专门存放图像数据的内存空间。以 800 乘以 480 分辨率、ARGB 格式为例每个像素占 4 字节所需显存为 800 乘以 480 乘以 4约 1.5MB。例如 DDR3 有 512MB 的空间0x80000000 到 0xA0000000显存空间可开到 0x89000000。显存可看作二维数组例如 unsigned int a[480][800]其中 a[0][0] 对应屏幕左上角第一个像素每个像素的 R、G、B 通道分别占 8 位R0-R7、G0-G7、B0-B7。4. LCD 时序信号PCLKPixel Clock像素时钟信号线同步每个像素点发送的时间间隔边沿采样具体查看 LCD 手册。HSYNCHorizontal Sync行水平同步时钟信号线同步每一行发送的时间间隔。VSYNCVertical Sync帧垂直同步时钟信号线同步每一帧图像的时间间隔。DEData Enable数据使能信号线。PWM根据占空比调节背光亮度。刷新率指每秒能够刷新的帧数板子上常见为 60Hz。IMX6ULL 驱动的RGB‑TFT LCD信号线分为 4 大类1数据数据线RGB 像素数据LCD_DATA0 ~ LCD_DATA23一共 24 根。24 位R8 位 G8 位 B8 位16 位屏只用其中低 16 根数据线。2时序控制信号线4 根PCLK像素时钟HSYNC行同步信号VSYNC场同步信号DE数据使能信号3背光控制信号线BLT_PWMPWM 背光亮度控制引脚GPIO 输出可以 PWM 调节 LCD 背光亮度。4电源与地线硬件板子上VCC、GND给 LCD 屏幕供电。软件操作的就是上面 24 根数据 4 根时序 背光就是代码里面 lcd_pin_init 初始化的所有引脚。PCLK、HSYNC、VSYNC、DE 信号线作用① PCLK 像素时钟Pixel Clock像素时钟每来 1 个 PCLK 脉冲传输1 个像素点的 RGB 数据。LCD 在 PCLK 边沿采样 RGB 数据线PCLK 频率决定屏幕刷新速度800*480 屏幕 PCLK 一般 30M 左右时钟由 LCDIF 外设输出就是代码里面lcd_clock_init配置的时钟。② HSYNC 行同步信号Horizontal Sync行同步一行图像的开始标记每扫描完一行HSYNC 发出一个脉冲脉冲宽度叫hspw行同步脉宽脉冲之后是行后沿hbp然后才输出一行真正的像素数据行数据结束之后是行前沿hfp。对应代码里面lcd_dev.hspw、hbp、hfp。③ VSYNC 场同步信号Vertical Sync完整显示完一帧画面VSYNC 发出脉冲脉冲宽度vspw场同步脉宽之后场后沿vbp然后输出一帧图像各行像素图像结束后场前沿vfp。④ DE 数据使能Data Enable高电平有效代表当前 RGB 数据线上的数据是有效像素数据DE 高RGB 数据线输出有效画面像素DE 低RGB 数据无效属于 hbp/hfp/vbp/vfp 这些消隐区间。两种 LCD 驱动模式同步模式HSYNCVSYNC依靠 HSYNC、VSYNC 脉冲判断行、帧DE 不用DE 模式依靠 DE 信号判断像素有效现在开发板 LCD 大多用DE 模式代码中 LCDIF 打开 DE 模式。信号中文功能PCLK像素时钟每个时钟传送 1 个像素HSYNC行同步标志一行画面的起始VSYNC场同步标志一帧画面的起始DE数据使能高电平时 RGB 数据才有效二、LCD 初始化配置步骤配置引脚复用功能以及引脚电气属性。配置 LCD 时钟例如 31MHz。配置 LCD 控制器相关寄存器。// 设置lcd引脚复用功能IOMUXC_SetPinMux(IOMUXC_LCD_DATA00_LCDIF_DATA00, 0);......// 设置lcd引脚电气属性IOMUXC_SetPinConfig(IOMUXC_LCD_DATA00_LCDIF_DATA00, 0xB9);......// lcd参数配置lcd_dev.width 800;lcd_dev.height 480;lcd_dev.hspw 48;lcd_dev.hfp 40;lcd_dev.hbp 88;lcd_dev.vspw 3;lcd_dev.vfp 13;lcd_dev.vbp 32;lcd_dev.pix_size 4;lcd_dev.frame_buffer LCD_FRAMEBUF_ADDR;lcd_dev.fore_color 0x00FF0000;lcd_dev.back_color 0x00FFFFFF;// LCD寄存器LCDIF-CTRL | (1 19) | (1 17) | (3 10) | (3 8) | (1 5);LCDIF-CTRL1 (7 16);LCDIF-TRANSFER_COUNT (lcd_dev.height 16) | (lcd_dev.width 0);LCDIF-CUR_BUF lcd_dev.frame_buffer;LCDIF-NEXT_BUF lcd_dev.frame_buffer;LCDIF-VDCTRL0 | (1 28) | (1 24) | (1 21) | (1 20) | (lcd_dev.vspw 0);LCDIF-VDCTRL1 (lcd_dev.height lcd_dev.vfp lcd_dev.vbp lcd_dev.vspw);LCDIF-VDCTRL2 (lcd_dev.hspw 18) | (lcd_dev.width lcd_dev.hfp lcd_dev.hbp lcd_dev.hspw);LCDIF-VDCTRL3 ((lcd_dev.hspw lcd_dev.hbp) 16) | ((lcd_dev.vspw lcd_dev.vbp) 0);LCDIF-VDCTRL4 | (1 18) | (lcd_dev.width 0);LCDIF-CTRL | (1 0);三、显存地址与像素写入显存基地址为 0x89000000可通过指针操作写入像素颜色。例如定义 unsigned int (*p)[800]p 指向显存首地址则 p 加 800 行、480 列对应屏幕坐标。也可使用一维指针 unsigned int *p 0x89000000通过公式 p 加800 乘以 y 加 x定位到第 y 行第 x 列像素写入颜色值 col即 *(p 800 * y x) col其中 x 为列坐标、y 为行坐标。四、PWM 背光调节PWMPulse Width Modulation脉冲宽度调制通过调节占空比来控制 LCD 背光亮度。背光引脚为BLT_PWM由 GPIO 输出 PWM 波形。1. PWM 核心概念计数器以 1MHz 计数即 1 个计数周期为 1us。PWM 周期由周期寄存器决定。例如 PWM 频率为 1KHz则 PWM 周期为 1ms对应计数器计数 1000 次。PWM 占空比由采样寄存器决定同时受引脚极性影响。引脚极性引脚默认高电平采样寄存器中的值越大占空比越大背光越亮。引脚默认低电平采样寄存器中的值越大占空比越小背光越暗。FIFO用于缓存待输出的 PWM 计数值。回滚点 / 比较点回滚点决定周期比较点决定占空比。2. PWM 参数示例以 1MHz 计数器、1KHz PWM 频率、50% 占空比为例PWM 周期 1ms计数器计数 1000 次周期寄存器 1000占空比 50%即高电平持续 500 个计数周期采样寄存器 500若引脚默认高电平采样值越大占空比越大背光越亮。五、触控屏驱动开发LCD 仅负责显示输出触摸功能由独立的触控屏芯片实现。触控屏通过 I2C 接口与主控通信常见类型如下电容触控屏通过感应电压变化检测触摸位置无需校准。电阻屏通过压力感应检测触摸位置需要校准。1. 触控屏芯片常见触控屏芯片及其 I2C 设备地址如下屏幕型号触控芯片I2C 地址7 位ALIENTEK 4.3 寸GT11580x144.3 寸GT91470x5D本笔记使用的触控屏芯片为GT9147I2C 7 位地址为0x14支持多点触控最多 5 个点。2. GT9147 关键寄存器设备地址0x147 位地址芯片 ID寄存器 0x8140读取值应为 0x9147INT 中断触发方式寄存器 0x804D / 0x8056配置为下降沿触发01按下点数与坐标寄存器 0x8150 - 0x815B用于读取当前按下的点数和各触点坐标。3. GT9147 驱动初始化流程配置 RST 和 INT 引脚的复用功能及电气属性将触控屏芯片复位初始化 I2C2 接口通过 gt9147_read / gt9147_write 读取芯片 ID0x8140校验是否为 0x9147读取 INT 引脚中断触发方式寄存器0x804D / 0x8056配置为下降沿触发使能 INT 引脚中断在 GIC 中注册 gt9147 中断函数设置优先级并使能中断在中断函数中判断当前按下几个点并读取按下的坐标点0x8158 - 0x815B。4. 触摸坐标读取当 INT 引脚触发中断后通过 I2C 读取 0x8150 - 0x8170 寄存器即可获得当前按下的触点坐标。GT9147 支持多点触控最多可同时上报 5 个触摸点每个触点包含 X、Y 坐标信息。// gt9147结构体变量struct GT9147_Device gt9147_dev;// gt9147读void gt9147_read(unsigned short reg_addr, unsigned char *data, int len){I2C_Msg msg {.direction I2C_Read,.dev_address 0x14,.reg_address reg_addr,.reg_len 2,.data data,.len len};master_xfer(I2C2, msg);}// gt9147写void gt9147_write(unsigned short reg_addr, unsigned char *data, int len){I2C_Msg msg {.direction I2C_Write,.dev_address 0x14,.reg_address reg_addr,.reg_len 2,.data data,.len len};master_xfer(I2C2, msg);}// 存放多点x y坐标寄存器地址const unsigned short gt9147_reg[5] {0x8150, 0x8158, 0x8160, 0x8168, 0x8170};// 读取触摸点坐标void read_points(void){// 触摸点数量unsigned char buffer[16] {0};gt9147_read(0x814E, buffer, 1);gt9147_dev.num buffer[0] 0x0F;// 读取触摸点x y坐标int i 0;for (i 0; i gt9147_dev.num; i){gt9147_read(gt9147_reg[i], buffer, 4); //buffer[0]:low buffer[1]:highgt9147_dev.x[i] buffer[1] 8 | buffer[0];gt9147_dev.y[i] buffer[3] 8 | buffer[2];}// 判断按下是否有效if (gt9147_dev.num 0){gt9147_dev.available 0;}else{gt9147_dev.available 1;}buffer[0] 0;gt9147_write(0x814E, buffer, 1);}
返回列表