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


本文轉載自:http://blog.csdn.net/fengyuwuzu0519/article/details/74080109

 

目錄(?)[+]

 

 

  • 硬件平台: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)解壓編譯器源碼

 

[cpp]  view plain  copy
 
 print?
  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為:

 

[cpp]  view plain  copy
 
 print?
  1. 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
添加
[cpp]  view plain  copy
 
 print?
  1. mount -t ramfs none  /dev  
  2. mount -t sysfsnone  /sys  
  3. mount -t proc  none  /proc  
  4. mount -t tmpfs none  /tmp  
  5. /sbin/mdev  -s  
保存退出
vim  etc/inittab
添加
[cpp]  view plain  copy
 
 print?
  1. ::sysinit:/etc/init.d/rcS  
  2. ttySAC0::askfirst:-/bin/sh  
保存退出
vim  etc/profile
添加
[cpp]  view plain  copy
 
 print?
  1. 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

 

[cpp]  view plain  copy
 
 print?
  1. tar xzf uboot_tiny4412-20130729.tgz  
  2. cd uboot_tiny4412  
  3. make tiny4412_config  
  4. make  

 

編譯 用於生成bl2 的工具

[cpp]  view plain  copy
 
 print?
  1. cd sd_fuse;  
  2. make  

 

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

[cpp]  view plain  copy
 
 print?
  1. cd sd_fuse/tiny4412  
  2. ./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  

內核啟動信息:

 


免責聲明!

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



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