根据最近使用的恩智浦S32G274ARDB2开发板,我总结了开发中遇到的一些问题,积累的一些经验,包括系统移植,启动流程分析,跑裸机代码,异核通信示例使用等等,将分成几篇文章讲解分享。第一部分先来针对刚上手的用户讲解一些系统移植时需要注意的内容,包括了编译注意事项,如何使用fdisk工具,烧写注意事项等。
目录
一. 需要准备的东西
根据目前恩智浦官网上给出的S32G BSP,目前我使用的版本是bsp33版本,手册名为S32G2_LinuxBSP_33.0_User_Manual
1.u-boot:使用git下载对应版本u-boot
2.kernel:使用git下载对应版本内核
3.TF-A:使用git下载TF-A
4.交叉编译器:使用git下载对应交叉编译器
5.DTC:在编译TF-A过程中需要保证DTC版本在1.4.6版本以上,使用
dtc --version
查看当前device-tree-compiler的版本,如果低于1.4.6,在编译TF-A时会在BL33阶段报出这样的错误,可在csdn中搜索到高版本DTC的相关资源。
二.编译过程注意事项
初次使用我使用SD卡作为默认启动方式。
为了方便后续开发可以将下载好的交叉编译器解压到/usr/local/arm路径下,并将交叉编译器添加到环境变量中。
sudo vi /etc/profile
在最后添加以下命令,保存后退出
export PATH=$PATH:/usr/local/arm/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin
1.u-boot编译
可以先将Makefile提前添加CROSS_COMPILE、PLAT和ARCH
ARCH = aarch64
CROSS_COMPILE = aarch64-none-linux-gnu-
PLAT = s32g274ardb2
进行make xxxdeconfig配置uboot
随后进行u-boot编译,生成u-boot-nodtb.bin文件供后续TF-A编译使用。
2.内核编译
与u-boot步骤一致,最终生成image镜像位于arch/arm64/boot路径下,生成设备树文件位于arch/arm64/boot/dts/freescale/路径下。
3.TF-A编译
初次使用建议不使用OP-TEE。
首先下载fiptool工具等库
sudo apt-get install libssl-dev openssl
随后进行编译,注意此时BL33的路径为编译好的u-boot-nodtb.bin的路径(路径最后要写到u-boot-nodtb.bin)不写完整就会失败,很重要!!!
make CROSS_COMPILE=aarch64-none-linux-gnu- \
ARCH=aarch64 PLAT=<plat> BL33=<path-to-u-boot-nodtb.bin>
三.烧写过程注意事项
由于整体镜像使用SD卡进行移植,关于从SD卡启动的流程,我会在下篇文章详细说明。在这里我们首先要对SD卡进行分区处理,分别存放fip.s32、内核和根文件系统。
1.如何使用fdisk工具
根据手册的内容,我们会将SD卡分成三块存储区域,在Ubuntu中,使用
sudo fdisk ${DEVSD} //DEVSD为SD卡的挂载路径,一般为/dev/sd*,可以使用df命令查看
随后我们使用此fdisk工具
d [删除分区,直至分区表为空]
n [新建分区]
p [新建primary分区]
1 [1号分区]
8192 [偏移8192字节,主要是给fip.s32留的]
+255M [1号分区占255M字节,用于保存zImage和设备树]
p [查看当前分区信息,可知1号分区到530431字节]
n [新建分区]
p [新建primary分区]
2 [2号分区]
530432 [从第530432字节开始]
<enter>[回车将默认剩余存储空间都给2号分区]
t [修改分区文件系统类型]
1 [选择1号分区]
c [FAT32]
t [修改分区文件系统类型]
2 [选择2号分区]
83 [Linux]
w [ 保存分区表信息到SD卡扇区0(前512字节)]
分区完成后,使用
sudo mkfs.vfat -n boot ${DEVSD}1
sudo mkfs.ext3 -L rootfs ${DEVSD}2
两个命令分别将1号分区和2号分区格式化并重命名为boot和rootfs
2.如何烧写各镜像
在此过程中,最重要的就是fip.s32的烧写,由于我们的SD卡扇区0(前512字节)保存的是分区表信息,所以在烧写时要特别注意跳过fip.s32和SD卡的前512字节
如图为fip.s32的镜像,在编译时已经空出了前512字节没有保存任何内容,所以在烧写时我们也要将这部分跳过去,阅读芯片手册可知,SD卡启动方式IVT表起始位置为1000h,如果这里烧写时不跳过去,地址就会对不上,因此我们使用命令
sudo dd if=fip.s32 of=${DEVSD} conv=notrunc,fsync seek=512 skip=512 oflag=seek_bytes iflag=skip_bytes
将fip.s32烧写进去。
之后的工作非常简单,分别将镜像、设备树拷贝到/boot分区下,将根文件系统解压到/rootfs分区下
sudo cp Image ${SD_MOUNT_POINT}/boot/
sudo cp <dtb_file> ${SD_MOUNT_POINT}/boot/<dtb_file>
sudo tar xf <rootfs> -C ${SD_MOUNT_POINT}/rootfs
sync
就大功告成了。
下一篇文章我会详细说明整体的启动流程