國產軟硬體龍芯系列迅為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 進行初始化的, 如果我們要呼叫
所以我們只需要在 Targets/LS2K/conf/ls2k 檔案中新增程式碼 option CONFIG_LS2K_NAND 即可,這裡我們添 加到第 269 行,
在 pmon 預設的 bsp 中,預設添加了程式碼 select nand,所以這裡我們不必要在新增程式碼 select nand,而select 指定的是後面的引數 nand 被選中,選中了 nand 引數以後,在 conf/files 檔案中使用
然我們回過頭再來看條件編譯的這部分程式碼,
如果我們定義了 NNAND 和 CONFIG_LS2K_NAND,就是執行*(volatile int *)0xbfe10420 |= (1<<9) 程式碼將GPIO 的管教複用設定為 NAND,,如果沒用定義這倆個巨集定義,就將複用關係設定為 GPIO,如下圖所示:
如果定義了這倆個巨集定義,接著就會呼叫 ls2k_nand_init 函式來初始化
在 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 的設定就已經完成了。