华硕tinkerboard 2s Android11系列-bootloader部分的编译_tinker board 编译-程序员宅基地

技术标签: android  

        前一篇《第一款能运行Android11 的RK3399开发板tinkerboard2》已经对tinkerboard2的Android 11有个大致的介绍,这一期来聊聊tinkerboard2 Android11 SDK  bootloader部分的编译与烧录验证。后续的文章会从多个方面详细介绍如何基于官方的SDK定制一套Android固件。

        这里要首先感谢华硕tinkerboard开发团队开放的Android 11源码,让笔者有机会从最底层接触目前最新的操作系统,华硕工控主板tinker board系列的开发者汇集地:

https://tinkerboard.cn/是官方支持的论坛,有问题都可以上这里找或者问。

        深圳风火轮作为华硕AIoT官方合作伙伴,在背后真的默默做了很多,感谢!

准备工作

     前一篇文章提到,目前tinkerboard2 Android11的源码已经开放,可以从https://github.com/TinkerBoard2-Android获取其源码,但是github服务器是在国外,源码大小为90多G,导致下载源码需要翻墙。对于普通用户来说是很不友好的。深圳风火轮团队已将tinkerboard2 Android11的源码保存到百度网盘。用户可以到深圳风火轮官方论坛https://smartfire.cn/thread-5481-1-1.html下载源码。本文以及后续的文章中提及的技术细节全部是基于这套源码,所以要先下载这套源码。

注:Tinker board 2和Tinker Board 2s的区别就是2s板载了16GB的eMMC。

然后要安装一些必要的编译工具,直接用下面的命令即可

sudo apt-get install repo 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 python-pip ncurses-dev python-pyelftools

Android整体启动流程

​​​​​​​

 

        上图展示了从上电到Android启动的大致流程,从上电启动开发板之后,会先执行片上的一段BOOTROM,这个BOOTROM烧写在芯片上,不能修改,其存在的意义就是跳转到FSBL。然后FSBL初始化DDR emmc 调试串口之后,跳转到SSBL,SSBL在rk平台上就是u-boot。之后u-boot引导kernel+ramdisk启动。对于不启用A/B分区的设备来说,是通过参数决定要使用normal mode还是recovery mode。对于启用了A/B分区的设备,则是决定要启用slot A的固件还是slot B的固件。ramdisk里面的Android init进程会进行分区挂载,创建目录,启动相关服务等操作,最终启动完整版本的Android系统。如果是recovery模式,则recovery init进程会根据需要进行恢复出厂设置,ota升级,备份等操作。

tinkerboard2 Android11FSBL

RK平台的FSBL有两种:

         第一种是使用uboot tpl+uboot spl,这种方式的特点是全开源,源码可自由修改,rk开放了他们目前使用的全部uboot源码,利用这套源码即可编译出tpl和spl。也可以自由选择mainline的uboot,里面也包含tpl和spl。

       第二种是使用rk的ddr bin和miniloader,ddr bin主要功能就是初始化ddr,相当于tpl,miniloader是初始化一些外设,相当于spl。这种方式只有某些参数允许修改,比如ddr频率,调试串口的波特率,使用的引脚等信息,这种方式优势 在于rk官方调试过的ddr、emmc、nand flash芯片全部都支持,不需要用户进行适配。

 

 上图展示了两种启动方式的区别与联系,其最终的目标都是启动boot.img(图片来源Rockchip open source Document)

在一般的使用场景中,用户不需要修改第一级的boot信息,这一阶段需要实现的逻辑相对简单,复杂一点的逻辑应该放到后续的uboot里面,因此,这里通常使用的还是rk的ddr bin和miniloader。

Tinkerboard2s主控RK3399的ddr bin和miniloader存放在rkbin/bin/rk33目录下

 这里的ddr和miniloader就是fsbl需要用到的。

根据rk开发文档中的描述,其ddr bin和miniloader之间支持参数传递,这里ddr bin的参数允许修改。找到rkbin/tools/ddrbin_param.txt

这是个配置文件,里面可以配置的参数包括串口信息,DDR信息。DDR信息只有在需要用到RK官方没有适配过的内存芯片的时候才需要修改,而这款芯片是在RK的支持列表上面的,所以不需要改其他的参数,唯一需要改的就是串口。

查看原理图可以知道,目前使用的串口使用串口2,对应的GPIO为GPIO4_C3和GPIO4_C4,这两个引脚对应的是uart2c

 因此这个配置文件,串口信息配置如下

 将这个文件命名为ddrbin_param_3399_115200.txt,然后在rkbin/bin/rk33下找到一个rk3399的ddr文件,且ddr频率比较相近的。在tinkerboard2上,内存芯片型号为K4F8E304HB,查看三星官网,这颗芯片的频率在933MHz之上,因此选择文件,复制一份这个文件,并且重命名为rk3399_ddr_933MHz_v1.24_115200.bin,在rkbin/tools下执行命令

./ddrbin_tool ddrbin_param_3399_115200.txt ../bin/rk33/rk3399_ddr_933MHz_v1.24_115200.bin

即可将这个ddr.bin文件的启动串口信息修改

 然后修改rkbin/RKBOOT/RK3399MINIALL.ini可以指定打包时的ddr和miniloader文件名,miniloader没有提供修改工具,它的参数从ddr.bin中传递而来,因此用默认的即可

 最终在SDK目录下面的uboot文件夹中执行脚本

./make.sh loader

即可得到rk3399_loader_v1.24.126.bin,就是制作出来的FSBL固件

然后烧录到板上验证一下,要烧录loader固件,必须使tinkerboard2进入maskrom模式,用跳线帽短接电源口旁边的排针,如下图

 然后上电,上电之后将跳线帽拔出,然后打开rk的烧录工具,选择loader进行烧录

 烧录完之后,可以看到ddr.bin的运行信息已经打印出来,说明修改成功。

tinkerboard2s Android11SSBL

         Tinkerboard2s Android11的SSBL,也就是uboot,源码已经全部提供,在SDK根目录的uboot文件夹中。

        这个uboot如果不需要添加额外的功能,直接进行编译就行。编译命令为./build.sh rk3399。执行此命令时,默认使用的defconfig文件为rk3399_defconfig。

        ASUS的github上面提供的代码是在RK的基础上面进行了更改的,增加了UMS和一些特殊的显示屏的支持。

        如果不需要启用ASUS官方默认支持的插上type-c线即进入UMS模式的功能,则需要进行如下更改

arch/arm/mach-rockchip/boot_mode.c

 RK的uboot启用了live dt技术,就是说对于大多数的驱动,它会启用kernel设备树里面的属性。因此,如果需要在uboot里面控制某些gpio的高低电平,比如点LED之类的,不需要在uboot中修改,直接修改kernel的设备树即可。

uboot的引导启动kernel的LOG如下

Tinkerboard2s Android11TRUST

        ARM公司提出的了trustzone技术,使用NS位来判断当前处于secure world还是non-secure world状态,状态的切换由ATF(arm trusted firmware)来完成。目前这项功能在ARM64处理器上面是全部默认支持的,同时Android系统也需求这项技术,用于保护一些保密信息,如信用卡pin码,私有密码,客户数据等。

        RK平台上,uboot会引导启动TRUST固件,这个固件不开源,它的配置从uboot获取。修改rkbin/RKTRUST/RK3399TRUST.ini可以指定bl31 bl32文件,这两个文件基本不需要修改,默认即可。最终的运行效果如下

总结

        本文介绍了tinkerboard2s Android11 SDK整个bootloader的流程。bootloader从上电运行,到引导进入kernel结束,总共包含三个部分,分别为FSBL,包括ddr bin和miniloader;SSBL,也就是uboot;以及ATF固件。在这三个部分中,uboot是完全开源的,也是华硕修改比较多的,如果大家不想下载整个SDK,也可以单独浏览这部分的代码,其源码地址为

GitHub - TinkerBoard2-Android/u-boot

        在最后,感谢华硕tinkerboard开发团队的开源精神,愿意将一些定制的代码放出来给大家学习。同时向大家推荐一下tinkerboard2S,这款开发板是市面上少有的,完全开源,能够从最底层学习Android的开发板之一。

关于主板的更多详细信息,可以访问华硕AIoT京东旗舰店

ASUS华硕tinkerboard 2S 瑞芯微RK3399开发板 安卓linux 4K双屏显示 官方标配 tinker board 2S(4GB+16GB)【图片 价格 品牌 报价】-京东ASUS华硕tinkerboard 2S 瑞芯微RK3399开发板 安卓linux 4K双屏显示 官方标配 tinker board 2S(4GB+16GB)图片、价格、品牌样样齐全!【京东正品行货,全国配送,心动不如行动,立即购买享受更多优惠哦!】https://ic-item.jd.com/10047476237091.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ok138ok/article/details/124551718

智能推荐

解决《CPU设计实战》第四章实践交叉编译时报错mipsel-linux-ld: section .MIPS.abiflags LMA overlaps section .data LMA_section .arm.__at_0x00070000 lma [00001bdc,00001be-程序员宅基地

文章浏览阅读1.6k次。解决《CPU设计实战》4.3.1节快速上手CPU设计的开发环境的第4步,编译测试程序时,报错mipsel-linux-ld: section .MIPS.abiflags LMA overlaps section .data LMA的问题,或是其他相似的问题也可参考。_section .arm.__at_0x00070000 lma [00001bdc,00001beb] overlaps section .code

QR二维码编码原理_二维码qr编码算法是什么-程序员宅基地

文章浏览阅读8.4k次,点赞4次,收藏17次。QR码生成原理(一)一、什么是QR码QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下:这个图如果被正确解码,应该看到我的名字和邮箱。二、QR码的特点说到QR码的特点,一是高速读取(QR就是取自“Quick Response”的首字母),对读取速度的体验源自于我..._二维码qr编码算法是什么

初步解析小程序前端框架vant-ui源码_微信小程序vantpopup源码-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏2次。初步解析小程序前端框架vant-ui源码本学期的系统分析课程要求我们做一个小项目,我们以微信小程序为框架进行了项目的前端搭建,在UI上以开源组件库vant-ui为基础进行了设计,其中用到了许多该开源库的设计,对于项目前端起到了很大的帮助。组件库的使用教程在 https://youzan.github.io/vant-weapp/#/intro ,介绍说明比较详细且简单,因此这里不再赘述,这里..._微信小程序vantpopup源码

树状数组上二分-程序员宅基地

文章浏览阅读3.2k次。树状数组+二分考虑一个简单的问题,维护一个数组,支持每次修改一个数的值,保证每时每刻每个数都为非负数。每次查询求前缀和kkk lower_bound 的值。对于修改,可以用树状数组、线段树等数据结构维护。二分查找可以在[l,r][l,r][l,r]的范围上二分答案,mid=⌊l+r2⌋mid = \lfloor \frac{l+r}{2} \rfloormid=⌊2l+r​⌋,验证midmidmid的前缀和是否大于kkk,并调整midmidmid。时间复杂度O(log22n)O(log^2_2n)O_树状数组上二分

数据结构——顺序串(定义初始化、赋值、遍历、两串比较)_串的初始化-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏47次。S;串的组成1length用length记录串的长度是为了减少后期的遍历串获取串长度的时间复杂度。如果不设置length的话,每一次获取字符串长度都需要一次循环,时间复杂度为O(n),如果设置了length的话,给串新增字符的过程中就记录当前串的长度,未来需要串的长度的时候直接获取length就可以了,时间复杂度降低为O(1)。2chch是串里的字符串。......_串的初始化

Maven的dependency中无版本号的可能情况_android studio dependencies里没有版本信息-程序员宅基地

文章浏览阅读2.3k次。pom文件的依赖无版本号的可能原因_android studio dependencies里没有版本信息

随便推点

虚拟内存_matlab2010 虚拟内存-程序员宅基地

文章浏览阅读138次。程序代码和数据。对所有的进程来说,代码是从同一固定地址开始,紧接着的是和C 全局变量相对应的数据位置。堆。代码和数据区在进程一开始运行时就被指定了大小,与此不同,当调用像 malloc 和 free 这样的 C 标准库函数时,堆可以在运行时动态地扩展和收缩。共享库。大约在地址空间的中间部分是一块用来存放像 C 标准库和数学库这样的共享库的代码和数据的区域。栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。特别地,每次我们调用..._matlab2010 虚拟内存

npm运行报错Error: EEXIST: file already exists解决办法_npm run dev error: eexist: file already exists, mk-程序员宅基地

文章浏览阅读6.5k次。如果你百度了很多方法都没有解决的话,请用管理员权限打开cmd,然后再输入npm安装命令试一试。反正我解决了_npm run dev error: eexist: file already exists, mkdir 'c:\windows\system32\c

物联网能为企业带来哪些创新?看看这些成功案例!-程序员宅基地

文章浏览阅读108次。物联网(Internet of Things,IoT)是指通过互联网连接各种设备和物品,使它们能够相互通信和交换数据的网络。在这个数字化时代,物联网已经成为了企业数字化转型的重要驱动力。通过物联网技术,企业可以实现对企业数据的实时监控、数据分析和智能化决策,从而提高企业的效率和效益,实现更高的商业价值。下面,我们将介绍一些成功的物联网应用案例,以帮助您更好地了解物联网的潜力。

阶次跟踪的角域重采样matlab,一种基于包络提取的高精度无键相信号阶次跟踪方法及系统与流程...-程序员宅基地

文章浏览阅读1.7k次。本发明涉及一种基于包络提取的高精度无键相信号阶次跟踪方法及系统,属于故障诊断技术与信号处理分析技术领域。背景技术:传统的阶次齿轮箱故障信号特征提取针对的是恒定转速运转下的测试信号,但对于工程机械等现代大型复杂机械装备中,恶劣的工作环境导致其运行工况复杂,转速和负荷等工况参数的变化将导致其振动信号具有明显的非平稳性,因此其采集的振动信号不直接满足傅里叶变换的平稳性要求。针对此问题出现了阶次跟踪方法,..._matlab阶次跟踪

python高阶知识之——字典/集合推导式_字典推导式 key自增怎么写-程序员宅基地

文章浏览阅读205次。什么是推导式:推导式是用来快速的生成数据1、推导式类型2、字典推导式推导式结合条件语句语法:dict = { key:value for i in xxx if 条件}推导式结合三元运算符语法:dict = { key:value if 条件 else key2:value2 for i in xxx}3、字典推导式原则4、注意事项5、集合推导式......_字典推导式 key自增怎么写

C语言经典编程之字符串_char ch : input-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏18次。C语言经典编程之字符串:按特定顺序输出压缩,IP地址判断是否合法,字符串压缩、解压、排序,查找相同的字串,单词升序排列,统计单词个数,Objective-C和C++命名之争,字符串删除、插入、替换、抽取、交换、拼接、分割,统计字母在字符串中出现的次数等。_char ch : input