1. 程式人生 > >tiny4412學習(一)之從零搭建linux系統(燒寫uboot、核心進emmc+uboot啟動核心)

tiny4412學習(一)之從零搭建linux系統(燒寫uboot、核心進emmc+uboot啟動核心)

  • 硬體平臺:tiny4412
  • 系統:linux-3.5-20151029
  • 檔案系統:busybox-1.22.1.tar.bz2
  • 編譯器: arm-linux-gcc-4.5.1

目的:

使用uboot引導linux系統,並掛接根檔案系統,搭建起linux開發環境。

由於友善支臂提供的minitools不是開源,使用起來很不舒服。本文將記錄從零使用uboot在tiny4412上搭建linux系統的。由於之前只是學了2440,完成這個流程也遇到各種,現在總結如下。其中參考了多篇部落格才得以實現,具體涉及的時候會給出連結。

一、準備系統檔案

1、安裝交叉編譯工具鏈

(1)解壓編譯器原始碼

tar arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz –C / 

(2)執行後將把 arm-linux-gcc 安裝到/opt/FriendlyARM/toolschain/4.5.1 目錄。

(3)vi /etc/environment修改PATH為:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.5.1/bin"

(4)重啟核心,執行arm-linux-gcc -v檢視版本。

2、編譯核心

(1)解壓

解壓 Linux  核心原始碼

tar xvzf  linux-3.5-20151029.tgz

cd  linux-3.5

(2)配置

cp  tiny4412_linux_defconfig  .config

(3)編譯

make

最後在 arch/arm/boot 目錄下生成 zImage

3、製作根檔案系統

本身打算使用光碟自帶的檔案系統,結果fastboot下載的時候,檔案系統始終出問題,於是採用自制檔案系統。通過網路進行掛接,後面會有具體操作說明。

參考:http://blog.csdn.net/morixinguan/article/details/50677105

編譯配置安裝busybox

下載原始碼:https://busybox.net/

tar -xvf busybox-1.22.1.tar.bz2

cd busybox-1.22.1

makedefconfig     //預設配置

make menuconfig

BusyboxSettings  --->  

[*] Build BusyBoxas a static binary (no shared libs)

[ ] Build sharedlibbusybox(NEW)                                     
[*] Build with Large File Support (for accessingfiles > 2 GB)        
(arm-linux-)  Cross Compilerprefix        

make -j4

makeinstall   生成:  _install

製作檔案系統 

mkdir filesystem
cd filesystem
cp ../busybox-1.22.1/_install/*  .-r
mkdir   etc dev opt sys tmp mnt lib proc
mkdir  etc/init.d
vim  etc/init.d/rcS
新增
mount -t ramfs none  /dev
mount -t sysfsnone  /sys
mount -t proc  none  /proc
mount -t tmpfs none  /tmp
/sbin/mdev  -s
儲存退出
vim  etc/inittab
新增
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
儲存退出
vim  etc/profile
新增
export  PS1="[root @ cjy \W ] #"
儲存退出
mknod  dev/console  c  5  1
cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* ./lib   -r
cd ..
許可權:chmod 777 filesystem -R
釋出檔案系統
vim   /etc/exports
新增
/work/nfs/filesystem      *(rw,sync,no_root_squash)

儲存退出
檢查檔案系統是否已經發布
showmount -e 192.168.1.123現在網路檔案系統以及可以共享,後面會給單板接上網線,然後設定uboot引數、單板IP,及nfs等引數。

4、編譯uboot

光碟自帶的uboot,無法直接使用,上電後只會列印OK。但是官方論壇可以下載到1506可以使用的uboot,連結如下:http://www.arm9home.net/read.php?tid-80810.html。也可以使用這篇部落格體提供的uboot:http://blog.csdn.net/lizuobin2/article/details/52825033

下載後配置,編譯即可產生uboot。

tar xzf uboot_tiny4412-20130729.tgz
cd uboot_tiny4412
make tiny4412_config
make

編譯 用於生成bl2 的工具

cd sd_fuse;
make

假設SD卡已被PC Linux識別為/dev/sdc, 以root使用者執行以下命令即可:

cd sd_fuse/tiny4412
./sd_fusing.sh  /dev/sdc

到此我們準備好了

(1) 核心

(2) 檔案系統

(3) Uboot

接下來就是如何下載,並啟動核心,掛接檔案系統了。

二、下載系統檔案,並啟動核心。

2.1、下載uboot到emmc

參考:

(1)之前我們已經將uboot下載到SD卡,現在從SD卡啟動uboot,可以看到如下資訊:


(2)檢視裝置的分割槽表資訊

fdisk -p 0

fdisk -p 1


裝置mmc1的分割槽資訊,即eMMC分析,注意這個是superboot分割槽資訊,我們就用這個分割槽。

分割槽1 是FAE分割槽, 分割槽2 是給system的,分割槽3是user-data, 分割槽4 是 cache.

(3)格式化eMMC

u-boot模式下輸入如下指令來格式化eMMC裝置。
#uboot:fdisk -c 1 320 2057 520
執行後會返回分割槽資訊,繼續格式話分割槽1,2,3,4
#uboot:fatformat mmc 1:1
這句話意思是對mmc 1裝置的第一分割槽格式作fat格式化。
#uboot:ext3format mmc 1:2
#uboot:ext3format mmc 1:3
#uboot:ext3format mmc 1:4
上面三個指令是分別對eMMC的分割槽2,3,4作ext3格式化。
到此我們完成了對eMMC的裝置的格式化。

(4)如果提示如下錯誤:

Error: No MBR is found at SD/MMC.                                            
Hint: use fdisk command to make partitions.
則先執行指令"fdisk -c 0",執行過程如下:
#fdisk -c 0                                                        
fdisk is completed

對emmc初始化後,我們開始使用dnw來下載uboot到emmc中。現在我們就需要裝一下linux的dnw工具,注意dnw是下載到記憶體,把韌體資料快取起來,然後燒錄到eMMC中。

(5)Linux下DNW工具安裝:

主要參考了:

1.首先解壓縮檔案:
# tar xvf dnw_for_linux.tar.gz
另:在Ubuntu下右鍵解壓也很方便

目錄如下:
dnw_linux/
dnw_linux/secbulk/
dnw_linux/secbulk/Makefile
dnw_linux/secbulk/secbulk.c
dnw_linux/dnw/
dnw_linux/dnw/dnw.c
其中secbulk.c是PC端USB驅動, dnw.c是寫入工具

2 編譯並載入secbulk.c核心模組

$cd secbulk
$make -C /lib/modules/`uname -r`/build M=`pwd` modules
編譯成功後在當前目錄下可以看到secbulk.ko

3.編譯完成後,會生成secbulk.ko檔案:
# ls
Makefile       Module.symvers  secbulk.ko     secbulk.mod.o
modules.order  secbulk.c       secbulk.mod.c  secbulk.o

4.載入模組到Linux核心:
# sudo insmod ./secbulk.ko        (注意要在root許可權下)
# dmesg        (檢視是否載入成功)
secbulk:secbulk loaded

usbcore:registered new interface driversecbulk        (看到這樣兩行就說明成功了)

開機的時候不會自動載入.ko檔案,這樣每次都要先載入才可以使用,此時將其加入開機指令碼,
使其得到自動載入,編輯/etc/init.d/rc.local 在最後加上 insmod /所在路徑/secbulk.ko。

5.下面開始編譯dnw工具
# cd ../dnw
# gcc -o dnw dnw.c

(編譯完成,會看到dnw可執行檔案)

6.將檔案copy到/usr/local/bin目錄
# sudo cp dnw /usr/local/bin
這樣就可以在shell下面直接使用dnw命令了

但是問題出現了,當我使用這個dnw下載bl2.bin的時候,會出現校驗錯誤。但是下載其他檔案均沒有問題,於是網上各種尋找DNW工具,看安裝,最後通過和另一個版本的DNW結合,解決了這個問題,uboot也完整的下載到了emmc中。下載連結:http://download.csdn.net/detail/fengyuwuzu0519/9886362

(6)DNW下載好了,我們可以把uboot下載到emmc了。

#uboot:emmc open 1
提示:eMMC OPEN Success.!!

上面提示emmc開啟成功,注意說明,emmc一旦開啟,需要連續燒錄,燒錄完成後可以關閉emmc

#uboot:dnw
提示:OTG cable Connected!

Now, Waiting forDNW to transmit data(等待DNW下載)

開啟虛擬機器,進入uboot所在目錄

cd /work/uboot_tiny4412

dnw  sd_fuse/tiny4412/E4412_N.bl1.bin

此時u-boot中斷會提示傳送校驗完成,此時已經把bl1.bin通過USB傳送到了memeory的0xc0000000起始地址,大小8KB.

接下來我們燒錄bl1.bin到eMMC中,u-boot下繼續輸入:
#uboot:mmc write 1 0xc0000000 0 0x10
會提示寫入資訊,說明已經寫入成功。這個是把剛才從PC端通過dnw下載下來的bl1.bin韌體下載到emmc中,起始0, 16個block, 一個block是512B, 16*512=8*1024=8KB. 這個是bl1.bin的存放位置。
以此類推,燒錄bl2.bin. u-boot.bin, tzsw.bin

#uboot:dnw

#虛擬機器:dnw sd_fuse/tiny4412/bl2.bin

#uboot:mmc write 1 0xc0000000 0x10 0x1C

#uboot:dnw

#虛擬機器:dnw u-boot.bin

#uboot:mmc write 1 0xc0000000 0x30 0x21D

#uboot:dnw

#虛擬機器:dnw sd_fuse/tiny4412/E4412_tzsw.bin

#uboot:mmc write 1 0xc0000000 0x2c0 0xB8

啟動分割槽到此全部寫入完成,注意一定要關閉emmc
u-boot下繼續輸入:
#uboot:emmc close 1
提示:eMMC CLOSE Success.!!

現在uboot已經完整的燒入到emmc,我們可以將開關波動到NAND一側,從emmc啟動,發現uboot輸出已經變成了:


2.2、下載核心到emmc

核心下載我們採用fastboot下載,uboot已經支援了fastboot。

安裝windows下fastboot工具

如果你已經安裝了Android Studio,那麼你已經有fastboot工具,在目錄

F:\AndroidSDK\platform-tools下有fastboot.exe AdbWinApi.dll

下載我們進入uboot,執行fastboot,並將單板的usb接到PC。提示如下:


windows下cmd進入fastboot.exe所在目錄

fastboot flashkernel zImage(正常下載)

fastboot flashramdisk ramdisk-u.img(正常下載)

fastboot flash fatrootfs_qtopia_qt4.img (下載始終出錯,於是放棄光碟的檔案系統,使用自制的檔案系統)

fastboot reboot 

此時,我們已經將uboot、核心下載到單板中。

參考:http://blog.csdn.net/lizuobin2/article/details/52825033

2.3、設定uboot啟動引數,啟動核心,並掛接網路檔案系統

uboot啟動引數:
set gatewayip  192.168.1.1
set ipaddr     192.168.1.125   //板子的IP
set serverip   192.168.1.123   //PC機IP

set bootargs "root=/dev/nfsnfsroot=192.168.1.123:/work/nfs/filesystem ip=192.168.1.125console=ttySAC0,115200 lcd=S70 ctp=2"

save

set bootcmd moviread kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 4000800041000000

reset  


核心啟動資訊: