讯为的 iTOP-4412 POP 1G Elite(精英板) 开发板,其核心如下所示:
- SoC: Exynos 4412
- ARM core: Cortex-A9 based Quad CPU
- ARM architecture: ARMv7A
- CPU Chip: SMDKC210 (s5pc220)
- EMMC: 8GB (KLM8G1WEPD-B031)
是一块主要用于学习 Linux 系统开法的开发板。在此基础,总结一下一个典型的 Linux 软件系统的组成,及其关键节点的执行、操作过程。
试验环境:
- Cross Compiler: gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
- Build Environment: Ubuntu 20.04.6 x86_64
软件系统组成
一个基础的 Linux 软件系统由3个部分组成:引导程序(Boot Loader)、操作系统(Linux Kernel)、根文件系统(Root File System)。
Boot Loader 在操作系统内核运行之前运行,负责初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
操作系统 是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件,在Linux的术语中被称为——内核(Kernel)。Linux 内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
根文件系统 是Linux内核启动时挂载的首个文件系统,包含引导系统及挂载其他文件系统所需的必要文件和目录,系统引导过程在挂载后会将初始化脚本和服务加载到内存运行。
本篇所使用的软件版本如下:
- Boot Loader: iTop4412_uboot_20151119.tar.gz, Based on u-boot-2010.03.
- Kernel: linux-4.19.296
- Root FS 1: BusyBox 1.36.1
- Root FS 2: Ubuntu 16
准备 SD 卡
区域划分
以 2G(1.92 GiB, 2034237440 bytes, 3973120 sectors, Sector size : 512 bytes) SD 卡为例:
block(10进制) | 名称 | 预留大小 | 镜像大小 |
---|---|---|---|
0 | MBR | 512B | |
[1, 2048) | uboot | 1MB - 512B | 444KB (u-boot-iTOP-4412.bin) |
[2048, 4096) | dtb | 1MB | 54KB (exynos4412-itop-pop1g-elite.dtb) |
[4096, 34816) | kernel | 15MB | 3.9MB (zImage@iTop4412_Kernel_3.0) |
6.5MB (zImage@linux-4.19.323) | |||
[34965, 2132864] | 分区 2(ext3) | 1024MB | |
[2132865, 2750579] | 分区 3(ext3) | 301.6M | |
[2750580 3368294] | 分区 4(ext3) | 301.6M | |
[3368295 3947159] | 分区 1(FAT32) | 282.7M |
将 SD 卡分为 原始区 + 4 个分区,分区 1 为 FAT32 格式,分区 2、3、4 为 ext3 格式。
- 原始区即为未分区区域,预留 17 MB。以下按照 block 为单位,1 block = 512 bytes。
- block 1 默认存放 MBR (Master Boot Record) 分区表。
- 1 - 2048,约 1MB 的区域,一般用于放置 UBoot。
- 2048 - 34816,16MB 的区域,用于放置 zImage、dtb。
- 分区 1 用于放置镜像文件。当在 uboot 中使用 sdfuse 命令向 EMMC 写入数据时,会自动读取此分区下的文件。
- 分区 2 用于写入根文件系统,一般来说比较大。
- 分区 3、4 可用于挂载为 home、temp 等目录。
16进制表示的 block 的实际大小
0x(block) | 10(block) | 大小 |
---|---|---|
0x80 | 128 | 64KB |
0x400 | 1024 | 512KB |
0x800 | 2048 | 1MB |
0x2000 | 8192 | 4MB |
0x3800 | 14336 | 7MB |
0x5000 | 20480 | 10MB |
16进制表示的 block 大小,常常在 dd
、mmc read
等命令中使用。
在 uboot 中
需要先把 uboot 写入 EMMC,从 EMMC 启动开发板。
以 2G TF 卡为例,依次执行:
1 | # Log 显示检测到 TF卡: MMC1: 1940 MB |
此时如果在 PC 上查看这张卡,会看到如下信息:
1 | Ubuntu 20 $ sudo fdisk -l /dev/sdb |
在 PC 中
1 | # 图形界面下分区: |
使用 gparted,在图形界面中,进行相同的分区。
新建 sdupdate
分区完成后,将 TF 卡插到 Windows,新建 sdupdate 文件夹,用于后续拷入:u-boot-iTOP-4412.bin zImage system.img ramdisk-uboot.img
也可以在 PC Ubunt 系统中,直接挂载 /dev/sdb1 后,进行同样的操作。
OM
启动选择操作
Exynos 4412 芯片支持从以下设备中启动:
- General NAND flash memory
- SD/MMC memory card
- eMMC memory
- USB device (for system debugging and flash reprogramming, not for normal booting)
iTop 4412 开发板支持使用拨码开关来选择从以下设备启动:
启动位置 | 拨码 1 | 拨码 2 |
---|---|---|
eMMC | 0 | 1(ON) |
SD card | 1(ON) | 0 |
无论从 eMMC 加载还是从 SD 卡加载,都需要先向对应的设备烧写好 Boot Loader。
启动过程
设备启动或从低电模式唤醒时,程序从 iROM 开始执行。
① iROM 是一片芯片内部的 64K ROM,其中储存的是芯片出厂时烧写的固件,它会初始化 SoC 基本功能,如 时钟、堆栈。
② 而后,根据 运行模式引脚(Operating Mode (OM) pins),从选定的启动设备加载 BL1 到 256K 的内部 SRAM。根据 secure boot 值,iROM 可能会对 BL1 进行完整性检查。
此处的 BL1 即是 Boot Loader。
Boot Loader
Boot Loader 其实是一个统称,所有可以完成系统引导的初级系统都是 Boot Loader。而在 ARM Linux 系统中,uboot 是最常使用的。
在这里,我们使用的具体如下: iTop4412_uboot_20151119.tar.gz, Based on u-boot-2010.03。
基于此软件,总结了 2 份单独的文档,所以此篇仅略讲。(iTOP-4412 UBoot 启动过程梳理 | Easy Wang、iTOP-4412 UBoot 使用笔记 | Easy Wang)
编译
在 PC 中执行:
1 | Ubuntu 20 $ cd iTop4412_uboot |
将烧写完成的 SD 卡插入开发板。设置拨码从 SD card 启动,即可进入 uboot。
写入 SD 卡
在 PC 中执行:
1 | # 如果插入 SD 卡后,显示为 /dev/sdx(如果不指定路径,默认为 /dev/sdb): |
写入 EMMC
先在 PC 中将 u-boot-iTOP-4412.bin 放入 FAT32 的磁盘的 /sdupdate 目录下。
先从 SD 卡进入 uboot,执行以下命令可以将 uboot 烧写到 eMMC:
1 | # Boot on SD |
Kernel 3.0.15
编译
在 PC 中执行:
1 | Ubuntu 20 $ cd iTop4412_Kernel_3.0 |
1 | Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373. |
解决:
1 | // timeconst.pl @ 373 |
写入 SD 卡
1 | # 如果插入 SD 卡后,显示为 /dev/sdb |
从 SD 加载
1 | # 进入 uboot 后,如果不在 3s 内输入,会在初始化完成后自动执行 bootcmd |
写入 EMMC
先在 PC 中将 zImage 放入 FAT32 分区的 /sdupdate 目录下。
先从 SD 卡进入 uboot,执行以下命令可以将 zImage 烧写到 eMMC:
1 | # Boot on SD |
写入日志:
1 | SD sclk_mmc is 400K HZ |
sdfuse 默认将 kernel 写入 1120(0x460)开始的位置。
载入与从 SD 加载基本一致,略。
加载根文件系统
在 .config
文件中,设置:
1 | CONFIG_CMDLINE="root=/dev/mmcblk1p2 console=ttySAC2,115200 init=/linuxrc rootfstype=ext3 rootwait rw" |
/dev/mmcblk1p2
即为根文件系统所在分区。rootwait 表示等待 mmc 设备初始化完成后再挂在,rw 表示根文件系统是可读写的。
Kernel 4.19.296
编译
在 PC 中,配置好交叉编译器的环境变量后执行:
1 | Ubuntu 20 $ cd linux-4.19.323 |
写入 SD 卡
1 | # 以插入 SD 卡后,显示为 /dev/sdb 为例: |
余下同 Kernel 3.0.15 类似,略。
加载根文件系统
在 exynos4412-itop-pop1g-elite.dts
中设置:
1 | bootargs = "root=/dev/mmcblk0p2 rw console=ttySAC2,115200 init=/linuxrc rootfstype=ext3 rootwait rw"; |
/dev/mmcblk0p2
即为根文件系统所在分区。
根文件系统 BusyBox 1.36.1
编译
1 | Ubuntu 20 $ mkdir rootfs |
修改:
1 | Busybox Settings ---> |
编译:
1 | Ubuntu 20 $ make |
写入 SD 卡
将 SD 卡的第2分区 mount 到 ubuntu 中,然后将 rootfs 文件夹中的内容直接拷贝到第2分区中。
写入 EMMC
制作 system.img
使用开发板资料中的 make_ext4fs:
1 | # sudo apt install lib32stdc++6 |
或者使用当前可安装的工具:
1 | sudo apt-get install e2fsprogs (https://command-not-found.com/mkfs.ext4) |
下载 system.img 到 SD 卡的 sdupdate/
1 | iTOP-4412 $ sdfuse flash system system.img |
根文件系统 Ubuntu 16
编译
无需编译,直接在 Ubuntu 编译好的基础包上进行配置,具体操作见 系统移植 iTOP-4412 Ubuntu。
写入 SD 卡
将 SD 卡的第2分区 mount 到 ubuntu 中,然后将 rootfs 文件夹中的内容直接拷贝到第2分区中。
参考
- 《iTOP-4412系列开发板实战教程》
- Chapter 5. Booting Sequence @ 《SEC_Exynos4412_Users Manual_Ver.0.30.00_Preliminary.pdf》
- 各类板子 bring up_芯片bring up-CSDN博客
- 2020.09.12 - xhr4412 移植 u-boot-2020.07 & linux-5.8.5 & BusyBox-1.31.1 到 iTOP-4412 汇总_linux5.8.12系统移植-CSDN博客