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 版本无需飞线

  1. 短接GP21GP22,因为luckfox pico的GP22是NC(无连接)的

  2. 短接电阻R3R4的左侧,使背光常开,因为luckfox pico的GP28是NC

Buildroot

1. 修改设备树

rv1103g-luckfox-pico.dts

说明

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

如果您觉得太麻烦了,可以使用我们编译好的文件,但这会覆盖您设备当前的内核及设备树,操作步骤如下

  1. 下载固件

boot.img ili9488_fb.ko

或者到如下仓库路径下载

https://github.com/embeddedboys/pico_dm_qd3503728_linux/tree/main/luckfox-pico

  1. 将固件推送至设备中
adb push boot.img /root/
adb push ili9488_fb.ko /root/
  1. 使用adb访问设备终端,烧录boot.img
adb shell

# 此时已位于设备端
dd if=/root/boot.img of=/dev/mmcblk1p4 bs=1M && reboot
  1. 待设备重启完成后,再次使用adb访问设备终端,加载设备驱动
adb shell

# 此时已位于设备端
insmod /root/ili9488_fb.ko
  1. 此时可以看到屏幕已经出现fb console

Ubuntu

Luckfox Pico Ubuntu server 安装桌面环境

触摸暂时还没有调通,因为我无法在该平台上使用i2c-gpio,具体原因忘记了,挺棘手的,不过还可以使用usb host连接鼠标键盘操作。

Luckfox Pico配置为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,所以应该是大同小异的,用户可以先自行尝试移植。