全志 D1s/F133 移植 LVGL 实战:从 T113 源码到 RISC-V 平台的驱动适配与部署
1. 从ARM到RISC-V为什么要移植LVGL最近在折腾全志D1s/F133开发板的朋友可能都遇到过这个问题网上大部分LVGL例程都是基于ARM架构的T113平台写的但D1s搭载的是RISC-V内核。这就好比你想在MacBook上运行Windows软件虽然都是电脑但底层指令集完全不同。我在第一次尝试移植时编译出来的程序直接报非法指令错误这才意识到架构差异的严重性。RISC-V作为开源指令集近几年在嵌入式领域越来越火。全志D1s采用的玄铁C906内核就是典型代表但这也意味着很多现成的ARM生态软件需要重新适配。LVGL作为轻量级GUI库本身是跨平台的但显示驱动、输入设备这些硬件相关部分必须针对新平台调整。这就涉及到三个核心改造点交叉编译工具链替换、显示/输入驱动适配、以及部署方式的调整。2. 工具链配置从ARM到RISC-V的转身2.1 工具链选择与路径设置原T113项目的Makefile里用的是arm-linux-gnueabi-gcc这在D1s上肯定跑不通。我们需要换成RISC-V工具链全志官方SDK里已经准备好了。以Tina Linux为例工具链通常位于prebuilt/gcc/linux-x86/riscv目录下。我建议直接使用SDK自带的riscv64-unknown-linux-gnu-gcc兼容性最有保障。具体修改方式看这里# 原ARM配置 # CC arm-linux-gnueabi-gcc # 修改为RISC-V配置 CTOOL : riscv64-unknown-linux-gnu- CCL : /your/path/to/Tina-Linux/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702 CC : ${CCL}/bin/${CTOOL}gcc注意路径中的your/path/to要替换为你本地Tina Linux SDK的实际存放位置。我第一次操作时因为路径写错编译时报找不到编译器的错误排查了半小时才发现是路径拼写错误。2.2 编译参数优化RISC-V的工具链参数和ARM有些微差异特别是关于浮点运算和ABI的选项。不过好在LVGL对硬件加速依赖不大保持原有的-O3优化级别即可。如果遇到奇怪的链接错误可以尝试在LDFLAGS里加上-latomic这是RISC-V处理64位原子操作需要的库。3. 显示驱动适配让屏幕亮起来3.1 替换sunxifb驱动全志的帧缓冲驱动sunxifb是显示关键但T113和D1s的版本并不通用。好在官方SDK已经提供了适配好的驱动位置通常在Tina-Linux/package/gui/littlevgl-8/lv_drivers/display/需要把这里的sunxifb.c和sunxifb.h复制到你的项目目录替换掉原来的版本。我实测发现D1s的驱动新增了对G2D硬件加速的支持如果遇到画面撕裂问题可以尝试启用USE_SUNXIFB_G2D_ROTATE宏定义。3.2 初始化参数调整D1s的显示初始化需要特别注意旋转参数。在main.c中sunxifb_init()的调用方式如下uint32_t rotated LV_DISP_ROT_NONE; // 可选ROT_90/180/270 sunxifb_init(rotated);如果屏幕出现倒置或错位先检查硬件连接是否正常再调整旋转参数。我在芒果派上就遇到过屏幕旋转180度的情况改成LV_DISP_ROT_180后显示立即正常。4. 触摸驱动调试精准点击的奥秘4.1 更新evdev驱动和显示驱动类似输入设备驱动也需要更新。从SDK的以下路径获取新版驱动Tina-Linux/package/gui/littlevgl-8/lv_drivers/indev/替换项目中的对应文件后最关键的是修改事件设备路径。不同开发板的触摸设备节点可能不同比如麻雀开发板通常是/dev/input/event2芒果派可能是/dev/input/event1可以通过adb shell evtest命令查看所有输入设备测试哪个对应触摸屏。我在调试时发现事件号不对会导致触摸完全无响应用这个方法很快定位到了正确设备。4.2 校准与轴交换有些触摸屏可能需要调整坐标轴在lv_drv_conf.h中修改这些参数#define EVDEV_SWAP_AXES 0 // 是否交换X/Y轴 #define EVDEV_CALIBRATE 0 // 是否启用软件校准如果触摸位置和实际点击位置有偏移可以先用evtest获取原始坐标范围然后通过lvgl/tests/indev/touchpad.py脚本生成校准参数。5. 部署与验证ADB实战技巧5.1 编译产出物处理编译完成后会生成demo可执行文件但直接上传可能会遇到权限问题。我的经验是先打包adb push demo /tmp adb shell chmod x /tmp/demo mv /tmp/demo /root5.2 运行环境准备D1s上需要确保以下条件帧缓冲设备正常检查/dev/fb0是否存在输入设备权限确保当前用户对/dev/input/event*有读写权限依赖库完整通过ldd demo查看是否有缺失的so库如果运行时提示cannot open display可能是帧缓冲设备未正确初始化需要检查内核启动日志中的显示相关输出。6. 常见问题与解决之道6.1 段错误排查遇到Segmentation fault时可以这样排查使用gdb调试riscv64-unknown-linux-gnu-gdb demo检查堆栈信息bt命令查看崩溃点常见原因内存对齐问题RISC-V对未对齐访问更敏感6.2 性能优化建议虽然C906是64位内核但默认配置下性能有限。几个实测有效的优化手段启用双缓冲在lv_conf.h中设置LV_USE_DOUBLE_BUFFER 1降低颜色深度使用LV_COLOR_DEPTH 16代替32位色开启编译器优化-O3 -fomit-frame-pointer移植完成后跑个lv_demo_benchmark()看看帧率正常应该能达到30FPS以上。我在D1s上实测Widgets Demo能达到35FPS完全满足大多数GUI应用需求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2545867.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!