Linux
本文用于介绍如何将此拓展板部署到Linux平台,因为此拓展板基于GPIO设计,在Linux中只目前只能使用gpiolib接口驱动,因为各平台实现方式不同,所以速度会有较大差异,效率普遍低下,但是能用😊。
相关资料仓库:https://github.com/embeddedboys/pico_dm_qd3503728_linux
Luckfox Pico & Max
luckfox pico有多个硬件版本型号,目前我们只对最基础的版本做了适配,也就是Luckfox Pico IPC
,我们也购买了Luckfox Pico Max,适配工作正在进行中。
luckfox pico有两个版本的SDK,分别是Buildroot和Ubuntu,我们针对这两个版本都做了适配。
硬件改动 飞线
在使用Luckfox Pico的时候,需要先飞两根线,Max 版本无需飞线。
短接
GP21
和GP22
,因为luckfox pico的GP22是NC(无连接)的短接电阻
R3
和R4
的左侧,使背光常开,因为luckfox pico的GP28是NC
Buildroot
1. 修改设备树
说明
Luckfox Pico、Pro、Max的引脚分布是不同的,所以不能套用同一份设备树。
在根节点中添加如下节点
ili9488 {
status = "okay";
compatible = "ultrachip,uc8253";
pinctrl-names = "default";
pinctrl-0 = <&i80_pins>;
fps = <30>;
buswidth = <8>;
debug = <0x7>;
db = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PB3 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC7 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC6 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC5 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PD2 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC0 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PC3 GPIO_ACTIVE_HIGH>,
<&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>,
<&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
dc = <&gpio4 RK_PA3 GPIO_ACTIVE_HIGH>; //RS
wr = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
reset = <&gpio4 RK_PA4 GPIO_ACTIVE_HIGH>; //RES
};
修改pinctrl,设定gpio方向、驱动强度等
&pinctrl {
i80 {
i80_pins: i80-pins {
rockchip,pins =
<1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<1 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<4 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>,
<4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none_drv_level_0>;
};
};
};
2. 修改内核配置,开启fb console支持 3. 重新编译,烧录boot.img,重启
./build.sh kernel
4. 编译、加载fb驱动
git clone https://github.com/embeddedboys/pico_dm_qd3503728_linux
cd pico_dm_qd3503728_linux
# 修改 Makefile 中这个三个变量到您设备的路径
# ARCH := arm
# CROSS_COMPILE := /home/developer/sources/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-
# KERN_DIR := /home/developer/sources/luckfox-pico/sysdrv/source/kernel
make
adb push ili9488_fb.ko /root/
adb shell
# at device side start
insmod ili9488_fb.ko
# at device side end
如果您觉得太麻烦了,可以使用我们编译好的文件,但这会覆盖您设备当前的内核及设备树,操作步骤如下
- 下载固件
或者到如下仓库路径下载
https://github.com/embeddedboys/pico_dm_qd3503728_linux/tree/main/luckfox-pico
- 将固件推送至设备中
adb push boot.img /root/
adb push ili9488_fb.ko /root/
- 使用adb访问设备终端,烧录boot.img
adb shell
# 此时已位于设备端
dd if=/root/boot.img of=/dev/mmcblk1p4 bs=1M && reboot
- 待设备重启完成后,再次使用adb访问设备终端,加载设备驱动
adb shell
# 此时已位于设备端
insmod /root/ili9488_fb.ko
- 此时可以看到屏幕已经出现fb console

Ubuntu
Luckfox Pico Ubuntu server 安装桌面环境

触摸暂时还没有调通,因为我无法在该平台上使用i2c-gpio,具体原因忘记了,挺棘手的,不过还可以使用usb host连接鼠标键盘操作。
但是这样就没法通过adb调试了,所以你需要事先写一个systemd服务,在开机初始化好一切需要的事务。 Max 或者 Pro版本因为有网口,所以还可以通过网络登陆设备。
Milk-V Duo
https://github.com/embeddedboys/pico_dm_qd3503728_linux
硬件改动 飞线
飞线跟luckfox pico章节中保持一致即可
Buildroot
1. 设置好buildroot工程
sudo apt install -y pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools android-sdk-libsparse-utils jq python3-distutils scons parallel tree python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tcl openssh-client cmake expect
git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1
至少运行build.sh
一次.
./build.sh lunch
# choose milkv-duo
./build.sh
2. 加载环境变量
source device/milkv-duo/boardconfig.sh
source build/milkvsetup.sh
defconfig cv1800b_milkv_duo_sd
3. 编译内核、设备树
cd linux_5.10
cp /home/developer/embeddedboys/pico_dm_qd3503728_linux/milk-v-duo/cv1800b_milkv_duo_sd.dts \
linux_5.10/arch/riscv/boot/dts/cvitek/
make dtbs
4. 重新烧录内核、设备树
cd ramdisk/build/cv1800b_milkv_duo_sd/workspace
cp ~/sources/duo-buildroot-sdk/linux_5.10/arch/riscv/boot/dts/cvitek/cv1800b_milkv_duo_sd.dtb .
cp ~/sources/duo-buildroot-sdk/linux_5.10/arch/riscv/boot/Image .
lzma -k Image
mkimage -f multi.its boot.sd
# at device side start
mkdir -p /boot
mount /dev/mmcblk0p1 /boot/
# at device side end
scp boot.sd root@192.168.42.1:/boot/
然后重启duo板子,应用新的内核。
5. 编译加载拓展板驱动
cd pico_dm_qd3503728_linux
make -f Makefile.milk-v-duo
scp milk-v-duo/test.sh root@192.168.42.1:~/
scp ili9488_fb.ko root@192.168.42.1:~/
# at device side start
./test.sh
# at device side end
脚本test.sh
的内容
#!/bin/sh
duo-pinmux -w GP0/GP0 > /dev/null 2>&1
duo-pinmux -w GP1/GP1 > /dev/null 2>&1
duo-pinmux -w GP2/GP2 > /dev/null 2>&1
duo-pinmux -w GP3/GP3 > /dev/null 2>&1
duo-pinmux -w GP4/GP4 > /dev/null 2>&1
duo-pinmux -w GP5/GP5 > /dev/null 2>&1
duo-pinmux -w GP6/GP6 > /dev/null 2>&1
duo-pinmux -w GP7/GP7 > /dev/null 2>&1
duo-pinmux -w GP8/GP8 > /dev/null 2>&1
duo-pinmux -w GP9/GP9 > /dev/null 2>&1
duo-pinmux -w GP10/GP10 > /dev/null 2>&1
duo-pinmux -w GP11/GP11 > /dev/null 2>&1
duo-pinmux -w GP12/GP12 > /dev/null 2>&1
duo-pinmux -w GP13/GP13 > /dev/null 2>&1
duo-pinmux -w GP14/GP14 > /dev/null 2>&1
duo-pinmux -w GP15/GP15 > /dev/null 2>&1
rmmod ili9488_fb.ko
insmod ili9488_fb.ko
milk-v duo 使用一个名为duo-pinmux
的用户空间工具来进行引脚复用,非常的奇怪。
6. 编译并运行lvgl demo
由于buildroot的工具链指向特定的动态库,需要在板子中进行软链接
# at device side start
cd /lib
ln -sf ../usr/lib64v0p7_xthead/lp64d/libc.so ./ld-musl-r
iscv64xthead.so.1
# at device side end
git clone https://github.com/lvgl/lv_port_linux_frame_buffer.git
cd lv_port_linux_frame_buffer
checkout release/v8.2
# 修改 main.c
# disp_drv.hor_res = 480;
# disp_drv.ver_res = 320;
# 修改 lv_conf.h
# #define LV_COLOR_DEPTH 16
make CC=/home/developer/sources/duo-buildroot-sdk/host-tools/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-gcc -j20
scp demo root@192.168.42.1:~/
# at device side start
./demo
# at device side end
此时lvgl demo应该已经在拓展板上显示出来了。
7. 跑分、 性能优化
TODO
Milk-V Duo 256M
待添加,我们这里没有此开发板,但他们都使用同一份sdk,所以应该是大同小异的,用户可以先自行尝试移植。