news 2026/5/2 12:50:07

从T113到D1s:手把手教你移植百问网LVGL Demo到全志RISC-V开发板(含Makefile修改与驱动适配)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从T113到D1s:手把手教你移植百问网LVGL Demo到全志RISC-V开发板(含Makefile修改与驱动适配)

从T113到D1s:RISC-V架构下LVGL移植实战全解析

移植嵌入式GUI项目到新硬件平台往往伴随着架构差异、驱动适配和工具链切换的挑战。最近在将百问网的LVGL Demo从全志T113(ARM架构)迁移到D1s/F133(RISC-V架构)开发板时,我踩遍了几乎所有可能的坑。本文将完整呈现整个移植过程的技术细节,包括Makefile的重构、显示与输入驱动的深度适配,以及那些官方文档从未提及的隐式依赖处理。

1. 环境准备:工具链与基础配置

RISC-V架构的开发环境配置与ARM有着本质区别。首先需要确认开发主机已安装正确的工具链。全志官方推荐的riscv64-unknown-linux-gnu工具链包含了对D1s芯片的特殊指令集优化:

# 验证工具链版本 riscv64-unknown-linux-gnu-gcc --version # 预期输出应包含类似以下信息 # riscv64-unknown-linux-gnu-gcc (T-HEAD Xuantie-900 elf newlib toolchain V2.6.1 B-20220906) 12.1.0

工具链路径配置是移植的第一道门槛。原T113项目的Makefile使用ARM工具链:

CC = arm-linux-gnueabi-gcc

需要替换为RISC-V工具链,并建议采用绝对路径以避免环境变量问题:

CTOOL := riscv64-unknown-linux-gnu- CCL := /path/to/tina-linux/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc CC := ${CCL}/bin/${CTOOL}gcc

关键差异对比表

配置项T113 (ARM)D1s (RISC-V)
工具链前缀arm-linux-gnueabi-riscv64-unknown-linux-gnu-
浮点运算支持-mfloat-abi=hard (默认)-march=rv64gcxthead (需要显式指定)
内存对齐要求32位对齐64位对齐
原子操作实现ARMv7指令集原生支持需要libatomic显式链接

提示:D1s的C906核心支持T-Head扩展指令集,编译时建议添加-march=rv64gcxthead参数以获得最佳性能

2. 显示驱动适配:从sunxifb到D1s帧缓冲

显示驱动是GUI移植的核心环节。T113和D1s虽然都使用全志的显示引擎,但寄存器映射和内存管理存在显著差异。需要从Tina-Linux SDK中获取专为D1s适配的驱动代码:

# 显示驱动文件替换路径 cp Tina-Linux/package/gui/littlevgl-8/lv_drivers/display/* lv_port_linux_frame_buffer/lv_drivers/display/

驱动适配过程中最易出问题的三个关键点:

  1. 内存分配策略

    • T113使用标准的malloc/free
    • D1s需要调用sunxifb_alloc/sunxifb_free进行DMA内存管理
  2. 色彩格式配置

    // 在lv_drv_conf.h中必须确保配置一致 #define SUNXIFB_COLOR_DEPTH 32 #define LV_COLOR_DEPTH 32
  3. 旋转处理差异

    // D1s需要显式设置G2D旋转 uint32_t rotated = LV_DISP_ROT_90; sunxifb_init(rotated);

常见问题排查表

现象可能原因解决方案
屏幕花屏色彩格式不匹配检查LV_COLOR_DEPTH与驱动配置一致
部分区域刷新异常DMA内存未对齐确保分配的内存64字节对齐
旋转后显示错位G2D硬件加速未启用在Makefile中添加-DSUNXIFB_G2D_ROTATE
性能低下未启用双缓冲在lv_conf.h中设置LV_USE_DOUBLE_BUFFER

3. 输入设备适配:evdev触摸校准秘籍

触摸驱动适配比显示驱动更具隐蔽性。D1s开发板的触摸设备节点通常为/dev/input/event2,但需要验证:

# 在开发板上执行获取输入设备信息 evtest # 输出示例: # /dev/input/event2: goodix-ts

在lv_drv_conf.h中修改设备节点:

#define EVDEV_NAME "/dev/input/event2" #define EVDEV_SWAP_AXES 1 // 根据实际触摸方向调整 #define EVDEV_CALIBRATE 1 // 首次运行时需要校准

触摸校准的实战技巧:

  1. 动态校准法

    // 在main函数初始化后添加校准代码 if(access("/etc/pointercal", F_OK) != 0) { system("ts_calibrate"); } system("ts_uinput -d");
  2. 多点触控处理

    // 修改indev驱动初始化 indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = evdev_read; indev_drv.feedback_cb = NULL;
  3. 压力灵敏度调整

    # 在开发板上设置触摸阈值 echo 50 > /sys/module/goodix/parameters/threshold

4. 系统集成:从编译到部署的完整链路

完成代码修改后,构建系统需要特别注意RISC-V的特殊要求。在Makefile中添加必要的链接参数:

LDFLAGS += -latomic -lts # 添加原子操作和触摸库支持 CFLAGS += -mcmodel=medany -mabi=lp64d # 指定内存模型和ABI

构建和部署流程:

  1. 交叉编译

    make clean && make -j$(nproc)
  2. ADB推送

    adb push demo /root/lvgl_demo adb shell chmod +x /root/lvgl_demo
  3. 运行调试

    adb shell "export LVGL_LOG_LEVEL=DEBUG; /root/lvgl_demo"

性能优化参数对比

优化项T113推荐值D1s推荐值说明
显示缓冲区1/10屏幕尺寸1/4屏幕尺寸RISC-V内存带宽更高
刷新率30Hz60HzD1s的DE引擎更强大
线程优先级SCHED_RR 50SCHED_RR 90避免音频中断影响
DMA缓冲区对齐32字节64字节匹配CPU缓存行大小

5. 高级调试:那些手册没告诉你的技巧

在实际移植过程中,有几个关键调试手段能节省大量时间:

内存诊断工具

# 在开发板上监控内存使用 watch -n 1 "cat /proc/meminfo | grep MemFree"

帧率统计方法

// 在lvgl回调中添加性能监控 static void fps_monitor(lv_disp_drv_t *drv, uint32_t time, uint32_t px) { static uint32_t last_time = 0; static uint16_t frame_cnt = 0; frame_cnt++; if(time - last_time >= 1000) { printf("FPS: %d\n", frame_cnt); frame_cnt = 0; last_time = time; } } // 注册到驱动 disp_drv.monitor_cb = fps_monitor;

输入延迟分析

# 使用evtest分析触摸延迟 evtest --grab /dev/input/event2 | awk -F ' ' '{print "Latency:", systime()*1000+$1, "ms"}'

移植完成后,建议进行压力测试:

# 运行LVGL内置测试 adb shell "/root/lvgl_demo --demo=stress --time=300"

在D1s上移植LVGL的体验明显不同于传统ARM平台。RISC-V架构的精简指令集带来了更可预测的性能表现,但同时也需要开发者更深入地理解硬件细节。经过两周的调优,我们的GUI应用在D1s上实现了稳定60FPS的运行效果,触摸响应延迟控制在30ms以内。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 12:49:53

当STM32没有硬件SPI时:我用GPIO模拟SPI读写W25Q64的经验与性能实测

当STM32硬件SPI不可用时:GPIO模拟SPI驱动W25Q64的实战优化指南 在嵌入式开发中,SPI接口因其高速、全双工的特性成为连接Flash、传感器等外设的首选。但实际项目中常遇到硬件SPI被占用或MCU型号限制的情况——比如某次工业控制器开发中,硬件S…

作者头像 李华
网站建设 2026/5/2 12:49:36

UniApp 项目打包 H5 失败?手把手教你检查和修复 package.json 里的隐藏坑

UniApp项目H5打包失败深度排查指南:从package.json到构建优化的完整解决方案 每次看到终端里红色的报错信息,作为开发者的我们总会心头一紧。特别是在使用UniApp进行多端开发时,一个看似简单的H5打包失败可能隐藏着复杂的依赖关系问题。上周我…

作者头像 李华