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
(3)編譯cp tiny4412_linux_defconfig .config
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 filesystemcd 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
核心啟動資訊: