移植u-boot2012.04.1 -》2440 (二)norflash 识别
来源:互联网 发布:电力科学研究院 知乎 编辑:程序博客网 时间:2024/05/21 17:19
在上一篇文章中,我们实现了新建单板,时钟 sdram 等一系列初始化工作,串口已经能正确输出打印信息,但是有错误信息。
现在,我们就来解决问题。搜索“Flash:”,或者往下看一下代码,不难发现 arch\arm\lib\board.c -》board_init_r 函数中有一句。
#if !defined(CONFIG_SYS_NO_FLASH)puts("Flash: ");flash_size = flash_init();flash_init 就是 norflash 的初始化函数了,下面来简单分析一下 flash_init 函数 norflash 的识别过程。
drivers\mtd\cfi_flash.c -> flash_init
if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))flash_get_size(cfi_flash_bank_addr(i), i);
board_flash_get_legacy(base, banknum, info)<span style="white-space:pre"></span>portwidth = FLASH_CFI_16BIT;<span style="white-space:pre"></span>chipwidth = FLASH_CFI_BY16;<span style="white-space:pre"></span>interface = FLASH_CFI_X16;
if (board_flash_get_legacy(base, banknum, info)) {// 如果 info 中没有指定厂商,我们假设它是下面两种之一,分别进行尝试if (!info->vendor) {int modes[] = {CFI_CMDSET_AMD_STANDARD,CFI_CMDSET_INTEL_STANDARD};int i; // 尝试两种厂商,循环两次,第一次是 CFI_CMDSET_AMD_STANDARDfor (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++) {info->vendor = modes[i];info->start[0] =(ulong)map_physmem(base, info->portwidth, MAP_NOCACHE);if (info->portwidth == FLASH_CFI_8BIT&& info->interface == FLASH_CFI_X8X16) {info->addr_unlock1 = 0x2AAA;info->addr_unlock2 = 0x5555;} else { // 执行这个分支,norflash 位宽16bitinfo->addr_unlock1 = 0x5555;info->addr_unlock2 = 0x2AAA;}flash_read_jedec_ids(info);// 读芯片IDdebug("JEDEC PROBE: ID %x %x %x\n",info->manufacturer_id,info->device_id,info->device_id2);if (jedec_flash_match(info, info->start[0])) //匹配flash芯片break;elseunmap_physmem((void *)info->start[0], MAP_NOCACHE);}} ...}首先引起我注意的是 info->addr_unlock1 和 info->addr_unlock1 ,因为它和我们 norflash 芯片手册中的两个值很相似。
如果没猜错的话,unlock1 就对应于Cycles 1 、3、5 ,unlock2 对应于 Cycles 2、4、6,由于我们的norflash位宽是16bit->word,那么我们这里应该分别修改为 info->addr_unlock1 = 0x555;info->addr_unlock2 = 0x2AA;
在 flash_read_jedec_ids(info);执行完之后,下面会debug出它读取出的信息.
根据上图芯片手册,正确的话我们的厂家 ID = 01 ,device id = 0x22C4 .
由于 debug 默认是不开启的,我们需要修改宏,配置输出 debug 信息,在 include\common.h
增加 #define DEBUG 开启 debug 输出,然后 make 烧写!
增加 #define DEBUG 开启 debug 输出,然后 make 烧写!
我们可以看到,已经能够正确识别出我们的 norflash id ,有些同学可能会奇怪下面又一次识别的是啥,那个好像不对,还记得前边 for 循环么?默认的第一个厂家识别匹配不成功的话,会尝试第二次识别匹配,我们识别是成功了,但是还不知道匹配行不行呢,解决了匹配问题,第二次识别就不会执行了。
int jedec_flash_match(flash_info_t *info, ulong base){int ret = 0;int i;ulong mask = 0xFFFF;if (info->chipwidth == 1)mask = 0xFF;for (i = 0; i < ARRAY_SIZE(jedec_table); i++) {if ((jedec_table[i].mfr_id & mask) == (info->manufacturer_id & mask) && (jedec_table[i].dev_id & mask) == (info->device_id & mask)) {fill_info(info, &jedec_table[i], base);ret = 1;break;}}return ret;}这个函数的功能能一目了然,取出 jecec_table 数组中的每一项,和我们识别出来的厂家ID 设备ID 进行比较,如果比较成功,将 jecec_table 中的信息填充到 info 中去,那么我们未匹配成功十有八九就是 jecec_table中没有我们 norflash 的信息咯。
打开 jecec_table 确实没有与我们匹配的项目,因此照葫芦画瓢添加一个。drivers\mtd\Jedec_flash.c
{//增加.mfr_id= (u16)0x01,.dev_id= 0x2249,.name= "S29AL016J",.uaddr= {[1] = MTD_UADDR_0x0555_0x02AA /* x16 */},.DevSize= SIZE_2MiB,.CmdSet= CFI_CMDSET_AMD_LEGACY,.NumEraseRegions= 4,.regions= {ERASEINFO(0x04000, 1),ERASEINFO(0x02000, 2),ERASEINFO(0x08000, 1),ERASEINFO(0x10000, 31),}},uaddr :和我们前边修改的保持一致,先发0x555后发0x2AA
cmdset:不清楚什么意思,但是数据中的值大多都是这一个 0xfff0,先试试不行再说
NumEraseRegions:几种不同的 sector ,与.regions 对应
我这款 norflash :
sector0 :16 * 1024 bytes (0x4000) 1个
sector1-sector2 : 8 * 1024 bytes (0x2000) 2个
sector3 :32 * 1024 bytes (0x8000) 1个
sector4-sector34 :64 * 1024 bytes (0x8000)31个
.regions 显然就是上边的信息了,ok添加完毕 make 烧写。
ERROR:too many flash sectors ,搜索 too many flash sectors
include\configs\smdk2440.h 中定义了
#define CONFIG_SYS_MAX_FLASH_SECT (19)
修改为 #define CONFIG_SYS_MAX_FLASH_SECT (35) //我的sector是35个
修改完成之后,norflash 部分算是没有问题了,nandflash 的问题在下一篇文章中解决。
1 0
- 移植u-boot2012.04.1 -》2440 (二)norflash 识别
- 移植u-boot2012.04.1 -》2440 (三)nandflash 识别
- u-boot2012.04移植到jz2440 支持norflash
- 移植u-boot2012.04.1 -》2440 (四)DM9000移植,环境变量设置
- 移植u-boot2012.04.1 -》2440 (一)新建单板,第一阶段修改
- 新版U-boot2012.04.01移植(二)(JZ2440-S3C2440)
- 移植u-boot2012.04.1 -》2440 (五)支持 nand nor 两种启动方式(完结)
- U-boot移植-norflash
- u-boot2012.04.01移植到mini2440
- u-boot2012.04.01移植到mini2440
- u-boot2012.04.01移植到mini2440
- U-Boot2010.06移植(2440)-----移植NorFlash驱动
- U-boot2012.10 移植之Signal # 8 caught的问题
- 新版U-boot2012.04.01移植(一)(JZ2440-S3C2440)
- u-boot-2014.04移植FL2440(norflash启动)
- 移植u-boot-2012.04----支持NORFlash启动
- U-boot-200908在FL2440上的移植(二)--uboot在norflash上运行
- u-boot2012.04移植到jz2440 -- ->正常显示u-boot启动信息
- 使用 Docker 一步搞定 ZooKeeper 集群的搭建
- 在FileSystem 异步API中如何创建阶层目录(依托关系)
- Android 开发中的日常积累
- JAVA EE---Servlet 学习第一天
- Ubuntu 14 安装 Caffe
- 移植u-boot2012.04.1 -》2440 (二)norflash 识别
- 导购用户分析
- Android常用的开源框架
- 凯文凯利在武汉的演讲:你,已经被12个趋势包围
- OpenCV之开发环境配置——Win10+VS2015+OpenCV2.4.X
- Restful程序设计学习总结(一)
- 二叉树的构建,遍历等基本操作
- 【从C到C++学习笔记】域运算符/new/delete运算符/重载/Name managling/extern "C"/带函数默认值参数
- [UESTC 1431]不是图论