<一>选择NOR flash型号
我的开发板上的nor flash芯片是Intel的JS28F320(4MB)(1device=32blocks,1block=128MB
fl2440默认是nandflash启动,norflash启动只需将跳线帽J5拔掉就可以了
1. 把开发板的配置文件fl2440.h(/include/configs/fl2440.h)中关于flash的配置部分都删掉,换成下面的配置:
#define CONFIG_NR_DRAM_BANKS 1
#define PHYS_SDRAM_1 0x30000000
#define PHYS_SDRAM_1_SIZE 0x04000000
#define PHYS_FLASH_1 0x00000000
#define CFG_FLASH_BASE PHYS_FLASH_1
#define CFG_MONITOR_BASE TEXT_BASE
#define FLASH_BASE0_PRELIM PHYS_FLASH_1
#define CONFIG_SYS_FLASH_PROTECTION 1
#define CFG_MAX_FLASH_BANKS 1
#define CONFIG_SYS_FLASH_SIZE 0x00400000
#define CFG_MAX_FLASH_SECT 32
#define CFG_FLASH_ERASE_TOUT (2*CONFIG_SYS_HZ)
#define CONFIG_SYS_FLASH_WRITE_TOUT (2*CONFIG_SYS_HZ)
#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_SIZE 0x20000
#define CFG_ENV_OFFSET 0x40000
#define CONFIG_SYS_HZ 1000
#endif
如果出现 警告: “no newline at end of file" 只需在这段代码后加几个回车就可以了
2. 把开发板目录下flash.c文件替换成下面的/board/cmi/下面的flash.c文件,然后删除这个write_short函数的申明和定义、删除write_buff函数。替换成下面的两个函数
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);
if ((l = addr - wp) != 0)
{
data = 0;
for (i=0, cp=wp; i
}
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;
}
while (cnt >= 2) {
data = *((vu_short*)src);
if ((rc = write_word(info, wp, data)) != 0) {
return (rc);
}
src += 2;
wp += 2;
cnt -= 2;
}
if (cnt == 0) {
return ERR_OK;
}
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, wp, data);
}
static int write_word (flash_info_t *info, ulong dest, ushort data)
{
vu_short *addr = (vu_short *)dest, val;
int rc = ERR_OK;
int flag;
if ((*addr & data) != data)
return ERR_NOT_ERASED;
flag = disable_interrupts();
*addr = 0x50;
*addr = 0x40;
*addr = data;
reset_timer_masked();
while(((val = *addr) & 0x80) != 0x80)
{
if (get_timer_masked() > CONFIG_SYS_FLASH_WRITE_TOUT) {
rc = ERR_TIMOUT;
*addr = 0xB0;
goto outahere;
}
}
if(val & 0x1A) {
printf("nFlash write error x at address lxn",
(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:
*addr = 0xFF;
if (flag)
enable_interrupts();
return rc;
}
3. 修改board/fl2440/flash.c中函数申明:
static ulong flash_get_size (vu_short *addr, flash_info_t *info);
//static int write_short (flash_info_t *info, ulong dest, ushort data);
static int write_word (flash_info_t *info, ulong dest, ushort data);
static void flash_get_offsets (ulong base, flash_info_t *info);
4. 修改flash.c文件中的一个宏定义:
把:
#define FLASH_BLOCK_SIZE 0x00010000
改为:
#define FLASH_BLOCK_SIZE 0x00020000
<二>执行make fl2440config 和 make all将生成的U-Boot.bin烧入norflash
NOR Flash常用命令 :查看NOR flash信息 flinfo
加/解写保护命令 protect
擦出命令 erase
读norflash mm/cp
写norflash cp
上一篇:U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
下一篇:U-Boot在FL2440上移植(一)----修改系统时钟
推荐阅读最新更新时间:2024-10-25 17:07
设计资源 培训 开发板 精华推荐
- 用于白光 LED 驱动器的 TB62752BFUG 升压型 DC/DC 转换器的典型应用
- BTS3410G智能双低边电源开关典型应用电路
- 使用具有 B 类 EMI 滤波(单输出)的 RP10-1212SA DC/DC 转换器的典型应用
- 基于VL53L3CX的多目标测距传感器Nucleo组件
- ADPA9002-EVALZ,用于评估 ADPA9002 GaAs、pHEMT、MMIC、单正电源、DC 至 10 GHz 功率放大器的评估套件
- LT1185IQ 低输入电压监视器的典型应用电路跟踪压差特性
- PF8101/PF8201客户评估板
- S12ZVML-MINIXXX: S12ZVM Mini Board和Mini Kit评估平台
- 在 I2C 接口的 5V 电源中嵌入 SHT2x 应用笔记
- LT4276AIUFD 25.5W(类型 2)PoE+ 电源在反激模式下的典型应用电路,具有 5V、4.7A 输出