到网站下载相应的芯片手册。
发现自己的天嵌TQ2440板子所使用的Nor flash 芯片(NOE的EN29LV160AB)与smdk2410默认使用的芯片(AMD的AM29LV400B或AM29LV400)除了大小不一样外,其它如命令序列、工作方式等都是一样的。所以U-boot源码中关于nor flash的部分修改的不多。
因为已经知道自己板子的Nor flash芯片是Bottom boot模式,分成35个扇区(使用J-LINK烧写板载光盘的映像时,可以看到相应的芯片信息),前4个扇区的大小分别为16KB,8KB,8KB,32KB,后31个扇区的大小都是64K。所以正好可以使用board/smdk2410目录下的flash.c,直接对芯片厂商以及ID进行赋值的方式。(当然还有更好的方式就是读取芯片信息,判断出芯片厂商和ID再进行以后相应的操作,以后有空用这种方式)。
以下是EN29LV160A的命令序列和移植步骤:
——————————————————————————
命令序列:
——————————————————
移植步骤:
在上一实验,也就是移植好DM9000网卡的基础上,简单做出如下修改即可:
1、修改include/configs/TQ2440.h中flash的部分
vim include/configs/TQ2440.c
屏蔽CONFIG_AMD_LV400的定义,修改AMD_LV800部分的信息(红色字体部分)
/*-------------------------------------
* FLASH and environment organization
*/
#if 0
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#endif
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE 0x00200000 /* 2MB */
#define CFG_MAX_FLASH_SECT (35) /* max number of sectors on one chip */
#define CONFIG_ENV_ADDR (CFG_FLASH_BASE + 0x01F0000) /* addr of environm ent */
……
修改环境变量的大小为最后一个扇区,大小为64K
……
#define CONFIG_ENV_IS_IN_FLASH 1
#define CONFIG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
……
保存退出
2、修改board/TQ2440/flash.c
vim board/TQ2440/flash.c
在开头部分重新定义芯片厂商和芯片ID的信息(查EN29LV160A的芯片手册)
/*修改芯片ID信息部分*/
#define FLASH_BANK_SIZE PHYS_FLASH_SIZE
#define MAIN_SECT_SIZE 0x10000 /* 64 KB */
/*Add by *****/
#ifdef AMD_MANUFACT
#define AMD_MANUFACT 0x007C007C /*EON MANUFACT ID*/
#endif
#ifdef AMD_ID_LV800B
#define AMD_ID_LV800B 0x22492249 /*EN29LV160A DEVICE ID (Bottom boot)*/
#endif
……
/*修改函数flash_print_info的打印信息*/
void flash_print_info (flash_info_t * info)
{
int i;
switch (info->flash_id & FLASH_VENDMASK) {
case (AMD_MANUFACT & FLASH_VENDMASK):
printf ("AMD/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): /*Modified by ×××*/
printf ("1x Eon29LV160AB (16Mbit)\n");
break;
default:
printf ("Unknown Chip Type\n");
goto Done;
break;
}
…………
保存退出。
其它擦除、读、写芯片操作函数都不用修改。
3、修改完成,重新编译U-boot
make TQ2440_config
make CROSS_COMPILE=arm-linux-
把编译后在顶层目录生成的u-boot.bin通过SAMBA拷出来,通过JTAG或JLINK烧到开发板!
4、测试
烧写好之后,链接好串口,启动开发板,看到 Flash: 2MB.
再用命令flinfo,查看打印的信息,看芯片ID等信息是否正确,flash扇区起始地址的分配是否与芯片手册一致。
用命令“protect on 起始地址 结束地址”,“protect off 起始地址 结束地址”查看flash的写保护命令是否正常工作。
用命令“erase 起始地址 结束地址”查看擦除命令是否正常。
通过setenv修改IP地址、物理地址等相关信息,saveenv保存环境变量到flash。断电在通电,看环境变量信息是否修改成功并正确保存到flash中。
…………
测试结果一切正常! 说明移植成功!
擦除扇区
最后Ping一下主机!
启动内核、根文件系统
tftp 30000000 uImage
bootm 30000000
一切顺利,移植顺利完成!
--------------------------------------------
增加:
如果使用的是别人编译好的内核或者启动不同目录的根文件系统,可以通过设置环境变量bootargs来修改启动参数,修改命令的例子如下:
#setenv bootargs 'root=/dev/nfs nfsroot=192.168.0.60:/nfsroot/rootfs ip=192.168.0.61 rw console=ttySAC0 mem=64M;'
(注:setenv bootargs命令生效的前提是,所使用的U-BOOT软硬件配置文件(本实验要修改的文件是:include/configs/TQ2440.h)中添加了语句:#define CONFIG_CMDLINE_TAG 1)
阅读(3841) | 评论(0) | 转发(0) |