手把手教你用ST7789V驱动点亮ST7735S屏幕(Linux 5.10内核,附完整设备树配置)
手把手教你用ST7789V驱动点亮ST7735S屏幕Linux 5.10内核附完整设备树配置在嵌入式开发中遇到屏幕驱动不完善的情况并不少见。最近我在一个项目中就碰到了这样的问题手头有一块ST7735S屏幕但内核中的原生驱动支持有限。经过一番探索我发现通过修改ST7789V驱动来适配ST7735S屏幕是个不错的解决方案。这种方法不仅解决了驱动问题还让我对Linux的FBTFT驱动框架有了更深入的理解。下面就把这个过程中的关键步骤和注意事项分享给大家。1. 驱动适配原理与准备工作ST7735S和ST7789V虽然属于不同系列但它们都是基于SPI接口的小型TFT液晶屏且寄存器结构有一定相似性。这就是为什么我们可以利用ST7789V的驱动框架来驱动ST7735S屏幕。需要准备的环境和工具运行Linux 5.10内核的开发板已连接好的ST7735S屏幕SPI接口交叉编译工具链内核源码树提示在开始修改前建议先备份原始驱动文件以便出现问题时可以快速恢复。2. 修改ST7789V驱动文件驱动适配的核心在于修改fb_st7789v.c文件这个文件通常位于内核源码的drivers/staging/fbtft目录下。我们需要修改两个关键部分初始化序列和屏幕参数定义。2.1 调整初始化序列ST7735S的初始化序列与ST7789V有所不同我们需要在init_display函数中替换为正确的寄存器设置static int init_display(struct fbtft_par *par) { par-fbtftops.reset(par); // 硬件复位 mdelay(50); write_reg(par, 0x11); // 软件复位 mdelay(100); // ST7735S帧率控制 write_reg(par, 0xB1, 0x05, 0x3C, 0x3C); write_reg(par, 0xB2, 0x05, 0x3C, 0x3C); write_reg(par, 0xB3, 0x05, 0x3C, 0x3C, 0x05, 0x3C, 0x3C); // 电源控制序列 write_reg(par, 0xC0, 0x28, 0x08, 0x04); write_reg(par, 0xC1, 0xC0); write_reg(par, 0xC2, 0x0D, 0x00); write_reg(par, 0xC3, 0x8D, 0x2A); // VCOM设置 write_reg(par, 0xC4, 0x8D, 0xEE); // MX, MY, RGB模式 // Gamma校正设置 write_reg(par, 0xE0, 0x04, 0x22, 0x07, 0x0A, 0x2E, 0x30, 0x25, 0x2A, 0x28, 0x26, 0x2E, 0x3A, 0x00, 0x01, 0x03, 0x13); write_reg(par, 0xE1, 0x04, 0x16, 0x06, 0x0D, 0x2D, 0x26, 0x23, 0x27, 0x27, 0x25, 0x2D, 0x3B, 0x00, 0x01, 0x04, 0x13); write_reg(par, 0x3A, 0x05); // 65K色彩模式 write_reg(par, 0x29); // 开启显示 mdelay(100); return 0; }2.2 修改屏幕参数结构体接下来需要调整fbtft_display结构体中的屏幕参数确保它们与ST7735S的实际规格匹配static struct fbtft_display display { .regwidth 8, .width 128, // ST7735S的实际宽度 .height 160, // ST7735S的实际高度 .gamma_num 2, .gamma_len 14, .gamma HSD20_IPS_GAMMA, .fbtftops { .init_display init_display, .set_var set_var, .set_gamma set_gamma, .blank blank, }, };注意对于ST7735S屏幕可能需要注释掉set_gamma函数中的for循环部分具体取决于屏幕型号和版本。3. 设备树配置详解正确的设备树配置是驱动能够正常工作的关键。下面是一个完整的SPI屏幕节点配置示例spi0 { status okay; st7789v0 { status okay; compatible sitronix,st7789v; reg 0; spi-max-frequency 48000000; // SPI时钟频率 rotate 90; // 屏幕旋转角度 spi-cpol; // SPI时钟极性 spi-cpha; // SPI时钟相位 rgb; // 颜色格式为RGB fps 30; // 刷新率 buswidth 8; // 数据总线宽度 dc-gpios pio 1 6 GPIO_ACTIVE_LOW; // 数据/命令选择引脚 reset-gpios pio 1 5 GPIO_ACTIVE_LOW; // 复位引脚 debug 0; // 调试信息关闭 }; };关键参数说明参数说明典型值spi-max-frequencySPI通信最大频率48000000 (48MHz)rotate屏幕旋转角度0, 90, 180, 270fps屏幕刷新率30-60dc-gpios数据/命令选择引脚根据硬件连接确定reset-gpios复位控制引脚根据硬件连接确定4. 内核配置与编译完成驱动修改后需要配置内核以包含我们修改后的FBTFT驱动进入内核配置界面make ARCHarm menuconfig确保以下选项已启用Device Drivers → Staging drivers → Support for small TFT LCD display modules → FB driver for ST7789V displays编译内核和设备树make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j16 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- dtbs安装模块如果需要make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- INSTALL_MOD_PATHout modules_install5. 测试与验证将编译好的内核和设备树文件部署到开发板后可以通过以下方法测试屏幕是否正常工作检查设备节点ls /dev/fb*显示测试图案cat /dev/urandom /dev/fb0如果屏幕出现随机噪点雪花效果说明驱动已成功加载。启用控制台显示可选 修改u-boot环境变量添加consoletty0参数setenv bootargs consoletty0 consolettyS0,115200 panic5 rootwait root/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default0 saveenv6. 常见问题排查在实际操作中可能会遇到各种问题这里列出几个常见问题及解决方法问题1屏幕无任何反应检查电源连接是否正常确认SPI总线是否已启用检查/dev/spidev*是否存在验证复位信号是否正确问题2显示内容错乱检查屏幕旋转参数是否正确确认SPI时钟极性和相位设置spi-cpol/spi-cpha验证色彩模式设置rgb参数问题3显示颜色异常检查Gamma校正设置确认色彩深度设置65K色模式验证初始化序列中的色彩相关寄存器7. 性能优化技巧为了让屏幕表现更好可以考虑以下优化措施调整SPI时钟频率逐步提高spi-max-frequency值直到出现显示异常然后回退到稳定值典型值在30-50MHz之间优化刷新率适当提高fps值但要注意CPU负载对于静态内容可以降低刷新率以节省功耗使用DMA传输在内核配置中启用SPI DMA支持可以减少CPU占用提高整体性能双缓冲技术实现帧缓冲的双缓冲切换可以避免屏幕刷新时的撕裂现象通过这次ST7789V驱动适配ST7735S屏幕的经历我深刻体会到Linux驱动框架的灵活性。虽然过程有些曲折但最终能够看到屏幕正常点亮的那一刻所有的努力都值得了。建议大家在修改驱动时保持耐心仔细对照数据手册检查每个寄存器设置这样能少走很多弯路。