工控網首頁
>

應用設計

>

ARM嵌入式設備Linux系統啟動步驟和方式

ARM嵌入式設備Linux系統啟動步驟和方式

1). 簡介

本文簡單介紹ARM嵌入式設備基于嵌入式Linux操作系統時候的啟動步驟和啟動方式, 區別與X86平臺,ARM平臺下并沒有一個標準的啟動步驟,不同ARM SoC都會使用各自定義的boot ROM來實現啟動過程,不過大體上面都包含有一些基本步驟。本文就基于Toradex ARM計算機模塊和配套載板來介紹基于Freescale i.MX6 ARM嵌入式設備的啟動步驟和方式。

2). 啟動步驟

a). 電源上電,系統Reset。

b). CPU內部boot ROM讀取, strappingGPIO數值鎖定。

c). 根據strapping GPIO值和SoC 內部fuse設置確定用于啟動的設備。

d). 從啟動設備起始位置讀取用于配置DDRRAM和定位boot loader的配置信息。對于i.MX6平臺,則使用'image vector table (IVT)' 'deviceconfiguration data (DCD)' ,如果從NAND設備啟動,則還包括 'boot control blocks (BCB)'。

e). DDR RAMboot ROM初始化。

f). boot loader從啟動設備復制到RAM執行,至此系統控制交由bootloader.也是從這里,一些定制代碼才可以在boot loader里面開始執行。當然也有一些SoC是先將boot loader復制到SDRAM執行后再由boot loader來初始化DDR RAM。

Toradex ARM核心板使用定制化的U-boot作為boot loader,下面就基于此來繼續bootloader加載后的啟動過程。

g). U-Boot從啟動設備上面讀取環境變量,如果變量數據損壞或者不存在,則會提示'*** Warning - bad CRC, using default environment' ,然后加載默認初始設置.

h). U-Boot通過分析環境變量獲得kernelrootfs存儲位置,以及所需的kernelcommand line

i). U-Boot 自動檢測系統RAMeMMC/NandFlash容量和參數

j). U-Boot 設置以太網口MAC地址,并配置好硬件準備加載Linuxkernel

k). U-Boot 加載Linux kernelRAM,至此系統控制權則轉移到kernel來處理

l). 系統Kernel初始化Linux,加載rootfs,最后啟動'init'來初始化Linuxuser space

3). 啟動方式

a). 默認方式, U-Boot, kernelrootfs都位與模塊自帶的eMMC上,全部從eMMC啟動。通常情況下的基本模式

b). U-Boot位于eMMC,從eMMC啟動;而kernelrootfs位于SD卡,從SD卡啟動。常用于切換不同的kernelrootfs版本

c). U-Boot位于eMMC,從eMMC啟動;而kernelTFTP加載,rootfsNFS加載。常用于kernelapplication開發調試階段

4). 不同啟動方式演示

這里使用ToradexApalis i.MX6Q計算機模塊配合ApalisEva 開發載板來進行測試,平臺基本的操作上手指南請見這里

軟件使用Toradex官方發布的LinuxV2.5beta3版本,請從這里下載。

a). 全部從eMMC啟動

模塊默認的U-Boot設置即為全部從eMMC啟動,開機上電即可

b). KernelrootfsSD卡啟動

./ 準備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 = 512bytes

Sector size (logical/physical): 512 bytes /512 bytes

I/O size (minimum/optimal): 512 bytes / 512bytes

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 壓縮包里面的kerneldevice tree文件到FAT32分區

----------------------------------

$ cd.../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin

$ cpuImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin/media/username/boot/uImage

$ cpuImage--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/filesystem啟動

./ 默認目標版系統和開發主機已經在同一局域網內并通過網內DHCP服務器自動取得IP地址,如果需要手動搭建DHCP服務器,請參考這里。

./ 配置TFTP Server

// Ubuntu 開發主機通過下面命令建立TFTPServer

----------------------------------

$ 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

----------------------------------

// 復制kerneldevice tree文件到TFTPServer文件夾

----------------------------------

$ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin

$ sudo cpuImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin/var/lib/tftpboot/uImage

$ sudo cpuImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb/var/lib/tftpboot/imx6q-apalis-eval.dtb

----------------------------------

./ 配置NFS Server

// Ubuntu 開發主機通過下面命令建立NFSServer

----------------------------------

$ sudo apt-get install nfs-kernel-server

$ sudo vi /etc/exports

//增加下面NFS配置, 10.20.1.111/24’為開發主機IP/Mask配置

/srv/nfs10.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:onroot=/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

投訴建議

提交

查看更多評論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測試 Secure Boot 功能

隆重推出 Aquila - 新一代 Toradex 計算機模塊

Verdin iMX8MP 調試串口更改

NXP iMX8MM Cortex-M4 核心 GPT Capture 測試