NXP_S32G域控制器BSP入门

NXP S32G 域控制器BSP入门

硬件型号: S32G274A-RDB2

参考文档:S32G2_BSP29.0.0_HF1_User_Manual.pdf(官网下载)

撰写时间:2021-11

1. 简述

  • Quad Arm ® Cortex ® -A53 内核采用 Arm Neon ™ 技术,组织成两个集群,每两个内核具有用于应用程序和服务的可选集群同步
  • 用于实时应用的三重 Arm Cortex-M7 锁步内核
  • 用于汽车网络加速的低延迟通信引擎 (LLCE)
  • 用于以太网网络加速的数据包转发引擎 (PFE)
  • 用于安全启动和加速安全服务的硬件安全引擎 (HSE)
  • 用于 ASIL D 系统的高级功能安全硬件和软件
  • AEC-Q100 2 级设备:-40 °C 至 105 °C
S32G2处理器

图1 S32G处理器规格

2. 启动

2.1 电源选择

如图2所示,SW15为电源开关。当拨码开关位于左侧ON(ON1)时,开发板由J176口AC/DC12V电源连接供电;当拨码开关位于右侧ON(ON2)时,开发板由J5口引脚2(12V)、引脚3(接地)连接供电。当拨码开关位于OFF时,开发板下电。

图2 S32G274A-RDB2 电源模式设置

2.2 启动方式

S32G274A-RDB2支持4种启动方式,分别为:

  • SD卡启动
  • eMMC启动
  • NOR Flash启动
  • Serial 启动

通过SD卡启动的开关设置如图3。

图3 通过 SD 启动的开关设置

2.3 设置超级终端并登录

2.3.1 开发板设置与连接

图4为S32G274A-RDB2开发板的元件概貌图。

image-20230417155438297

图4 S32G274A-RDB2开发板元件概貌

  • 将开关设置为SD卡启动方式,同时将SD卡插入卡槽。
  • 通过UART0口连接开发板与PC机。
  • 连接电源,打开开关。

2.3.2 Putty设置与登录

使用Putty或其他方式登录开发板是为了可以看到开发板的打印信息,类似于ubuntu主机下的terminal一样;Putty登录的优点是:可以在没有调试网络端口的情况下登录;Putty登录的缺点是:界面中无法使用鼠标保存。

  • 确认设备权限

通过ls -al /dev/ttyUSB查看设备号及权限。

通过sudo chmod a+x /dev/ttyUSB0打开执行权限。

图5 确认设备权限

  • 打开Putty进行如下设置

图6 Putty登录设置

  • 登录连接

在S32G274A-RDB2启动后,输入“root”登录。

图7 Putty登录连接

  • 退出登录

在结束使用后,通过“Ctrl+d”或输入“exit”退出登录。

图8 Putty退出登录

注意:除上述Putty登录开发板方式外,还可通过其他方式登录。如图9可通过ssh登录开发板。

图9 通过SSH登录开发板

3. 构建Linux BSP

3.1 构建原因

Linux BSP包含了uboot,kernel等内容,其中的也包含了设备的驱动。

构建Linux BSP的原因如下:

  • 原厂驱动不完善,影响开发板上一些设备的使用。在开发板发布的初期,存在一种普遍的情况是:原厂提供的BSP仅能驱动开发板上一部分设备,有一些设备(网口等)的驱动部分不包含在原厂的BSP中。如果开发人员不能自己构建BSP驱动设备的话会导致开发板上部分设备无法使用,影响项目中的功能开发。

  • 开发时需要对部分设备进行自定义设定。有时需要对部分设备的驱动做更改以适应项目开发需求。

  • BSP版本需要自己更新。存在部分情况是更新的BSP会解决上一版本BSP出现的问题,此时需要更新BSP中uboot,kernel版本(可单独更新uboot或kernel)。不过这里需要注意保持版本间互相匹配(uboot与kernel版本),BSP与开发板互相匹配。

3.2 构建方式

可通过YOCTO或者交叉编译工具链两种方式构建Linux BSP。

请参见“S32G2_BSP29.0.0_HF1_User_Manual.pdf”中P7-P9中“2.1 Building the Linux BSP using YOCTO”内容。

3.2.1 通过YOCTO构建Linux BSP

步骤

  • 构建默认YOCTO

首先更新包管理器:

1
sudo <pkg-mgr> update

其次安装依赖:

1
2
3
4
5
6
7
8
# python 2.x - 2.6或更高版本:
sudo <pkg-mgr> install python
# git 1.8.3或更高版本:
sudo <pkg-mgr> install git
#curl:
sudo <pkg-mgr> install curl

# 注:其中<pkg-mgr>是系统的包管理器(Debian/Ubuntu:apt-get或apt;CentOS/Fedora:yum或dnf;Suse:zypper)。

接着,安装repo,命令如下(仅需操作一次)

1
2
3
4
mkdir ~/bin
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
PATH=${PATH}:~/bin

配置git环境,命令如下:

1
2
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

最后下载YOCTO环境至编译路径,以下以fsl-auto-yocto-bsp为例,实际可配置base,auto以及ubuntu等多种BSP。

1
2
3
4
mkdir fsl-auto-yocto-bsp
cd fsl-auto-yocto-bsp
repo init -u https://source.codeaurora.org/external/autobsps32/auto_yocto_bsp -b hotfix/bsp29.0.hf1
repo sync

注:Yocto 构建需要至少50GB的可用空间并需要大量时间(2到10小时,取决于系统配置)。建议使用多核和快速存储介质的强大系统(推荐使用SSD)。 推荐的RAM大小为8GB。

  • BSP的YOCTO构建

BSP的YOCTO构建分为三步:

  1. 首次设置(需要有权限在不输入密码的情况下执行 sudo apt-get <cmd>)。
1
./sources/meta-alb/scripts/host-prepare.sh
  1. 创建构建目录并测试安装。在 SDK 根目录中创建一个构建目录。
1
source nxp-setup-alb.sh -m <machine>
  1. 运用bitbake指令编译
1
bitbake <imagename>

注:其中的<machine>即为s32g274ardb2;<imagename>可选择fsl-image-base,或fsl-image-auto;编译生成的结果放置于路径:fsl-auto-yocto-bsp/build_s32g274ardb2/tmp/deploy/images/s32g274ardb2,如图10所示。

图10 YOCTO 构建 BSP 路径内容

  • 注意事项

将repo更换为国内源,使用以下命令即设置清华源。

1
export | grep REPO_URL declare -x REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/"

设置主机中/etc/sudoers 文档, 使 sudo apt-get <cmd>时, 不需要输入密码。 修改方式如下。

1
fzy ALL=NOPASSWD: /usr/bin/apt-get

3.2.2 基于交叉编译工具链构建Linux BSP

说明 版本
host PC Ubuntu-18.04 LTS
Uboot 源码 bsp29.0.hf1-2020.04
Kernel 源码 bsp29.0.hf1-5.4-rt
交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linuxgnu

交叉编译工具链下载地址

  • 选择uboot
1
2
3
4
5
6
# 网站失效啦??
git clone https://source.codeaurora.org/external/autobsps32/u-boot
cd u-boot
git branch
git checkout -b <branch_name>
git branch

在通过 git clone 获取 uboot 后, 通过 git branch -a 指令查看所有分支; 之后可通过 git checkout -b 指令切换至remotes/origin/hotfix/bsp29.0.hf1-2020.04 分支, 最后通过 git branch 指令查看当前分支 。

  • 构建uboot
1
2
make CROSS_COMPILE=/path/to/your/toolchain/dir/bin/aarch64-linux-gnu- <board>_defconfig
make CROSS_COMPILE=/path/to/your/toolchain/dir/bin/aarch64-linux-gnu-

可以通过查看uboot文件夹中config内信息,如图11所示。针对S32G274ARDB2来说,defconfigs32g274ardb2_defconfig

图11 通过uboot中config查看deconfig版本

生成文档为可执行文件u-boot:

生成可执行文件u-boot的路径为~/S32G_LinuxBSP/u-boot,可通过ls命令查看,如图13所示。

图13 使用ls命令查看生成的uboot文件

  • 编译内核
1
2
3
4
5
# 获取源码
git clone https://source.codeaurora.org/external/autobsps32/linux
cd linux
git checkout -b <branch_name> hotfix/bsp29.0.hf1-5.4-rt
ls

同样,在通过git clone获取uboot后,通过git branch -a指令查看所有分支;之后可通过git checkout -b指令切换至remotes/origin/hotfix/bsp29.0.hf1-5.4-rt分支,最后通过git branch指令查看当前分支。

1
2
make ARCH=arm64 CROSS_COMPILE=/path/to/your/toolchain/dir/bin/aarch64-linux-gnu- <soc_name>_defconfig
make ARCH=arm64 CROSS_COMPILE=/path/to/your/toolchain/dir/bin/aarch64-linux-gnu-

对于S32G274ARDB2开发板defconfig为s32gen1_defconfig

生成文档及位置:

文档名称 路径
Image arch/arm64/boot/Image
fsl-s32g274a-evb.dtb arch/arm64/boot/dts/freescale/fsl-s32g274a-evb.dtb
  • 构建ARM可信固件(the ARM Trusted Firmware)

内容详见“S32G2_BSP29.0.0_HF1_User_Manual.pdf”中“2.2.4 Building the ARM Trusted Firmware”内容。

4. SD卡烧写

为启动S32G274A-RDB2开发板,需准备一张SD4或SD10(这里的数字指SD卡读写速度)。

4.1 YOCTO方式

在成功构建Yocto后,会生成格式为.sdcard的文件。该.sdcard文件创建了一个包含有必要分区、bootloader、kernel以及根文件系统的镜像文件。

通过如下命令烧写Image文件:

1
sudo dd if=./fsl-image-auto-s32g274ardb2.sdcard of=${DEVSD} bs=1M && sync

注意:烧写会覆盖SD卡中原分区与数据,请确保烧写前SD卡已做好相应备份。

其中,{DEVSD}SD/MMC卡的设备节点,可通过指令cat /proc/partitions查看,通常为/dev/sda;若通过bitbake fsl-image-base编译镜像,则需替换对应的.sdcard镜像文件。烧写完成后,如图14所示。

图14 使用dd命令烧写SD卡

4.2 交叉编译工具链方式

基于交叉编译工具链烧写SD卡主要分为两步骤:

  • 对SD卡分区
  • 烧写bootloader, kernel以及根文件系统

4.2.1 交叉编译工具链烧写前准备

首先,将SD卡通过读卡器插入PC机;

其次,通过图15所示的命令行找到SD读卡器在Linux主机上的设备号。假设SD卡存储空间为4G,则图3.2中SD读卡器被标记为/dev/sdb

设置export DEVSD=/dev/sdb

图15 通过命令行查看设备号举例

注意:请务必于烧写前确认SD卡的正确的设备号,否则有可能在烧写过程中损坏其他设备或数据!

4.2.2 交叉编译工具链—SD卡的烧写

由BSP二进制文件烧写SD卡分为两个步骤:

首先,需要对SD卡分区;

将SD卡分为主要两个区:

  • boot:放置kernel,设备树;

  • rootfs:放置根文件系统。

具体步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo fdisk ${DEVSD}
d [repeat this until no partition is reported by the 'p' command]
n [create a new partition]
p [create a primary partition]
1 [the first partition]
8192 [create a partition that starts at offset 8192; this leaves 4MB of unpartitioned space for the bootloader]
+255M [size of the actual partition = 255 MB]
[It may be that fdisk detects a previous filesystem signature and asks for confirmation of erase: "Partition #1 contains a vfat signature. Do you want to remove the signature?
[Y]es/[N]o:". Answer Y in this case.]
p [list the parameters of the previously created partition, look at the number of the End sector: 530431]
n [create a new partition]
p [create a primary partition]
2 [the second partition]
530432 [Start sector of the new partition; partition will be adjacent to the previous one]
<enter>[using the default value will create a partition that uses the remaining space on the card]
t [set partition type]
1 [partition #1]
c [FAT32]
t [set partition type]
2 [partition #2]
83 [Linux]
w [ this writes the partition table to the medium and fdisk exits]
sudo mkfs.vfat -n boot ${DEVSD}1
sudo mkfs.ext3 -L rootfs ${DEVSD}2

分区完成后,重新插入SD卡至主机,即可看到两个分区(boot,rootfs)。同时需要再次使用

cat /proc/partitions确定设备号。

其次,烧写/复制文件至相应分区。

按照如下指令将相应文件烧写/复制至对应分区:

1
2
3
4
5
6
7
8
export SD_MOUNT_POINT=/media/public
cd <builddirectory>/tmp/deploy/images/<board_name>
sudo dd if=u-boot-s32g274ardb2.s32 of=${DEVSD} conv=notrunc bs=256 count=1 seek=0
sudo dd if=u-boot-s32g274ardb2.s32 of=${DEVSD} conv=notrunc bs=512 seek=1 skip=1
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

其中,

DEVSD指SD读卡器的设备号,如/dev/sdb

SD_MOUNT_POINT指SD卡挂载的点,如/media/public

Image为镜像,如<linux src>/arch/arm64/boot/Image

指格式为.dtb的设备树文件,如<linux src>/arch/arm64/boot/dts/freescale/fsl-s32g274a-rdb2.dtb

<rootfs>指根文件系统文件夹。

在实践过程中,通过第二种方式,即“由BSP二进制文件烧写SD卡”,会缺少部分firmware支持,导致pfe0,pfe2口不可见;因此,推荐使用方式1所述,通过“.sdcard”烧写SD卡,版本为binaries_auto_linux_bsp29.0.hf1_s32g274_pfe,Linux版本为Ubuntu-20.04 LTS。

5. 以太网设置与使用说明

5.1 以太网接口

S32G274ARDB2中以太网接口如图16,图17所示,目前P5口无软件支持。

image-20230417164251650

图16 以太网接口

5.2 S32G274ARDB2以太网连接

5.2.1 uboot配置

首先需要通过在uboot中设置hwconfig值。hwconfig设置项如下。

对于S32G274A RDB2开发板,以PCIeX2 serdes0; EMAC0 1Gserdes1 lane0, EMAC0 1G serdes1 lane1这种方式工作时,可在uboot中做如下设置:

1
setenv hwconfig "pcie0: mode=pcie, clock=ext; pcie1: mode=sgmii, clock=int, fmhz=125, xpcs_mode=both"
image-20230417171136287

图17 S32G-VNP-RDB2以太网接口图示

在完成设置后,可以通过printenv hwconfig查看设置后的值,如图18所示。

图18 在uboot中设置并查看hwconfig

5.2.2 Linux kernel配置

根据NXP文档所述,Linux SerDes 驱动程序根据设备树重新配置 SerDes。 设备树从 u-boot 自动更新以对应 hwconfig 变量。

5.2.3 连接

  • 设置S32G274ARDB2的IP地址

以下是具体步骤:

  1. 关闭DHCP服务

通过vi修改文件/etc/network/interfaces,将eth0,pfe0,pfe2的配置中“dhcp”修改为“static”,如图19所示。

图19 关闭S32G274ARDB2的DHCP服务

  1. 为网卡设置不同的IP网段地址

图20 通过ifconfig命令查看网口信息

为确保个网口正常使用,需将eth0,pfe0,pfe2三个网卡分别设置为不同网段(将三个网卡设置为同一网段下不同地址时会导致某一个或两个网卡无法正常ping通主机,原因待排查)。

可以采用如图19所示,通过修改/etc/network/interfaces文档中网口地址,掩码等内容,设置三个网口的IP地址;或者可以通过ifconfig+网卡名称+IP地址命令,依次修改上述三个网卡的IP地址(临时)。

在修改后,首先通过service network stop, service network start重启网络,使interfaces文件生效;接着,通过ifconfig命令查看是否设置成功,如图20所示。

5.2.4 测试

通过5.2.3所述方法,将主机IP地址与相连网卡的IP地址设置在同一网段,举例如下。

网卡 IP地址
S32G274A 网卡: eth0 192.168.90.90
主机网卡: 192.168.90.10

接着, 通过 Ping 命令测试能否连通, 如图21所示;

图21 通过PING连接S32G与主机

6. 问题及解决方案

  • 使用 putty 登录时发现无法登录或打开 putty 后无任何打印信息

问题分析:
在打开 Putty 前没有打开 USB 口的可执行权限( “x”),同时也没有用 root账户打开 putty。 在这两种情况下, 可能会由于没有权限导致上述问题的发生。
解决方法:
按照 2.3.2 的步骤打开并登录 Putty。
具体可分为: 1) 打开 USB 端口权限; 2) 以 ROOT 账户打开 Putty。

  • 构建 Linux BSP, SD 卡烧写的问题与解决方法

使用主机烧写 SD 卡后, 将 SD 卡插入开发板并打开电源。 但是启动过程中,u-boot 无法引导 kernel, 开发板启动失败。
问题分析:
启动失败后打印的信息为:

1
2
Retry time exceeded; starting again
Bad linux ARM64 Image magic!

打印的信息可以分析出是烧写入 SD 卡的镜像有问题,因此使用官方提供的镜像烧写( 确保镜像没有问题) 再次尝试使用 dd 命令烧写。 启动后同样报错。 接着考虑烧写时出错, 排查后发现是因为烧写时忽略了 SD 卡分区导致kernel 所在分区没有 uboot。 修改烧写命令后成功启动。
解决方法:
将编译得到的 uboot 镜像使用 dd 命令烧写进 SD 卡的两个分区内,需要分别设置参数 seek=0, seek=1。即,

1
2
sudo dd if=u-boot.s32 of=${DEVSD} conv=notrunc bs=256 count=1 seek=0
sudo dd if=u-boot.s32 of=${DEVSD} conv=notrunc bs=512 seek=1 skip=1

在使用 SD 卡启动开发板的过程中, 偶尔会出现 kernel 无法挂载 rootfs 的情况
问题分析:
通过 kenerl 打印的错误信息:

1
Kernel panic – not syncing: VFS: Unable to mount root fs on unkown-block(179,2)

可以看到报错信息中显示在未知块上无法挂载 rootfs。接着在 uboot 中尝试找 rootfs 的地址查看当中的值, 因无法挂载 rootfs所在分区而无法查看;

1
2
=> fatinfo mmc 0:2
** Unable to use mmc 0:2 for fatinfo **

最后将 SD 卡放置于主机手动挂载, 显示挂载失败。
解决方法:
SD 卡硬件本身某一个块在烧写时出了问题, 导致 SD 卡该分区不可挂载。可以在出现这个问题后重新格式化 SD 卡,重新分区烧写,即可解决该问题。


NXP_S32G域控制器BSP入门
http://ziyangfu.github.io/2023/04/17/NXP-S32G域控制器BSP入门/
作者
FZY
发布于
2023年4月17日
许可协议