软件开发指导
开发环境
文件下载
安装虚拟机软件
为虚拟机配置 Windows
添加 Windows 网卡
配置 Windows 网卡
导入虚拟机系统
虚拟机设置
虚拟机与PC互传文件
虚拟机使用
用户和密码
Linux源码编译
编译环境要求
编译主机需在ubuntu系统中进行,且版本需Ubuntu 20.04以上,笔者主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
下载rk3562源码包,路径为:3.软件资料–>3.1源码–>rk3562-linux.tar.xz
创建编译目录:
mkdir -p ~/my-work/RK3562/02_sources/
把源码放到刚创建的目录中,并进行解压:
tar xvf rk3562-linux.tar.xz -C ~/my-work/RK3562/02_sources/
依赖安装
sudo apt-get install -y git ssh make gcc libssl-dev liblz4-tool expect expect-dev g++ patchelf
chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex
fakeroot rsync cmake gcc-multilib g++-multilib unzip device-tree-compiler ncurses-dev
libgucharmap-2-90-dev bzip2 expat gpgv2 cpp-aarch64-linux-gnu libgmp-dev libmpc-dev bc
python-is-python3 python2 libpkgconf-dev
SDK配置加载
./build.sh myzr_rk3562_evb_defconfig
cd buildroot/
./envsetup.sh rockchip_rk3562
整体编译
回到SDK主目录,运行整体编译(编译时间较长),输入如下命令:
cd ../
./build.sh
编译成功后在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
单独编译buildroot
./build.sh rootfs
打包固件
./build.sh firmware
打包update.img
在SDK下的output/update/Image⽬录将镜像打包成update.img
在SDK主目录下输入如下命令:
./build.sh updateimg
安卓源码编译
编译环境要求
编译主机需在linux环境中进行,推荐主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
网盘目录下,下载源码包 MYZR-RK3562_Android13_20260407.tar.bz2(请将网盘内分卷文件下载后合并可以得到该压缩包)
创建编译目录:
mkdir ~/my-work/rk3562/05_android -p
把源码放到此目录中,并进行解压:
tar xvf MYZR-RK3562_Android13_20260407.tar.bz2 -C ~/my-work/rk3562/05_android/
配置编译环境
每次打开一个新的终端,都需要进行一个环境配置
进入RK3562_Android13.0_SDK目录
输入如下命令配置java环境:
source javaenv.sh
输入如下命令配置编译环境:
source build/envsetup.sh
输入如下命令配置平台环境:
lunch rk3562_t-userdebug
整体编译
整体编译将整个android系统,包括kernel、uboot、android、recovery。
输入如下命令:
./build.sh -AUCKu
编译时间较长,本人使用16线程主机编译需要4个小时时间(仅作参考!)
成功编译后在rockdev/Image-rk3562_t/目录下可看到相关镜像,其中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
开发指导
UBOOT板级文件
Linux内核板级文件
kernel-5.10/arch/arm64/boot/dts/rockchip/myzr-rk3562-ek200.dts(默认设备树,适用于hdmi显示屏)
kernel-5.10/arch/arm64/boot/dts/rockchip/myzr-rk3562-ek200-lvds-lcd.dtsi(备用,适用于lvds lcd显示屏)
kernel-5.10/arch/arm64/boot/dts/rockchip/myzr-rk3562-ek200-mipi-lcd.dtsi(备用,适用于mipi lcd显示屏)
Ethernet
dts配置
gmac0: ethernet@ffa80000 {
compatible = "rockchip,rk3562-gmac", "snps,dwmac-4.20a";
reg = <0x0 0xffa80000 0x0 0x10000>;
interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_wake_irq";
rockchip,grf = <&sys_grf>;
rockchip,php_grf = <&ioc_grf>;
clocks = <&cru CLK_GMAC_125M_CRU_I>, <&cru CLK_GMAC_50M_CRU_I>,
<&cru PCLK_GMAC>, <&cru ACLK_GMAC>;
clock-names = "stmmaceth", "clk_mac_ref",
"pclk_mac", "aclk_mac";
resets = <&cru SRST_A_GMAC>;
reset-names = "stmmaceth";
rockchip,csu = <&csu CSU_GMAC_ACLK>, <&csu CSU_GMAC_PCLK>;
rockchip,csu-names = "aclk", "pclk";
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 {
snps,reset-gpio = <&gpio3 RK_PD0 GPIO_ACTIVE_LOW>;
snps,reset-delays-us = <20000 20000 100000>;
tx_delay = <0x38>;
rx_delay = <0x1e>;
pinctrl-0 = <&rgmiim0_miim
&rgmiim0_tx_bus2
&rgmiim0_rx_bus2
&rgmiim0_rgmii_clk
&rgmiim0_rgmii_bus>;
phy-handle = <&rgmii_phy>;
};
如果网口没有自动获取ip
GPIO
1. GPIO驱动架构
2. 引脚命名规则
GPIO0_D0表示第0组(GPIO4)的D组第0个引脚。
GPIO4_B5表示第4组(GPIO4)的B组第5个引脚。
3. GPIO引脚编号的计算公式
4. 通过/sys/class/gpio目录控制GPIO
echo 141 > /sys/class/gpio/export #使能引脚GPIO4_B5
echo out > gpio141/direction # 设置引脚为输出模式
echo 1 > gpio141/value # 设置引脚为高电平
cat /sys/class/gpio/gpio141/value # 读取引脚的值
echo 141 > /sys/class/gpio/unexport # 释放GPIO
PWM
1. PWM 硬件与驱动框架
2. PWM设备树配置
pwm14: pwm@ff720020 {
compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm";
reg = <0x0 0xff720020 0x0 0x10>;
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
#pwm-cells = <3>;
pinctrl-names = "active";
pinctrl-0 = <&pwm14m0_pins>;
clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>;
clock-names = "pwm", "pclk";
status = "disabled";
};
&pwm14 {
status = "okay";
pinctrl-names = "active";
pinctrl-0 = <&pwm14m0_pins>; // 确保引脚复用配置正确
};
// 示例:配置PWM14_M0输出到某个设备(如背光)
/ {
pwm_dev: pwm-dev {
compatible = "pwm-device";
pwms = <&pwm14 0 10000000 1>; // 关键参数设置
duty-cycle = <5000000>; // 占空比50%
pinctrl-names = "default";
pinctrl-0 = <&pwm14m0_pins>;// 确保与控制器配置一致
};
};
3. Sysfs接口操作PWM
查找PWM控制器路径
ls /sys/class/pwm # 显示所有PWM控制器,例如pwmchip0、pwmchip1等
导出PWM通道
echo 0 > /sys/class/pwm/pwmchip3/export # 导出pwm14的0号通道
配置周期与占空比
echo 10000000 > /sys/class/pwm/pwmchip3/pwm0/period # 设置10ms周期(100Hz)
echo 5000000 > /sys/class/pwm/pwmchip3/pwm0/duty_cycle # 设置5ms占空比(50%)
echo 1 > /sys/class/pwm/pwmchip3/pwm0/enable # 启用PWM输出
动态调整占空比
echo 7000000 > /sys/class/pwm/pwmchip3/pwm0/duty_cycle # 调整为70%占空比
I2C
1. I2C 子系统架构概述
2. I2C设备树配置(以I2C1上挂载gt911触摸芯片为例)
&i2c1 {
gt911@5d {
status = "okay";
compatible = "goodix,gt911";
reg = <0x5d>;
pinctrl-names = "default";
pinctrl-0 = <>911_int>;
interrupt-parent = <&gpio4>;
interrupts = <8 0>;
irq-gpios = <&gpio4 RK_PB0 0>;
reset-gpios = <&gpio3 RK_PB0 0>;
};
};
static struct of_device_id goodix_ts_dt_ids[] = {
{ .compatible = "goodix,gt9xx" },
{ }
};
i2cdetect -y 1
SPI
1. Linux SPI 框架概述
2. SPI设备树配置(以SPI0_M0为例,在J9扩展接口mosi和miso和对应17和19引脚)
&spi0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi0m0_pins>; // 指定M0模式引脚组
#address-cells = <1>;
#size-cells = <0>;
spidev@0{
compatible = "spidev";
reg = <0>;
spi-max-frequency = <10000000>;// 最大频率10MHz
};
};
3. 调试工具
=====> Input:
./test_app/spidev_test -D /dev/spidev0.0
=====> Output:
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D
UART
1. 设备树配置以(UART6_M0为例,在J8扩展接口上对应7和9引脚)
&uart6 {
status ="okay";
pinctrl-name = "default";
pinctrl-0 = <&uart6m0_xfer>;
};
uart6m0_xfer: uart6m0-xfer {
rockchip,pins =
/* uart6_rx_m0 */
<0 RK_PC7 1 &pcfg_pull_up>,
/* uart6_tx_m0 */
<0 RK_PC6 1 &pcfg_pull_up>;
};
2. 调试工具
=====> Input:
# ./test_app/serial_test.out /dev/ttyS6 "myzr"
=====> Output:
Starting send data...finish
Starting receive data:
ASCII: 0x6d Character: m
ASCII: 0x79 Character: y
ASCII: 0x7a Character: z
ASCII: 0x72 Character: r
ASCII: 0x0 Character: