Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185058
  • 博文数量: 26
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 176
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-18 15:59
文章分类
文章存档

2011年(3)

2010年(23)

我的朋友

分类: 嵌入式

2010-07-28 02:22:10

前一实验(http://blog.chinaunix.net/u3/117012/showart_2278275.html)已经把DM9000网卡驱动移植好,只是Nor flash部分还是显示512K,实际的Nor flash大小应该是2M,所以还需要做一些修改。
 
   到网站下载相应的芯片手册。
发现自己的天嵌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)
 
 
阅读(3831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~