1. 程式人生 > >《轉》u-boot移植燒寫步驟、u-boot命令和kernel燒寫步驟

《轉》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內容為當前核心版本

                     ====