软件开发指导
开发环境
文件下载
安装虚拟机软件
为虚拟机配置 Windows
添加 Windows 网卡
配置 Windows 网卡
导入虚拟机系统
虚拟机设置
虚拟机与PC互传文件
虚拟机使用
用户和密码
Linux 源码编译
编译环境要求
下载源码包
下载rk3576源码包,路径为:3.软件资料–>3.1源码–>XX
创建编译目录:
mkdir -p ~/my-work/RK3576/02_sources/
把源码放到刚创建的目录中,并进行解压:
tar xvf XX -C ~/my-work/RK3576/02_sources/
依赖安装
sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop git curl u-boot-tools mtd-utils openjdk-8-jdk device-tree-compiler gdisk m4 gnupg flex bison gperf libsdl1.2-dev libesd-java squashfs-tools build-essential zip libncurses5-dev pngcrush schedtool libxml2 libxml2-utils xsltproc libc6-dev g++-multilib lib32z1-dev lib32ncurses-dev lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip liblz4-tool ssh make vim expect patchelf chrpath gawk texinfo diffstat binfmt-support qemu-user-static live-build fakeroot cmake python3-pip rsync subversion python-protobuf sed binutils wget python-is-python2 libncurses5 bzr cvs mercurial patch gzip bzip2 perl tar cpio file bc android-sdk-libsparse-utils android-sdk-ext4-utils -y
整体编译
运行整体编译(编译时间较长),输入如下命令:
buildroot
./build.sh buildroot_update
ubantu22
./build.sh ubuntu22_update
debian12
./build.sh debian12_update
编译成功后在rockdev/目录下可看到相关镜像,其中update.img是所有镜像的集合
单独编译uboot
编译前可先清除生成文件
cd u-boot/
make clean
回到SDK主目录,并进行uboot单独编译
cd ../
./build.sh uboot
单独编译Kernel
编译前可先清除生成文件
cd kernel/
make clean
回到SDK主目录,并进行kernel单独编译
cd ../
./build.sh kernel
单独编译recovery
./build.sh recovery
单独编译rootfs
buildroot
./build.sh buildroot
ubantu22
./build.sh ubuntu22
debian12
./build.sh debian12
打包固件
./build.sh firmware
打包update.img
在rockdev将镜像打包成update.img
在SDK主目录下输入如下命令:
./build.sh updateimg
安卓源码编译
编译环境要求
编译主机需在linux环境中进行,推荐主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
网盘目录下,下载源码包 MYZR-RK3576_Android14_20260407.tar.gz(请将网盘内分卷文件下载后合并可以得到该压缩包)
创建编译目录:
mkdir ~/my-work/rk3576/05_android -p
把源码放到此目录中,并进行解压:
tar xvf MYZR-RK3576_Android14_20260407.tar.gz -C ~/my-work/rk3576/05_android/
配置编译环境
每次打开一个新的终端,都需要进行一个环境配置
进入rk3576_android14目录
输入如下命令配置java环境:
source javaenv.sh
输入如下命令配置编译环境:
source build/envsetup.sh
输入如下命令配置平台环境:
lunch myzr_rk3576-userdebug
./make_rk3576.sh
整体编译
整体编译将整个android系统,包括kernel、uboot、android、recovery。
输入如下命令:
./build.sh -AUCKu
编译时间较长,本人使用16线程主机编译需要4个小时时间(仅作参考!)
成功编译后在rockdev/Image-myzr_rk3576/目录下可看到相关镜像,其中update.img是所有镜像的集合。
单独编译 uboot
编译前可先清除生成文件
cd u-boot/
make clean
回到SDK主目录,并进行uboot单独编译
cd ../
./build.sh -U
单独编译 Kernel
编译前可先清除生成文件
cd kernel/
make clean
回到SDK主目录,并进行kernel单独编译
cd ../
./build.sh -CKA
或使用kernel脚本进行编译
cd kernel-6.1/
./makekernel.sh
单独编译 android
在SDK主目录下
./build.sh -A
打包update.img
在rockdev将镜像打包成update.img
在SDK主目录下
./build.sh -u
开发指导
U-Boot 板级文件
u-boot 板级文件位置:board/myzr/myzr_rk3576
u-boot 板级配置文件:include/configs/myzr_rk3576.h
u-boot 极级编译配置文件:configs/myzr_rk3576_defconfig
Linux 内核板级文件
内核板级编译配置文件:arch/arm64/configs/myzr_linux_defconfig
内核板级设备树文件:arch/arm64/boot/dts/rockchip/myzr-.dts
内核开发参考手册:网盘中《Reference Manual.pdf》
Ethernet
dts 配置
1.1 公共的配置
gmac0: ethernet@2a220000 {
compatible = "rockchip,rk3576-gmac", "snps,dwmac-4.20a";
reg = <0x0 0x2a220000 0x0 0x10000>;
interrupts = <GIC_SPI 293 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 298 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_wake_irq";
rockchip,grf = <&sdgmac_grf>;
rockchip,php_grf = <&ioc_grf>;
clocks = <&cru CLK_GMAC0_125M_SRC>, <&cru CLK_GMAC0_RMII_CRU>,
<&cru PCLK_GMAC0>, <&cru ACLK_GMAC0>,
<&cru CLK_GMAC0_PTP_REF>;
clock-names = "stmmaceth", "clk_mac_ref",
"pclk_mac", "aclk_mac",
"ptp_ref";
resets = <&cru SRST_A_GMAC0>;
reset-names = "stmmaceth";
power-domains = <&power RK3576_PD_SDGMAC>;
dma-coherent;
snps,mixed-burst;
snps,tso;
snps,axi-config = <&gmac0_stmmac_axi_setup>;
snps,mtl-rx-config = <&gmac0_mtl_rx_setup>;
snps,mtl-tx-config = <&gmac0_mtl_tx_setup>;
status = "disabled";
mdio0: mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <0x1>;
#size-cells = <0x0>;
};
gmac0_stmmac_axi_setup: stmmac-axi-config {
snps,wr_osr_lmt = <4>;
snps,rd_osr_lmt = <8>;
snps,blen = <0 0 0 0 16 8 4>;
};
gmac0_mtl_rx_setup: rx-queues-config {
snps,rx-queues-to-use = <1>;
queue0 {};
};
gmac0_mtl_tx_setup: tx-queues-config {
snps,tx-queues-to-use = <1>;
queue0 {};
};
};
1.2 板级的配置
&gmac0 {
/* Use rgmii-rxid mode to disable rx delay inside Soc */
phy-mode = "rgmii-rxid";
clock_in_out = "output";
snps,reset-gpio = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <ð0m0_miim
ð0m0_tx_bus2
ð0m0_rx_bus2
ð0m0_rgmii_clk
ð0m0_rgmii_bus
ðm0_clk0_25m_out>;
tx_delay = <0x21>;
/* rx_delay = <0x3f>; */
phy-handle = <&rgmii_phy0>;
status = "okay";
};
网口没有自动获取ip
RTC 使用
简介
可计时基于 32.768kHz 晶体的秒,分,小时,星期,天,月和年
宽工作电压范围:1.0~5.5V
低休眠电流:典型值为 0.25μA(VDD =3.0V, TA =25°C)
内部集成振荡电容
漏极开路中断引脚
RTC驱动
接口使用
SYSFS接口:/sys/class/rtc/rtc0/
PROCFS接口: /proc/driver/rtc
IOCTL接口: /dev/rtc0
SYSFS接口
root@root:/# date -s "2025-05-7 10:00:00"
Wed May 7 10:00:00 UTC 2025
root@root:/# cat /sys/class/rtc/rtc0/time
10:00:24
PROCFS 接口
root@root:/# cat /proc/driver/rtc
rtc_time : 10:03:19
rtc_date : 2025-05-07
alrm_time : 10:04:00
alrm_date : 2025-05-07
alarm_IRQ : no
alrm_pending : no
update IRQ enabled : no
periodic IRQ enabled : no
periodic IRQ frequency : 1
max user IRQ frequency : 64
24hr : yes
IOCTL接口
FAQs
485
DTS配置
&uart5 {
status = "okay";
pinctrl-0 = <&uart5m1_xfer>;
};
/dev/ttyS5
CAN
CAN 简介
DTS 节点配置
公共配置 kernel/arch/arm64/boot/dts/rockchip/rk3576.dtsi
can0: can@2ac00000 {
compatible = "rockchip,rk3576-canfd";
reg = <0x0 0x2ac00000 0x0 0x1000>;
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN0>, <&cru HCLK_CAN0>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN0>, <&cru SRST_H_CAN0>;
reset-names = "can", "can-apb";
dmas = <&dmac0 20>;
dma-names = "rx";
status = "disabled";
};
板级配置 arch/arm64/boot/dts/rockchip/myzr-rk3576-linux.dts
&can0 {
status = "okay";
assigned-clocks = <&cru CLK_CAN0>;
assigned-clock-rates = <200000000>;
pinctrl-names = "default";
pinctrl-0 = <&can0m2_pins>;
};
更多指令
1、 ip link set canX down //关闭can设备;
2、 ip link set canX up //开启can设备;
3、 ip -details link show canX //显示can设备详细信息;
4、 candump canX //接收can总线发来数据;
5、 ifconfig canX down //关闭can设备,以便配置;
6、 ip link set canX up type can bitrate 250000 //设置can波特率
7、 conconfig canX bitrate + 波特率;
8、 canconfig canX start //启动can设备;
9、 canconfig canX ctrlmode loopback on //回环测试;
10、canconfig canX restart // 重启can设备;
11、canconfig canX stop //停止can设备;
12、canecho canX //查看can设备总线状态;
13、cansend canX --identifier=ID+数据 //发送数据;
14、candump canX --filter=ID:mask //使用滤波器接收ID匹配的数据
报文发送后很久才接收到,或者接收不到。
GPIO
简介
GPIO引脚计算
#define RK_PA0 0
#define RK_PA1 1
#define RK_PA2 2
#define RK_PA3 3
#define RK_PA4 4
#define RK_PA5 5
#define RK_PA6 6
#define RK_PA7 7
#define RK_PB0 8
...
中断
interrupt-parent = <&gpio0>;
interrupts = <RK_PB0 IRQ_TYPE_LEVEL_LOW>;
复用
/omit-if-no-ref/
uart5m1_xfer: uart5m1-xfer {
rockchip,pins =
/* uart5_rx_m1 */
<4 RK_PB1 10 &pcfg_pull_up>,
/* uart5_tx_m1 */
<4 RK_PB0 10 &pcfg_pull_up>;
};
&uart5 {
status = "okay";
pinctrl-0 = <&uart5m1_xfer>;
};
GPIO 调试接口
root@root:/# cat sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/27320000.gpio, gpio0:
gpio-22 ( |vcc3v3-lcd0-n ) out lo
gpio-23 ( |vcc5v0-host ) out hi
gpio-25 ( |vbus5v0-typec ) out lo
gpio-27 ( |hp-det ) in lo IRQ
gpiochip1: GPIOs 32-63, parent: platform/2ae10000.gpio, gpio1:
gpio-57 ( |vcc3v3-pcie0 ) out hi
gpiochip2: GPIOs 64-95, parent: platform/2ae20000.gpio, gpio2:
gpio-70 ( |sbu1-dc ) out lo
gpio-71 ( |sbu2-dc ) out lo
gpio-72 ( |enable ) out hi
gpio-73 ( |spk-con ) out lo
gpiochip3: GPIOs 96-127, parent: platform/2ae30000.gpio, gpio3:
gpio-126 ( |hp-con ) out lo
gpiochip4: GPIOs 128-159, parent: platform/2ae40000.gpio, gpio4:
gpiochip5: GPIOs 509-511, parent: platform/rk806-pinctrl.1.auto, rk806-gpio, can sleep:
485
DTS配置
&uart5 {
status = "okay";
pinctrl-0 = <&uart5m1_xfer>;
};
UART0: /dev/ttyS5
CAN
CAN 简介
DTS 节点配置
公共配置 kernel/arch/arm64/boot/dts/rockchip/rk3576.dtsi
can0: can@2ac00000 {
compatible = "rockchip,rk3576-canfd";
reg = <0x0 0x2ac00000 0x0 0x1000>;
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN0>, <&cru HCLK_CAN0>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN0>, <&cru SRST_H_CAN0>;
reset-names = "can", "can-apb";
dmas = <&dmac0 20>;
dma-names = "rx";
status = "disabled";
};
板级配置 kernel/arch/arm64/boot/dts/rockchip/myzr-rk3576-linux.dts
&can0 {
status = "okay";
assigned-clocks = <&cru CLK_CAN0>;
assigned-clock-rates = <200000000>;
pinctrl-names = "default";
pinctrl-0 = <&can0m2_pins>;
};
更多指令
1、 ip link set canX down //关闭can设备;
2、 ip link set canX up //开启can设备;
3、 ip -details link show canX //显示can设备详细信息;
4、 candump canX //接收can总线发来数据;
5、 ifconfig canX down //关闭can设备,以便配置;
6、 ip link set canX up type can bitrate 250000 //设置can波特率
7、 conconfig canX bitrate + 波特率;
8、 canconfig canX start //启动can设备;
9、 canconfig canX ctrlmode loopback on //回环测试;
10、canconfig canX restart // 重启can设备;
11、canconfig canX stop //停止can设备;
12、canecho canX //查看can设备总线状态;
13、cansend canX --identifier=ID+数据 //发送数据;
14、candump canX --filter=ID:mask //使用滤波器接收ID匹配的数据
报文发送后很久才接收到,或者接收不到。
HDMI
HDMI接口的配置
kernel/arch/arm64/boot/dts/rockchip/myzr-screen-lcds.dts
#define LCD_TYPE_HDMI //VP0
//#define LCD_TYPE_MIPI0 //VP1
// #define LCD_TYPE_LVDS_7_0 //VP1
#if defined(LCD_TYPE_HDMI)
//HDMI配置
&vp0 {
status = "okay";
};
&hdmi {
status = "okay";
enable-gpios = <&gpio2 RK_PB0 GPIO_ACTIVE_HIGH>;
rockchip,sda-falling-delay-ns = <360>;
};
&hdmi_in_vp0 {
status = "okay";
};
&hdptxphy_hdmi {
status = "okay";
};
&hdmi_sound {
status = "okay";
};
&route_hdmi {
status = "okay";
connect = <&vp0_out_hdmi>;
};
&display_subsystem {
clocks = <&hdptxphy_hdmi>;
clock-names = "hdmi0_phy_pll";
};
#endif