RK3568(泰山派开发板)开发环境搭建与使用
主要参考立创泰山派官方教程,链接:https://openkits-wiki.easyeda.com/zh-hans/tspi-rk3566/sdk-compilation/linux-compilation.html
一、芯片参数
CPU:4核A55,主频1.8GHz
GPU:支持OpenGL,支持4K,60fps解码
NPU:1.0TOP,可以跑一些简单的AI框架模型
价格:只要100多,非常划算!可以用来学习Linux、Andorid
二、开发环境搭建
虚拟机安装
用于在Windows中安装一个Ubuntu等linux操作系统,可以使用VMware、WSL2等方式,如果电脑是linux操作系统可以略过。我这里使用VMware,版本:VMware Workstation PRO 17。关于安装/Pojie虚拟机的教程有很多,不再赘述。
安装Ubuntu操作系统,
Ubuntu是linux的一个发行版本,我这里使用的Ubuntu版本如下:
内核版本:5.4.0-150
Ubuntu发行版本:18.04.1
这一步可以参考正点原子等,网上教程也很多。
值得注意的是Ubuntu虚拟机最少需要100G以上的空间,因为编译RK的SDK就需要80G
SDK下载
下载链接:https://pan.baidu.com/s/1HtnpytCBBqBOqZi8mfV4VQ?pwd=qcxx#list/path=%2F
目录:下载中心->百度网盘->第05章.【立创·泰山派】系统SDK->【SDK】Linux->tspi_linux_sdk_xxxxxxxx.tar.gz
框起来的两个文件下载其中一个即可,我使用不带repo的。
下载完成后,可以通过Samba共享文件夹的方式,将SDK目录复制到虚拟机工作目录下,目录名称不要包含中文。
注意:下载完成后,最好使用md5sum工具检验一下文件完整性,与SDK目录里的MD5码对比一下。
将SDK压缩包解压:
tar -zxvf tspi_linux_sdk_20230916.tar.gz
解压后会得到Release目录,目录下的文件内容如下:
app buildroot debian envsetup.sh IMAGE Makefile prebuilts rkflash.sh tools yocto
br.log build.sh device external kernel mkfirmware.sh rkbin rockdev u-boot
app: 存放上层应⽤ app,主要是 qcamera/qfm/qplayer/settings 等⼀些应⽤程序。
buildroot: 基于 buildroot (2018.02-rc3) 开发的根⽂件系统。
debian: 基于 debian 10 开发的根⽂件系统,⽀持部分芯⽚。
device/rockchip: 存放各芯⽚板级配置和 Parameter ⽂件,以及⼀些编译与打包固件的脚本和预备⽂件。
IMAGE: 存放每次⽣成编译时间、XML、补丁和固件⽬录。
external: 存放第三⽅相关仓库,包括⾳频、视频、⽹络、recovery 等。
kernel: 存放 kernel 4.4 或 4.19 开发的代码。
prebuilts: 存放交叉编译⼯具链。
rkbin: 存放 Rockchip 相关的 Binary 和⼯具。
rockdev: 存放编译输出固件。
tools: 存放 Linux 和 Windows 操作系统环境下常⽤⼯具。
u-boot: 存放基于 v2017.09 版本进⾏开发的 uboot 代码。
yocto: 基于 yocto gatesgarth 3.2 开发的根⽂件系统,⽀持部分芯⽚。
编译环境配置
主要是安装一些编译用的工具。
sudo apt-get update
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 ncurses-dev
需要保持网络通畅。
编译SDK
板级配置:
选择3,BoardConfig-rk3566-tspi-v10.mk,并回车
./build.sh lunch
查看配置是否生效
./build.sh -h kernel
5.2 选择操作系统
可选buildroot、debian、ubuntu,buildroot根文件系统所占内存比较小,优先推荐。
此外,如果你的开发不涉及驱动开发,只做应用开发,也可以直接下载官方编译好的系统镜像,地址:
https://pan.baidu.com/s/1HtnpytCBBqBOqZi8mfV4VQ?pwd=qcxx#list/path=%2F
在06章-系统镜像目录下。
以编译buildroot操作系统为例:选择buildroot操作系统
export RK_ROOTFS_SYSTEM=buildroot
运行全编译:(全编译时间非常漫长,取决于电脑配置,我编译了2个小时)
./build.sh all # 只编译模块代码(u-Boot,kernel,Rootfs,Recovery)
# 需要再执⾏./mkfirmware.sh 进⾏固件打包
第一次编译需要选择电源:
编译完成后截图:
5.3 固件打包
./mkfirmware.sh
打包成功后,固件会输出到 rockdev 目录:
boot.img misc.img parameter.txt rootfs.img update.img
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
固件烧录
6.1 windows系统下固件烧录
6.1.1 下载RKDevTool.exe工具,在07-开发工具目录下。
6.1.2 下载Tspi_linux_config.cfg配置文件:
下载中心->百度网盘->第06章.【立创·泰山派】系统镜像->【镜像】Ubuntu->Tspi_Linux_config.cfg
6.1.3 下载镜像
打开RKDevTool.exe软件,右键选择导入Tspi_linux_config.cfg配置文件,并把路径改成你编译好的固件路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级。升级完成后系统会自动重启。
重启后,能通过ADB或者串口方式登录进去,串口输出一下信息,说明SDK编译、烧录成功了。
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按键)。在“虚拟机****→可移动设备”下面也可以找到该设备,如下图所示:
进入到/rockdev 目录
使用UL指令烧写MiniLoaderAll.bin镜像,使用DI指令烧写其它镜像(uboot.img、boot.img、 oem.img、userdata.img、rootfs.img、misc.img 等)以及分区表文件 parameter.txt。
- 先烧写 MiniLoaderAll.bin 镜像,使用 UL 指令烧写 MiniLoaderAll.bin(执行 upgrade_tool 命令时需要加入 sudo 获取到 root 用户权限,否则操作会失败!):
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool UL MiniLoaderAll.bin -
noreset
- 要通过 DI 指令下载 parameter.txt 分区表:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -p parameter.txt
- 烧录其它镜像:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -uboot uboot.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -misc misc.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -boot boot.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -recovery recov
ery.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -oem oem.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -rootfs rootfs.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -userdata userdata.img
- 最后,当所有镜像全部烧录完成后,我们可以执行下面这条命令复位开发板、重新启动系统:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool RD
对于update.img(打包后的整个文件)使用以下命令烧录:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool UF update.img
设备树使用测试
找到SDK目录下:kernel/arch/arm64/boot/dts/rockchip目录下的tspi-rk3566-user-v10-linux.dts设备树文件
7.1 创建节点
我们尝试在根节点下创建一个设备节点,添加以下内容:
mylednode@0x1234{
gpios = <&gpio1 RK_PB3 GPIO_ACTIVE_LOW>;
status = "okay";
a-stringp-property = "my led A-string";
addr-property = <0xdeadbeef>;
};
7.2 重新编译内核
接下来我们保存设备树文件,并重新编译内核:
./build.sh kernel
7.3 打包、烧录固件
编译成功后,打包固件:
./mkfirmware.sh
最后,重新烧录下boot(只更新boot即可)
7.4 设备树节点信息验证
设备树信息会在内核初始化时传递给操作系统,我们进入到proc/device-tree目录,
cd /proc/device-tree
ls
找到我们创建的设备树节点,如下图,可以看到我们创建的设备树节点,我们进入该目录,通过cat命令查看节点信息,说明我们的设备树节点创建成功了。
驱动开发测试
我们编写一个字符类型测试驱动,编译驱动前需要先将内核编译通过。
8.1 编写驱动
测试驱动代码如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#define MY_NAME "chardev"
int major = 0;
int my_open (struct inode *inode, struct file *file)
{
printk("open!\n");
return 0;
}
ssize_t my_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
{
printk("read!\n");
return 0;
}
ssize_t my_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
{
printk("write!\n");
return 0;
}
int my_close (struct inode *inode, struct file *file)
{
printk("close!\n");
return 0;
}
struct file_operations fops = {
.open = my_open,
.read = my_read,
.write = my_write,
.release = my_close
};
static int __init mycdev_init(void)
{
major = register_chrdev(0, MY_NAME, &fops);
if(major < 0)
{
printk("reg failed!\n");
return -1;
}
printk("reg successed\n");
return 0;
}
static void __exit mycdev_exit(void)
{
printk("hello world %s\n","exit");
unregister_chrdev(major, MY_NAME);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LiSir LiSir@qq.com");
8.2 编写MakeFile
cc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-交叉编译链工具路径需要替换为你本地SDK下的实际目录。
#外部编译
#借助内核源码中的makefile文件 进行编译
#先指定当前目录
PWD ?= $(shell pwd)
#内核源码路径
KERNELDIR:=/home/lckfb/kernel
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-
obj-m += demo.o
CC := $(CROSS_COMPILE)gcc
module:
make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 modules
@# -C $(KERNELDIR) 从当前目录切换到内核源码下 借助内核源码makefile 进行make
@# M=$(PWD) 只编译当前目录下的驱动文件
@# ARCH=arm64 指定编译架构
$(CC) test.c -o test
clean:
make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 clean
8.3 编译驱动
在驱动文件,目录下,执行:
make module
编译成功后会得到xxx.ko驱动文件。
8.3 挂载驱动
将得到的xxx.ko文件通过ADB、SSH等方式copy至板卡目录下,执行挂载目录。
insmod demo.ko
加载驱动:
mknod /dev/chardev c 236 0
给驱动设置可执行权限
chmod 777 /dev/chardev
其中236代表主设备号,0代表子设备号,可以通过以下命令查看:
cat proc/devices
用户APP执行驱动验证
9.1 编写一个用户APP,
打开第8章我们编写的驱动,并执行读写操作,测试驱动现象,
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
char buf[32] = {0};
int fd = open("/dev/chardev",O_RDWR);
if(fd == -1)
{
printf("open failed");
return -1;
}
printf("chardev open success\n");
read(fd,buf,sizeof(buf));
write(fd,buf,sizeof(buf));
close(fd);
return 0;
}
9.2 安装gcc交叉编译链工具
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
9.3 编译APP
sudo aarch64-linux-gnu-gcc test.c -o testAPP
编译成功后会得到teatAPP文件,将该文件copy至板卡中,给testAPP设置可执行权限:
chmod 777 testAPP
9.4 执行APP
./testAPP
打印的信息与内核驱动及用户APP输出一致。
RK3568(泰山派开发板)开发环境搭建与使用的更多相关文章
- Tiny4412 开发板 编译环境搭建【转】
本文转载自:http://blog.csdn.net/beijiwei/article/details/51055369 版权声明:本文为博主原创文章,未经博主允许不得转载. /*********** ...
- STM32F407Discovery开发板使用环境搭建
差不多4年前买了STM32F407Discovery这块开发板,也用它作为我的毕业设计的一部分,今晚整理一下东西,觉得这么不错的东西应该再次利用起来,做个智能家居系统的一部分什么的也不错,于是,记录一 ...
- ubuntu12.04下CKermit与开发板交互环境搭建
CKermit蛮好的一个调试工具!就像在windows下的telnet,但是还是折腾了一下,现在看来,非常容易,其实我主要是在开发板为正常工作的情况下,以为是CKermit的问题,其实是我开发板开机设 ...
- 使用Kotlin开发Android应用 - 环境搭建 (1)
一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...
- S3C6410开发板开发环境的搭建
本节主要介绍了S3C6410开发板及OK6410开发板.OK6410开发板是基于ARM11处理器的S3C6410,采用“核心版+底板”结构 主要步骤如下:. OK6410开发板自带一个串口,PC也需要 ...
- 第五章 搭建S3C6410开发板测试环境
开发板是开发和学习嵌入式技术的主要设备.在这章中介绍了S3C6410开发板,它是三星公司推出的一款低功耗.高性价比的RISC处理器.安装串口调试工具:minicom.它的安装步骤:第1步:检测当前系统 ...
- 基于GBT28181:SIP协议组件开发-----------第一篇环境搭建
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3930018.html,qq:1269122125. SIP协议在安 ...
- 1 IDEA 安装 及 IDEA开发 spring的环境搭建
摘要: 主要讲解使用 IDEA 开发 Spring MVC 的环境搭建,Maven的简单教学. 参考1:https://my.oschina.net/gaussik/blog/385697 参考2:h ...
- Android NDK开发之从环境搭建到Demo级十步流
写在正文之前: 几个月没有更新博客,感觉有点生疏了,所以说不能断,一断人就懒. 其实这几个月也并不是什么事也没有做,俺可是时刻想着今年的任务呢,10本书,30篇博文...,这几个月间断性的也是在学习中 ...
- UI5-学习篇-1-Eclipse开发工具及环境搭建
最近研究SAP-UI5好几个月了,将相关学习经历及问题点做个记录. 1.先了解学习资料相关站点 SAP官网:https://www.sap.com/china/index.html SAP开发工具:h ...
随机推荐
- 【doctrine/orm】findBy用法
用法: //$condition array('表字段对应的entity的属性'=>'值') //$orderBy array('表字段'=>'ASC/DESC') //$count in ...
- 搞定 XLSX 预览?别瞎找了,这几个库(尤其最后一个)真香!
- Hey, 我是 沉浸式趣谈 - 本文首发于[沉浸式趣谈],我的个人博客 **https://yaolifeng.com** 也同步更新. - 转载请在文章开头注明出处和版权信息. - ...
- TypeScript+Vue3
TypeScript Any 类型 和 unknown 顶级类型 1.没有强制限定哪种类型,随时切换类型都可以 我们可以对 any 进行任何操作,不需要检查类型 2.声明变量的时候没有指定任意类型默认 ...
- 17.8K star!完美超越宝塔的产品,像呼吸一样部署应用,这款开源神器绝了!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dokploy是一个强大的开源平台,旨在简化全栈 Web 应用的开发和部署.通过其直观的界面 ...
- JS 构造函数与类
严格来说, JS 并不是一个面向对象的语言, 类似 Java, Python, C++ 这样的. JS 的独特精妙的设计其实是 原型 prototype 因此这里讲一嘴面向对象其实是为了后面引出原型的 ...
- vue3适配移动端的登录实现
<script lang="ts" setup> import { ref } from 'vue' const PHONE_NUMBER_REGEX = /^1[0- ...
- 轻松掌握Manim的.animate语法:让动画编程更简单
在Manim中,.animate语法是一个非常实用的功能,它能让你的动画代码变得更加简洁和直观. 本文将详细介绍.animate语法,看看它是如何让动画制作变得更加简单又有趣,即使是编程新手也能轻松上 ...
- 7 MyBatis动态SQL之bind标签|转
1 MyBatis动态SQL之if 语句 2 MyBatis动态sql之where标签|转 3 MyBatis动态SQL之set标签|转 4 MyBatis动态SQL之trim元素|转 5 MyBat ...
- ChatterBot人工智能,聊天机器人,无坑指南(安装,使用)(2.使用篇)
上一篇(安装):https://www.cnblogs.com/Ctrl-cCtrl-v/p/13220584.html 基础代码: 1 from chatterbot import ChatBot ...
- Java IO<1>File类
java.io.File类 文件和文件目录路径的抽象表示形式,与平台无关 File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内容本身,则需要使用输入/输出 ...