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

使用 github 上的代码进行编译
https://github.com/rockchip-linux/rkbin/tree/master
https://github.com/rockchip-linux/u-boot/tree/next-dev
https://github.com/rockchip-linux/kernel/tree/develop-5.10
下载他们的压缩包,自行解压,解压后把文件夹名里的分支名去掉

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

使用 debian 系统

软件环境

aptsudo apt install make gcc-aarch64-linux-gnu build-essential device-tree-compiler flex bison libncurses-dev libssl-dev qemu-user-static debootstrappython2如果装不了就像这样手动编译安装wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz // python2 最后的版本tar -xvf Python-2.7.18.tgzcd Python-2.7.18./configuremake -j16sudo make altinstall使用 which python2 查找 python2 的位置,如果没有就查找 python2.7,然后在 python2.7 的位置做一个 python2 指向 python2.7 的软链接,比如 sudo ln -s /usr/local/bin/python2.7 /usr/local/bin/python2python3use "which python" or "which python3", if no found python but found python3, it use "sudo ln -s /usr/bin/python3 /usr/bin/python"

uboot

编译export CROSS_COMPILE=aarch64-linux-gnu-  // 新的终端都要先执行一次make rk3588_defconfigmake -j16idbloader.imgtools/mkimage -n rk3588 -T rksd -d ../rkbin/bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.11.bin:spl/u-boot-spl.bin idbloader.imgu-boot.itscp ../rkbin/bin/rk35/rk3588_bl31_v1.38.elf bl31.elfarch/arm/mach-rockchip/make_fit_atf.sh u-boot.dtb > uboot.itsu-boot.itbcp ../rkbin/bin/rk35/rk3588_bl32_v1.13.bin tee.bintools/mkimage -f uboot.its -E uboot.itbspi 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 7167dd if=idbloader.img of=rkspi_loader.img seek=64 conv=notruncdd if=u-boot.itb of=rkspi_loader.img seek=1024 conv=notrunc

linux

配置文件和设备树使用板卡厂商提供的设备树,这里用的是飞凌的 ok3588cFET3588-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.dtsiEXTIO_GPIO_P06 改为 RK_PA6EXTIO_GPIO_P07 改为 RK_PA7EXTIO_GPIO_P10 改为 RK_PB0EXTIO_GPIO_P11 改为 RK_PB1EXTIO_GPIO_P05 改为 RK_PA5EXTIO_GPIO_P04 改为 RK_PA4EXTIO_GPIO_P01 改为 RK_PA1EXTIO_GPIO_P00 改为 RK_PA0EXTIO_GPIO_P03 改为 RK_PA3EXTIO_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.dtsidsi0_in_vp2 和紧贴该节点上面的 dsi0两个节点里的 status 都赋值为 okay // 这样 dsi0 的 mipi 屏就能显示了i2c2 里的 ft5x06_dsi0取消注释 interrupt-parent、interrupts,注释 irq-gpio // 驱动代码不同导致的修改i2c2 里的 gt9xx_dsi0status 赋值为 disabled // ft5x06_dsi0 和 gt9xx_dsi0 使用同一中断脚,所以节点不能都开启,这里开启的是 ft5x06_dsi0,所以 gt9xx_dsi0 就要关闭i2c2 里的触摸芯片对应的是 dsi0 接口,如果屏幕接 dsi1 上就用同样的方法修改 i2c5OK3588-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.dtbboot.itsfdt 节点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 节点configurations 节点删除 conf 里的 multi 部分删除 conf/sign-images 里的 multi 部分编译export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- // 新的终端都要先执行一次make rockchip_linux_defconfig rk3588_linux.configmake menuconfig // rockchip 提供的公有配置也能启动,额外的驱动比如 ft5x06 的驱动就要在这自行开启。ft5x06 的位置在 Device Drivers/Input device support/Touchscreens/EDT FocalTech FT5x06 I2C Touchscreen supportmake -j16如果编译报 ...error, forbidden warning,就在 scripts/gcc-wrapper.py 中注释掉 run_gcc() 里的 interpret_warning()boot.itb../u-boot/tools/mkimage -f boot.its -E -p 0x800 boot.itb

rootfs

sudo debootstrap --arch=arm64 bookworm rootfs https://mirrors.tuna.tsinghua.edu.cn/debian/ // bookworm 是 debian 12 的代号,rootfs 是放文件的目录sudo chroot rootfs
passwd root // 设置 root 用户的密码,不设置密码就登录不了,默认是 root 用户
exitdd if=/dev/zero of=rootfs.img bs=1G count=1
sudo mkfs.ext4 rootfs.img
mkdir rootfs_mount
sudo mount rootfs.img rootfs_mount
sudo cp -rfp rootfs/* rootfs_mount
sudo umount rootfs_mount
rm -r rootfs_mount
sudo e2fsck -f rootfs.img
sudo resize2fs -M rootfs.img // 调整镜像为实际大小

烧录

把镜像都拿到一个单独的文件夹里,方便操作烧录到 sd卡分区sudo sgdisk -z -og /dev/sdb // sdb 是 sd卡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 // "boot" 名字不要改烧录sudo dd if=idbloader.img of=/dev/sdb1 bs=4Msudo dd if=uboot.itb of=/dev/sdb2 bs=4Msudo dd if=boot.itb of=/dev/sdb3 bs=4Msudo dd if=rootfs.img of=/dev/sdb4 bs=4Msync烧录到 emmcrkdeveloptool下载:https://github.com/rockchip-linux/rkdeveloptool编译sudo apt install libudev-dev libusb-1.0-0-dev dh-autoreconf pkg-config libusb-1.0autoreconf -i./configuremakesudo make installrk3588_spl_loader_v1.11.112.bin(MiniLoader.bin)在 rkbin 下执行 ./tools/boot_merger ./RKBOOT/RK3588MINIALL.iniparameter.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.txtsudo rkdeveloptool wl 0x40 idbloader.imgsudo rkdeveloptool wl 0x4000 u-boot.itbsudo rkdeveloptool wl 0x8000 boot.itbsudo rkdeveloptool wl 0x28000 rootfs.img

minicom

串口工具 "minicom",使用 "sudo minicom -D /dev/ttyUSB0", 修改 bps 为 1500000, flow control 设置为 "No", 选择保存为默认 "Save setup as dfl"

开发板启动后

登录用户名为 root扩展根分区lsblk // 查看挂载在 / 的分区名和分区的物理大小,这里的分区名是 mmcblk0p4df -h // 查看挂载在 / 的分区的逻辑大小resize2fs /dev/mmcblk0p4 // 调整系统记录的 / 的大小到剩余分区的大小联网测试ip addr // 查看网卡信息ip link set end0 up // 启动 end0 网卡dhclient end0 // end0 dhcpping 8.8.8.8 // 测试网络是否连通date -s '2023-07-09 19:07:00' // 设置为实际时间,如果系统时间和实际时间误差过大就访问不了 https,用不了软件源apt update // 测试网络是否正常更改软件源添加到 /etc/apt/sources.list 文件里deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stable main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian/ stable-updates main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian/ stable-backports main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian-security stable-security main contrib non-free non-free-firmwareapt update        网卡自动联网apt install network-manager // 不需要配置时间自动同步ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime // 设置时区apt install chronytimedatectl set-ntp true // 自动获取时间安装桌面xfceapt install xfce4 onboardnano /etc/lightdm/lightdm-gtk-greeter.conf // 启用软键盘,登录界面点击右上角的小人图标,选择 On Screen Keyboard 就可以唤起软键盘进行输入[greeter] 下的 keyboard 取消注释并赋值为 onboard重启之后屏幕就显示登录页面了。登录进去后要使用软键盘需要设置一下,点击 状态栏/Applications/Settings/OnBoard Settings,进入软件后点击 General,选择 Auto show when editing text,关闭软件。再点击 状态栏/Applications/Accessories/OnBoard 以启动软键盘,状态栏就会显示 onboard 的图标,就可以在有编辑操作的时候自动唤起软键盘了,每次登录后都要启动一次软键盘。桌面里的命令行无法唤起软键盘,这时可以点击状态栏里的软键盘图标,让软键盘常驻,然后就可以输入了,点击软键盘的关闭按钮就可以关闭软键盘界面浏览器apt install chromium fonts-wqy-zenhei任务管理器apt install xfce4-taskmanagergnomeapt install gnome

其他

如果接在下级路由器并且该路由器工作在交换机模式时,需要注意地址的段须是根路由器的段,包括路由表、网关等。
dhclient 获取的 ip 可能是网线连接的那个路由器的段,有些路由器的段会从 192.168.2.1 开始,交换机模式相当于扩展网口,如果 ip 段不一样不能正常工作,如果出现这种情况可以连接根路由器测试是否正常,然后向指定 ip 获取参数(dhclient -s 192.168.1.1),或者手动设置 ipip 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@debian:~# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever2: end1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000link/ether 32:f6:dd:52:06:46 brd ff:ff:ff:ff:ff:ff3: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 2e:f6:dd:52:06:46 brd ff:ff:ff:ff:ff:ffinet 192.168.1.60/24 brd 192.168.1.255 scope global dynamic noprefixroute end0valid_lft 258942sec preferred_lft 258942secinet6 240e:3a1:ef1:4ee0:9eb2:ec27:f9f9:c09e/64 scope global dynamic noprefixroute valid_lft 6945sec preferred_lft 3345secinet6 fe80::b0b2:5f61:7807:244/64 scope link noprefixroute valid_lft forever preferred_lft foreverroot@debian:~# ip routedefault via 192.168.1.1 dev end0 proto dhcp src 192.168.1.60 metric 100 192.168.1.0/24 dev end0 proto kernel scope link src 192.168.1.60 metric 100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ教程-(4)-领域模型概述

Apache RocketMQ 是一款典型的分布式架构下的中间件产品&#xff0c;使用异步通信方式和发布订阅的消息传输模型。通信方式和传输模型的具体说明&#xff0c;请参见下文通信方式介绍和消息传输模型介绍。 Apache RocketMQ 产品具备异步通信的优势&#xff0c;系统拓扑简单、上下…

Java-IDEA好用的插件

Lombok&#xff0c;结合一些列注解&#xff0c;帮我们轻松解决重复编写实体类get、set、toString、build、构造方法等麻烦 Chinesepinyin-CodeComp&#xff0c;让界面汉化&#xff0c;使用起来更有亲和力 MyBatisX,点击小鸟图标&#xff0c;轻松再Mapper接口与xml文件之间实…

无涯教程-html(val)

html(val)方法设置每个匹配元素的html内容。此属性在XML文档上不可用&#xff0c;但适用于XHTML文档。 html( val ) - 语法 selector.html( val ) 这是此方法使用的所有参数的描述- val - 任何字符串 html( val ) - 示例 以下示例将获取第一段的HTML内容&#xff0c;并…

【算法与数据结构】104、111、LeetCode二叉树的最大/最小深度

文章目录 一、题目二、层序遍历法三、递归法四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、层序遍历法 思路分析&#xff1a;两道题都可以用层序遍历&#xff08;迭代法&#xff09;来做&#xff0c;遍历完…

帮助中心内容需要囊括什么?(内含案例分享)

给产品制作一个帮助中心&#xff0c;让用户能够通过访问帮助中心查看产品相关内容&#xff0c;尽快了解产品&#xff0c;熟悉操作。不仅仅局限于售后&#xff0c;在售中售前都能够发挥很大的作用&#xff0c;帮助用户全面了解产品&#xff0c;减少销售的工作量&#xff0c;节约…

如何开展企业级spring cloud微服务开发实践落地

随着互联网技术的不断发展&#xff0c;微服务架构已经成为了企业级应用开发的重要趋势。Spring Cloud是基于Spring Boot的微服务框架&#xff0c;它提供了一系列的组件和工具&#xff0c;可以帮助开发者快速搭建、部署和管理微服务系统。本文将介绍如何开展企业级Spring Cloud微…

Zookeeper命令总结

目录 1、常用命令2、ls path3、create xxx创建持久化节点创建临时节点创建持久化序列节点 4、get path5、set path6、delete path7、监听器总结1&#xff09;节点的值变化监听2&#xff09;节点的子节点变化监听&#xff08;路径变化&#xff09;3&#xff09;当某个节点创建或…

最优化方法

一. 图论 1.最小生成树 图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树 • 适用场景&#xff1a;道路规划、通讯网络规划、管道铺设、电线布设等 题目数据 kruskal算法 稀疏图&#x…

oracle单个用户最大连接数限制

项目经理反馈&#xff0c;现场已做了单个用户的最大连接数2000的限制&#xff0c;但数据库还是报无法连接&#xff0c;故障用户的连接数已3800多了。 查看日志报错如下 2023-07-20T13:07:57.79465308:00 Process m000 submission failed with error 20 Process m000 submiss…

HDFS的设计目标和重要特性

HDFS的设计目标和重要特性 设计目标HDFS重要特性主从架构分块存储机制副本机制namespace元数据管理数据块存储 设计目标 硬件故障(Hardware Failure)是常态&#xff0c;HDFS可能有成百上千的服务器组成&#xff0c;每一个组件都有可能出现故障。因此古见检测和自动快速恢复的H…

梯度提升树的基本思想

目录 1. 梯度提升树 VS AdaBoost 2. GradientBoosting回归与分类的实现 2.1 GradientBoosting回归 2.2 GradientBoosting分类 1. 梯度提升树 VS AdaBoost 梯度提升树&#xff08;Gradient Boosting Decision Tree&#xff0c;GBDT&#xff09;是提升法中的代表性算法&#…

赛码-0726

01串的魔法 思路&#xff1a;虽然标着dp&#xff0c;其实是滑动窗口问题&#xff0c;dp 会超时 import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int k scanner.nextInt…

帆软报表设计器设置步骤

1、连接工作目录&#xff08;可以是远程服务器&#xff09; 在打开的界面中设置具体的远程地址 一个报表文件可以有多个数据集、但是数据集依附于报表文件的存在&#xff0c;不能跨报表共享。 先补充这么多&#xff0c;有遇到问题再写一点。 &#xff08;完&#xff09;

指针易混淆概念:*p++,*(p++),++(*p)

&#xff08;1&#xff09;a[1]和&a[1] a[1]:二维数组的第二行元素&#xff0c;即a[1]是以a[1][0]开头的一维数组&#xff0c;类型是一级指针 &a[1]:二维数组的第二行元素的地址&#xff0c;类型是二级指针 &#xff08;2&#xff09;a1与*&#xff08;a1&#xff09…

我的创作纪念日——暨成为创作者满1024日的总结

我的创作纪念日 机缘收获日常成就憧憬 机缘 最初写博客&#xff0c;是因为身边一个同事&#xff0c;写了几篇博客&#xff0c;然后给我臭摆&#xff0c;于是&#xff0c;不服输的自己也动手开始写了。之后&#xff0c;就逐渐写出惯性来了&#xff0c;现在每月4篇&#xff0c;基…

Cpp 01 — namespace命名空间、C++的输入与输出、缺省参数、函数重载、引用、隐式类型转换

前言&#xff1a;本文章主要用于个人复习&#xff0c;追求简洁&#xff0c;感谢大家的参考、交流和搬运&#xff0c;后续可能会继续修改和完善。 因为是个人复习&#xff0c;会有部分压缩和省略。 一、namespace命名空间 C使用命名空间(namespace)来避免命名冲突。 在定义一个…

最小生成树

最小生成树 1.朴素Primm~n^2稠密图 Part1:例题 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 数据范围&#xff1a; 1≤n≤5001≤n≤…

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

Vue mixin 混入

可以复用的组件&#xff0c;我们一般会抽离&#xff0c;写成公共的模块。 可以复用的方法&#xff0c;我们一般会抽离&#xff0c;写成公共的函数。 那么 在 Vue 中&#xff0c;如果 某几个组件实例 VueComponent 中、或者 整个 Vue 项目中 都存在相同的配置&#xff0c;那就…

格雷码(Gray Code)的构造

说明 Gray Code是一个数列集合&#xff0c;每个数使用二进位来表示&#xff0c;假设使用n位元来表示每个数好了&#xff0c;任两个数之间只有一个位元值不同&#xff0c;例如以下为3位元的Gray Code&#xff1a; 000 001 011 010 110 111 101 100 由定义可以知道&#xff0c;G…