- 论坛徽章:
- 0
|
)
现在叙述一下,关于norflash部分的移植工作吧。
修改flash.c
根据不同的flash芯片采用不同的flash程序接口,本开发板选用的是atmel的AT49BV322A。由于芯片不同所以需要根据datasheet对flash.c进行修改。
① 修改扇区大小和数目的定义
OrgDef OrgAT49BV16x4A[] =
{
{ 8, 8*1024 }, /* 8 * 8kBytes sectors */
{ 31, 64*1024 } /* 31 * 64kBytes sectors */
};
改为
OrgDef OrgAT49BV16x4A[]=
{
{ 8, 8*1024 }, /* 8 * 64kBytes sectors */
{ 63, 64*1024 } /* 63 *8kBytes sectors */
};
本芯片为71个扇区。
② 根据datasheet修改关于地址和读写命令的宏定义。
#define FLASH_BANK_SIZE 0x200000 /* 2 MB */
改为 #define FLASH_BANK_SIZE 0x400000 /* 4 MB */
/* AT49BV1614A Codes */
#define FLASH_CODE1 0xAA
#define FLASH_CODE2 0x55
#define ID_IN_CODE 0x90
#define ID_OUT_CODE 0xF0
#define CMD_READ_ARRAY 0x00F0
#define CMD_UNLOCK1 0x00AA
#define CMD_UNLOCK2 0x0055
#define CMD_ERASE_SETUP 0x0080
#define CMD_ERASE_CONFIRM 0x0030
#define CMD_PROGRAM 0x00A0
#define CMD_UNLOCK_BYPASS 0x0020
#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00005555
#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AAA
#define IDENT_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000555
#define IDENT_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000AAA
修改为:
#define FLASH_CODE1 0x00AA00aa
#define FLASH_CODE2 0x00550055
#define ID_IN_CODE 0x00900090
#define ID_OUT_CODE 0x00F000f0
#define CMD_READ_ARRAY 0x00F000F0
#define CMD_UNLOCK1 0x00AA
#define CMD_UNLOCK2 0x0055
#define CMD_ERASE_SETUP 0x0080
#define CMD_ERASE_CONFIRM 0x0030
#define CMD_PROGRAM 0x00A0
#define CMD_UNLOCK_BYPASS 0x00200020
#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000555
#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AA
#define IDENT_FLASH_ADDR1 (*(volatile u32 *)(CFG_FLASH_BASE + (0x0000555
#define IDENT_FLASH_ADDR2 (*(volatile u32 *)(CFG_FLASH_BASE + (0x0000AAA
再1.1.4 后要注意加一个#define CMD_SECTOR_UNLOCK 0x0070
#define FLASH_BANK_SIZE 0x400000
然后在 flash_identification()中,来个直接的,呵呵呵,把 /* Vendor type */下面的全部删除,直接写上自己的代码,我的如下:info->flash_id = ATM_MANUFACT & FLASH_VENDMASK;
printf ("flash_302: ");
if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV1614 & FLASH_TYPEMASK)) {
if ((add_device_code & FLASH_TYPEMASK) ==
(ATM_ID_BV1614A & FLASH_TYPEMASK)) {
info->flash_id |= ATM_ID_BV1614A & FLASH_TYPEMASK;
printf ("AT49BV1614A (16Mbit)\n");
}
} else { /* AT49BV1614 Flash */
info->flash_id |= ATM_ID_BV1614 & FLASH_TYPEMASK;
printf ("flash_302 (32Mbit)\n");
}
然后修改flash_init部分,把这个 int i, j, k;
unsigned int flash_nb_blocks, sector;
unsigned int start_address;
OrgDef *pOrgDef;
ulong size = 0;
for (i = 0; i
flash_identification (&flash_info);在这别忘了添加flash_info.size = FLASH_BANK_SIZE;然后后面的全部注释掉。直接也添加自己的代码,我的如下: flash_info.sector_count = CFG_MAX_FLASH_SECT ;
memset (flash_info.protect, 0, CFG_MAX_FLASH_SECT );
pOrgDef = OrgAT49BV16x4A;
flash_nb_blocks = sizeof (OrgAT49BV16x4A) / sizeof (OrgDef);
,然后保存推出,OK。别忘记还要添加一个头文件,就是在include/common.h里添加班子的头文件:#include ,包含与硬件相关的寄存器的定义,这个跟uboot版本有关系,注意还有一个没有定义,在1.1.4以后没有定义,需要自己去手动定义上就可以了。其他的我看了,也没什么不一样的了。不然会缺少定义等等的错误,就是这个罪魁祸首了。呵呵 !
③ 去掉芯片自动识别,防治出以外错误。
注视掉if ((flash_info.flash_id & FLASH_TYPEMASK)……到else 144行-152行。
4.2.3 修改 config.mk
将 TEXT_BASE = 0x21f80000 修改为 TEXT_BASE = 0x21f00000
这个地址是要根一级boot中定义保持一致。
Boot中的main.c
#define DST 0x21f00000 //UBOOT被解压缩后载入到SDRAM中的位置。
修改 include下面的头文件at91rm9200dk.h,
#define CONFIG_NR_DRAM_BANKS 1 //SDRAM bank数
#define PHYS_SDRAM 0x20000000 //基地址
#define PHYS_SDRAM_SIZE 0x2000000 //大小 32M
#define PHYS_FLASH_1 0x10000000 //基地址
#define PHYS_FLASH_SIZE 0x400000 //大小 4M
#define CFG_FLASH_BASE PHYS_FLASH_1 //别名
#define CFG_MAX_FLASH_BANKS 1 //总bank数
#define CFG_MAX_FLASH_SECT 71 //扇区总数
里面还可以添加一些环境变量。比如网络部分:
#define CONFIG_DEFAULT_ENVIRONMENT
#define CONFIG_BOARDNAME "AT91RM9200DK"
#define CONFIG_ETHADDR "00:11:22:33:44:55"
#define CONFIG_IPADDR "192.168.0.110"
#define CONFIG_SERVERIP "192.168.0.100"
#define CONFIG_GATEWAYIP "192.168.0.1"
#define CONFIG_BOOTCOMMAND "tftp 0x20008000 uImage; tftp 0x21000000 ramdisk; go 0x20008000"
#define CONFIG_DEFAULT_KERNEL "2.6.17"
然后保存退出,make mrproper,make at91rm9200dk_config,make CROSS_COMPILE=arm-linux-哗哗的满屏跑着,运气好的话,就会有一个u-boot.bin,然后放到内存跑跑吧。祝你成功。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/63379/showart_512114.html |
|