1. 程式人生 > 其它 >國產軟硬體龍芯系列迅為2K1000開發板配置 nand flash

國產軟硬體龍芯系列迅為2K1000開發板配置 nand flash

國產軟硬體龍芯系列2K1000開發板配置 nand flash

 

 

 

pmon 支援倆種介面型別的 nand flash,一個是 nand 控制器介面,一個是 spi 介面。龍芯核心板上板載了一個 nand 控制器介面的 flash   

 

 

 

 

 

 

 

 

 

 

9.9.11.1 配置 pmon

首先我們需要在 pmon 裡面新增對 nand 的支援,那麼我們都要配置哪些內容呢?這個要從 pmon 的啟動流程入手,pmon 在啟動的時候是在 Targets/LS2K/ls2k/tgt_machdep.c 裡呼叫 ls2k_nand_init()函式對 nand 進行初始化的, 如果我們要呼叫

ls2k_nand_init()函式,就需要定義巨集定義 NNADN CONFIG_LS2K_NAND 其中 NNADN 的值在 Targets/LS2K/compile/ls2k/m25p80.h 中定義為 1,

 

所以我們只需要在 Targets/LS2K/conf/ls2k 檔案中新增程式碼 option CONFIG_LS2K_NAND 即可,這裡我們添 加到第 269 行,

pmon 預設的 bsp 中,預設添加了程式碼 select nand,所以這裡我們不必要在新增程式碼 select nand,而select 指定的是後面的引數 nand 被選中,選中了 nand 引數以後,在 conf/files 檔案中使用

file 指定的 c 檔案就可以被編譯到 pmon 裡面。因為 file 指定的檔案編譯與否取決於後面的引數有沒有被選中,needs-flag 表示為該檔案生成標頭檔案。

 

 

 

 

 

 

 

然我們回過頭再來看條件編譯的這部分程式碼,

 

如果我們定義了 NNAND CONFIG_LS2K_NAND,就是執行*(volatile int *)0xbfe10420 |= (1<<9) 程式碼將GPIO 的管教複用設定為 NAND,,如果沒用定義這倆個巨集定義,就將複用關係設定為 GPIO,如下圖所示:

 

 

 

 

 

 

如果定義了這倆個巨集定義,接著就會呼叫 ls2k_nand_init 函式來初始化

nand,我們跳轉到 ls2k_nand_init 函式定義的 sys/dev/nand/ls2k-nand.c 驅動檔案,通過閱讀程式碼我們可以找到對 mtd 結構初始化的驅動函式為 ls2k_nand_init_mtd,通過訪問 mtd 就可以訪問 nand 控制器,

 

ls2k_nand_init_mtd 函式中,最關鍵的是對 ECC 的選擇,在 pmon 中預設的 ECC NAND_ECC_SOFT NAND_ECC_SOFT_BCH 倆種。BCH 校驗比 ECC 校驗有更強的糾錯能力,龍芯 BSP 裡面預設使用的是 ECC 校驗,程式碼如下:

 

 

 

 

 

 

 

如果我們需要使用 BCH 校驗,需要在在 Targets/LS2K/conf/ls2k 中定義 select nand_bch,,這個我們選擇 BCH 校驗,如下圖所示:

 

 

 

 

 

 

 

9.9.11.2 配置分割槽

nand 初始化最後的步驟會建立分割槽資訊,建立分割槽資訊的邏輯是先會呼叫 nand_flash_add_parts

數對環境變數 mtdparts 進行判斷,mtdparts 環境變數在 Targets/LS2K/include/pmon_target.h 中定義,

mtdparts 調 add_mtd_device sys/dev/nand/ls2k-nand.c 中程式碼如下:

 

 

 

 

 

 

 

環境變數 mtdparts 中的值我們要怎麼設定呢?

這裡環境變數的設定我們要和 pmon 裡面裝置樹的保持一致,開啟 Targets/LS2K/conf/LS2K.dts 裝置樹檔案,找到 nand 節點,其中 nand 節點的子 partition 節點表示的是分割槽資訊,如下圖所示:

 

 

 

 

 

 

 

其中:

compatible = "loongson,ls-nand"; 表示匹配驅動所使用的屬性。

reg = <0x1fe06040 0x0 0x1fe06000 0x20>; 表示控制暫存器的地址和長度,其中 0x1fe06040

NAND_DMA_ADDR_REG 的地址。 地址 0x1fe06000 NAND_CMD 的地址。長度均為 0x20

interrupt-parent = <&icu>; 中斷控制器是 icu

interrupts = <52>; 分配中斷號為 52

interrupt-names = "nand_irq"; 中斷名稱

dmas = <&dma0 1>; 表示使用 dma0 控制器,通道數為 1

dma-names = "nand_rw"; dma 控制器名稱

dma-mask = <0xffffffff 0xffffffff>; 表示裝置 dma 能力,如果裝置只有 32 dma 能力,則應該配置成

0x00xffffffff,如果裝置有 64 dma 能力,則應該配置成 0xffffffff 0xffffffff

number-of-parts = <0x2>; 表示分割槽數量,這裡設定成倆個分割槽

partition@0 {

label = "kernel_partition";

reg = <0x0000000 0x01e00000>;

};

分割槽 0,分割槽名稱為 kernel_partition,其中分割槽起始地址為 0x0000000,分割槽長度為 0x01e00000

partition@0x01400000 {

label = "os_partition";

reg = <0x01e00000 0x0>;

};

分割槽 1,分割槽名稱為 os_partition,其中分割槽起始地址為 0x01e00000,分割槽長度為剩餘所有空間。

這裡我們需要修改 partition@0 partition@0x01400000 子節點。這裡我們把核心的分割槽大小設定 30M,剩餘的 482M 給檔案系統。

接著我們需要新增片選資訊。一般情況下根據硬體設計規範,Flash 的片選會接到 cs0 上,通過原理圖我們可以確定,片選引腳連線到了 cs0 上,如下圖所示:

 

 

 

 

 

 

 

 

但是裝置樹我們要怎麼寫呢?這個就需要我們去看驅動原始碼了,我們開啟核心原始碼

drivers/mtd/nand/ls-nand.c 下的 nand 控制器的驅動,在第 637 行我們可以看到他是通過 nand-cs 來獲取的片選資訊,

 

所以我們在裝置樹中新增屬性 nand-cs=<0x00>;,新增完成如下圖所示:

 

 

 

 

 

 

這樣,pmon 下的裝置樹我們就設定好了,然後我們回過頭在來設定環境變數 mtdparts,要與裝置樹中我們設定的保持一致,修改完成如下圖所示:

 

 

 

 

 

 

這樣 pmon nand 的設定就已經完成了。