"); //-->
By Toradex 秦海
1). 简介
本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动步骤和启动方式, 区别与X86平台,ARM平台下并没有一个标准的启动步骤,不同ARM SoC都会使用各自定义的boot ROM来实现启动过程,不过大体上面都包含有一些基本步骤。本文就基于Toradex ARM计算机模块和配套载板来介绍基于Freescale i.MX6 ARM嵌入式设备的启动步骤和方式。
2). 启动步骤
a). 电源上电,系统Reset。
b). CPU内部boot ROM读取, strapping GPIO数值锁定。
c). 根据strapping GPIO值和SoC 内部fuse设置确定用于启动的设备。
d). 从启动设备起始位置读取用于配置DDR RAM和定位boot loader的配置信息。对于i.MX6平台,则使用'image vector table (IVT)' 和 'device configuration data (DCD)' ,如果从NAND设备启动,则还包括 'boot control blocks (BCB)'。
e). DDR RAM被boot ROM初始化。
f). boot loader从启动设备复制到RAM执行,至此系统控制交由boot loader.也是从这里,一些定制代码才可以在boot loader里面开始执行。当然也有一些SoC是先将boot loader复制到SDRAM执行后再由boot loader来初始化DDR RAM。
Toradex ARM核心板使用定制化的U-boot作为boot loader,下面就基于此来继续boot loader加载后的启动过程。
g). U-Boot从启动设备上面读取环境变量,如果变量数据损坏或者不存在,则会提示'*** Warning - bad CRC, using default environment' ,然后加载默认初始设置.
h). U-Boot通过分析环境变量获得kernel和rootfs存储位置,以及所需的kernel command line
i). U-Boot 自动检测系统RAM和eMMC/Nand Flash容量和参数
j). U-Boot 设置以太网口MAC地址,并配置好硬件准备加载Linux kernel
k). U-Boot 加载Linux kernel到RAM,至此系统控制权则转移到kernel来处理
l). 系统Kernel初始化Linux,加载rootfs,最后启动'init'来初始化Linux user space
3). 启动方式
a). 默认方式, U-Boot, kernel和rootfs都位与模块自带的eMMC上,全部从eMMC启动。通常情况下的基本模式
b). U-Boot位于eMMC,从eMMC启动;而kernel和rootfs位于SD卡,从SD卡启动。常用于切换不同的kernel和rootfs版本
c). U-Boot位于eMMC,从eMMC启动;而kernel从TFTP加载,rootfs从NFS加载。常用于kernel和application开发调试阶段
4). 不同启动方式演示
这里使用Toradex Apalis i.MX6Q 计算机模块配合Apalis Eva 开发载板来进行测试,平台基本的操作上手指南请见这里。
软件使用Toradex官方发布的Linux V2.5beta3版本,请从这里下载。
a). 全部从eMMC启动
模块默认的U-Boot设置即为全部从eMMC启动,开机上电即可
b). Kernel和rootfs从SD卡启动
./ 准备SD卡:将SD卡(几百MB容量以上,这里使用8GB)分为2个分区,第一个分区为FAT32格式,一般几十MB即可,这里演示操作为1GB;另外一个分区为ext3格式,分配为剩下SD卡容量。
----------------------------------
$ sudo fdisk /dev/sdc
...
命令(输入 m 获取帮助): p
Disk /dev/sdc: 7744 MB, 7744782336 bytes
255 heads, 63 sectors/track, 941 cylinders, total 15126528 sectors
Units = 扇区 of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
设备 启动 起点 终点 块数 Id 系统
/dev/sdc1 2048 2099199 1048576 c W95 FAT32 (LBA)
/dev/sdc2 2099200 15126527 6513664 83 Linux
$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1
$ sudo mkfs.ext3 -L fs /dev/sdc2
----------------------------------
./ 制作启动SD卡
// 复制Linux image 压缩包里面的kernel和device tree文件到FAT32分区
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin
$ cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin /media/username/boot/uImage
$ cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb /media/simon/boot/imx6q-apalis-eval.dtb
----------------------------------
// 复制Linux image 压缩包里面的rootfs文件夹内容到ext3分区
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5
$ sudo cp -Ppr rootfs/* /media/simon/fs/
----------------------------------
./ 将SD卡插入Apalis Eva载板8-bit SD卡插槽, 开机上电进入uboot
----------------------------------
Apalis iMX6 # printenv
...
fdt_file=imx6q-apalis-eval.dtb //确保device tree文件和上面FAT32分区里面的命名一致
...
Apalis iMX6 # run sdboot
----------------------------------
./ 启动后就可以进行正常的应用开发测试了.
c). TFTP/NFS加载kernel/file system启动
./ 默认目标版系统和开发主机已经在同一局域网内并通过网内DHCP服务器自动取得IP地址,如果需要手动搭建DHCP服务器,请参考这里。
./ 配置TFTP Server
// 在Ubuntu 开发主机通过下面命令建立TFTP Server
----------------------------------
$ sudo apt-get install tftpd-hpa
$ sudo vi /etc/default/tftpd-hpa
//默认tftp server配置,也可以更换目录,不过需要修改目录group为”nogroup”
$ sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="[::]:69"
TFTP_OPTIONS="--secure"
$ sudo service tftpd-hpa start
//如已经启动,重新加载配置,则可运行
$ sudo service tftpd-hpa force-reload
----------------------------------
// 复制kernel和device tree文件到TFTP Server文件夹
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin
$ sudo cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin /var/lib/tftpboot/uImage
$ sudo cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb /var/lib/tftpboot/imx6q-apalis-eval.dtb
----------------------------------
./ 配置NFS Server
// 在Ubuntu 开发主机通过下面命令建立NFS Server
----------------------------------
$ sudo apt-get install nfs-kernel-server
$ sudo vi /etc/exports
//增加下面NFS配置, ‘10.20.1.111/24’为开发主机IP/Mask配置
/srv/nfs 10.20.1.111/24(no_root_squash,no_subtree_check,rw,fsid=root)
$ sudo service nfs-kernel-server restart
----------------------------------
// 复制rootfs文件到NFS Server文件夹
----------------------------------
$ cd .../Apalis_iMX6_LinuxImageV2.5
$ sudo cp -Ppr rootfs/* /srv/nfs/
----------------------------------
./ 配置Apalis i.MX6目标系统
//开机上电进入Uboot,修改如下参数
----------------------------------
# setenv serverip ‘10.20.1.111’ //TFTP Server IP
# setenv nfsargs ‘ip=10.20.1.115:10.20.1.111:10.20.1.1:255.255.255.0::eth0:on root=/dev/nfs nfsroot=10.20.1.111:/srv/nfs rw netdevwait’
// ip = 目标板IP:NFS Server IP:网关:Mask
// 启动NFS boot
# run nfsboot
----------------------------------
5). 总结
由上可见,在ARM平台使用和开发的时候可以灵活利用各种启动方式,提供更为方便和高效的开发或使用过程。
参考文档
http://developer.toradex.com/knowledge-base/linux-booting
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。