本文轉載自:http://blog.csdn.net/fengyuwuzu0519/article/details/74080109
版權聲明:本文為博主原創文章,轉載請注明http://blog.csdn.net/fengyuwuzu0519。
- 硬件平台: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 內核源代碼
(2)配置tar xvzf linux-3.5-20151029.tgz
cd linux-3.5
(3)編譯cp tiny4412_linux_defconfig .config
make
最后在 arch/arm/boot 目錄下生成 zImage
3、制作根文件系統
參考: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。
本人使用的uboot下載鏈接:http://download.csdn.net/detail/fengyuwuzu0519/9886366
- 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
參考:
http://www.cnblogs.com/pengdonglin137/articles/4161084.html
http://www.arm9home.net/read.php?tid-83474.html
(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工具安裝:
主要參考了:
http://blog.sina.com.cn/s/blog_69dd1a09010196bf.html
http://blog.csdn.net/u011452544/article/details/39393857
http://blog.csdn.net/morixinguan/article/details/70478650
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
參考:http://blog.csdn.net/lizuobin2/article/details/52825033
內核下載我們采用fastboot下載,uboot已經支持了fastboot。
安裝windows下fastboot工具
如果你已經安裝了Android Studio,那么你已經有fastboot工具,在目錄
F:\AndroidSDK\platform-tools下有fastboot.exe AdbWinApi.dll
我也提供一下fastboot下載鏈接:http://download.csdn.net/detail/fengyuwuzu0519/9886552
下載我們進入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
內核啟動信息:

