加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

NOR FLASH 修改 在AT91RM9200上

发布时间:2020-12-15 06:58:06 所属栏目:百科 来源:网络整理
导读:作者: yaoqigui ?时间: 2010-10-21 出处:http://blog.chinaunix.net/u3/118466/showart_2363396.html 本文修改的基础是 NOR flash 芯片的更换,由原来 Intel 芯片 E28F128 换为 S29GL128N , ( 该芯片是 Spansion 公司的,被 AMD 收购 ) ,芯片由以前的 8M
作者: yaoqigui ?时间: 2010-10-21

出处:http://blog.chinaunix.net/u3/118466/showart_2363396.html

本文修改的基础是NOR flash芯片的更换,由原来Intel 芯片E28F128换为S29GL128N(该芯片是Spansion公司的,被AMD收购),芯片由以前的8M也变为16M,所以大体修改分两个方面,一是Uboot,一是linux内核。

一.Uboot的修改

uboot中由于换了新的flash芯片,Uboot不一定支持,所以需要修改对他的识别:

(1)?? 修改在 include/configs 下的at91rm9200dk.h文件

在这个文件头中主要定义了两个变量,一类是选项,前缀为CONFIG_,用来选择处理器,设备接口,命令,属性等,主要用来决定是否编译某些文件或者函数。一类是参数,前缀是CFG_,用来定义总线频率,串口波特率,FLASH地址参数等。这些常量参数主要用来支持通用目录中的代码,定义板子资源参数。

???? 在该文件中,我们主要改了以下两项,主要是flash中的参数:

???? #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0xfe0000) //环境变量的地址,参考在Linux内核中的phymap.c函数中的分区来看,PHYS_FLASH_1flash的起始地址。

???? #define CFG_ENV_SIZE 0x20000 //每个扇区的大小,这里芯片是128k,不同的芯片不同,参考芯片手册。

???? 有时需要设置flash的片数,一片还是两片,在

#define????? CFG_ENV_IS_IN_FLASH???? 1?? 中设置

u-boot的命令也是通过目标板的配置头文件来配置的,比如要添加ping命令,就必须添加CFG_CMD_NETCFG_CMD_PING才行。不然common/cmd_net.c就不会被编译了。

?????? 从这里我可以这么认为,u-boot工程可配置性移植性可以分为两层:

?一是由Makefile来实现,配置工程要包含的文件和文件夹上,用什么编译器。

?二是由目标板的配置头文件来实现源码级的可配置性,通用性。主要使用的是#ifdef #else #endif 之类来实现的。

(2)? 在linux/include flush.h 文件

1增加芯片Device IDs

#define AMD_ID_GL128N_3? 0x22012201 /* 3rd ID word for S29GL128N */

2增加FLASH identification codes??

#define FLASH_S29GL128N 0x00F1????????? /* Spansion S29GL128N??????????????? */

3 增加manufacturer offsets

?? #define FLASH_MAN_AMD???? 0x00000000 /* AMD?????????????????????????????? */

(3)? ?在board/at91rm9200dk 下的flash.c 文件

在这里面有几个部分需要改动,一是读flash的各种信息,如制造商ID等,通过,flash_get_size();在一个写周期期中,往任意地址写上0x90就可以了。

/* Write auto select command sequence */

????? addr[FLASH_CYCLE1] = 0x00AA;?????? /* for AMD,Intel ignores this */

????? addr[FLASH_CYCLE2] = 0x0055; /* for AMD,Intel ignores this */

????? addr[FLASH_CYCLE1] = 0x0090; /* selects Intel or AMD */

二是设置保护区,把uboot,和环境变量的保护区。

三是写和擦除函数,注意写和擦出的操作就可以了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读