天天看點

TQ2440移植u-boot2016.11全過程記錄-【3】NOR FLASH驅動移植TQ2440移植u-boot2016.11 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的大小:

TQ2440移植u-boot2016.11全過程記錄-【3】NOR FLASH驅動移植TQ2440移植u-boot2016.11 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

讀出的與寫入的一緻,測試通過:

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

ends…

繼續閱讀