uboot分析之通過nand命令讀核心

2021-10-01 14:58:13 字數 2865 閱讀 9386

**--- 修改了一些個人感覺不太完整的描述

本節主要學習:

詳細分析uboot環境變數中"bootcmd=nand read.jffs2 0x30007fc0 kernel;bootm 0x30007fc0"

怎麼實現nand命令讀核心。

1. nand read.jffs2 0x30007fc0 kernel

步驟a: 從nand filshe中的kernel分割槽讀出核心

步驟b: 放到記憶體位址0x30007fc0去

1.1 kernel分割槽: 是flash中核心區

其中在flash中定義了4大分割槽:

| bootloader | :u-boot存放位置

| boot parameters | :存放一些可以設定的引數,供u-boot使用

| kernel | :存放核心區

|root filesystem | :根檔案系統,掛載(mount)後才能使用檔案系統中的應用程式

這幾個分割槽通過配置檔案已在flash位址上是寫好了,位於 u-boot-1.1.6/include/configs/100ask24x0.h:

#define mtdids_default "nand0=nandflash0"

#define mtdparts_default "mtdparts=nandflash0:256k@0(bootloader)," \

"128k(params)," \

"2m(kernel)," \

"-(root)"

在100ask24x0.h裡定義了乙個mtdparts_default巨集定義,

「mtdparts=nandflash0:」表示mtdparts分割槽位於nandflash上

"256k@0(bootloader),"表示從0開始共256kb是bootloader分割槽

"128k(params),"表示接下來128kb用來存放引數,是params分割槽

"2m(kernel)," 表示接下來2mb用來存放核心,是kernel分割槽

"-(root)" 表示剩下的容量存放根檔案系統,是root分割槽

1.2 可以通過在uboot介面輸入"mtd"命令,檢視4個分割槽的位置情況:

#: name size offset mask_flags

0:bootloader 0x00040000 0x00000000 0

1:params 0x00020000 0x00040000 0

2:kernel 0x00200000 0x00060000 0

3:root 0x0fda0000 0x00260000 0

從上面可以看出bootloader基位址是0x0000 0000,該分割槽大小為0x00040000,所以結束位址為0x0003 ffff。

為什麼0x00040000等於256kb?

因為在arm920t中,每隔4個位址儲存了乙個32位資料(4個位元組)(每個位址儲存乙個位元組資料)

所以0x00040000(hex)=262144(dec)=  256*1024 =256kb 

1.3 所以 nand read.jffs2 0x30007fc0 kernel 最終擴充套件開為:

nand read.jffs2 0x30007fc0 0x00060000 0x00200000
1.4 nand命令位於./common/cmd_nand.c(所有命令檔案都是存在common中,以cmd_xx.c形式儲存)

其中nand命令執行時呼叫的是do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *ar**)函式

進入do_nand()函式:

int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *ar**)

...if (strcmp(cmd, "bad") != 0 && strcmp(cmd, "erase") != 0 &&

strncmp(cmd, "dump", 4) != 0 &&

strncmp(cmd, "read", 4) != 0 && strncmp(cmd, "write", 5) != 0 &&

strcmp(cmd, "scrub") != 0 && strcmp(cmd, "markbad") != 0 &&

strcmp(cmd, "biterr") != 0 &&

strcmp(cmd, "lock") != 0 && strcmp(cmd, "unlock") != 0 )

goto usage; //若ar**[1]都不滿足的話,表示使用命令在語法上有錯誤,列印短的幫助說明

....

if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) //cmd==read為真

else

}else if ( s != null && !strcmp(s, ".yaffs"))else if ( s != null && !strcmp(s, ".raw")) else

printf(" %d bytes %s: %s\n", size,

read ? "read" : "written", ret ? "error" : "ok"); //列印"2097152 bytes read : ok\n"

return ret == 0 ? 0 : 1; //read讀取kernel分割槽成功返回0,失敗返回1

}

uboot移植與原始碼分析總結 Nand驅動

從功能上來說,nand flash與norflash並無太大差異,主要區別在於操作介面和方式。nand基於非sram匯流排介面,使用nand介面,所以一般需要mcu具有nand控制器才可與其連線。在讀取時,以頁為單位 擦除和寫入時,以塊為單位。將nand視作乙個mtd裝置 uboot將nand視作乙...

uboot之配置分析

1.在uboot原始碼包中分析其中makefile。因為編譯流程為 1.make mini2440 config 2.make 2.makefile中有 mini2440 config unconfig mkconfig config arm arm920t mini2440 tekkamannin...

u boot之命令分析 6

u boot之命令分析 分析run command run command process macros token,finaltoken 處理巨集 解析傳進來的命令和引數,並將他們提取出來 if argc parse line finaltoken,argv 0 look up command i...