软件开发指导
开发环境
文件下载
安装虚拟机软件
为虚拟机配置 Windows
添加 Windows 网卡
配置 Windows 网卡
导入虚拟机系统
虚拟机设置
虚拟机与PC互传文件
虚拟机使用
用户和密码
Linux源码编译
编译环境要求
编译主机需在ubuntu系统中进行,且版本需Ubuntu 20.04以上,笔者主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
下载rk3588源码包,路径为:3.软件资料–>3.1源码–>rk3588-linux.tar.xz
创建编译目录:
mkdir -p ~/my-work/RK3588/02_sources/
把源码放到刚创建的目录中,并进行解压:
tar xvf rk3588-linux.tar.xz -C ~/my-work/RK3588/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 zlib1g-dev git gnupg flex bison gperf libsdl1.2-dev libesd-java \
squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool \
libxml2 libxml2-utils xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev \
lib32ncurses-dev lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip \
zip liblz4-tool git ssh make gcc libssl-dev liblz4-tool vim expect \
g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
unzip device-tree-compiler python3-pip libncurses5-dev rsync subversion python-protobuf \
sed make binutils build-essential gcc g++ wget python-is-python2 libncurses5 bzr cvs git mercurial \
patch gzip bzip2 perl tar cpio unzip rsync file bc wget qemu-user-static live-build android-sdk-libsparse-utils android-sdk-ext4-utils -y libicu-dev
整体编译
运行整体编译(编译时间较长),输入如下命令:
buildroot
./build.sh buildroot_update
ubuntu20
./build.sh ubuntu20_update
ubuntu22
./build.sh ubuntu22_update
debian11
./build.sh debian11_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 rootfs
ubantu20
./build.sh ubuntu20
ubantu22
./build.sh ubuntu22
debian11
./build.sh debian11
debian12
./build.sh debian12
打包固件
./mkfirmware.sh
打包update.img
在rockdev将镜像打包成update.img
在SDK主目录下输入如下命令:
./build.sh updateimg
安卓源码编译
编译环境要求
编译主机需在linux环境中进行,推荐主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
网盘目录下,下载源码包 MYZR-RK3588-EK360_Android12_20260108.tar.bz2(请将网盘内分卷文件下载后合并可以得到该压缩包)
创建编译目录:
mkdir ~/my-work/rk3588/05_android -p
把源码放到此目录中,并进行解压:
tar xvf MYZR-RK3588-EK360_Android12_20260108.tar.bz2 -C ~/my-work/rk3588/05_android/
配置编译环境
每次打开一个新的终端,都需要进行一个环境配置
进入3588-android12目录
输入如下命令配置java环境:
source javaenv.sh
输入如下命令配置编译环境:
source build/envsetup.sh
输入如下命令配置平台环境:
lunch myzr_rk3588-userdebug
整体编译
整体编译将整个android系统,包括kernel、uboot、android、recovery。
输入如下命令:
./build.sh -AUCKu
编译时间较长,本人使用16线程主机编译需要4个小时时间(仅作参考!)
成功编译后在rockdev/Image-myzr_rk3588/目录下可看到相关镜像,其中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
单独编译 android
在SDK主目录下
./build.sh -A
打包update.img
在rockdev将镜像打包成update.img
在SDK主目录下
./build.sh -u
开发指导
U-Boot 板级文件
u-boot 板级文件位置:board/myzr/myzr_rk3588
u-boot 板级配置文件:include/configs/myzr_rk3588.h
u-boot 极级编译配置文件:configs/myzr_rk3588_defconfig
Linux 内核板级文件
内核板级编译配置文件:arch/arm64/configs/myzr_linux_defconfig
内核板级设备树文件:arch/arm64/boot/dts/rockchip/myzr-.dts
内核开发参考手册:网盘中《Reference Manual.pdf》
Ethernet
dts 配置
gmac0: ethernet@fe1b0000 {
compatible = "rockchip,rk3588-gmac", "snps,dwmac-4.20a";
reg = <0x0 0xfe1b0000 0x0 0x10000>;
interrupts = <GIC_SPI 227 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 226 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_wake_irq";
rockchip,grf = <&sys_grf>;
rockchip,php_grf = <&php_grf>;
clocks = <&cru CLK_GMAC_125M>, <&cru CLK_GMAC_50M>,
<&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 RK3588_PD_GMAC>;
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 {
/* Use rgmii-rxid mode to disable rx delay inside Soc */
phy-mode = "rgmii-rxid";
clock_in_out = "output";
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac0_miim
&gmac0_tx_bus2
&gmac0_rx_bus2
&gmac0_rgmii_clk
&gmac0_rgmii_bus>;
tx_delay = <0x44>;
/* rx_delay = <0x4f>; */
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
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/
uart0m2_xfer: uart0m2-xfer {
rockchip,pins =
/* uart0_rx_m2 */
<4 RK_PA4 10 &pcfg_pull_up>,
/* uart0_tx_m2 */
<4 RK_PA3 10 &pcfg_pull_up>;
};
//485
&uart0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart0m2_xfer>;
};
GPIO 调试接口
root@topeet:/# cat sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:
gpio-15 ( |vcc-3v3-sd-s0-regula) out lo
gpiochip1: GPIOs 32-63, parent: platform/fec20000.gpio, gpio1:
gpio-43 ( |vcc3v3-lcd0-n ) out hi
gpio-52 ( |hp-det ) in hi ACTIVE LOW
gpio-61 ( |hdmirx-det ) in hi ACTIVE LOW
gpiochip2: GPIOs 64-95, parent: platform/fec30000.gpio, gpio2:
...
485
DTS配置
//485
&uart0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart0m2_xfer>;
};
UART0: /dev/ttyS0
CAN
CAN 简介
DTS 节点配置
公共配置 kernel/arch/arm64/boot/dts/rockchip/rk3588s.dtsi
can1: can@fea60000 {
compatible = "rockchip,can-2.0";
reg = <0x0 0xfea60000 0x0 0x1000>;
interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN1>, <&cru SRST_P_CAN1>;
reset-names = "can", "can-apb";
pinctrl-names = "default";
pinctrl-0 = <&can1m0_pins>;
tx-fifo-depth = <1>;
rx-fifo-depth = <6>;
status = "disabled";
};
板级配置 arch/arm64/boot/dts/rockchip/myzr-rk3588-linux.dts
//can
&can1 {
status = "okay";
compatible = "rockchip,can-2.0"; //使用can
pinctrl-0 = <&can1m1_pins>;
assigned-clocks = <&cru CLK_CAN1>;
assigned-clock-rates = <100000000>;
};
更多指令
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接口的配置
/rk3588-linux/kernel/arch/arm64/boot/dts/rockchip/myzr-screen-lcds.dts
//#define LCD_TYPE_MIPI0 //VP2
//#define LCD_TYPE_LVDS_10_1_1280x800_GT911 //VP2
//#define LCD_TYPE_LVDS_10_1_1280x800_GT9271 //VP2
//#define LCD_TYPE_LVDS_10_1_1024x600_GT911 //VP2
//#define LCD_TYPE_LVDS_7_0 //VP2
#define LCD_TYPE_HDMI1 //VP1
#define LCD_TYPE_HDMI0 //VP0
//#define LCD_TYPE_TYPEC_DP //VP1
//#define LCD_TYPE_MIPI1 //VP3
#if defined(LCD_TYPE_HDMI0)
//打开 hdmi0 的 硬件 phy
&hdptxphy_hdmi0 {
status = "okay";
};
//使能HDMI0
&hdmi0 {
enable-gpios = <&gpio4 RK_PB1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
//配置HDMI0到VP0上面
&hdmi0_in_vp0 {
status = "okay";
};
//打开HDMI0 声音
&hdmi0_sound {
status = "okay";
};
//配置HDMI0上面显示开机logo
&route_hdmi0 {
status = "okay";
};
#endif
#if defined(LCD_TYPE_HDMI1)
//使能HDMI1
&hdptxphy_hdmi1 {
status = "okay";
};
&hdmi1 {
enable-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
status = "okay";
};
//配置HDMI1到VP1上面
&hdmi1_in_vp1 {
status = "okay";
};
//打开HDMI1 声音
&hdmi1_sound {
status = "okay";
};
//配置HDMI1上面显示开机logo
&route_hdmi1 {
status = "okay";
};
#endif
Watchdog
简介
DTS配置
wdt: watchdog@feaf0000 {
compatible = "snps,dw-wdt";
reg = <0x0 0xfeaf0000 0x0 0x100>;
clocks = <&cru TCLK_WDT0>, <&cru PCLK_WDT0>;
clock-names = "tclk", "pclk";
interrupts = <GIC_SPI 315 IRQ_TYPE_LEVEL_HIGH>;
status = "okay";
};