1. 硬件准备与环境搭建第一次拿到Luckfox Pico开发板和ST7789V2屏幕时我对着桌上那堆零件发呆了十分钟——这比乐高积木复杂多了。不过别担心跟着我的步骤来保证你能少走弯路。先说说硬件清单Luckfox Pico开发板建议选排针焊接好的版本省去自己焊的麻烦ST7789V2屏幕选240x280分辨率的通用款就行淘宝上二十多块就能买到另外准备一张高速microSD卡8G以上、杜邦线若干、Type-C数据线和读卡器。开发环境搭建有个坑要特别注意官方工具链必须完整安装我之前偷懒跳过这步结果编译时报错提示像天书一样折腾半天才发现是工具链缺失。推荐使用Ubuntu系统按照官方教程安装DriverAssitant驱动助手和烧录工具时记得把SD卡格式化成FAT32格式虽然不格式化也能用但遇到过有人因为文件系统问题导致烧录失败。提示开发板首次上电前建议先用万用表检查排针间是否有短路我有次就碰到杜邦线内部断裂导致接触不良的情况。2. 设备树修改实战设备树修改是驱动开发的第一道门槛。Luckfox Pico的设备树文件藏在SDK的rv1103g-luckfox-pico.dts中这个文件会继承rv1103.dtsi等基础配置。我建议先用VSCode打开整个内核目录方便全局搜索。关键修改有三处首先在spi0节点下添加yqh_lcd子节点注意compatible属性要设成yqh_st7789v2然后把原有的spidev和fbtft节点注释掉这两个默认配置会占用SPI资源最后别忘了把status设为okay。GPIO引脚配置要根据实际接线调整比如我的屏幕背光控制接在GPIO0_A4就写成led-gpios gpio0 RK_PA4 GPIO_ACTIVE_LOW。spi0 { status okay; yqh_lcd0 { compatible yqh_st7789v2; reg 0; spi-max-frequency 60000000; led-gpios gpio0 RK_PA4 GPIO_ACTIVE_LOW; dc gpio1 RK_PA2 GPIO_ACTIVE_HIGH; reset gpio1 RK_PD3 GPIO_ACTIVE_LOW; }; };编译时用sudo ./build.sh kernel命令只编译内核和设备树比全量编译快得多。烧录后如果屏幕没反应先检查dmesg日志常见问题有引脚冲突或SPI速率设置过高——我有次设成100MHz导致屏幕花屏降到60MHz才稳定。3. 驱动模块开发详解驱动开发就像搭积木先建框架再填功能。核心文件就两个spi_st7789v2.c处理SPI设备注册ST7789V2.h实现屏幕控制逻辑。注册字符设备时要注意主设备号的分配方式我习惯用动态分配alloc_chrdev_region避免与系统设备冲突。SPI通信最关键的三个函数lcd_write_reg()发送命令字lcd_write_data()发送数据SPI_Write_bytes()处理批量数据传输void LCD_init(void) { gpio_set_value(st7789v2_dev.RES, 0); mdelay(120); // 复位脉冲要保持足够时长 gpio_set_value(st7789v2_dev.RES, 1); mdelay(120); lcd_write_reg(0x11); // 退出睡眠模式 mdelay(120); lcd_write_reg(0x3A); lcd_write_data(0x65); // 设置RGB565格式 }显存刷新有个性能优化点ST7789V2的SPI接口速度有限直接刷全屏会卡顿。我的解决方案是分块传输把240x280的显存分成多个2400字节的小包发送。实测发现这样既能避免SPI超时错误又能保持60fps的流畅度。4. 用户空间交互实现驱动写好只是成功一半还得让应用程序能调用。我设计的用户程序testApp.c通过write接口传递RGB565格式的像素数据支持两种操作模式清屏填充统一颜色画矩形指定区域和颜色编译时要加-static选项因为开发板的动态库和PC不同。这个坑我踩过——在Ubuntu上正常运行的动态链接程序放到开发板就报not found错误。arm-rockchip830-linux-uclibcgnueabihf-gcc -static testApp.c -o testApp调试时建议先用简单图案测试比如全屏红色0xF800或绿色0x07E0。遇到显示异常时按这个顺序排查检查/dev下设备节点是否存在用示波器测SPI时钟信号确认DC引脚电平切换时机查看内核日志是否有传输错误最后分享一个实用技巧用mmap把显存映射到用户空间能省去数据拷贝开销。不过要记得实现ioctl接口来同步访问否则会出现画面撕裂。
从零构建:为Luckfox Pico适配ST7789V2 SPI屏幕驱动
发布时间:2026/5/23 6:18:55
1. 硬件准备与环境搭建第一次拿到Luckfox Pico开发板和ST7789V2屏幕时我对着桌上那堆零件发呆了十分钟——这比乐高积木复杂多了。不过别担心跟着我的步骤来保证你能少走弯路。先说说硬件清单Luckfox Pico开发板建议选排针焊接好的版本省去自己焊的麻烦ST7789V2屏幕选240x280分辨率的通用款就行淘宝上二十多块就能买到另外准备一张高速microSD卡8G以上、杜邦线若干、Type-C数据线和读卡器。开发环境搭建有个坑要特别注意官方工具链必须完整安装我之前偷懒跳过这步结果编译时报错提示像天书一样折腾半天才发现是工具链缺失。推荐使用Ubuntu系统按照官方教程安装DriverAssitant驱动助手和烧录工具时记得把SD卡格式化成FAT32格式虽然不格式化也能用但遇到过有人因为文件系统问题导致烧录失败。提示开发板首次上电前建议先用万用表检查排针间是否有短路我有次就碰到杜邦线内部断裂导致接触不良的情况。2. 设备树修改实战设备树修改是驱动开发的第一道门槛。Luckfox Pico的设备树文件藏在SDK的rv1103g-luckfox-pico.dts中这个文件会继承rv1103.dtsi等基础配置。我建议先用VSCode打开整个内核目录方便全局搜索。关键修改有三处首先在spi0节点下添加yqh_lcd子节点注意compatible属性要设成yqh_st7789v2然后把原有的spidev和fbtft节点注释掉这两个默认配置会占用SPI资源最后别忘了把status设为okay。GPIO引脚配置要根据实际接线调整比如我的屏幕背光控制接在GPIO0_A4就写成led-gpios gpio0 RK_PA4 GPIO_ACTIVE_LOW。spi0 { status okay; yqh_lcd0 { compatible yqh_st7789v2; reg 0; spi-max-frequency 60000000; led-gpios gpio0 RK_PA4 GPIO_ACTIVE_LOW; dc gpio1 RK_PA2 GPIO_ACTIVE_HIGH; reset gpio1 RK_PD3 GPIO_ACTIVE_LOW; }; };编译时用sudo ./build.sh kernel命令只编译内核和设备树比全量编译快得多。烧录后如果屏幕没反应先检查dmesg日志常见问题有引脚冲突或SPI速率设置过高——我有次设成100MHz导致屏幕花屏降到60MHz才稳定。3. 驱动模块开发详解驱动开发就像搭积木先建框架再填功能。核心文件就两个spi_st7789v2.c处理SPI设备注册ST7789V2.h实现屏幕控制逻辑。注册字符设备时要注意主设备号的分配方式我习惯用动态分配alloc_chrdev_region避免与系统设备冲突。SPI通信最关键的三个函数lcd_write_reg()发送命令字lcd_write_data()发送数据SPI_Write_bytes()处理批量数据传输void LCD_init(void) { gpio_set_value(st7789v2_dev.RES, 0); mdelay(120); // 复位脉冲要保持足够时长 gpio_set_value(st7789v2_dev.RES, 1); mdelay(120); lcd_write_reg(0x11); // 退出睡眠模式 mdelay(120); lcd_write_reg(0x3A); lcd_write_data(0x65); // 设置RGB565格式 }显存刷新有个性能优化点ST7789V2的SPI接口速度有限直接刷全屏会卡顿。我的解决方案是分块传输把240x280的显存分成多个2400字节的小包发送。实测发现这样既能避免SPI超时错误又能保持60fps的流畅度。4. 用户空间交互实现驱动写好只是成功一半还得让应用程序能调用。我设计的用户程序testApp.c通过write接口传递RGB565格式的像素数据支持两种操作模式清屏填充统一颜色画矩形指定区域和颜色编译时要加-static选项因为开发板的动态库和PC不同。这个坑我踩过——在Ubuntu上正常运行的动态链接程序放到开发板就报not found错误。arm-rockchip830-linux-uclibcgnueabihf-gcc -static testApp.c -o testApp调试时建议先用简单图案测试比如全屏红色0xF800或绿色0x07E0。遇到显示异常时按这个顺序排查检查/dev下设备节点是否存在用示波器测SPI时钟信号确认DC引脚电平切换时机查看内核日志是否有传输错误最后分享一个实用技巧用mmap把显存映射到用户空间能省去数据拷贝开销。不过要记得实现ioctl接口来同步访问否则会出现画面撕裂。