1. 硬件准备与电路连接在开始之前我们需要准备好所有必要的硬件设备。Luckfox RV1106开发板是一款性能不错的嵌入式开发平台而ST7735S是一款常见的1.8寸SPI接口LCD屏幕。我实际使用中发现市面上常见的ST7735S屏幕引脚定义可能略有不同所以一定要仔细核对你的屏幕规格书。屏幕的典型引脚包括VCC3.3V电源GND地线SCLSPI时钟线SDASPI数据线CS片选信号DC数据/命令选择RES复位信号BL背光控制连接时最容易出错的就是背光控制线。很多新手会忽略这个引脚结果屏幕完全不亮。我踩过这个坑当时还以为驱动有问题折腾了半天才发现是背光没开。建议先用万用表测量背光引脚电压确保硬件连接正确。2. 设备树配置详解设备树配置是驱动开发的关键一步。在Luckfox RV1106上我们需要修改两个关键文件rv1106g-luckfox-pico-pro-max.dts和rv1106-luckfox-pico-pro-max-ipc.dtsi。首先在dts文件中添加背光驱动配置backlight:backlight{ compatible gpio-backlight; pinctrl-names default; pinctrl-0 gpio2_pb0; gpios gpio2 RK_PB0 GPIO_ACTIVE_HIGH; default-on; };然后在dtsi文件中修改SPI配置fbtft0{ status okay; compatible sitronix,st7735r; // 注意这里用st7735r兼容st7735s reg 0; spi-max-frequency 48000000; spi-cpol; spi-cpha; rotate 0; fps 30; rgb; buswidth 8; dc gpio1 RK_PD0 GPIO_ACTIVE_HIGH; reset gpio1 RK_PD1 GPIO_ACTIVE_LOW; debug 0x1; };这里有个关键点官方驱动中st7735r可以完美兼容st7735s。我实测过多种屏幕这个配置都能正常工作。如果遇到问题可以尝试调整spi-max-frequency参数降低到24MHz试试。3. 内核驱动适配与修改由于内核版本差异我们可能需要修改fbtft驱动。主要改动集中在fbtft-core.c文件中添加必要的头文件#include linux/gpio.h #include linux/of_gpio.h修改fbtft_request_one_gpio函数static int fbtft_request_one_gpio(struct fbtft_par *par, const char *name, int index, struct gpio_desc **gpiop) { // 详细实现参考原文 // 关键是要正确处理GPIO的active low配置 }修改reset函数static void fbtft_reset(struct fbtft_par *par) { if (!par-gpio.reset) return; gpiod_set_value_cansleep(par-gpio.reset, 1); usleep_range(20, 40); gpiod_set_value_cansleep(par-gpio.reset, 0); msleep(120); gpiod_set_value_cansleep(par-gpio.reset, 1); msleep(120); gpiod_set_value_cansleep(par-gpio.cs, 0); // 激活芯片 msleep(120); }修改完成后记得在defconfig中启用相关配置CONFIG_BACKLIGHT_GPIOy CONFIG_FB_TFT_ST7735Ry CONFIG_SPI_MASTERy CONFIG_FBy4. 驱动验证与调试编译并烧写系统后可以通过以下命令验证驱动是否正常工作# 查看驱动加载信息 dmesg | grep fb_ # 测试花屏效果 cat /dev/urandom /dev/fb0 # 清屏测试 cat /dev/zero /dev/fb0 # 背光控制 echo 1 /sys/class/backlight/backlight/brightness # 打开背光 echo 0 /sys/class/backlight/backlight/brightness # 关闭背光如果屏幕没有反应建议按以下步骤排查检查背光是否点亮测量各控制引脚电平确认SPI时钟信号是否正常查看dmesg输出是否有错误信息5. LVGL环境搭建LVGL是一个轻量级的嵌入式图形库我们需要先准备开发环境# 创建工作目录 mkdir -p ~/lvgl_project/project_01 cd ~/lvgl_project/project_01 # 克隆LVGL相关仓库 git clone -b v8.1.0 https://github.com/lvgl/lvgl.git git clone -b v8.1.0 https://github.com/lvgl/lv_drivers.git git clone -b v8.1.0 https://github.com/lvgl/lv_demos.git git clone --branch release/v8.2 --single-branch https://github.com/lvgl/lv_port_linux_frame_buffer.git # 复制必要文件 cp -r lvgl lv_drivers lv_demos . cp lvgl/lv_conf_template.h ./lv_conf.h cp lv_drivers/lv_drv_conf_template.h ./lv_drv_conf.h cp lv_demos/lv_demo_conf_template.h ./lv_demo_conf.h cp lv_port_linux_frame_buffer/main.c . cp lv_port_linux_frame_buffer/Makefile .6. LVGL配置修改需要修改几个关键配置文件lv_conf.h:#define LV_MEM_SIZE (32U * 1024U) // 根据实际情况调整内存大小 #define LV_DISP_DEF_REFR_PERIOD 30 // 刷新周期 #define LV_INDEV_DEF_READ_PERIOD 30 // 输入设备读取周期 #define LV_USE_LOG 0 // 关闭日志减少开销lv_drv_conf.h:#define USE_FBDEV 1 // 启用framebuffer驱动lv_demo_conf.h:#define LV_USE_DEMO_WIDGETS 0 // 不使用示例组件7. 图片显示实现要在LVGL中显示图片需要先将图片转换为C数组。可以使用在线转换工具选择CF_TRUE_COLOR格式JPG或CF_TRUE_COLOR_ALPHA格式PNG。转换完成后将生成的.c文件添加到工程中然后在main.c中使用LV_IMG_DECLARE(fll); // 声明外部图片 lv_obj_t * img1 lv_img_create(lv_scr_act()); lv_img_set_src(img1, fll); lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);8. 编译与部署使用交叉编译工具链编译程序make CCarm-rockchip830-linux-uclibcgnueabihf-gcc将生成的可执行文件复制到开发板并运行chmod x demo ./demo如果遇到问题可以尝试以下调试方法检查framebuffer设备是否正确初始化确认图片数据格式与屏幕色彩模式匹配调整LVGL的内存配置参数查看系统资源使用情况确保内存充足在实际项目中我发现ST7735S屏幕在低刷新率下可能会出现残影可以通过调整fps参数和屏幕初始化序列来改善。另外LVGL的内存管理需要特别注意特别是在资源有限的嵌入式设备上合理配置LV_MEM_SIZE对性能影响很大。
【RV1106】基于SPI驱动ST7735S屏幕,移植LVGL实现图片显示全流程解析
1. 硬件准备与电路连接在开始之前我们需要准备好所有必要的硬件设备。Luckfox RV1106开发板是一款性能不错的嵌入式开发平台而ST7735S是一款常见的1.8寸SPI接口LCD屏幕。我实际使用中发现市面上常见的ST7735S屏幕引脚定义可能略有不同所以一定要仔细核对你的屏幕规格书。屏幕的典型引脚包括VCC3.3V电源GND地线SCLSPI时钟线SDASPI数据线CS片选信号DC数据/命令选择RES复位信号BL背光控制连接时最容易出错的就是背光控制线。很多新手会忽略这个引脚结果屏幕完全不亮。我踩过这个坑当时还以为驱动有问题折腾了半天才发现是背光没开。建议先用万用表测量背光引脚电压确保硬件连接正确。2. 设备树配置详解设备树配置是驱动开发的关键一步。在Luckfox RV1106上我们需要修改两个关键文件rv1106g-luckfox-pico-pro-max.dts和rv1106-luckfox-pico-pro-max-ipc.dtsi。首先在dts文件中添加背光驱动配置backlight:backlight{ compatible gpio-backlight; pinctrl-names default; pinctrl-0 gpio2_pb0; gpios gpio2 RK_PB0 GPIO_ACTIVE_HIGH; default-on; };然后在dtsi文件中修改SPI配置fbtft0{ status okay; compatible sitronix,st7735r; // 注意这里用st7735r兼容st7735s reg 0; spi-max-frequency 48000000; spi-cpol; spi-cpha; rotate 0; fps 30; rgb; buswidth 8; dc gpio1 RK_PD0 GPIO_ACTIVE_HIGH; reset gpio1 RK_PD1 GPIO_ACTIVE_LOW; debug 0x1; };这里有个关键点官方驱动中st7735r可以完美兼容st7735s。我实测过多种屏幕这个配置都能正常工作。如果遇到问题可以尝试调整spi-max-frequency参数降低到24MHz试试。3. 内核驱动适配与修改由于内核版本差异我们可能需要修改fbtft驱动。主要改动集中在fbtft-core.c文件中添加必要的头文件#include linux/gpio.h #include linux/of_gpio.h修改fbtft_request_one_gpio函数static int fbtft_request_one_gpio(struct fbtft_par *par, const char *name, int index, struct gpio_desc **gpiop) { // 详细实现参考原文 // 关键是要正确处理GPIO的active low配置 }修改reset函数static void fbtft_reset(struct fbtft_par *par) { if (!par-gpio.reset) return; gpiod_set_value_cansleep(par-gpio.reset, 1); usleep_range(20, 40); gpiod_set_value_cansleep(par-gpio.reset, 0); msleep(120); gpiod_set_value_cansleep(par-gpio.reset, 1); msleep(120); gpiod_set_value_cansleep(par-gpio.cs, 0); // 激活芯片 msleep(120); }修改完成后记得在defconfig中启用相关配置CONFIG_BACKLIGHT_GPIOy CONFIG_FB_TFT_ST7735Ry CONFIG_SPI_MASTERy CONFIG_FBy4. 驱动验证与调试编译并烧写系统后可以通过以下命令验证驱动是否正常工作# 查看驱动加载信息 dmesg | grep fb_ # 测试花屏效果 cat /dev/urandom /dev/fb0 # 清屏测试 cat /dev/zero /dev/fb0 # 背光控制 echo 1 /sys/class/backlight/backlight/brightness # 打开背光 echo 0 /sys/class/backlight/backlight/brightness # 关闭背光如果屏幕没有反应建议按以下步骤排查检查背光是否点亮测量各控制引脚电平确认SPI时钟信号是否正常查看dmesg输出是否有错误信息5. LVGL环境搭建LVGL是一个轻量级的嵌入式图形库我们需要先准备开发环境# 创建工作目录 mkdir -p ~/lvgl_project/project_01 cd ~/lvgl_project/project_01 # 克隆LVGL相关仓库 git clone -b v8.1.0 https://github.com/lvgl/lvgl.git git clone -b v8.1.0 https://github.com/lvgl/lv_drivers.git git clone -b v8.1.0 https://github.com/lvgl/lv_demos.git git clone --branch release/v8.2 --single-branch https://github.com/lvgl/lv_port_linux_frame_buffer.git # 复制必要文件 cp -r lvgl lv_drivers lv_demos . cp lvgl/lv_conf_template.h ./lv_conf.h cp lv_drivers/lv_drv_conf_template.h ./lv_drv_conf.h cp lv_demos/lv_demo_conf_template.h ./lv_demo_conf.h cp lv_port_linux_frame_buffer/main.c . cp lv_port_linux_frame_buffer/Makefile .6. LVGL配置修改需要修改几个关键配置文件lv_conf.h:#define LV_MEM_SIZE (32U * 1024U) // 根据实际情况调整内存大小 #define LV_DISP_DEF_REFR_PERIOD 30 // 刷新周期 #define LV_INDEV_DEF_READ_PERIOD 30 // 输入设备读取周期 #define LV_USE_LOG 0 // 关闭日志减少开销lv_drv_conf.h:#define USE_FBDEV 1 // 启用framebuffer驱动lv_demo_conf.h:#define LV_USE_DEMO_WIDGETS 0 // 不使用示例组件7. 图片显示实现要在LVGL中显示图片需要先将图片转换为C数组。可以使用在线转换工具选择CF_TRUE_COLOR格式JPG或CF_TRUE_COLOR_ALPHA格式PNG。转换完成后将生成的.c文件添加到工程中然后在main.c中使用LV_IMG_DECLARE(fll); // 声明外部图片 lv_obj_t * img1 lv_img_create(lv_scr_act()); lv_img_set_src(img1, fll); lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0);8. 编译与部署使用交叉编译工具链编译程序make CCarm-rockchip830-linux-uclibcgnueabihf-gcc将生成的可执行文件复制到开发板并运行chmod x demo ./demo如果遇到问题可以尝试以下调试方法检查framebuffer设备是否正确初始化确认图片数据格式与屏幕色彩模式匹配调整LVGL的内存配置参数查看系统资源使用情况确保内存充足在实际项目中我发现ST7735S屏幕在低刷新率下可能会出现残影可以通过调整fps参数和屏幕初始化序列来改善。另外LVGL的内存管理需要特别注意特别是在资源有限的嵌入式设备上合理配置LV_MEM_SIZE对性能影响很大。