TQ2440移植u-boot2016.11全過程記錄-【3】NOR FLASH驅動移植

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
    在這裏插入圖片描述

  • 拷貝內存64K的內容到NOR FLASH:
    cp.b 0x30008000 0x100000 0x10000
    在這裏插入圖片描述

  • 讀取Nor Flash 64K內容到內存:
    cp.b 0x100000 0x30108000 0x10000

  • 比較64K數據:
    cmp.b 0x30108000 0x30008000 0x10000

讀出的與寫入的一致,測試通過:
在這裏插入圖片描述


ends…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章