软件开发指导
开发环境
文件下载
安装虚拟机软件
为虚拟机配置 Windows
添加 Windows 网卡
配置 Windows 网卡
导入虚拟机系统
虚拟机设置
虚拟机与PC互传文件
虚拟机使用
用户和密码
Linux源码编译
编译环境要求
编译主机需在ubuntu系统中进行,且版本需Ubuntu 20.04以上,笔者主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
下载rk3568源码包,rk3568提供内核版本为4.19和5.10两个版本的sdk,任意选一个版本下载即可,
创建编译目录:
mkdir -p ~/my-work/RK3568/02_sources/
把源码放到刚创建的目录中,并进行解压:
tar -xjf MYZR-RK3568pi_Linux-4.19_20250722.tar.bz2 -C ~/my-work/RK3568/02_sources/
依赖安装
sudo apt-get install git ssh make gcc libssl-dev liblz4-tool \
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 libncurses-dev \
time python3 rsync python-is-python3
SDK配置加载
./build.sh BoardConfig-rk3568-myzr.mk
./build.sh myzr_rk3568_ddr4_defconfig
整体编译
运行整体编译(编译时间较长),输入如下命令:
./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
打包固件
./mkfirmware.sh
打包update.img
在SDK下的rockdev目录里可以看到打包好的镜像update.img
在SDK主目录下输入如下命令可完成镜像打包:
./build.sh updateimg
安卓源码编译
编译环境要求
编译主机需在linux环境中进行,推荐主机系统为Ubuntu 20.04
主机需可连接外网,因为编译系统过程需要下载某些文件。
下载源码包
网盘目录下,下载源码包 MYZR-RK3568PI_Android11_20250716.tar.bz2(请将网盘内分卷文件下载后合并可以得到该压缩包)
创建编译目录:
mkdir ~/my-work/rk3568/05_android -p
把源码放到此目录中,并进行解压:
tar xvf MYZR-RK3568PI_Android11_20250716.tar.bz2 -C ~/my-work/rk3568/05_android/
配置编译环境
每次打开一个新的终端,都需要进行一个环境配置
进入RK356X_Android11目录
输入如下命令配置java环境:
source javaenv.sh
输入如下命令配置编译环境:
source build/envsetup.sh
输入如下命令配置平台环境:
lunch rk3568_r-userdebug
整体编译
整体编译将整个android系统,包括kernel、uboot、android、recovery。
输入如下命令:
./build.sh -AUCKu
编译时间较长,本人使用16线程主机编译需要4个小时时间(仅作参考!)
成功编译后在rockdev/Image-rk3568_r/目录下可看到相关镜像,其中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/
./make.sh
单独编译 android
在SDK主目录下
./build.sh -A
打包update.img
在rockdev将镜像打包成update.img
在SDK主目录下
./build.sh -u
开发指导
UBOOT板级文件
Linux内核板级文件
GPIO
GPIO驱动架构
引脚命名规则
GPIO4_D5表示第4组(GPIO4)的D组第5个引脚。
GPIO0_B7表示第0组(GPIO0)的B组第7个引脚。
GPIO引脚编号的计算公式
pin = bank * 32 + number
number = group * 8 + X
通过/sys/class/gpio目录控制GPIO
echo 157 > /sys/class/gpio/export # 导出GPIO157
echo out > gpio157/direction # 设为输出模式
echo 1 > gpio157/value # 输出高电平
echo 157 > /sys/class/gpio/unexport # 释放GPIO
PWM
PWM 硬件与驱动框架
PWM设备树配置(以PWM14_M0为例,在J14扩展接口对应12引脚)
pwm14: pwm@fe700020 {
compatible = "rockchip,rk3568-pwm", "rockchip,rk3328-pwm";
reg = <0x0 0xfe700020 0x0 0x10>;
#pwm-cells = <3>;
pinctrl-names = "active";
pinctrl-0 = <&pwm14m0_pins>;
clocks = <&cru CLK_PWM3>, <&cru PCLK_PWM3>;
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>;// 确保与控制器配置一致
};
};
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输出
动态调整占空比
# 调整为70%占空比
UART
设备树配置(以UART3_M1为例,在J14扩展接口上对应33和35引脚)
&uart3 {
status ="okay";
pinctrl-name = "default";
pinctrl-0 = <&uart3m1_xfer>;
};
uart3m1_xfer: uart3m1-xfer {
rockchip,pins =
/* uart3_rxm1 */
<3 RK_PC0 4 &pcfg_pull_up>,
/* uart3_txm1 */
<3 RK_PB7 4 &pcfg_pull_up>;
};
调试工具
=====> Input:
# /my-demo/serial_test.out /dev/ttyS3 "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:
I2C
I2C 子系统架构概述
I2C设备树配置(以I2C1上挂载触摸芯片为例)
&i2c1 {
status = "okay";
gt1x: gt1x@14 {
compatible = "goodix,gt1x";
reg = <0x14>;
pinctrl-names = "default";
pinctrl-0 = <&touch_gpio>;
goodix,rst-gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
goodix,irq-gpio = <&gpio0 RK_PB5 IRQ_TYPE_LEVEL_LOW>;
};
};
static const struct of_device_id gt1x_of_match[] = {
{ .compatible = "goodix,gt1x" },
{}
};
i2cdetect -y 1
SPI
Linux SPI 框架概述
SPI设备树配置(以SPI3_M1为例,在J14扩展接口miso和mosi对应19和21引脚)
&spi3 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi3m1_pins>; // 指定M1模式引脚组
#address-cells = <1>;
#size-cells = <0>;
spidev@0 {
compatible = "spidev";
reg = <0>;
spi-max-frequency = <10000000>; // 最大频率10MHz
};
};
调试工具
=====> Input:
./spidev_test -D /dev/spidev3.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