《轉》u-boot移植燒寫步驟、u-boot命令和kernel燒寫步驟
轉自:《http://blog.sina.com.cn/s/blog_726c4bd20100unjn.html》
移植燒寫步驟
1. 解壓u-boot原始檔
2. 從u-boot/include/configs裡找相近的配置,複製成自已的名字
3. 改makefile檔案增加目標,比如 mini2440_config: arm<體系> <SMDK2410板型號> <資料夾名字> <公司/開發者,可以為NULL> 核心s3c24x0
4. 把相應檔案改好
例如: 硬體配置在 u-boot/include/configs/mini2440.h <包括 啟動引數,命令指示符等>
相關指令的 u-boot/common/cmd_console.c
相關驅動的檔案,都放到相應目錄裡去
5. make distclean 清除垃圾(把上一級的配置全部刪除)
6. 啟動你改好的配置 make mini2440_config
7. 交叉編譯 make CROSS_COMPILE=arm-linux-
8. 在uboot/下生成了uboot.bin
9. 傳輸資料到記憶體
9.1 燒寫機<工廠級,Nand中的bootload已被破壞>
9.2 USB+驅動 輸入<Nand啟動,並且bootloader完好>指令usbslave ,然後給計算機制定檔案
<Nand中的bootloader已被破壞,就用開發板Nor啟動>
<如果Nand中的bootloader已被破壞, 又不是開發板, 則成磚頭機>
9.3 串列埠 輸入 <Nand啟動,並且bootloader完好> 指令loadx ,然後給計算機制定檔案
9.4 網路 輸入 <Nand啟動,並且bootloader完好> 指令tftp <遇先要在u-boot環境變數裡設定好伺服器和本機的IP地址,MAC地址,閘道器,MASK>
(注:資料傳輸指令後可以跟資料輸入的記憶體目標地址, 預設是bootloader的mini2440.h裡CONFIG_SYS_LOAD_ADDR指定的值)
10. 燒寫進Nand
10.1 先擦除nand erase offset<Nand基址(起始地址)> len<資料長度>
10.2 寫入nand write.jffs2 addr<記憶體基址> offset<Nand基址> len<資料長度>
10.3 根檔案系統rootfs定入要用yaffs檔案系統寫入
nand wrtie.yaffs addr offset len
u-boot命令
u-boot新版本下載地址,
ftp://ftp.denx.de/pub/u-boot
http://sourceforge.net/projects/U-Boot/
= 0.常用命令
- 記憶體操作-
md 是顯示記憶體資訊,預設是以32位顯示md.l
md.b 以2位顯示
md.w 以4位
mm 修改記憶體的值 也可以.b .w .l
空格+回車 結束脩改
mw記憶體填充
資料複製cp
cp[.b .w .l]src_add dest_add len
例: cp.b 31000000 50000 D0000 從31000000複製到50000 長度D0000
- Flash操作 -
檢視FLASH型號的扇區
flinfo
第一行顯示Bank所在的號碼,容量bit
大小Size和扇區Sectors大小
按扇區塊防寫FLASH,一定要按整扇區塊,如果不是整扇區塊,則失敗
protect off all 關閉所有扇區防寫
protect on all 開啟所有
protect off start end <start和end為起始地址和結束地址>
protect on start end
例: protect on 0 1FFFF
擦除FLASH, Nor Flash無法寫入1,所以需要用erase擦除來寫入1
erase start end
例 erase 30000 1EFFFF
- Nand Flash命令-
nand info
nand erase
nand read[.jffs2] addr off size .jffs代表ECC方式不同
nand read.yaffs addr off size
nand write[.jffs2] addr off size .jffs代表ECC方式不同
nand write.yaffs addr off size
nand dump offset 列印offset開始的一個扇區的資料
- 設定環境變數 -
printenv 顯示所有環境變數
setenv val item 新增/修改val變數,值為item
setenv val 把val的值清空了, 等效刪除val
saveenv 把所有的env都儲存至flash(關機後不會丟失)
bootdelay是開機延時的時間變數
從NAND啟動引數
setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 <設定root的儲存裝置>
setenv bootcmd "nand read 0x30000000 0x60000 0x2300000; bootm 0x30000000" <設定kernel的起始地址>
設定YAFFS啟動,引導引數:
setenv bootargs noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
設定NFS啟動,引導引數:
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.201:/home/root/root_fs/fs_mini ip=192.168.1.227:192.168.1.201:192.168.1.201:255.255.255.0:sbc2440.arm9.net:eth0:off
- 啟動命令 -
go 執行記憶體中的二進位制程式碼<不帶頭的程式,比如 zImage>
go addr[arg...]
bootm 執行記憶體中的二進位制程式碼<有固定格式的頭,比如系統,格式,壓縮,等頭資訊等,如uImage>
bootm[addr[arg...]]
如果addr省略,則存放到配置檔案中定義的巨集CFG_LOAD_ADDR
nboot 執行NandFlash中的程式碼
nboot[[[addr]dev]offset]從dev偏移offset處的映像複製到記憶體的addr處,如果環境變數autostart的值是yes,就啟動這個映像
如果addr省略,則存放到配置檔案中定義的巨集CFG_LOAD_ADDR
如果dev省略,則取環境變數bootdevice的值
如果offset省略,預設為0
bootp 從網路中啟動
= 2. 下載檔案到開發板
下載韌體有3種模式(串列埠,USB,網路)
- USB下載 - <開發板常用/手機常用, 需要USB驅動>
usbslave
nand erase 0x100000 0x300000
起始地址 大小
nand write 0x30000000 0x100000 0x300000 <目標地址必須是設定kernel的起始地址>
源地址 目標地址 大小
usbslave 從USB下載 rootfs
nand erase 0x560000 0x305700
nand write.yaffs 0x30000000 0x560000 0x305700 0
<yaffs大小必須是528的倍數,所以0x305700必須要改大成是528的倍數>
- 串列埠下載 - <任何裝置維修時用,萬能,但速度慢,115.2Kbps>
在超級終端下
loadb
loady
loadz
loadx 0x32000000 loadb跟上地址
然後點發送檔案
- 網路通過tftp來下載 - <網路裝置專用, 速度快>
主機先 開啟TFTP Server軟體,將u-boot.bin拷貝至C:\Program Files\TftpdWin\
setenv ethaddr 12:34:56:78:xx:xx //開發板MAC地址
setenv ipaddr 192.168.0.x //本開發板IP地址
setenv serverip 192.168.0.x //伺服器IP地址
下載指令tftp 0x32000000 uImage //下載uImage到記憶體0x3200000地址的地方3
= 3. 燒入FLASH
假設FLASH地址分段
bootloader 0x0 ~0x40000
parameter 0x40000 ~0x50000
kernel 0x50000 ~0x250000
(空)
rootfs 0x270000~
- 燒U-BOOT - nand命令後面的地址 有0x和沒有,都認為是16進位制
下載u-boot.bin至Nand Flash 地址0x0處
1)藉助DNW
跳線從Nor Flash啟動,進入SuperViVi選單介面,輸入“n”,藉助DNW,通過USB下載剛編譯生成的u-boot.bin;
2)更新自已
SMDK2440A>tftp 0x30000000 u-boot.bin // 通過tftp server下載u-boot.bin至開發板記憶體0x30000000 地址處
SMDK2440A>nand erase 0x0 0x40000 //首先擦除Nand Flash從0x0 開始,大小為0x40000 ,來存放u-boot.bin
SMDK2440A>nand write.jffs2 30000000 0 0x40000 //燒寫u-boot.bin至0x0 開始的Nand Flash
- 燒kernel-
先從zImage轉到uImage
mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008000
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
SMDK2440A>tftp 0x32000000 uImage // 通過tftp server下載uImage至開發板記憶體0x32000000 地址處
SMDK2440A>nand erase 0x50000 0x200000 //首先擦除Nand Flash從0x50000 開始,大小為0x200000 的空間,來存放uImage
SMDK2440A>nand write.jffs2 0x32000000 0x50000 0x200000 //燒寫uImage至0x30000
想開發板上電後自動啟動kernel則要設定bootcmd環境變數
set bootcmd 'nand read 32000000 50000 2000000; bootm 32000000'
saveenv
- 燒rootfs-
SMDK2440A>tftp 0x30000000 root_qtopia.img// 通過tftp server下載root_qtopia.img至開發板記憶體0x30000000 地址處
SMDK2440A>nand erase 0x270000 $(filesize) //首先擦除Nand Flash從0x270000 開始,大小為$(filesize)
(可用echo $(filesize)來檢視root_qtopia.img的大小),來存放root_qtopia.img
SMDK2440A>nand write.yaffs 30000000 270000 $(filesize) //燒寫root_qtopia.img至0x270000 開始的Nand Flash
SMDK2440A>boot
註明: $(filesize) 為系統環境變數, 可以用printenv檢視, 呼叫tftp後,系統自動會更新$(filesize) 的值,
直接呼叫即可,不必檢視後再輸入
kernel燒寫步驟
1. 從核心原始檔kernel/arch/arm/configs/裡找一個config樣本
2. 把樣本複製到kernel/目錄複製成 .config
例: 指令 cp xxx_config .config
3. make distclean清除垃圾
4. make menuconfig 開啟配置介面
5. 修改配置 , 最後選save儲存配置
6. make zImage CROSS_COMPILE=arm-linux-
7. 把生成的/arch/arm/boot/zImage 放到當初u-boot原始碼中/tools裡去,
<有一個寫好的mkz2uimage指令碼>使用mkimage生成uImage
8. 用nand啟動u-boot
9. 用DNW軟體用usbslave用USB傳輸uImage到記憶體中
注意u-boot預設下載的地址
10. bootm 地址 , 從記憶體中啟動核心,驗證核心是否正常<啟動了kernel,不能再回到u-boot>
===========
關機,開機,從nand啟動u-boot重下載kernel
11. nand erase 60000<nand偏移量> 400000<大小> 清除kernel區
nand write.jffs2 30000000<記憶體中的地址> 60000<nand偏移量> 400000<大小>
12.
=============
2.X86平臺 make bzImage
但要肥編好的zImage複製到/boot 並改名為vmlinuz-版本號
修改/boot/grub/grub.conf內容為當前核心版本
==== 驅動模組的編譯, 和存放
編譯核心時,編譯選譯M的模組, make modules
然後安裝M模組, make modules_install
(安裝實際是將編譯好的*.ko程式碼,複製到/lib/modules/<$version>/kernel/arch/x86/kernel/下)
<2.4核心,都叫*.o, 2.6之後的動態驅動都改成*.ko, 是由*.mod.o+*.o構成>
單個編譯時,自已寫個makefile,用make編譯,然後自已複製到/lib/modules下面
對於ARM平臺,因為系統的根目錄還沒有生成,所以*.ko將延後到rootfs根檔案系統中存放
= ramdisk
X86需要 還需要把核心中M的模組,製作成ramdisk,
"用mkinitrd initrd-版本號 版本號目錄名"
"版本號目錄名"為剛剛安裝的M模組/lib/modules下
命令類似mkinitrd initrd-2.6.32.2 2.6.32.2
mkinitrd initrd-2.6.18-8.el5xen 2.6.18-8.el5xen
也複製到/boot 並改名為initrd-版本號.img
修改/boot/grub/grub.conf內容為當前核心版本
====