当前位置: 首页 > article >正文

RV1106驱动ST7735S踩坑实录:从设备树到LVGL显示,我遇到的3个关键问题

RV1106驱动ST7735S踩坑实录从设备树到LVGL显示的三个关键陷阱最近在Luckfox Pico Pro MaxRV1106平台上折腾ST7735S SPI屏幕时遇到了几个颇具代表性的问题。这些问题不仅让我熬了几个通宵也让我对嵌入式Linux的显示子系统有了更深入的理解。本文将重点分享三个最具迷惑性的技术陷阱及其解决方案。1. 设备树配置的玄学为什么.dts修改无效第一次尝试在RV1106上驱动ST7735S时我按照常规思路修改了rv1106g-luckfox-pico-pro-max.dts文件中的SPI配置添加了fbtft节点。编译烧录后屏幕却始终没有反应。通过dmesg查看内核日志发现系统仍然加载了默认的st7789v驱动。问题本质Luckfox的SDK采用了设备树覆盖机制.dtsi文件的配置会覆盖.dts中的定义。这是Rockchip平台常见的设备树组织方式。关键解决步骤定位正确的修改位置# 在SDK目录中搜索设备树包含关系 grep -r include arch/arm/boot/dts/修改rv1106-luckfox-pico-pro-max-ipc.dtsi中的SPI配置spi0 { fbtft0 { status okay; compatible sitronix,st7735r; // 使用st7735r驱动兼容st7735s reg 0; spi-max-frequency 48000000; spi-cpol; spi-cpha; rotate 0; fps 30; buswidth 8; dc gpio1 RK_PD0 GPIO_ACTIVE_HIGH; reset gpio1 RK_PD1 GPIO_ACTIVE_LOW; debug 0x1; }; };验证驱动加载# 查看内核消息 dmesg | grep fb_ # 预期输出应包含fb_st7735r相关信息经验总结Rockchip平台设备树存在.dts→.dtsi的覆盖链st7735r驱动可以完美兼容st7735s屏幕修改后务必执行make dtbs重新编译设备树2. 背光控制的隐藏关卡为什么fb0测试无反应当通过cat /dev/urandom /dev/fb0测试屏幕时发现毫无反应。用万用表测量背光控制引脚电压始终为0V。这引出了第二个关键问题背光控制需要单独的GPIO驱动。问题分析大多数SPI LCD的背光控制是独立于显示驱动的需要创建专门的backlight设备节点传统的regulator-fixed方式不适用于背光控制解决方案在设备树中添加backlight节点backlight: backlight { compatible gpio-backlight; pinctrl-names default; pinctrl-0 gpio2_pb0; gpios gpio2 RK_PB0 GPIO_ACTIVE_HIGH; default-on; };配置对应的pinctrlpinctrl { gpio2-pb0 { gpio2_pb0: gpio2-pb0 { rockchip,pins 2 RK_PB0 RK_FUNC_GPIO pcfg_pull_none; }; }; };内核配置检查# 确保内核配置包含 CONFIG_BACKLIGHT_GPIOy CONFIG_BACKLIGHT_CLASS_DEVICEy控制背光测试# 查看背光设备 ls /sys/class/backlight/ # 控制背光亮度 echo 1 /sys/class/backlight/backlight/brightness # 开启 echo 0 /sys/class/backlight/backlight/brightness # 关闭调试技巧使用gpiodetect和gpioinfo工具验证GPIO状态通过echo 1 /sys/class/gpio/export手动测试GPIO检查/proc/device-tree确认设备树修改已生效3. 内核驱动的版本陷阱fbtft-core.c的接口变化当一切配置看似正确时屏幕仍然无法正常工作。通过内核日志发现fbtft驱动在初始化GPIO时出现了问题。这引出了第三个关键问题不同内核版本中fbtft-core.c的接口发生了变化。问题现象驱动加载失败内核报错failed to request GPIO背光控制无反应屏幕复位信号异常解决方案修改fbtft-core.c的关键函数// 添加头文件 #include linux/of_gpio.h // 修改GPIO请求函数 static int fbtft_request_one_gpio(struct fbtft_par *par, const char *name, int index, struct gpio_desc **gpiop) { struct device *dev par-info-device; struct device_node *node dev-of_node; int gpio, flags, ret 0; enum of_gpio_flags of_flags; if (of_find_property(node, name, NULL)) { gpio of_get_named_gpio_flags(node, name, index, of_flags); if (gpio -ENOENT) return 0; if (gpio -EPROBE_DEFER) return gpio; if (gpio 0) { dev_err(dev, failed to get %s from DT\n, name); return gpio; } flags (of_flags OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH; ret devm_gpio_request_one(dev, gpio, flags, dev-driver-name); if (ret) { dev_err(dev, gpio_request_one(%s%d) failed with %d\n, name, gpio, ret); return ret; } *gpiop gpio_to_desc(gpio); } return ret; }修改复位函数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); /* 激活芯片选择线 */ if (par-gpio.cs) gpiod_set_value_cansleep(par-gpio.cs, 0); msleep(120); }内核配置检查# 关键配置项 CONFIG_FB_TFT_ST7735Ry CONFIG_SPI_MASTERy CONFIG_FBy CONFIG_FRAMEBUFFER_CONSOLEy版本适配建议对比不同内核版本的fbtft驱动差异关注GPIO子系统接口的变化优先参考同内核版本的其他平台实现4. LVGL集成实战从零构建显示框架当底层驱动问题解决后下一步就是在应用层实现图形界面。LVGL是一个轻量级的嵌入式图形库非常适合在资源受限的嵌入式设备上使用。环境搭建步骤获取LVGL源代码mkdir -p ~/lvgl_project cd ~/lvgl_project 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 --branch release/v8.2 --single-branch https://github.com/lvgl/lv_port_linux_frame_buffer.git关键配置文件修改// lv_conf.h 主要修改 #define LV_MEM_SIZE (32U * 1024) // 根据设备内存调整 #define LV_DISP_DEF_REFR_PERIOD 30 // 刷新周期(ms) #define LV_TICK_CUSTOM 0 // 不使用自定义tick // lv_drv_conf.h #define USE_FBDEV 1 // 启用framebuffer驱动简单的显示示例#include lvgl/lvgl.h #include lv_drivers/display/fbdev.h #define DISP_BUF_SIZE (128 * 160) int main(void) { lv_init(); fbdev_init(); static lv_color_t buf[DISP_BUF_SIZE]; static lv_disp_draw_buf_t disp_buf; lv_disp_draw_buf_init(disp_buf, buf, NULL, DISP_BUF_SIZE); static lv_disp_drv_t disp_drv; lv_disp_drv_init(disp_drv); disp_drv.draw_buf disp_buf; disp_drv.flush_cb fbdev_flush; disp_drv.hor_res 128; disp_drv.ver_res 160; lv_disp_t * disp lv_disp_drv_register(disp_drv); lv_obj_t * label lv_label_create(lv_scr_act()); lv_label_set_text(label, Hello Luckfox!); lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); while(1) { lv_timer_handler(); usleep(5000); } return 0; }性能优化技巧根据屏幕分辨率调整DISP_BUF_SIZE在资源紧张时考虑使用LV_MEM_CUSTOM合理设置刷新率避免CPU过载使用双缓冲减少闪烁5. 实战问题排查指南在整个开发过程中积累了一些实用的调试技巧和问题排查方法常用调试命令# 检查驱动加载 dmesg | grep -E fb_|spi|fbtft # 检查framebuffer设备 ls /dev/fb* cat /proc/fb # 检查背光设备 ls /sys/class/backlight/ cat /sys/class/backlight/*/brightness # 检查GPIO状态 gpiodetect gpioinfo常见问题及解决方案问题现象可能原因解决方案屏幕无任何反应背光未开启检查backlight驱动和GPIO配置显示花屏SPI时钟速率过高降低spi-max-frequency驱动加载失败设备树配置错误检查compatible字符串和reg属性显示偏移或错位屏幕参数不匹配调整rotate和分辨率参数性能监测工具# 查看CPU负载 top -H # 查看内存使用 free -m # 查看SPI传输统计 cat /sys/kernel/debug/spi/spi0/statistics通过这三个关键问题的解决不仅成功驱动了ST7735S屏幕还深入理解了Linux显示子系统的运作机制。嵌入式开发中的每个问题都是学习的机会记录这些踩坑经验希望能帮助遇到类似问题的开发者少走弯路。

相关文章:

RV1106驱动ST7735S踩坑实录:从设备树到LVGL显示,我遇到的3个关键问题

RV1106驱动ST7735S踩坑实录:从设备树到LVGL显示的三个关键陷阱 最近在Luckfox Pico Pro Max(RV1106平台)上折腾ST7735S SPI屏幕时,遇到了几个颇具代表性的问题。这些问题不仅让我熬了几个通宵,也让我对嵌入式Linux的显…...

DAMOYOLO-S多场景落地:智能硬件产品出厂前目标检测功能自动化校验

DAMOYOLO-S多场景落地:智能硬件产品出厂前目标检测功能自动化校验 1. 引言:从质检痛点说起 想象一下这个场景:你是一家智能硬件公司的生产线负责人。每天,成千上万的摄像头、扫地机器人、智能门锁从流水线上下来。每个产品都内置…...

GLM-4.1V-9B-Base一键部署教程:Python入门级环境配置指南

GLM-4.1V-9B-Base一键部署教程:Python入门级环境配置指南 1. 开篇:为什么选择GLM-4.1V-9B-Base 如果你刚接触AI开发,想快速体验多模态大模型的能力,GLM-4.1V-9B-Base是个不错的起点。这个开源模型不仅能处理文本,还能…...

AIAgent架构安全审计倒计时:监管新规Q3强制实施,你还在用传统API网关日志做AI风控?

第一章:AIAgent架构安全审计与日志 2026奇点智能技术大会(https://ml-summit.org) 安全审计的核心关注点 AI Agent 架构在多模态交互、自主决策与外部系统集成过程中,面临权限越界、提示注入、推理链污染及敏感数据泄露等新型攻击面。安全审计需覆盖运…...

终极Windows驱动签名绕过指南:3步解决硬件兼容性问题

终极Windows驱动签名绕过指南:3步解决硬件兼容性问题 【免费下载链接】DSEFix Windows x64 Driver Signature Enforcement Overrider 项目地址: https://gitcode.com/gh_mirrors/ds/DSEFix DSEFix是一款专为Windows x64系统设计的驱动签名强制覆盖工具&#…...

如何快速迁移Ziglings项目:从GitHub到Codeberg的完整指南

如何快速迁移Ziglings项目:从GitHub到Codeberg的完整指南 【免费下载链接】ziglings Learn the Zig programming language by fixing tiny broken programs. 项目地址: https://gitcode.com/gh_mirrors/zi/ziglings Ziglings是一个通过修复小型破损程序来学习…...

ams OSRAM 将娱乐与工业灯具业务出售给 Ushio

事件核心摘要交易双方:ams OSRAM(卖方,奥地利/德国半导体巨头) vs. Ushio, Inc.(买方,日本光学技术公司)。交易内容:出售 Entertainment & Industry Lamps(娱乐与工业…...

Nginx 学习总结从

1. 引入 在现代 AI 工程中,Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的,官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为,最好的办法…...

终极指南:5分钟学会用Virtual Kubelet在非K8s环境部署容器

终极指南:5分钟学会用Virtual Kubelet在非K8s环境部署容器 【免费下载链接】virtual-kubelet Virtual Kubelet is an open source Kubernetes kubelet implementation. 项目地址: https://gitcode.com/gh_mirrors/vi/virtual-kubelet Virtual Kubelet是一个开…...

10 分钟搞定答辩 PPT!Paperxie AI 神器,终结本科生熬夜改稿魔咒

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 一、 答辩 PPT:压垮毕业生的最后一根稻草 毕业论文定稿的喜悦,往往会被答辩 PPT 的焦虑瞬间冲淡。对…...

Rust 异步函数调用栈分析

Rust异步函数调用栈分析:深入理解异步执行机制 在当今高并发的编程场景中,异步编程已成为提升性能的关键技术。Rust通过async/await语法和Future机制提供了高效的异步支持,但其底层调用栈的复杂性常常让开发者感到困惑。本文将深入分析Rust异…...

终极Dockertest错误处理指南:从连接失败到超时重试的完整解决方案

终极Dockertest错误处理指南:从连接失败到超时重试的完整解决方案 【免费下载链接】dockertest Write better integration tests! Dockertest helps you boot up ephermal docker images for your Go tests with minimal work. 项目地址: https://gitcode.com/gh_…...

FireRedASR-AED-L模型Java八股文精讲:多线程并发调用与连接池管理

FireRedASR-AED-L模型Java八股文精讲:多线程并发调用与连接池管理 最近在做一个智能客服项目,需要把用户的语音实时转成文字。我们选用了FireRedASR-AED-L这个语音识别模型,效果确实不错。但上线没多久,就遇到了问题:…...

STM32F030K6T6 定时器触发ADC采样的DMA传输实战

1. 为什么需要定时器触发ADC采样? 在嵌入式开发中,ADC(模数转换器)采样是获取模拟信号的关键环节。传统的手动触发或查询式ADC采样存在两个明显痛点:一是需要CPU频繁介入,二是采样间隔难以精确控制。比如用…...

Proteus与Keil5实战:RS485多机通信仿真全解析

1. RS485多机通信基础与仿真环境搭建 第一次接触RS485通信时,我被它"一根总线挂多个设备"的特性惊艳到了。相比RS232的点对点通信,RS485就像个高效的快递中转站,能同时处理多个包裹收发。在实际工业现场,这种特性让布线…...

抓取不规则表面物体机械手的设计

目 录 第一章 绪论 1 1.1 课题研究的意义及背景 1 1.2 机械手研究概况 2 1.2.1国外研究现状 2 1.2.2国内研究现状 2 1.3 研究的内容 2 第二章 抓取物体机械手总体结构设计 4 2.1机械手设计思路 4 2.2总体方案的设计 5 2.2.1驱动方式的选择 5 2.2.2传动结构的分析 6 2.2.3传动方…...

Win11Debloat深度解析:模块化架构设计如何实现Windows系统70%性能优化

Win11Debloat深度解析:模块化架构设计如何实现Windows系统70%性能优化 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to d…...

新手避坑指南:微信小程序组件通信最常见的3个错误用法(附正确示范)

微信小程序组件通信避坑手册:3个高频错误与实战修复方案 刚接触微信小程序开发的工程师,往往会在组件通信环节踩中一些隐蔽的"地雷"。这些陷阱轻则导致页面渲染异常,重则引发内存泄漏和性能劣化。本文将解剖三个最具迷惑性的典型错…...

Mechanize最佳实践:提升Web自动化脚本性能的8个实用技巧

Mechanize最佳实践:提升Web自动化脚本性能的8个实用技巧 【免费下载链接】mechanize Mechanize is a ruby library that makes automated web interaction easy. 项目地址: https://gitcode.com/gh_mirrors/me/mechanize Mechanize是一款强大的Ruby库&#x…...

猫抓Cat-Catch:解锁网页媒体资源的终极免费解决方案

猫抓Cat-Catch:解锁网页媒体资源的终极免费解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存心爱的在线视频而苦…...

5个核心功能解析:netDxf如何简化你的DXF文件处理工作流

5个核心功能解析:netDxf如何简化你的DXF文件处理工作流 【免费下载链接】netDxf .net dxf Reader-Writer 项目地址: https://gitcode.com/gh_mirrors/ne/netDxf 在CAD数据处理领域,DXF文件处理一直是开发者和工程师面临的技术挑战。AutoCAD的DXF格…...

三菱PLC网口通讯避坑指南:MX Component连接上位机常见问题与解决方案

三菱PLC网口通讯实战:从MX Component配置到疑难排错全解析 在工业自动化领域,三菱PLC与上位机的稳定通讯是系统集成的基石。MX Component作为三菱官方提供的通讯组件,其网口连接方式因配置灵活、响应快速而广受工程师青睐。然而,从…...

别再用笨方法点灯了!手把手教你用C51+Keil写一个可复用的LED驱动模块

别再用笨方法点灯了!手把手教你用C51Keil写一个可复用的LED驱动模块 当你第一次点亮LED时,那种成就感就像打开了新世界的大门。但随着项目复杂度增加,你是否发现代码变得越来越臃肿?每次修改LED控制逻辑都要在main函数里翻找半天…...

从零构建K8s网络:CNI插件选型与网络策略实战

1. Kubernetes网络模型基础解析 第一次接触Kubernetes网络时,我被它的设计理念深深吸引。与传统的虚拟机网络不同,Kubernetes提出了一种全新的网络模型,要求所有Pod无论运行在哪个节点上,都能直接通过IP地址相互通信。这种扁平化的…...

Jenkins自动化部署:如何安全存储和使用npm的authToken(附最佳实践)

Jenkins自动化部署中npm authToken的安全管理实践 在持续集成与持续交付(CI/CD)的现代开发流程中,npm作为前端生态的核心包管理工具,其认证机制的安全管理已成为DevOps工程师必须掌握的关键技能。传统交互式登录方式在自动化环境中显得笨拙且脆弱&#…...

显卡要求高吗?实测Asian Beauty Z-Image Turbo在不同配置下的运行表现

显卡要求高吗?实测Asian Beauty Z-Image Turbo在不同配置下的运行表现 如果你对AI图像生成感兴趣,特别是想生成东方风格的人像写真,Asian Beauty Z-Image Turbo绝对值得关注。但很多人在尝试前都会问:这个工具对显卡要求高吗&…...

python opencv-python

# 聊聊 OpenCV-Python 那点事儿 如果你在计算机视觉这个圈子里待过一阵子,大概率会听过 OpenCV 的大名。而 OpenCV-Python,可以看作是这座庞大宫殿的一扇侧门——它保留了宫殿里绝大多数珍宝,却提供了一条更轻快、更亲切的进入路径。 它究竟是…...

如何快速集成Android Times Square:打造高效日期选择器的完整指南

如何快速集成Android Times Square:打造高效日期选择器的完整指南 【免费下载链接】android-times-square Standalone Android widget for picking a single date from a calendar view. 项目地址: https://gitcode.com/gh_mirrors/an/android-times-square …...

python mapbox

# 聊聊pydeck:当Python遇见地理空间可视化 最近在做一个城市交通数据的分析项目,需要在地图上展示数百万个轨迹点。试了几个库之后,发现pydeck这个工具确实有点意思,今天就来聊聊它。 它到底是什么 pydeck本质上是一个桥梁&#x…...

Janus-Pro-7B多场景落地:在线教育平台AI助教图文解析系统

Janus-Pro-7B多场景落地:在线教育平台AI助教图文解析系统 1. 项目背景与价值 在线教育行业正面临着一个核心挑战:如何为海量学习内容提供个性化的智能辅导。传统教育平台依赖人工答疑和标准化内容,难以满足学生多样化的学习需求。Janus-Pro…...