讓uboot 支援 ubi
轉載地址:http://blog.chinaunix.net/uid-15706699-id-2670964.html
uboot已經支援ubi,只要在.h檔案中開啟巨集定義就可以了,修改如下:
//新增加對ubifs的支援
#define CONFIG_MTD_DEVICE 1
#define CONFIG_MTD_PARTITIONS 1
#define CONFIG_CMD_MTDPARTS
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_UBI
#define CONFIG_LZO 1
#define CONFIG_RBTREE 1
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:[email protected](xload)," \
"1920k(uboot)," \
"128k(params)," \
"5m(kernel)," \
"-(root)"
需要注意的是增加UBI的支援之後uboot會增大100多KB,在NAND中啟動,有可能需要修改
//copy U-Boot to RAM
ldr r0, =TEXT_BASE //傳遞給C程式碼的第一個引數:u-boot在RAM中的起始地址
mov r1, #0x0 //傳遞給C程式碼的第二個引數:Nand Flash的起始地址
mov r2, #0x50000 //傳遞給C程式碼的第三個引數:u-boot的長度大小(320KB)
bl nand_read_ll //此處呼叫C程式碼中讀Nand的函式,現在還沒有要自己編寫實現
如果uboot傳給nand_read_ll 的uboot的引數小於uboot的長度的話,uboot跑不起來,移植的時候被這個問題搞得很鬱悶。
另外還有一個地方就是編譯的時要求CONFIG_SYS_MALLOC_LEN大於等於512KB,下面兩個沒有要求我也給改了。
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE+ 512*1024)
如果沒改的話會報錯。
這個時候就可以make 了,如果順利的話會編譯出uboot-bin在根目錄下。
到這裡uboot的UBI移植完成了。
下載檔案系統到flash
使用預設的分割槽對nand進行分割槽:mtdpart default
1)擦除root分割槽 nand erase root
2)對root分割槽進行ubi格式化 ubi part root
AM3517_SHAW # ubi part root
Creating 1 MTD partitions on "nand0":
0x000000780000-0x000010000000 : "mtd=4"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size: 512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=4"
UBI: MTD device size: 248 MiB
UBI: number of good PEBs: 1984
UBI: number of bad PEBs: 4
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 0
UBI: available PEBs: 1961
UBI: total number of reserved PEBs: 23
UBI: number of PEBs reserved for bad PEB handling: 19
UBI: max/mean erase counter: 1/0
3)建立rootfs ubi create rootfs-nand
AM3517_SHAW # ubi create rootfs-nand
Creating dynamic volume rootfs of size 253016064
4)將檔案系統下載到記憶體 tftpboot 0x82000000 ubifs.img
AM3517_SHAW # tftpboot 0x82000000 ubifs.img
Using DaVinci EMAC device
TFTP from server 192.168.1.119; our IP address is 192.168.1.10
Filename 'ubi.img'.
Load address: 0x82000000
Loading: #################################################################
#################################################################
#####################
done
Bytes transferred = 18743296 (11e0000 hex)
5)將檔案系統燒寫到rootfs 中
AM3517_SHAW # ubi write 0x82000000 rootfs-nand 0x11e0000 (分割槽名稱與核心保持一致)
Volume "rootfs" found at volume id 0
Cannot start volume update
exit not allowed from main input shell.
操作不成功!發現原因為,下面這個巨集定義的值不夠大,改為1024*1024後,可正常燒寫正常!
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE+ 1024*1024)
到此,uboot關於ubi的修改工作全部完成,下面是啟動核心的相關工作了。
setenv bootargs mem=256M console=ttyO2,115200n8 noinitrd ip=off omap_vout.vid1_static_vrfb_alloc=y rw ubi.mtd=4,512 rootfstype=ubifs root=ubi0:rootfs-nand rootdelay=2 vram=8M omapfb.vram=0:8M
我的板子的啟動引數,其中mtd=4,512要注意,是vid head的偏移!
注意燒寫的檔案 一定要對,uboot燒寫ubifs.img 而不是ubi.img !!!