TINY4412:移植uboot、內核和掛接網絡文件系統


 


開發環境:

單板: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)

 

成功后如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM