2010.09移植(四) 添加NOR FLash启动支持

我们知道S3C2440支持从NAND Flash启动和从NOR Flash启动两种模式,先来介绍u-boot的NOR Flash启动方式吧。

一、修改NOR Flash的读写程序

FL2440开发板中使用的NOR Flash是Intel的J3系列存储大小是4M字节,这个系列的NOR Flash支持标准的CFI指令(在最新的U-boot版本中只需要添加宏定义就可以支持CFI接口的NOR Flash了,但我们这个版本中还不行),将board/cmi/flash.c复制到board/fl2440/flash.c,这个文件中包含了我们开发板的NOR Flash读写函数,但是其中还有一点问题,需要修改flash.c文件中的函数write_buff,此函数需要将小端字节数进行short类型变换,即将低地址数放在低位,高地址数放在高位另外还要进行地址对其,因为该型号flash只支持16位写,不支持8位写,那么我们写8位时需要从flash中读取出不改写8位,在加上需要改写的8位组成16位后回写到flash中去,具体将原flash.c中的函数write_buff修改如下:

相关阅读:

U-Boot源代码下载地址

FL2440的U-boot-2010.09移植(一)
FL2440的U-boot-2010.09移植(二)
FL2440的U-boot-2010.09移植(三)DM9000网卡及开发板相关配置
FL2440的U-boot-2010.09移植(四) 添加NOR FLash启动支持
FL2440的U-boot-2010.09移植(五)uboot架构中NAND FLash驱动修改
FL2440的U-boot-2010.09移植(六)NAND FLash启动支持
FL2440的U-boot-2010.09移植(七)LCD的支持
针对FL2440开发板的u-boot-2010.09版本补丁

int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)   {       ulong cp, wp;       ushort data;       int i, rc;          if (info->flash_id == FLASH_UNKNOWN) {           return 4;       }          wp = (addr & ~1);   /* get lower word aligned address */          /*       * handle unaligned start byte       */             /* for not to modify the origin data in flash*/          if (addr - wp) {           data = 0;                   for(i = 0, cp = wp; i < 1; ++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_short(info, wp, data)) != 0) {               return (rc);           }           wp += 2;       }          /*       * handle word aligned part       */          while (cnt >= 2) {           /*data = 0;          for (i=0; i<2; ++i) {              data = (data << 8) | *src++;          }*/                   data = *((vu_short *) src) ;              if ((rc = write_short(info, wp, data)) != 0) {               return (rc);           }                   src += 2;           wp  += 2;           cnt -= 2;       }          if (cnt == 0) {           return (0);       }          /*       * handle unaligned tail bytes           * read the origin high byte data and write again!           * modified by yanghao       */          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_short(info, wp, data));      }  

还需要将flash.c文件中的NOR Flash块大小进行修改:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psysp.html