? ? ? ? ?我们知道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修改如下:
- 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);?????
- ?????
- ?
- ??
- ?????????
- 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,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????????????????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)?{??
- ?????????
- ????????for?(i=0;?i<2;?++i)?{?
- ????????????data?=?(data?<<?8)?|?*src++;?
- ????????}*/??
- ????????????????data?=?*((vu_short?*)?src)?;??
- ???????? ????????????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);??
- for?(;?i<2;?++i,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????????data?=?(data?>>?8)?|?(*(uchar?*)cp?<<?8);??
- return?(write_short(info,?data));??
- }??
还需要将flash.c文件中的NOR Flash块大小进行修改:
#define?FLASH_BLOCK_SIZE??0x00020000???????<span?style="font-family:Times?New?Roman;font-size:16px;">//</span>数据手册<span?style="font-family:Times?New?Roman;">p8</span>说了<span?style="font-family:Times?New?Roman;">32Mbit</span>有<span?style="font-family:Times?New?Roman;">32</span>个<span?style="font-family:Times?New?Roman;">128kBytes?block</span>组成??
二、修改开发板头文件中的宏定义
为了添加对NOR Flash启动的支持,还需要在include/configs/fl2440.h头文件中添加对NOR Flash的信息描述和支持,将fl2440.h文件中159行附近:
#define?CONFIG_AMD_LV400????1???/*?uncomment?this?if?you?have?a?LV400?flash?*/??
- #if?0??
- #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?*/??
- #ifdef?CONFIG_AMD_LV800??
- #define?PHYS_FLASH_SIZE?????0x00100000?/*?1MB?*/??
- #define?CONFIG_SYS_MAX_FLASH_SECT???(19)????/*?max?number?of?sectors?on?one?chip?*/??
- #define?CONFIG_ENV_ADDR?????(CONFIG_SYS_FLASH_BASE?+?0x0F0000)?/*?addr?of?environment?*/??
- #endif??
- #ifdef?CONFIG_AMD_LV400??
- #define?PHYS_FLASH_SIZE?????0x00080000?/*?512KB?*/??
- #define?CONFIG_SYS_MAX_FLASH_SECT???(11)????/*?max?number?of?sectors?on?one?chip?*/??
- #define?CONFIG_ENV_ADDR?????(CONFIG_SYS_FLASH_BASE?+?0x070000)?/*?addr?of?environment?*/??
- #endif??
全部删除,并修改为:
#define?CONFIG_SYS_MAX_FLASH_BANKS??1???/*?max?number?of?memory?banks?*/??
- #ifdef?CONFIG_FL2440??
- #define?PHYS_FLASH_SIZE?????0x00400000?/*?4MB?*/??
- #define?CONFIG_SYS_MAX_FLASH_SECT???(32)????/*?max?number?of?sectors?on?one?chip?*/??
- #define?CONFIG_ENV_ADDR?????(CONFIG_SYS_FLASH_BASE?+?0x0F0000)?/*?addr?of?environment?*/??
- #define?CONFIG_SYS_MONITOR_BASE??TEXT_BASE??/*CMI/flash.c?need*/??
- #define?FLASH_BASE0_PRELIM??????PHYS_FLASH_1??????/*CMI/flash.c?need*/??
- 并将文件中
#define?CONFIG_ENV_SIZE??0x10000?/*?Total?Size?of?Environment???
修改为:
#define?CONFIG_ENV_SIZE??0x20000?/*?Total?Size?of?Environment???
再执行make,生成的u-boot.bin就可以烧写入NOR Flash中了(可以使用JLINK软件包中的JFlash来完成烧写过程),设置开发板启动方式为NOR Flash启动,再次上电启动NOR Flash就完成u-boot的启动了。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|