接上篇!!!!!!!!!!!!!
4.支援norflash啟動:
(1)在添加norflash功能之前,首先要查看norflash的具體參數,而我用的板的norflash型號為:EN29LV160A。查看PDF得知如下參數:
<1>2048K * 8bit / 1024K * 16bit Flash Memory Boot Sector Flash Memory
<2>Flexible Sector Architecture:
-One 16-Kbyte, two 8-Kbyte, one 32-Kbyte, and thirty-one 64-Kbyte sectors(byte mode)
-One 8-Kword, two 4-Kword, one 16-Kword,and thirty-one 32-Kword sectors(word mode)
從以上參數看出:兩種模式的總扇區數為:35 sectors
(2)開始修改:在include/configs/smdk2440.h修改:
1.先屏蔽掉不用的nor型號:
/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#if 0 //注釋掉下面兩個類型的Nor Flash設定,因為不是我們所使用的型號
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#endif
2. 然後增加對EN29LV160A型號的支援:(還在上檔案裡加)
//第175行添加如下內容
#define CONFIG_EON_29LV160AB 1 //添加TQ2440開發板Nor Flash設定
#define PHYS_FLASH_SIZE 0x200000 //我們開發板的Nor Flash是2M
#define CONFIG_SYS_MAX_FLASH_SECT (35) //根據EN29LV160AB的晶片手冊描述,共35個扇區
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x80000) //暫設定環境變數的首地址為0x80000 //在256K處放uboot參數
(3)添加norflash的資訊:在include/flash.h裡加:
第122行添加:
#define EON_MANUFACT 0x001c001c//廠商ID
第181行添加
#define EON_ID_LV160AB 0x22492249//裝置ID號
(4)修改norflash的驅動程式:
在u-boot中對Nor Flash的操作分別有初始化、擦除和寫入,所以我們主要修改與硬體密切相關的三個函數flash_init、flash_erase、write_hword。
vi board/samsung/smdk2440/flash.c
由-One 8-Kword, two 4-Kword, one 16-Kword,and thirty-one 32-Kword sectors(word mode)
可知主要扇區大小為32k,so修改第31行
#define MAIN_SECT_SIZE 0x8000 //定義為32k,主要扇區的大小
#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))
由於我們是把norflash串連到了s3c2440的bank0上,因此norflash中的地址相對於s3c2440來說基址為0x00000000,即CONFIG_SYS_FLASH_BASE = 0。
而之所以又把norflash中的地址向左移一位(即乘以2),是因為我們是把s3c2440的ADDR1串連到了norflash的A0上的緣故。
由資料手冊可知EN29LV160AB第0扇區大小為8K,第1、2為4K,第3為16K,後面31扇區為32K。前面4個扇區加起來剛好是主要扇區的大小 = 32K, 所以修改87行下如下
for (j = 0; j < flash_info.sector_count; j++)
{
if (j <= 3)
{
/* 1st one is 8 KB */
if (j == 0)
{
flash_info.start[j] = flashbase + 0;
}
/* 2nd and 3rd are both 4 KB */
if ((j == 1) || (j == 2))
{
flash_info.start[j] = flashbase + 0x2000 + (j - 1) * 0x1000;
}
/* 4th 16 KB */
if (j == 3)
{
flash_info.start[j] = flashbase + 0x4000;
}
}
else
{
flash_info.start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;
}
}
size += flash_info.size;
修改flash_print_info,添加EN29LV160AB相關資訊如下:
switch (info->flash_id & FLASH_VENDMASK) {
case (AMD_MANUFACT & FLASH_VENDMASK):
printf ("AMD: ");
break;
case (EON_MANUFACT & FLASH_VENDMASK):
printf ("EON: ");
break;
default:
printf ("Unknown Vendor ");
break;
}
switch (info->flash_id & FLASH_TYPEMASK) {
case (AMD_ID_LV400B & FLASH_TYPEMASK):
printf ("1x Amd29LV400BB (4Mbit)\n");
break;
case (AMD_ID_LV800B & FLASH_TYPEMASK):
printf ("1x Amd29LV800BB (8Mbit)\n");
break;
case (EON_ID_LV160AB & FLASH_TYPEMASK):
printf ("1x EN29LV160AB (16Mbit)\n");
break;
default:
printf ("Unknown Chip Type\n");
goto Done;
break;
}
修改int flash_erase (flash_info_t * info, int s_first, int s_last)
if ((info->flash_id & FLASH_VENDMASK) !=
(EON_MANUFACT & FLASH_VENDMASK)) {
return ERR_UNKNOWN_FLASH_VENDOR;
在編譯時間,出現錯誤如下:
rm-linux-ld:ERROR:usr/local/arm/3.3.2/lib/gcc/arm-linux/3.3.2/libgcc.a(_udivdi3.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld:failed to merge target specific data of file /usr/local/arm/3.3.2/lib/gcc/arm-linux/3.3.2/libgcc.a(_udivdi3.oS)
arm-linux-ld: ERROR: /usr/local/arm/3.3.2/lib/gcc/arm-linux/3.3.2/libgcc.a(_clz.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld: failed to merge target specific data of file /usr/local/arm/3.3.2/lib/gcc/arm-linux/3.3.2/libgcc.a(_clz.oS)
make: *** [u-boot] Error 1
呢個時候搞D艮既也,一百度原來系軟浮點的問題。
於是解決辦法:
找到/u-boot-1.1.4/cpu/arm920t/config.mk檔案
該檔案內容如下所示:
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
-msoft-float
PLATFORM_CPPFLAGS += -march=armv4
# Supply options according to compiler version
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
修改該檔案:
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
# -msoft-float
...............................
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32)#,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
跟住就再:make clean再make all 。OK編譯通過