接着前一篇u-boot-2009.08在飞凌OK2440/FL2440上的移植——让u-boot在内存中运行进来(一)来完成下面的移植
修改norflash(nor fhash型号:JS28F320)的配置,把include/configs/ok2440.h中关于“Physical?Memory?Map”和“FLASH?and?environment?organization”的配置都删掉,换成下面的配置:
- /*-----------------------------------------------------------------------
?* Physical Memory Map
?*/
#define CONFIG_NR_DRAM_BANKS 1?? /* we have 1 bank of DRAM */
#define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
#define CONFIG_SYS_MONITOR_BASE ? TEXT_BASE
#define FLASH_BASE0_PRELIM ? ? ? ?PHYS_FLASH_1
/*-----------------------------------------------------------------------
?* FLASH and environment organization
?*/
#if 0
#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
#define CONFIG_SYS_MAX_FLASH_BANKS 1/* max number of memory banks */
#define CONFIG_JS2_8F320? 1
#define CONFIG_SYS_FLASH_PROTECTION ? 1
#define CONFIG_SYS_FLASH_SIZE ? ?0x00400000 ? ?/*4 MB*/
#define CONFIG_SYS_MAX_FLASH_SECT ? ?32 ? ? ? ? /*max number of sectors on one chip*/
- /* timeout values are in ticks */
#define CONFIG_SYS_FLASH_ERASE_TOUT(2*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
#define CONFIG_SYS_FLASH_WRITE_TOUT(2*CONFIG_SYS_HZ) /* Timeout for Flash Write */
#defineCONFIG_ENV_IS_IN_FLASH1
#define CONFIG_ENV_SIZE0x40000/* Total Size of Environment Sector,这是256K的环境变量储存空间?*/
#define CONFIG_ENV_OFFSET ?0x100000 ?//在以后的内核分区中环境变量分区的OFFSET值要与此一致
#endif/* __CONFIG_H */
修改board/samsung/ok2440v3/lowlevel_init.S文件中SDARM刷新参数为:
#define REFCNT 1258 /* period=7.8125us,HCLK=405/4 Mhz,(2048+1-7.8125*405/4) */
修改flash型号相关文件,用board/cmi/flash.c文件替换board/samsung/ok2440v3/flash.c文件,使uboot支持Intel的JS28F320型号nor fhash.
打开board/samsung/ok2440v3/flash.c文件,修改:
- 把:
#define FLASH_BLOCK_SIZE??? ??? 0x00010000
改为:
#define FLASH_BLOCK_SIZE??? ????0x00020000
-
把声明:
static ?int ? ?write_short? ?(flash_info_t *info,ulong dest,ushort data);//并删除这个函数体
改为:
static ? ?int ? ? ?write_word ? ? (flash_info_t *info,ushort data);??
-
删除write_buff和write_short两个函数,用下面两个函数代替:
int write_buff (flash_info_t *info,uchar *src,ulong addr,ulong cnt)
{
? ?ulong cp,wp;
? ?ushort data;
? ?int l;
? ?int i,rc;
? ?wp = (addr & ~1); ? ? ? ?/* get lower word aligned address */
? ?/*
? ? * handle unaligned start bytes
? ? */
? ?if ((l = addr - wp) != 0)
? ?{
? ? ? data = 0;
? ? ? for (i=0,cp=wp; i<l; ++i,++cp) {
? ? ? ?data = (data >> 8) | (*(uchar *)cp << 8);
? ? ? }
? ? ? for (; i<2 && cnt>0; ++i) {
? ? ?data = (data >> 8) | (*src++ << 8);
? ? ?--cnt;
? ? ?++cp;
? ? ? }
? ? ? for (; cnt==0 && i<2; ++i,++cp) {
? ? ?data = (data >> 8) | (*(uchar *)cp << 8);
? ? ? }
? ? ? if ((rc = write_word(info,wp,data)) != 0) {
? ? ?return (rc);
? ? ? }
? ? ? wp += 2;
? ?}
? ?/*
? ? * handle word aligned part
? ? */
? ?while (cnt >= 2) {
? ? ? data = *((vu_short*)src);
? ? ? if ((rc = write_word(info,data)) != 0) {
? ? ? return (rc);
? ? ? }
? ? ? src += 2;
? ? ? wp ?+= 2;
? ? ? cnt -= 2;
? ?}
? ?if (cnt == 0) {
? ? ? return ERR_OK;
? ?}
? ?/*
? ? * handle unaligned tail bytes
? ? */
? ?data = 0;
? ?for (i=0,cp=wp; i<2 && cnt>0; ++i,++cp) {
? ? ? data = (data >> 8) | (*src++ << 8);
? ? ? --cnt;
? ?}
? ?for (; i<2; ++i,++cp) {
? ? ? data = (data >> 8) | (*(uchar *)cp << 8);
? ?}
? ?return write_word(info,data);
}
/*
?* Write 16 bit (short) to flash
?*/
static int write_word (flash_info_t *info,ushort data)
{
? ?vu_short *addr = (vu_short *)dest,val;
? ?int rc = ERR_OK;
? ?int flag;
? ?/* Check if Flash is (sufficiently) erased,fix by kavin*/
? ?if ((*addr & data) != data)
? ? ? return ERR_NOT_ERASED;
? ?/*
? ? * Disable interrupts which might cause a timeout
? ? * here. Remember that our exception vectors are
? ? * at address 0 in the flash,and we don't want a
? ? * (ticker) exception to happen while the flash
? ? * chip is in programming mode.
? ? */
? ?flag = disable_interrupts();
? ?/* clear status register command */
? ?*addr = 0x50;
? ?/* program set-up command */
? ?*addr = 0x40;
? ?/* latch address/data */
? ?*addr = data;
? ?/* arm simple,non interrupt dependent timer */
? ?reset_timer_masked();
? ?/* wait while polling the status register */
? ?while(((val = *addr) & 0x80) != 0x80)
? ?{
? ? ? if (get_timer_masked() > CONFIG_SYS_FLASH_WRITE_TOUT) {
? ? ? rc = ERR_TIMOUT;
? ? ? /* suspend program command */
? ? ? *addr = 0xB0;
? ? ? goto outahere;
? ? ? }
? ?}
? ?if(val & 0x1A) { ? ? ? ?/* check for error */
? ? ? printf("nFlash write error %02x at address %08lxn",
? ? ? ? ? ?(int)val,(unsigned long)dest);
? ? ? if(val & (1<<3)) {
? ? ?printf("Voltage range error.n");
? ? ?rc = ERR_PROG_ERROR;
? ? ?goto outahere;
? ? ? }
? ? ? if(val & (1<<1)) {
? ? ?printf("Device protect error.n");
? ? ?rc = ERR_PROTECTED;
? ? ?goto outahere;
? ? ? }
? ? ? if(val & (1<<4)) {
? ? ?printf("Programming error.n");
? ? ?rc = ERR_PROG_ERROR;
? ? ?goto outahere;
? ? ? }
? ? ? rc = ERR_PROG_ERROR;
? ? ? goto outahere;
? ?}
outahere:
? ?/* read array command */
? ?*addr = 0xFF;
? ?if (flag)
? ? ? enable_interrupts();
? ?return rc;
}
至此,uboot就能完会支持从nor flash启动,编译生成新的u-boot.bin并通过DNW的USB线下载到SDRAM中运行,便可看到u-boot检测到了我们的flash。用flinfo命令可以看 到具体的块信息,还可以用flash的各种命令对flash进行操作,从而实现这块nor flash驱动的完全支持。烧写当然也是没问题的了,把需要烧写的文件下载到SDRAM中后,用cp.b命令就可以了。
下面大该分析一下这个驱动文件的函数调用,此flash.c文件中有如下几个函数:
static ulong? flash_get_size ??? ??? (vu_short *addr,flash_info_t *info);
static void ??? flash_get_offsets ??? (ulong base,flash_info_t *info);
static int??????? write_word (flash_info_t *info,ushort data)
unsigned long flash_init (void)
void flash_print_info? (flash_info_t *info)
int flash_erase (flash_info_t *info,int s_first,int s_last)
int flash_real_protect(flash_info_t *info,long sector,int prot)
int write_buff (flash_info_t *info,ulong cnt)
????? 1.u-boot启动只会用到flash.c文件中的flash_init函数,正如上面所述;
????? 2.以static修饰的3个函数只在flash.c文件中被调用;
????? 3.最后面的4个函数会被/common/cmd_flash.c文件中的函数调用,以实现u-boot下的各种命令操作。
?附:若用JLINK下载u-boot.bin到nor flash 中,需要把/include/configs/ok2440v3.h 中定义的以下这个宏注释掉:
? ? ? ?/*?#define CONFIG_SKIP_RELOCATE_UBOOT??? 1 ?*/ ??注释掉u-boo才能初始化CPU
? ? ? ?感谢网上的各位大牛,本博文主要参考:
- http://www.360doc.com/content/12/1215/19/532901_254233098.shtml