TQ2440移植u-boot2016.11 NOR FLASH驅動移植
TQ2440開發闆上闆載一片NOR FLASH,型号為
EON EN29LV160AB
,挂載到了0x0000_0000~0x001F_FFFF位址,2M位元組,16bit位寬。
編輯配置頭檔案:
gedit include/configs/tq2440.h
定位到NOR Flash的配置宏:
/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16
#define CONFIG_FLASH_SHOW_PROGRESS 45
#define CONFIG_SYS_MAX_FLASH_BANKS 1
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
#define CONFIG_SYS_MAX_FLASH_SECT (19)
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
#define CONFIG_ENV_IS_IN_FLASH
#define CONFIG_ENV_SIZE 0x10000
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
替換為:
/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_1024Kx16 /* NOR FLASH 大小為2M位元組,16位寬 */
#define CONFIG_FLASH_SHOW_PROGRESS 45
#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* NOR FLASH 數量,TQ2440闆子上隻有一個 */
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
#define CONFIG_SYS_MAX_FLASH_SECT (35) /* NOR FLASH 扇區數目 */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x100000) /* 環境變量儲存位置 */
#define CONFIG_ENV_IS_IN_FLASH /* 定義該宏後環境變量儲存入NOR FLASH */
#define CONFIG_ENV_SIZE 0x10000 /* 環境變量大小為64K */
#define CONFIG_ENV_OVERWRITE /* 允許覆寫環境變量 */
其中
CONFIG_ENV_ADDR
定義了環境變量儲存的位置,使用指令
ls -hl u-boot.bin
檢視一下u-boot的大小為521K大小,那麼環境變量的位置就必須大于這個位址,否則就會把u-boot的記憶體覆寫掉,這裡我設定的為
0x100000
,在NOR Flash的1M位址處儲存環境變量。
添加TQ2440闆子上的NOR Flash的初始化選項:
gedit drivers/mtd/jedec_flash.c
找到
jedec_table
這個數組,在該數組末尾加入以下代碼:
#ifdef CONFIG_SYS_FLASH_LEGACY_1024Kx16
{
.mfr_id = 0x1C,
.dev_id = 0x2249,
.name = "EON EN29LV160AB",
.uaddr = {
[1] = MTD_UADDR_0x0555_0x02AA /* x16 */
},
.DevSize = SIZE_2MiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions = 4,
.regions = {
ERASEINFO(0x04000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x08000, 1),
ERASEINFO(0x10000, 31),
}
},
#endif
編譯後使用tftp下載下傳到開發闆0x30008000處可以并go到0x30008000位址處運作程式,可以看到已經正确識别出Nor Flash的大小:

下面測試一下NOR FLASH的讀寫:
- 去除寫保護:
protect off all
- 擦除從0x100000位址開始的64K,從0x100000位址處開始是為了避開自帶的u-boot:
erase 0x100000 +0x10000
TQ2440移植u-boot2016.11全過程記錄-【3】NOR FLASH驅動移植TQ2440移植u-boot2016.11 NOR FLASH驅動移植 - 拷貝記憶體64K的内容到NOR FLASH:
cp.b 0x30008000 0x100000 0x10000
TQ2440移植u-boot2016.11全過程記錄-【3】NOR FLASH驅動移植TQ2440移植u-boot2016.11 NOR FLASH驅動移植 - 讀取Nor Flash 64K内容到記憶體:
cp.b 0x100000 0x30108000 0x10000
- 比較64K資料:
cmp.b 0x30108000 0x30008000 0x10000
讀出的與寫入的一緻,測試通過:
ends…