找回密码
 立即注册
首页 业界区 业界 RK3568(泰山派开发板)开发环境搭建与使用 ...

RK3568(泰山派开发板)开发环境搭建与使用

邹语彤 昨天 15:31
主要参考立创泰山派官方教程,链接:https://openkits-wiki.easyeda.com/zh-hans/tspi-rk3566/sdk-compilation/linux-compilation.html
一、芯片参数

1.png

2.png

CPU:4核A55,主频1.8GHz
GPU:支持OpenGL,支持4K,60fps解码
NPU:1.0TOP,可以跑一些简单的AI框架模型
价格:只要100多,非常划算!可以用来学习Linux、Andorid
二、开发环境搭建

2.1 虚拟机安装

用于在Windows中安装一个Ubuntu等linux操作系统,可以使用VMware、WSL2等方式,如果电脑是linux操作系统可以略过。我这里使用VMware,版本:VMware Workstation PRO 17。关于安装/Pojie虚拟机的教程有很多,不再赘述。
2.2 安装Ubuntu操作系统

Ubuntu是linux的一个发行版本,我这里使用的Ubuntu版本如下:
3.png

内核版本:5.4.0-150
Ubuntu发行版本:18.04.1
这一步可以参考正点原子等,网上教程也很多。
值得注意的是Ubuntu虚拟机最少需要100G以上的空间,因为编译RK的SDK就需要80G
2.3 SDK下载

下载链接:https://pan.baidu.com/s/1HtnpytCBBqBOqZi8mfV4VQ?pwd=qcxx#list/path=%2F
目录:下载中心->百度网盘->第05章.【立创·泰山派】系统SDK->【SDK】Linux->tspi_linux_sdk_xxxxxxxx.tar.gz
4.png

框起来的两个文件下载其中一个即可,我使用不带repo的。
下载完成后,可以通过Samba共享文件夹的方式,将SDK目录复制到虚拟机工作目录下,目录名称不要包含中文。
注意:下载完成后,最好使用md5sum工具检验一下文件完整性,与SDK目录里的MD5码对比一下。
将SDK压缩包解压:
  1. tar -zxvf tspi_linux_sdk_20230916.tar.gz
复制代码
解压后会得到Release目录,目录下的文件内容如下:
  1. app     buildroot  debian  envsetup.sh  IMAGE   Makefile       prebuilts  rkflash.sh  tools   yocto
  2. br.log  build.sh   device  external     kernel  mkfirmware.sh  rkbin      rockdev     u-boot
复制代码
  1. app: 存放上层应⽤ app,主要是 qcamera/qfm/qplayer/settings 等⼀些应⽤程序。
  2. buildroot: 基于 buildroot (2018.02-rc3) 开发的根⽂件系统。
  3. debian: 基于 debian 10 开发的根⽂件系统,⽀持部分芯⽚。
  4. device/rockchip: 存放各芯⽚板级配置和 Parameter ⽂件,以及⼀些编译与打包固件的脚本和预备⽂件。
  5. IMAGE: 存放每次⽣成编译时间、XML、补丁和固件⽬录。
  6. external: 存放第三⽅相关仓库,包括⾳频、视频、⽹络、recovery 等。
  7. kernel: 存放 kernel 4.4 或 4.19 开发的代码。
  8. prebuilts: 存放交叉编译⼯具链。
  9. rkbin: 存放 Rockchip 相关的 Binary 和⼯具。
  10. rockdev: 存放编译输出固件。
  11. tools: 存放 Linux 和 Windows 操作系统环境下常⽤⼯具。
  12. u-boot: 存放基于 v2017.09 版本进⾏开发的 uboot 代码。
  13. yocto: 基于 yocto gatesgarth 3.2 开发的根⽂件系统,⽀持部分芯⽚。
复制代码
2.4 编译环境配置

主要是安装一些编译用的工具。
  1. sudo apt-get update
复制代码
  1. sudo apt-get install git ssh make gcc libssl-dev liblz4-tool expect \
  2. g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
  3. qemu-user-static live-build bison flex fakeroot cmake gcc-multilib \
  4. g++-multilib unzip device-tree-compiler ncurses-dev
复制代码
需要保持网络通畅。
2.5 编译SDK

2.5.1. 板级配置:

选择3,BoardConfig-rk3566-tspi-v10.mk,并回车
  1. ./build.sh lunch
复制代码
5.png

查看配置是否生效
  1. ./build.sh -h kernel
复制代码
6.png

2.5.2. 选择操作系统

可选buildroot、debian、ubuntu,buildroot根文件系统所占内存比较小,优先推荐。
此外,如果你的开发不涉及驱动开发,只做应用开发,也可以直接下载官方编译好的系统镜像,地址:
https://pan.baidu.com/s/1HtnpytCBBqBOqZi8mfV4VQ?pwd=qcxx#list/path=%2F
在06章-系统镜像目录下。
以编译buildroot操作系统为例:选择buildroot操作系统
  1. export RK_ROOTFS_SYSTEM=buildroot
复制代码
运行全编译:(全编译时间非常漫长,取决于电脑配置,我编译了2个小时)
  1. ./build.sh all         # 只编译模块代码(u-Boot,kernel,Rootfs,Recovery)
  2.                        # 需要再执⾏./mkfirmware.sh 进⾏固件打包
复制代码
第一次编译需要选择电源:
7.png

8.png

9.png

10.png

11.png

12.png

13.png

编译完成后截图:
14.png

2.5.3 固件打包
  1. ./mkfirmware.sh
复制代码
打包成功后,固件会输出到 rockdev 目录:
  1. boot.img           misc.img  parameter.txt  rootfs.img  update.img
  2. MiniLoaderAll.bin  oem.img   recovery.img   uboot.img   userdata.img
复制代码
如果,你参考上述环境仍然编译不成功,可以通过Docker方式,再套娃一层立创官方的编译环境,教程链接:https://openkits-wiki.easyeda.com/zh-hans/tspi-rk3566/sdk-compilation/docker-compiling-environment.html
2.6 固件烧录

2.6.1 windows系统下固件烧录

1 下载RKDevTool.exe工具,在07-开发工具目录下。

15.png

2 下载Tspi_linux_config.cfg配置文件:

下载中心->百度网盘->第06章.【立创·泰山派】系统镜像->【镜像】Ubuntu->Tspi_Linux_config.cfg
3 下载镜像

打开RKDevTool.exe软件,右键选择导入Tspi_linux_config.cfg配置文件,并把路径改成你编译好的固件路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级。升级完成后系统会自动重启。
重启后,能通过ADB或者串口方式登录进去,串口输出一下信息,说明SDK编译、烧录成功了。
16.png

2.6.2 Linux环境下固件烧录

在 Ubuntu 下可以使用 Linux_Upgrade_Tool 工具进行烧录,该工具集成 在 SDK 中,路径为:/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool.该目录下有两份 RK 提供的使用说明文档:《命令行开发工具使用文档.pdf》、《Linux 开发 工具使用手册_v1.32.pdf》,关于 upgrade_tool 工具的详细使用方法请参考这两份文档。
在 Ubuntu 下使用 upgrade_tool 工具烧写镜像之前,需要将开发板连接到 Ubuntu 系统。首 先,连接好硬件(连接电源适配器以及 OTG 口),让开发板处于 Maskrom 或 Loader 模式下(按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键)。在“虚拟机****→可移动设备”下面也可以找到该设备,如下图所示:
17.png

进入到/rockdev 目录
使用UL指令烧写MiniLoaderAll.bin镜像,使用DI指令烧写其它镜像(uboot.img、boot.img、 oem.img、userdata.img、rootfs.img、misc.img 等)以及分区表文件 parameter.txt。
1.  先烧写 MiniLoaderAll.bin 镜像,使用 UL 指令烧写 MiniLoaderAll.bin(执行 upgrade_tool 命令时需要加入 sudo 获取到 root 用户权限,否则操作会失败!):
  1. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool UL MiniLoaderAll.bin -
  2. noreset
复制代码
2.  要通过 DI 指令下载 parameter.txt 分区表:
  1. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -p parameter.txt
复制代码
3.  烧录其它镜像:
  1. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -uboot uboot.img
  2. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -misc misc.img
  3. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -boot boot.img
  4. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -recovery recov
  5. ery.img
  6. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -oem oem.img
  7. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -rootfs rootfs.img
  8. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -userdata userdata.img
复制代码
4.  最后,当所有镜像全部烧录完成后,我们可以执行下面这条命令复位开发板、重新启动系统:
  1. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool RD
复制代码
5. 对于update.img(打包后的整个文件)使用以下命令烧录:
  1. sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool UF update.img
复制代码
三、使用

3.1.设备树使用测试

找到SDK目录下:kernel/arch/arm64/boot/dts/rockchip目录下的tspi-rk3566-user-v10-linux.dts设备树文件
3.1.1 创建节点

我们尝试在根节点下创建一个设备节点,添加以下内容:
  1. mylednode@0x1234{
  2.     gpios = <&gpio1 RK_PB3 GPIO_ACTIVE_LOW>;
  3.     status = "okay";
  4.     a-stringp-property = "my led A-string";
  5.     addr-property = <0xdeadbeef>;
  6. };
复制代码
3.1.2 重新编译内核

接下来我们保存设备树文件,并重新编译内核:
  1. ./build.sh kernel
复制代码
18.jpeg

3.1.3 打包、烧录固件

编译成功后,打包固件:
  1. ./mkfirmware.sh
复制代码
最后,重新烧录下boot(只更新boot即可)
19.jpeg

3.1.4 设备树节点信息验证

设备树信息会在内核初始化时传递给操作系统,我们进入到proc/device-tree目录,
  1. cd /proc/device-tree
  2. ls
复制代码
找到我们创建的设备树节点,如下图,可以看到我们创建的设备树节点,我们进入该目录,通过cat命令查看节点信息,说明我们的设备树节点创建成功了。
20.jpeg

21.jpeg

3.2 驱动开发测试

我们编写一个字符类型测试驱动,编译驱动前需要先将内核编译通过。
3.2.1 编写驱动

测试驱动代码如下:
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/fs.h>
  4. #define MY_NAME "chardev"
  5. int major = 0;
  6. int my_open (struct inode *inode, struct file *file)
  7. {
  8.         printk("open!\n");
  9.         return 0;
  10. }
  11. ssize_t my_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
  12. {
  13.         printk("read!\n");
  14.         return 0;
  15. }
  16. ssize_t my_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
  17. {
  18.         printk("write!\n");
  19.         return 0;
  20. }
  21. int my_close (struct inode *inode, struct file *file)
  22. {
  23.         printk("close!\n");
  24.         return 0;
  25. }
  26. struct file_operations fops = {
  27.         .open = my_open,
  28.         .read = my_read,
  29.         .write = my_write,
  30.         .release = my_close
  31. };
  32. static int __init mycdev_init(void)
  33. {
  34.         major = register_chrdev(0, MY_NAME, &fops);
  35.         if(major < 0)
  36.         {
  37.                 printk("reg failed!\n");
  38.                 return -1;
  39.         }
  40.         printk("reg successed\n");
  41.     return 0;
  42. }
  43. static void __exit mycdev_exit(void)
  44. {
  45.         printk("hello world %s\n","exit");
  46.         unregister_chrdev(major, MY_NAME);
  47. }
  48. module_init(mycdev_init);
  49. module_exit(mycdev_exit);
  50. MODULE_LICENSE("GPL");
  51. MODULE_AUTHOR("LiSir LiSir@qq.com");
复制代码
3.2.2 编写MakeFile

cc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-交叉编译链工具路径需要替换为你本地SDK下的实际目录。
  1. #外部编译
  2. #借助内核源码中的makefile文件 进行编译
  3. #先指定当前目录
  4. PWD ?= $(shell pwd)
  5. #内核源码路径
  6. KERNELDIR:=/home/lckfb/kernel
  7. CROSS_COMPILE ?= /home/lckfb/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
  8. obj-m += demo.o
  9. CC := $(CROSS_COMPILE)gcc
  10. module:
  11.         make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 modules
  12.         @# -C $(KERNELDIR) 从当前目录切换到内核源码下 借助内核源码makefile 进行make
  13.         @# M=$(PWD) 只编译当前目录下的驱动文件
  14.         @# ARCH=arm64 指定编译架构
  15.         $(CC) test.c -o test
  16. clean:
  17.         make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 clean
复制代码
3.2.3 编译驱动

在驱动文件,目录下,执行:
  1. make module
复制代码
编译成功后会得到xxx.ko驱动文件。
3.2.4 挂载驱动

将得到的xxx.ko文件通过ADB、SSH等方式copy至板卡目录下,执行挂载目录。
  1. insmod demo.ko
复制代码
3.2.5 加载驱动:
  1. mknod /dev/chardev c 236 0
复制代码
给驱动设置可执行权限
  1. chmod 777 /dev/chardev
复制代码
其中236代表主设备号,0代表子设备号,可以通过以下命令查看:
  1. cat proc/devices
复制代码
3.3 用户APP执行驱动验证

3.3.1 编写一个用户APP,

打开第8章我们编写的驱动,并执行读写操作,测试驱动现象,
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. int main()
  7. {
  8.         char buf[32] = {0};
  9.         int fd = open("/dev/chardev",O_RDWR);
  10.         if(fd == -1)
  11.         {
  12.                 printf("open failed");
  13.                 return -1;
  14.         }
  15.         printf("chardev open success\n");
  16.         read(fd,buf,sizeof(buf));
  17.         write(fd,buf,sizeof(buf));
  18.         close(fd);
  19.         return 0;
  20. }
复制代码
3.3.2 安装gcc交叉编译链工具
  1. sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
复制代码
3.3.3 编译APP
  1. sudo aarch64-linux-gnu-gcc test.c -o testAPP
复制代码
编译成功后会得到teatAPP文件,将该文件copy至板卡中,给testAPP设置可执行权限:
  1. chmod 777 testAPP
复制代码
3.3.4 执行APP
  1. ./testAPP
复制代码
22.jpeg

打印的信息与内核驱动及用户APP输出一致。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册