開發環境:
單板:TINY4412-1611
系統:Ubuntu 16.04 64位
編譯工具鏈:arm-linux-gcc-4.3.2
uboot版本:uboot_tiny4412-20130729
內核版本:linux-3.5-20170221
busybox版本:busybox-1.20.0
【注】 1、本文只用於移植,不會講解其中原理。若讀者希望了解其中原理,請閱讀《嵌入式linux應用開發完全手冊》。
2、為了便於區分uboot命令和虛擬機命令,兩種命令的背景會采用不同顏色,請讀者注意區分。
一、下載源碼和必需文件
百度網盤鏈接(提供了友善之臂光盤的文件系統,但是本博客使用的是網絡文件系統):
https://pan.baidu.com/s/1DwW9HItGVViDyavq2fzGhQ
提取碼為:n0tj
二、安裝arm-linux-gcc-4.3.2
解壓arm-linux-gcc-4.3.2到/usr/local/目錄:
$ sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /
設置環境變量,在/etc/environment文件中添加:/usr/local/arm/4.3.2/bin,更改完成后如下圖:
$ sudo vim /etc/environment
$ source /etc/environment
查看是否安裝成功:
$ arm-linux-gcc -v
若有讀者在第二步出錯,建議使用韋東山老師提供的虛擬機:http://wiki.100ask.org/Download_link_page
三、編譯uboot_tiny4412-20130729
將百度網盤中文件夾下的所有文件放在某一目錄(筆者目錄為/work/tiny4412/tools/),解壓uboot並打補丁:
$ tar xzf uboot_tiny4412-20130729.tgz
$ cd uboot_tiny4412/
$ patch -p1 < ../tiny4412_lioker.patch
完成后如下圖:
編譯:
$ make tiny4412_config
$ make
完成后會在當前目錄下生成u-boot.bin
四、編譯linux-3.5-20170221
解壓linux-3.5:
$ cd ../
$ tar xzf linux-3.5-20170221.tgz
$ cd linux-3.5/
配置:
$ sudo cp ../uboot_tiny4412/tools/mkimage /usr/bin/mkimage
$ sudo chmod 777 /usr/bin/mkimage
$ cp tiny4412_linux_defconfig .config
$ make menuconfig
【注】如果make menuconfig時報錯,如make[1]: *** [menuconfig] Segmentation fault (core dumped),那么需要執行sudo apt-get install libncurses*
成功后如下圖,我們可以通過方向鍵控制,按空格鍵選中或取消選中(也就是[*]或[ ]),按回車進入下一級
我們需要在此基礎上進行修改,打開以下選項:
System Type --->
[ ] Support TrustZone-enabled Trusted Execution Environment
取消勾選Support TrustZone-enabled Trusted Execution Environment
Kernel hacking --->
[*] Kernel low-level debugging functions (read help!)
Kernel low-level debugging port (Use S3C UART 0 for low-level debug)
(X) Use S3C UART 0 for low-level debug
保存后退出
修改kernel/timeconst.pl文件,否則編譯過程會出現如下錯誤:
修改kernel/timeconst.pl文件373行如下圖所示:
編譯:
$ make -j4
完成后會在arch/arm/boot目錄中生成我們需要的zImage文件
五、編譯busybox-1.20.0,創建文件系統
配置busybox-1.20.0:
$ cd ../
$ tar -xvf busybox-1.20.0.tar.bz2
$ cd busybox-1.20.0/
$ make defconfig
$ make menuconfig
打開以下選項,設置如下圖所示:
BusyboxSettings --->
Build Options --->
保存后退出
編譯:
$ make -j4
$ make install
完成后會在busybox-1.20.0目錄下生成_install目錄
制作文件系統:
$ cd /work/tiny4412/
$ mkdir fs
$ cd fs/
$ cp /work/tiny4412/tools/busybox-1.20.0/_install/* . -r
$ mkdir etc dev opt sys tmp mnt lib proc
$ mkdir etc/init.d
$ mkdir dev/pts
$ vim etc/init.d/rcS
添加:
mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
保存后退出,完成后如下圖:
$ vim etc/inittab
添加:
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
保存后退出,完成后如下圖:
$ vim etc/profile
添加:
export PS1="[root @ lioker \W ] #"
保存后退出,完成后如下圖:
$ vim etc/fstab
添加:
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
保存后退出,完成后如下圖:
創建命令行設備和空設備:
$ sudo mknod dev/console c 5 1
$ sudo mknod dev/null c 1 3
構造lib:
$ sudo cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/* ./lib -r
$ sudo cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/* /work/tiny4412/fs/lib/ -r
設置權限並允許掛接:
$ cd ../
$ sudo chmod 777 fs -R
$ sudo vim /etc/exports
添加:
/work/tiny4412/fs *(rw,sync,no_root_squash)
保存后退出,完成后如下圖:
重啟nfs服務並測試是否可以掛接:
$ sudo /etc/init.d/nfs-kernel-server restart
$ sudo mount -t nfs 127.0.0.1:/work/tiny4412/fs /mnt
完成后如下圖:
取消掛接:
$ sudo umount /mnt
六、燒寫uboot至eMMC
查看掛載的磁盤設備:
$ ls /dev/sd*
如下圖:
需要准備2G到8G的SD卡,並進行格式化
將SD卡插入電腦,SD卡連接虛擬機
執行:
$ ls /dev/sd*
/dev/sdc就是我們的SD卡
繼續執行:
$ cd /work/tiny4412/tools/uboot_tiny4412/sd_fuse/
$ make
$ cd ./tiny4412/
$ sudo ./sd_fusing.sh /dev/sdc
將SD卡插入開發板,開發板串口連接電腦,開發板的microUSB連接電腦(不能使用USB分線器),啟動后串口正常接收,代表uboot燒寫到SD卡完成
按任意鍵進入uboot命令行,准備格式化eMMC,執行以下命令:
TINY4412 # fdisk -p 0
TINY4412 # fdisk -p 1
確定“disk 1”為eMMC,下一行的命令的“1”指的就是eMMC:
TINY4412 # fdisk -c 1 320 2057 520
TINY4412 # fatformat mmc 1:1
TINY4412 # ext3format mmc 1:2
TINY4412 # ext3format mmc 1:3
TINY4412 # ext3format mmc 1:4
TINY4412 # emmc open 1
TINY4412 # dnw 0x40008000
切換到虛擬機,虛擬機上會顯示兩個USB圖標,一個是串口線(USB UART),一個是傳輸線,將傳輸線連接到虛擬機
虛擬機中執行:
$ lsusb
確定ID為04e8:1234的是傳輸線
虛擬機中安裝dnw:
$ tar -xzf dnw-linux.tar.gz
$ cd dnw-linux/
$ cd ./src/driver/
$ vim secbulk.c
修改26行為之前的傳輸線ID
保存后退出
$ cd ../../
$ make
$ cd ./src/driver/
$ sudo insmod secbulk.ko
$ sudo cp ../dnw/dnw /usr/local/bin/
$ cd /work/tiny4412/tools/uboot_tiny4412/sd_fuse/tiny4412/
$ sudo dnw E4412_N.bl1.bin
此時uboot會提示傳送校驗完成,此時已經把bl1.bin通過USB傳輸到了DDR的0x40008000地址
接下來我們燒錄bl1.bin到eMMC中,uboot下繼續輸入:
TINY4412 # mmc write 1 0x40008000 0 0x10
uboot會提示寫入信息,說明已經寫入成功。以此類推,燒錄bl2.bin,u-boot.bin和tzsw.bin
TINY4412 # dnw 0x40008000
$ sudo dnw bl2.bin
TINY4412 # mmc write 1 0x40008000 0x10 0x1C
TINY4412 # dnw 0x40008000
$ sudo dnw ../../u-boot.bin
TINY4412 # mmc write 1 0x40008000 0x30 0x21D
TINY4412 # dnw 0x40008000
$ sudo dnw E4412_tzsw.bin
TINY4412 # mmc write 1 0x40008000 0x2C0 0xB8
啟動分區到此全部寫入完成,關閉eMMC
TINY4412 # emmc close 1
將開關撥到NAND一側,使用eMMC啟動
七、燒寫內核到eMMC,掛載網絡文件系統
燒寫使用的是fastboot,在虛擬機中執行:
$ sudo apt-get install fastboot
安裝完成后在uboot中執行:
TINY4412 # fastboot
虛擬機中傳輸:
$ sudo fastboot flash kernel /work/tiny4412/tools/linux-3.5/arch/arm/boot/zImage
uboot會提示寫入信息,說明已經寫入成功
TINY4412 # fastboot
$ sudo fastboot flash ramdisk /work/tiny4412/tools/ramdisk-u.img
如果想使用友善之臂自帶的文件系統,執行:
TINY4412 # fastboot
$ sudo fastboot flash fat /work/tiny4412/tools/rootfs_qtopia_qt4.img
在uboot命令行中按“Ctrl + C”退出傳輸
對於網絡文件系統設置uboot啟動參數:
TINY4412 # set gatewayip 192.168.7.1
TINY4412 # set ipaddr 192.168.7.9 // 板子的IP
TINY4412 # set serverip 192.168.7.5 // 虛擬機的IP
TINY4412 # set bootargs "root=/dev/nfs nfsroot=192.168.7.5:/work/tiny4412/fs ip=192.168.7.9 console=ttySAC0,115200n8 lcd=S70 ctp=2"
TINY4412 # set bootcmd "movi read kernel 0 40008000; movi read rootfs 0 41000000 400000;bootm 40008000 41000000"
TINY4412 # save
TINY4412 # reset
對於友善之臂自帶的文件系統設置uboot啟動參數:
TINY4412 # set bootargs "console=ttySAC0,115200n8"
TINY4412 # set bootcmd "movi read kernel 0 40008000;movi read rootfs 0 41000000 400000;bootm 40008000 41000000"
TINY4412 # save
TINY4412 # reset
如果讀者不希望內核打印太多信息, 可將bootargs設置為:
bootargs=root=/dev/nfs nfsroot=192.168.7.5:/work/tiny4412/fs ip=192.168.7.9 console=ttySAC0,115200n8 lcd=S70 ctp=2 loglevel=4
或
bootargs=console=ttySAC0,115200n8 loglevel=4
需要注意的是,loglevel后面的數值越小,表示輸出級別越高,輸出信息越少(最小值為0)
成功后如下圖: