加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

U-boot移植(三)

发布时间:2020-12-15 06:25:28 所属栏目:百科 来源:网络整理
导读:接上篇!!!!!!!!!!!!! 4.支持norflash启动: ?(1)在添加norflash功能之前,首先要查看norflash的具体参数,而我用的板的norflash型号为: EN29LV160A。查看PDF得知如下参数: ???? 12048K * 8bit / 1024K * 16bit Flash Memory Boot Sector F

接上篇!!!!!!!!!!!!!

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,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 Typen");
??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,))

跟住就再:make clean再make all 。OK编译通过

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读