1. 程式人生 > >用uboot 燒寫uboot linux核心 檔案系統到nandflash的 過程以及bootm go命令啟動與區別

用uboot 燒寫uboot linux核心 檔案系統到nandflash的 過程以及bootm go命令啟動與區別

文章結構
結構順序有變化
-1:燒寫uboot
0: bootargs bootcmd 命令引數的設定
1:製作yaffs2的過程
2:燒寫yaffs2的過程
3:製作uimage 的過程
4: 燒寫uiamge的過程
5:uimage zimage vmlinux 的區別
6: uboot傳遞給核心的引數結構 tag
7:bootm go 的 啟動過程 以及區別
8:載入地址 入口地址 等

///////////////////通過uboot燒寫uboot到nandflash/////////////
//////////////
nand  erase  0  50000
//////////////
tftpboot  30008000  u-boot.bin
/////
Loading: T ##################

done
Bytes transferred = 257164 (3ec8c hex)
[[email protected]]# nand  write  0x30008000  0  3f000
//////////////
nand  write  0x30008000  0  3f000( 3ec8c最靠近2K整數倍的值 )



///////////////////通過uboot燒寫核心到nandflash/////////////
先檢視你自己板子的nandflash分割槽表
通過例項分析:下面的燒寫核心出錯
[[email protected]]# tftpboot 30008000 uImage
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.0.100; our IP address is 192.168.0.10
Filename 'uImage'.
Load address: 0x30008000
Loading: T #################################################################
 #################################################################

 ##########################
done
Bytes transferred = 2287128 (22e618 hex)
[[email protected]]# nand erase 0x60000 0x500000

NAND erase: device 0 offset 0x60000, size 0x500000
Erasing at 0x54000002800000 --  0% complete.
OK
[[email protected]]# nand write 0x30008000 0x60000 22e618
NAND write: device 0 offset 0x60000, size 0x22e618
Attempt to write non page aligned data
2287128 bytes written: ERROR
下面的燒寫正確:
NAND erase: device 0 offset 0x80000, size 0x500000
Erasing at 0x54000002800000 --  0% complete.
OK
[[email protected]]# nand write 0x30008000 0x80000 22e800
NAND write: device 0 offset 0x80000, size 22e800
改了兩個地方:
1:0x60000 ->0x80000
2:0x22e618 ->22e800
修改的原因是:1:從0x60000檫除 會把bootargs bootcmd 也給檫除了 所以選擇從0x80000開始檫除
2:0x22e618 雖然是通過tftpboot下載的核心的實際大小,但是這裡是write指令 後面的引數是指明要檫寫的長度  檫寫長度要求是2k(2048)的整數倍(也就是整頁 整頁的檫除) 而0x22e618 不是2K的整數倍 ,出現錯誤Attempt to write non page aligned data  2287128 bytes written: ERROR ,於是取一個最靠近的數  就選擇了22e800 就OK樂
/////////////////////設定自啟動引數bootcmd///////////////////
我剛開始時 是這樣寫的:
setenv  bootcmd  nand read 30008000 80000 22e800 ; bootm 30008000
按確定後 直接執行了bootm這個命令 於是改了:
setenv  bootcmd  nand read 30008000 80000 22e800 \; bootm 30008000 就OK了
/////////////////////下載yaffs2映像到nandflash中/////////////////////////
生產yaffs2 以及工具請可以參考Tekkaman Ninja 的檔案 uboot 燒寫yaffs2檔案系統
方法是類似於核心的燒寫
先檢視你自己板子的nandflash分割槽表( 比如128M的板子 128M ->8000000 檫寫地址是從0x580000開始 所以 兩個相減 等於 7a80000 而我的是256M的 前面的核心是從0x80000開始的 檫除了0x500000 長度 所以這裡檔案系統 從0x580000 開始 結束到 nandflash的結束  )
128M
先察除:nand erase 0x580000 7a80000 
再寫  :nand write.yaffs 30008000 0x580000 dbb040(檔案系統的大小,而這裡檔案系統 不像核心一樣 燒寫長度 不是2K的整數倍 我不確定我從網路上找到的答案是否是對的,自己也沒有去查證:用mkyaffs2image 生成的檔案系統 在2K資料對齊的問題上 已經採取了對齊措施 使用者不用在考慮資料對齊的問題,而mkimage等工具沒有采用對齊措施 所以是要注意)
256M:
先察除:nand erase 0x580000 FA80000 
再寫  :nand write.yaffs 30008000 0x580000 dbb040
///////////設定bootargs引數////////////////////////////////////
1:如果用yaffs2檔案系統
setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
2:如果用NFS檔案系統
setenv bootargs noinitrdroot=/dev/nfsrwnfsroot= 192.168.0.100 :/ home/lq/rootfs ip=192.168.0.10 console=ttySAC0 mem=64M
///////////////bootatgs 引數解析/////////////////////////
root
用來指定rootfs的位置, 常見的情況有:
 root=/dev/ram rw 
 root=/dev/ram0 rw
請 注意上面的這兩種設定情況是通用的,我做過測試甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,網上有人說在某些情況下是不通用的,即必須設定成ram或者ram0,但是目前還沒有遇到,還需要進一步確認,遇到不行的時候可以逐一嘗 試。
 root=/dev/mtdx rw
 root=/dev/mtdblockx rw
 root=/dev/mtdblock/x rw
 root=31:0x
上 面的這幾個在一定情況下是通用的,當然這要看你當前的系統是否支援,不過mtd是字元裝置,而mtdblock是塊裝置,有時候你的挨個的試到底當前的系 統支援上面那種情況下,不過root=/dev/mtdblockx rw比較通用。此外,如果直接指定裝置名可以的話,那麼使用此裝置的裝置號也是可以的。
 root=/dev/nfs
在檔案系統為基於nfs的檔案系統的時候使用。當然指定root=/dev/nfs之後,還需要指定nfsroot=serverip:nfs_dir,即指明檔案系統存在那個主機的那個目錄下面。
B. rootfstype
 這個選項需要跟root一起配合使用,一般如果根檔案系統是ext2的話,有沒有這個選項是無所謂的,但是如果是jffs2,squashfs等檔案系統的話,就需要rootfstype指明檔案系統的型別,不然會無法掛載根分割槽.
C. console
console=tty 使用虛擬串列埠終端裝置 .
console=ttyS[,options] 使用特定的串列埠,options可以是這樣的形式bbbbpnx,這裡bbbb是指串列埠的波特率,p是奇偶位(從來沒有看過使用過),n是指的bits。
console=ttySAC[,options] 同上面。
看 你當前的環境,有時用ttyS,有時用ttySAC,網上有人說,這是跟核心的版本有關,2.4用ttyS,2.6用ttySAC,但實際情況是官方文件 中也是使用ttyS,所以應該是跟核心版本沒有關聯的。可以檢視Documentation/serial-console.txt找到相關描述。
D. mem
mem=xxM 指定記憶體的大小,不是必須的
E. ramdisk_size
ramdisk=xxxxx 不推薦 
ramdisk_size=xxxxx 推薦
上 面這兩個都可以告訴ramdisk 驅動,建立的ramdisk的size,預設情況下是4m(s390預設8M),你可以檢視Documentation/ramdisk.txt找到相關 的描述,不過ramdisk=xxxxx在新版的核心都已經沒有提了,不推薦使用。
F. initrd, noinitrd
當你沒有使用ramdisk啟動系統的時候,你需要使用noinitrd這個引數,但是如果使用了的話,就需要指定initrd=r_addr,size, r_addr表示initrd在記憶體中的位置,size表示initrd的大小。
G. init
init 指定的是核心啟起來後,進入系統中執行的第一個指令碼,一般init=/linuxrc, 或者init=/etc/preinit,preinit的內容一般是建立console,null裝置節點,執行init程式,掛載一些檔案系統等等操 作。請注意,很多初學者以為init=/linuxrc是固定寫法,其實不然,/linuxrc指的是/目錄下面的linuxrc指令碼,一般是一個連線罷 了。
H. mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要 想這個引數起作用,核心中的mtd驅動必須要支援,即核心配置時需要選上Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
mtdparts的格式如下:
mtdparts=[;
:= :[,]
:= [@offset][][ro]
:= unique id used in mapping driver/device
 := standard linux memsize OR "-" to denote all remaining space
 := (NAME)
因此你在使用的時候需要按照下面的格式來設定:
mtdparts=mtd-id:@(),@()
這裡面有幾個必須要注意的:
a. mtd-id 必須要跟你當前平臺的flash的mtd-id一致,不然整個mtdparts會失效
b. size在設定的時候可以為實際的size(xxM,xxk,xx),也可以為'-'這表示剩餘的所有空間。
舉例:
假設flash 的mtd-id是sa1100,那麼你可以使用下面的方式來設定:
mtdparts=sa1100:- → 只有一個分割槽
mtdparts=sa1100:256k(ARMboot)ro,-(root) → 有兩個分割槽
可以檢視drivers/mtd/cmdlinepart.c中的註釋找到相關描述。
I. ip
指定系統啟動之後網絡卡的ip地址,如果你使用基於nfs的檔案系統,那麼必須要有這個引數,其他的情況下就看你自己的喜好了。設定ip有兩種方法:
ip = ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
這兩種方法可以用,不過很明顯第二種要詳細很多,請注意第二種中which netcard 是指開發板上的網絡卡,而不是主機上的網絡卡。
說完常見的幾種bootargs,那麼我們來討論平常我經常使用的幾種組合:
1). 假設檔案系統是ramdisk,且直接就在記憶體中,bootargs的設定應該如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
2). 假設檔案系統是ramdisk,且在flash中,bootargs的設定應該如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意這種情況下你應該要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)

相關推薦

uboot uboot linux核心 檔案系統nandflash過程以及bootm go命令啟動區別

文章結構 結構順序有變化 -1:燒寫uboot 0: bootargs bootcmd 命令引數的設定 1:製作yaffs2的過程 2:燒寫yaffs2的過程 3:製作uimage 的過程 4: 燒寫uiamge的過程 5:uimage zimage vm

uboot uboot linux核心 檔案系統nandflash過程以及bootm go命令啟動區別(2010-12-19 17:27:43)

文章結構 結構順序有變化 -1:燒寫uboot 0: bootargs bootcmd 命令引數的設定 1:製作yaffs2的過程 2:燒寫yaffs2的過程 3:製作uimage 的過程 4: 燒寫uiamge的過程 5:uimage zimage vmlinux 的區別 6: uboot傳遞給核心的引數結

Linux核心檔案系統掛載分析

http://edsionte.com/techblog/archives/4389?f=http://blogread.cn/ 1.資料結構 下面將對檔案系統掛載過程中涉及到的兩個主要資料結構vfsmount和path進行節本說明。 1.1 struct vfsmo

linux核心 檔案系統 樹莓派 wireshark ssh uml

1, 原始機器資料格式化輸出 static const char *fmt_lower =         "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02

Fedora17下samba實現windows和Linux跨平臺檔案系統訪問

第一步:在Fedora linux系統下載並安裝samba       #   yum  -y  install  samba 第二步:編輯samba的配置檔案/etc/samba/smb.conf        1. 找到[homes],複製這6行   yy6p 2.修改

02.linux檔案系統簡介、檢視目錄ls命令、切換目錄cd命令、建立目錄mkdir、刪除目錄rm、移動重新命名mv、建立檔案touch、拷貝cp

整個檔案系統有一個頂層目錄:/ bin:存放一些可執行的程式(命令); boot:存放系統啟動所需要的一些檔案; dev:系統中的硬體(硬體在Linux中通過裝置檔案來標識); etc:存放配置檔案的地方; home:使用者目錄的總目錄; lib

“轉”使用UBOOT檔案系統核心的方法

①此處param區存放著uboot傳遞給kernel的標記列表,(是uboot傳遞給核心的,核心去讀取),和nandflash上的param儲存區(是uboot自己的)的內容不一樣 nandflash的param儲存區存放的是如 bootargs=console=ttySAC0 noinitrd root=/

uboot核心

tftp 0x31000000 192.168.1.78:uImage 1.nand erase 0x80000 0x500000 2.nand write 0x31000000 0x80000 0x500000 3.setenv bootcmd 'nand read 0

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開發環境。 由於友

嵌入式linux核心,檔案系統的2種方式

一.網路下載燒寫 tftpboot 二.linux下的DNW,win7下的DNW無法使用 第一種方式 1.設定開發板ip,及其伺服器IP在同一段 set ipaddr 192.168.1.X set serverip 192.168.1.X 與上面不同 save 2.從

在Tiny6410linux核心檔案檔案系統

1配置編譯支援NAND啟動的U-boot 在Linux下安裝MiniTools 要啟動MiniTools,進入MiniTools目錄,在root使用者命令列下執行./start.sh MiniTools開啟,如此時MiniTools最底一行顯示“未連線開發板.

把更改後的uboot到開發板及遇到的問題

SD卡燒寫過程及遇到的問題 (1)對uboot原始碼進行完修改(修改內容根據自己的理解和分析來修改) (2)make distclean然後make x210_sd_config然後make (3)編譯完成得到u-boot.bin,然後去燒錄。燒錄方法按照裸機第三部分講的linux下使用

Source Insight工程精準匯入到的Linux核心檔案

下載指令碼檔案:PF_Prj_Gen.sh /*這個指令碼的作用應該是對原始檔進行篩選,挑出編譯出了對應的.o檔案的檔案,然後把這些檔案生成列表,在source insight中新增進去,這種方法瀏覽程式碼很好,過濾掉了沒有用到的一大堆檔案 習慣在ubuntu上面用命令列搜尋,因為比較快,往

使用jlinkuboot

        .long   0 @ 0x24:         .long   0 @ 0x28: where this vivi was linked, so we can put it in memory in the right place         .long   _start @ 0x2C

利用SD卡uboot.bin到nand中

準備: 開發板 tiny6410 梯形口usb線 串列埠線 第一步利用SD-FLASH將superboot燒寫到sd卡上  放到開發板中啟動,串列埠線連線電腦 開啟超級終端(超級終端的設定 為 11520波特率 com3 資料流控制為 無)   然後根據超級終端的顯示來操作

OpenJTAG程式到Flash—— 韋東山嵌入式Linux視訊學習筆記03

說明:本文僅在Windows環境下實驗。 韋東山的JZ2440(v2),可以選擇從Nor Flash啟動,也可以選擇從Nand Flash啟動,不管從哪裡啟動,都需要Flash上有程式,沒有程式的話,板子就是一塊磚頭。 按照常規思維,板子上應該有一個Boot

【記錄】Windows下DNW和uboot

準備 uboot在NORFLASH中,所以先設定設定撥碼開關,選擇NORFLASH啟動 開啟SecureCRT,用於操作uboot,檢視串列埠資訊 開啟DNW工具,傳送檔案 燒寫 重啟板卡

製作和嵌入式Linux檔案系統過程

1.解壓tar xvf createSdcard.qt4.tar.bz2檔案,在Ubuntu下插入SD卡。 2.執行./createSdCard.sh,即可在SD卡生成 bin 和 system 目錄,bin 裡面的內容不要更改; system 目錄裡的內容將來被 燒寫到

ubootflash原理

UBOOT燒寫flash命令路徑原理:http://blog.csdn.net/lishaman/article/details/6740866 UBOOT燒寫flash具體晶片操作流程原理:http://blog.csdn.net/qingkongyeyue/articl

基於MT7688模組的開發筆記8——TFTP方式Uboot韌體

通過TFTP方式,燒寫Uboot.bin韌體需要準備tftpd、SecureCRT,還要準備網線,串列埠線。 一、我的MT7688開發板出廠的IP地址為:192.168.1.1/24,所以給電腦設定一個同網段的靜態IP地址。然後用網線將開發板的LAN與電腦的網絡卡連線。如果