rk3588 编译(使用公有源码)和烧录(sd、emmc)

使用 github 上的代码进行编译
这些代码和其他板卡厂商提供的略有不同,以此为准
https://github.com/rockchip-linux/rkbin
https://github.com/rockchip-linux/u-boot
https://github.com/rockchip-linux/kernel // 将分支切换到 5.10 再下载
下载他们的压缩包,自行解压

mkimage 需要使用 rockchip 提供的 uboot 里的
sd 的启动优先级低于 emmc,如果 emmc 里有固件就不能从 sd 卡启动,所以需要擦除 emmc,可以用 rkdeveloptool 工具来操作

rk3588_spl_loader_v1.11.112.bin(MiniLoader.bin)
    在 rkbin 下执行 ./tools/boot_merger ./RKBOOT/RK3588MINIALL.ini

uboot
    编译
        sudo apt install gcc-aarch64-linux-gnu
        export CROSS_COMPILE=aarch64-linux-gnu-  // 新的终端都要先执行一次
        make rk3588_defconfig
        make -j16

    idbloader.img
        tools/mkimage -n rk3588 -T rksd -d ../rkbin/bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.11.bin:spl/u-boot-spl.bin idbloader.img

    u-boot.its
        arch/arm/mach-rockchip/make_fit_atf.sh u-boot.dtb > uboot.its

    u-boot.itb
        cp ../rkbin/bin/rk35/rk3588_bl31_v1.33.elf ./bl31.elf
        cp ../rkbin/bin/rk35/rk3588_bl32_v1.13.bin ./tee.elf
        tools/mkimage -f uboot.its -E uboot.itb

    spi flash 固件
        dd if=/dev/zero of=rkspi_loader.img bs=1M count=0 seek=4
        /sbin/parted -s rkspi_loader.img mklabel gpt
        /sbin/parted -s rkspi_loader.img unit s mkpart idbloader 64 1023
        /sbin/parted -s rkspi_loader.img unit s mkpart uboot 1024 7167
        dd if=idbloader.img of=rkspi_loader.img seek=64 conv=notrunc
        dd if=u-boot.itb of=rkspi_loader.img seek=1024 conv=notrunc

linux
    配置文件和设备树
        使用板卡厂商提供的设备树,这里用的是飞凌的 ok3588c
            FET3588-C.dtsi、OK3588-C-Camera.dtsi、OK3588-C-common.dtsi、OK3588-C-Linux.dts 放到 arch/arm64/boot/dts/rockchip 里
            电源管理芯片的设备树有单双之分,不能通用。单:rk3588-rk806-single.dtsi;双:rk3588-rk806-dual.dtsi

        修改
            OK3588-C-Camera.dtsi
                EXTIO_GPIO_P06 改为 RK_PA6
                    EXTIO_GPIO_P07 改为 RK_PA7
                EXTIO_GPIO_P10 改为 RK_PB0
                    EXTIO_GPIO_P11 改为 RK_PB1
                EXTIO_GPIO_P05 改为 RK_PA5
                EXTIO_GPIO_P04 改为 RK_PA4
                EXTIO_GPIO_P01 改为 RK_PA1
                EXTIO_GPIO_P00 改为 RK_PA0
                EXTIO_GPIO_P03 改为 RK_PA3
                EXTIO_GPIO_P02 改为 RK_PA2

                从板卡厂商整合包里的 kernel/include/dt-bindings/pinctrl/rockchip.h 得出。这是 TCA6424ARGJR 芯片,用于 i2c 扩展 io,比如 EXTIO_GPIO_P06 是扩展出的 io 的序号,用这个需要修改 rockchip.h 文件,这里用已有 RK_PA6 代替序号,RK_PA6 也是序号

            OK3588-C-common.dtsi
                修改 dsi0_in_vp2 和该节点上面的 dsi0 节点
                    两个节点里的 status 都赋值为 okay // 这样 dsi0 的 mipi 屏就能用了

                修改 i2c2 里的 ft5x06_dsi0 节点
                    取消注释 interrupt-parent、interrupts,注释 irq-gpio // 驱动代码不同导致的修改

                修改 i2c2 里的 gt9xx_dsi0 节点
                    status 赋值为 disabled // ft5x06_dsi0 和 gt9xx_dsi0 使用同一中断脚,所以节点不能都开启,这里开启的是 ft5x06_dsi0,所以 gt9xx_dsi0 就要关闭

            OK3588-C-Linux.dts
                如果要烧录到 sd 卡里,需要更改 bootargs,修改 / 里的 chosen 节点
                    bootargs 值的 root 赋值为 /dev/mmcblk0p4 // mmcblk0 是设备号,从 0 开始,p4 是分区 4,从 1 开始

                修改 / 里的 fiq_debugger 节点
                    rockchip,baudrate 赋值为 1500000 // 串口波特率

            arch/arm64/boot/dts/rockchip/Makefile
                添加 dtb-$(CONFIG_ARCH_ROCKCHIP) += OK3588-C-Linux.dtb

    编译
        export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- // 新的终端都要先执行一次
        make rockchip_linux_defconfig rk3588_linux.config
        make menuconfig // rockchip 提供的公有配置也能启动,额外的驱动比如 ft5x06 的驱动就要在这自行开启
        make -j16

        如果编译报 ...error, forbidden warning,就在 ./scripts/gcc-wrapper.py 中注释掉 run_gcc() 里的 interpret_warning()

    boot.its
        boot.its 在板卡厂商或官方整合包/device/rockchip/rk3588 下
        
        boot.its 修改如下
            fdt 节点
                data = /incbin/("arch/arm64/boot/dts/rockchip/OK3588-C-Linux.dtb"); // 文件的在电脑的路径,工具会去这里找
                arch = "arm64";

            kernel 节点
                data = /incbin/("arch/arm64/boot/Image.gz");
                arch = "arm64";
                compression = "gzip";

                制作 .gz 镜像:cat Image | gzip -n -f -9 > Image.gz

            删除 resource 节点

    boot.itb
        ../u-boot/tools/mkimage -f boot.its -E -p 0x800 boot.itb

rootfs
    sudo debootstrap --arch=arm64 bookworm rootfs https://mirrors.ustc.edu.cn/debian // bookworm 是 debian 12 的代号,rootfs 是放文件的目录

    sudo chroot rootfs
    passwd root // 设置 root 用户的密码,不设置密码就登录不了,默认是 root 用户
    exit

    dd if=/dev/zero of=rootfs.img bs=1G count=1
    mkfs.ext4 rootfs.img
    mkdir rootfs_mount
    sudo mount rootfs.img rootfs_mount
    sudo cp -rfp rootfs/* rootfs_mount
    sudo umount rootfs_mount
    e2fsck -f rootfs.img
    resize2fs -M rootfs.img // 调整镜像为实际大小

烧录
    烧录到 sd
        分区
            sudo sgdisk -z -og /dev/sdb
                sudo sgdisk --resize-table=128 -a 1 -n 1:64:16383 -c 1:idbloader -n 2:16384:32767 -c 2:uboot -n 3:32768:163839 -c 3:boot -n 4:163840: -c 4:rootfs -p /dev/sdb

        烧录
                sudo dd if=idbloader.img of=/dev/sdb1 bs=4K
            sudo dd if=uboot.itb of=/dev/sdb2 bs=4K
            sudo dd if=boot.itb of=/dev/sdb3 bs=4K
            sudo dd if=rootfs.img of=/dev/sdb4 bs=4K
            sync

    烧录到 emmc
        rkdeveloptool
            下载:https://github.com/rockchip-linux/rkdeveloptool

            编译
                sudo apt install libudev-dev libusb-1.0-0-dev dh-autoreconf pkg-config libusb-1.0
                autoreconf -i
                ./configure
                make
                sudo make install

        parameter.txt
            在 官方固件/device/rockchip/rk3588 下

            修改
                CMDLINE 里面的分区部分改为 0x00004000@0x00004000(uboot),0x00020000@0x00008000(boot),-@0x00028000(rootfs:grow)

                uboot 分区大小为 8MByte,boot 分区大小为 64MByte,rootfs 分区占据之后的所有空间

            在 OK3588-C-Linux.dts 里 / 下的 chosen 节点里有 bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 root=PARTUUID=614e0000-0000 rw rootwait";,这个在 rk3588-linux.dtsi 里也有,这是 uboot 传给 linux 的参数,614e0000-0000 就是 parameter.txt 里的 rootfs 的 uuid,内核就是靠这个在 GPT 分区表里找到 rootfs 的分区

        烧录
            先将设备启动到 maskrom 模式

            sudo rkdeveloptool db rk3588_spl_loader_v1.11.112.bin // 先要下载这个才能进行其他操作
            sudo rkdeveloptool ef // 擦除,按需使用
            sudo rkdeveloptool gpt parameter.txt
            sudo rkdeveloptool wl 0x40 idbloader.img
            sudo rkdeveloptool wl 0x4000 u-boot.itb
            sudo rkdeveloptool wl 0x8000 boot.itb
            sudo rkdeveloptool wl 0x28000 rootfs.img

开发板启动后
    登录,用户名为 root

    联网
        ip link // 查看网卡
        ip link set end0 up // 启动 end0 网卡
        dhclient end0 // end0 dhcp
        ip addr // 查看 ip
        ping 8.8.8.8 // 测试网络是否连通
        date // 查看时间
        date -s "2023-06-15 20:33:05" // 设置为当前时间,如果本地时间和当前时间误差过大就访问不了 https
        apt update // 测试网络是否正常

    扩容分区
        lsblk // 可以查看挂载在 / 的分区名和分区的物理大小,这里的分区名是 mmcblk0p4
        df -h // 可以查看挂载在 / 的分区的逻辑大小
        resize2fs /dev/mmcblk0p4 // 调整 / 的大小到整个分区的大小
        df -h // 验证

    自动同步时间
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime // 设置时区
        apt install chrony // 安装时会启动其自动化配置,安装即可
        systemctl status chronyd.service // 看到有 Active: active (running) 就行了
        date // 验证

其他
    4 线网线不可用,虽能获取 ip 但上不了网。如果接在下级路由器并且该路由器工作在交换机模式时,需要注意地址的段须是根路由器的段,包括路由表、网关等。dhclient 获取的 ip 可能是网线连接的那个路由器的段,有些路由器的段会从 192.168.2.1 开始,交换机模式相当于扩展网口,如果 ip 段不一样不能正常工作,如果出现这种情况可以连接根路由器测试是否正常,然后手动设置 ip
    ip addr flush dev end0 // 删除 end0 网卡的所有 ip
    ip addr add 192.168.1.22/24 dev end0 // 添加 ip
    ip route flush dev end0 // 删除路由表
    ip route add 192.168.1.0/24 dev end0 // 路由 ip
    ip route add default via 192.168.1.1 dev end0 // 网关 ip

    实例
        root@ubuntu-VMware-Virtual-Platform:~# ip addr
        1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
            link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
            inet 127.0.0.1/8 scope host lo
               valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
               valid_lft forever preferred_lft forever
        2: end1: mtu 1500 qdisc noop state DOWN group default qlen 1000
            link/ether 32:f6:dd:52:06:46 brd ff:ff:ff:ff:ff:ff
        3: end0: mtu 1500 qdisc mq state UP group default qlen 1000
            link/ether 2e:f6:dd:52:06:46 brd ff:ff:ff:ff:ff:ff
            inet 192.168.1.60/24 brd 192.168.1.255 scope global dynamic end0
               valid_lft 259137sec preferred_lft 259137sec
            inet6 240e:3a1:ef1:4ee0:2cf6:ddff:fe52:646/64 scope global dynamic mngtmpaddr 
               valid_lft 7125sec preferred_lft 3525sec
            inet6 fe80::2cf6:ddff:fe52:646/64 scope link 
               valid_lft forever preferred_lft forever

        root@ubuntu-VMware-Virtual-Platform:~# ip route
        default via 192.168.1.1 dev end0 
        192.168.1.0/24 dev end0 proto kernel scope link src 192.168.1.60

你可能感兴趣的:(rk3588,linux,嵌入式硬件)