Hi3531D调试手记(二):U-Boot、Linux内核与RootFS镜像制作及烧录

Ubuntu系统版本:Ubuntu 16.04.7 LTS

准备工作:到 Linux开源社区 下载内核源码。进入网站,选择 HTTP 协议下的 /pub/linux/kernel/v3.x,下载 linux-3.18.20.tar.gz 。将下载的 Linux 内核包放到 SDK 包的 osdrv/opensource/kernel/ 目录下(建议留个备份包)。

SDK包中提供了一键生成 uboot、kernel 和 rootfs 可用镜像的接口。这里先记录单独生成各组件的方法,再记录一键生成方法。

一、U-Boot单独编译与烧录

1.编译部分

  • 进入展开的 SDK 包后,在 uboot 的目录下手动解压 uboot 源码压缩包:
cd osdrv/opensource/uboot/
tar -xvf u-boot-2010.06.tgz
  • 进入 uboot 源码目录,执行下面的命令:
cd uboot-2010.06/	# 进入 uboot 源码目录
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- hi3531d_xxx_config
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux-

hi3531d_xxx_config 参数设置说明:
  hi3531d_config :使用 SPI Nor Flash 或 SPI Nand Flash;
  hi3531d_nand_config :使用 Nand Flash;
  由于博主使用的开发板上只有SPI Nor Flash 和 SPI Nand Flash,所以还是莫得选择。
在这里插入图片描述
在这里插入图片描述

  • 一切顺利就会生成 u-boot.bin 文件。但这一步得到的只是一个中间文件,并不是最终在单板上执行的 u-boot 镜像。将其复制到 osdrv/tools/pc/uboot_tools/ 目录下以获取真正可用的镜像文件:
./mkboot.sh reg_info_hi3531d.bin u-boot_hi3531d.bin

在这里插入图片描述

  • 最后在编译好的 u-boot 源代码目录下找到 mkimage 软件(u-boot-2010.06/tools),将其拷贝到 /usr/bin 下:
sudo cp ./mkimage /usr/bin		# 只需在第一次编译 uboot 的时候做一次就可以了

2.烧录部分

  如果是第一次烧写 uboot 或是 uboot 起不来,则需要使用串口进行烧写;如果待移植单板中已有 uboot 运行,则可以通过串口或网口与服务器连接,直接更新 uboot。这里先记录一下使用 HiTool 工具进行串口烧写的方式,网口烧写方式放到内核镜像与根文件系统镜像的烧写过程中说明。
  使用 HiTool 进行串口烧录前,先检查一下 HiTool 的相关配置。博主使用过两个版本的 HiTool,第一个 5.0 版本的尝试多次但始终无法进行烧写,换成 4.0.4 版本的才烧写成功。之后检查配置的时候发现 5.0 版本的工具比 4.0.4 版本少了几个,但到底是不是因为这个也无从查证。
在这里插入图片描述
在这里插入图片描述

  • 首先将板子连接到 PC,获取 COM 口。然后打开 HiTool 工具,选择好使用的芯片。选择方法:芯片 ⇒ \Rightarrow 切换芯片 ⇒ \Rightarrow 具体芯片型号。文中使用 Hi3531DV100,这里选择 Hi3531D。
    在这里插入图片描述
  • 然后进入烧写 Fastboot 选项,指定要烧写的 uboot 镜像文件,按要求进行烧写(板子在上电状态,掉电再上电)即可。
    在这里插入图片描述
    在这里插入图片描述

二、Linux内核单独编译

  • 进入展开的 SDK 包后,在 kernel 的目录下手动解压 linux 内核源码压缩包:
cd osdrv/opensource/kernel/
tar -xvf linux-3.18.20.tar.gz
mv linux-3.18.20 linux-3.18.y
  • 进入内核源代码目录,执行下面的命令:
cd linux-3.18.y/	# 进入内核源代码目录
patch -p1 < ../hi3531dv100_for_linux_v3.18.y.patch	# 打补丁
cp arch/arm/configs/hi3531d_xxx_defconfig .config	# 如果对内核和Hi3531平台没有足够了解,建议不要修改默认配置,仅增加自身需要的模块
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- menuconfig	# 退出是连按两下Esc
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- uImage

hi3531d_xxx_defconfig 参数设置说明:
  hi3531d_full_defconfig:使用 SPI Nor Flash 或 SPI Nand Flash,PCIE 选择主片模式;
  hi3531d_full_slave_defconfig:使用 SPI Nor Flash 或 SPI Nand Flash,PCIE 选择从片模式;
  hi3531d_nand_defconfig:使用 Nand Flash,PCIE 选择主片模式;
  hi3531d_nand_slave_defconfig:使用 Nand Flash,PCIE 选择从片模式;

  • 等待一段时间,编译完成,生成目标镜像文件 uImage(存放路径下图中有)。
    在这里插入图片描述

PS:如果编译过程中出现错误,可执行清理指令:
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- clean
之后再重新配置 menuconfig 和生成镜像。

  进到镜像文件所在的目录下,会发现除了 uImage 以外还有个 zImage 。zImage 是 ARM Linux 常用的一种压缩映像文件,而 uImage 则是 U-boot 专用的映像文件,它是在 zImage 之前加上一个长度为 0x40 的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从 uImage 的 0x40 位置开始执行,zImage 和 uImage 没有任何区别。

三、根文件系统镜像制作

  SDK包中已经自带了配置好的、编译好的、完整的根文件系统,即 package 目录下的 rootfs_uclibc.tgz 压缩包,直接根据单板上flash的规格型号制作文件系统镜像即可。甚至在 package/image_uclibc 目录下还提供了可以直接使用的uboot 镜像、 Linux 内核镜像和根文件系统镜像。如果要添加已开发的应用程序,只需将应用程序和相应的库文件拷贝到根文件系统的对应目录即可。

  • 首先要安装 busybox。进入展开的 SDK 包后,在 busybox 的目录下手动解压 busybox 源码压缩包:
cd osdrv/opensource/busybox/
tar -xvf busybox-1.20.2.tgz
  • 进入 busybox 源码目录,执行下面的命令:
cd busybox-1.20.2/		# 进入 busybox 源码目录
cp ./config_v500_a9_softfp_neon ./.config	# 指定配置文件,不同产品平台、使用不同的交叉编译器指定的配置文件是不同的,海思的Linux开发环境用户指南
make menuconfig		# 和内核配置类似

在这里插入图片描述

PS:在 Busybox Settings —> Build Options 中有两个选项:
[*]Build BusyBox as a static binary (no shared libs)

这个用来选择是否把 busybox 编译成静态链接的可执行文件。如果选择该选项,编译出来的 busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的 busybox,体积较小,但需要动态库的支持。

[*] Build with Large File Support (for accessing files > 2 GB)
(arm-hisiv500-linux-) Cross Compiler prefix
() Path to sysroot
(-mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon) Additional CFLAGS
() Additional LDLIBS
这个用于选择 SDK 推荐的交叉编译器。Additional CFLAGS 并没有显示完整。完整的配置也在上面的表格里。

  • 继续执行命令,完成 busybox 的安装:
make
make install

在这里插入图片描述

  • 接下来就是使用 busybox 制作根文件系统。进入 SDK 包下的 osdrv/pub/rootfs_uclibc 根文件系统目录下执行命令:
mkdir rootbox
cd rootbox
cp -R packet/os/busybox-1.20.2/_install/*.
mkdir etc dev lib tmp var mnt home proc
  • 配置 etc、lib、dev 目录的必需文件。etc 目录下最主要的文件包括 inittab、fstab、init.d/rcS 文件等,可以从 busybox 的 examples 目录下拷贝过来;lib 目录存放应用程序需要读取的库文件,这个酌情添加;dev 目录下的设备文件可以直接从系统中拷贝过来或者使用 mknod 命令生成需要的设备文件,拷贝时需使用 cp -R file_name。
  • 最后开始 jffs2 格式镜像的制作。先将 SDK 包中 package 目录下的 rootfs_uclibc.tgz 拷贝到 osdrv/pub 目录下,再执行下面的指令:
tar -xvf rootfs_uclibc.tgz
mkfs.jffs2 -d ./rootfs_uclibc -l -e 0x10000 -o ./rootfs_uclibc_64k.jffs2	# 以块大小为64KB(64*1024 B = 0x10000 B)为例

PS:制作 jffs2 镜像时,需要用到 SPI Nor Flash 的块大小。这些信息会在 uboot 启动时会打印出来。

  • 输出的 rootfs_uclibc_64k.jffs2 就是制作好的根文件系统镜像了。

四、Linux内核及根文件系统镜像烧录

  Linux 内核和根文件系统不像 uboot 那么小,因此用串口烧录等待的时间更长,在调试过程中会耗费很多不必要的时间。因此在板子里已经有 uboot 的情况下可以直接利用网口烧写内核和根文件系统的镜像。

1.Win10下的镜像烧录

  • 首先把要烧录的镜像文件和 tftp 服务器扔到一个文件夹里(这里多扔了个 uboot 的镜像):
    在这里插入图片描述
  • 在配置好网络环境的基础下(Hi3531D调试手记(Ex):U-Boot使用随笔 第三节有具体配置方法),打开 tftp 服务器,选择到开发板与 PC 端连接的 IPv4 地址。如果没有目标 ip 可以选择,通常是因为目标没有上电。
    在这里插入图片描述
  • 然后就可以在 uboot 这边下指令啦。先做一个地址空间说明:这里使用的板子的 SPI Nor Flash 是 32M 的,所以内存分配就是 1M、4M、27M,可以根据实际情况进行调整(基本调整也就是调整根文件系统的空间大小了)。
|  1M   |   4M   |  27M   |
|-------|--------|--------|
| boot  | kernel | rootfs |
#烧写内核
mw.b 42000000 ff 400000	#对内存进行初始化,其中42000000为flash内存地址,后面的400000就是4M
tftp 42000000 uImage	#镜像名字要对上
sf probe 0
sf erase 100000 400000	#000000到100000的是uboot
sf write 42000000 100000 400000

#烧写根文件系统
mw.b 42000000 ff 1b00000
tftp 42000000 rootfs_uclibc_64k.jffs2	#镜像名字要对上
sf probe 0
sf erase 500000 1b00000	#100000到500000的是内核
sf write 42000000 500000 1b00000

#设置启动参数,这个参照板子到手时的配置来设置就可以
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),27M(rootfs);hinand:256M(nand)'
setenv bootcmd 'sf probe 0;sf read 0x42000000 0x100000 0x400000;bootm 0x42000000'
sa
  • 之后使用 reset 指令重启 uboot 就可以看到 Linux 成功启动啦:
    在这里插入图片描述

PS:更新 u-boot 也是类似的指令:
sf probe 0
mw.b 42000000 ff 100000
tftp 42000000 u-boot-hi3531d.bin
sf probe 0
sf erase 0 100000
sf write 42000000 0 100000
reset

2.Ubuntu下的镜像烧录

  分出来另作说明是因为之前使用的是现成的 tftp 服务器,其默认运行环境就是 Windows,而 Ubuntu 下则不行,tftp 服务器得自己搭建和配置。不过在搭好 tftp 服务器(Hi3531D调试手记(一):Linux开发环境搭建 第三节有记录搭建过程)以后的烧录操作就与 Windows 下一般无二了(当然得把要下载的文件放到 tftp 服务器的目录下才行)。

五、SDK包下整个osdrv目录编译

  • 在 osdrv 目录下执行命令(执行此命令前需要单独编译一次 uboot,目的是产生必要的 mkimage 软件):
make OSDRV_CROSS=arm-hisiv500-linux PCI_MODE=XXX FLASH_TYPE=XXX all

参数说明:
  FLASH_TYPE:设为 nand 参数时,使用 Nand Flash;设为 spi 参数时,使用 SPI Nor Flash 或 SPI Nand Flash。
  PCI_MODE:共有 master、slave 两个参数。编译 PCIE 主片版本时使用 master 参数,编译 PCIE 从片使用 slave 参数,默认是 master 参数。

PS:清除整个osdrv目录的编译文件:
make OSDRV_CROSS=arm-hisiv500-linux clean
彻底清除整个osdrv目录的编译文件,除清除编译文件外,还删除已编译好的镜像:
make OSDRV_CROSS=arm-hisiv500-linux distclean

  烧录方法同上文介绍的两种。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值