map_word_equal 检测不到QRY
flash芯片类型,sst39vf6401
启动在linux-2.6.9/drivers/mtd/chips/cfi_probe.c的qry_present函数不能通过.redboot可以使用flash.
static int qry_present(struct map_info *map, __u32 base,
struct cfi_private *cfi)
{
int osf = cfi->interleave * cfi->device_type; // scale factor
map_word val;
map_word qry;
qry = cfi_build_cmd('Q', map, cfi);
val = map_read(map, base + osf*0x10);
if (!map_word_equal(map, qry, val))
return 0;
///////////////////////////
/////// map_word_equal 检测不到QRY,请问是什么原因?
//////////////////////
qry = cfi_build_cmd('R', map, cfi);
val = map_read(map, base + osf*0x11);
if (!map_word_equal(map, qry, val))
return 0;
qry = cfi_build_cmd('Y', map, cfi);
val = map_read(map, base + osf*0x12);
if (!map_word_equal(map, qry, val))
return 0;
return 1; // nothing found
}
1 从芯片手册中确定是支持CFI
2 该flash芯片是16bit的操作。
原来用的amd 033c换成sst39vf6401b.因为我用16bit的flash替换8bit,现在是qry_present不能通过.
对于cfi接口的,读QRY特征字的花据说偏移地址是0x10,0x11,0x12,3 个存储区,那么cfi信息结构的interleave值是什么含义?cfi信息结构的cfi->device_type值是什么含义?
为什么偏移地址0x10,0x11,0x12要乘以osf (cfi->interleave * cfi->device_type) ?
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
有两个可能的原因:
1. map 不对
没有找到正确的设备或是数据结构没有赋正确的值
2. flash chip is unready
先做reset, 可能解决问题
好像kernel本身不支持你这个sst39vf6401b设备, 是吗??????
这是micrel的ks8695x的开发板上的code,我们只是对其更换了flash芯片,原来的8 bit am29lv033c换成了16bit sst39vf6401b.
map设置是正确的,串口输出 physmap flash device: 800000 at 2000000.
我对比了一下qry和val的值,不能得到正确的Q R Y的值。
代码应该没有问题吧,应该是哪里的配置不对。
请指出,谢谢俄。
算你运气好,我迷惑了一个星期呢
http://linux.chinaunix.net/bbs/v ... p;highlight=smalloc
注意到代码里面的interleave的意义和.config文件里面的对应参数,有可以这个设置不对。
inerleave的并列的意思,比如2个8位的并成16位用,这样在地址上会有所变化。看看吧
太好了,这位仁兄,我的项目就是在这里停下了。
1 sst39vf6401b支持cfi.
2 原来开发板是8bit, 现在sst39vf6401b是16bit。用了1个flash 那么cfi->interleave 应该=1;cfi->device_type 应该=2吧? 也就是osf = cfi->interleave * cfi->device_type 应该等于2。
可是我在映射地址+offset读取特征字时,得到值 0xf014不是0x0051。
因为我只是替换了flash,那么导致不能找到QRY,不会是代码有问题吧,我用的是linux2.6.9.
那会是配置有问题,可到底是哪里的配置出现了问题?
那么cfi->device_type 是不是就是flash的位宽呢,我的flash是16bit .
那么cfi->device_type 是不是 2?
因为并列,所以地址会变宽,如果确实是支持cfi的话,你在地址上想办法
我当时还注意到这样一个问题,不知道是不是编译时的bug:
.关于config里面的一点问题,关闭CONFIG_MTD_CFI_I2,总是不成立。成立的话只需要改如下配置文件。
配置文件里打开CONFIG_MTD_JEDECPROB=y
打开CONFIG_MTD_CFI_I1=y
关闭CONFIG_MTD_CFI_I2
CONFIG_MTD_MAP_BANK_WIDTH_2=y
不能修改的话(修改无效)可以更改如下文件:./linux/kernel/linux-2.6.13.2/include/linux/mtd/cfi.h
static inline int cfi_interleave_supported(int i)
{
switch (i) {
#ifdef CONFIG_MTD_CFI_I1
case 1:
#endif
#ifdef CONFIG_MTD_CFI_I2
//case 2: //注释掉这行!!!!!!!!!!!!!!!!!!
#endif
#ifdef CONFIG_MTD_CFI_I4
case 4:
#endif
#ifdef CONFIG_MTD_CFI_I8
case 8:
#endif
return 1;
default:
return 0;
}
}
device_type 应该就是单片位宽,你16位的就应该是2,还有一个参数就是总线位宽,这些可能都影响到你的寻址
相关的修改就在config文件里啊
#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_CFI_I1=y
#CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
# CONFIG_MTD_CFI_INTELEXT is not set
CONFIG_MTD_CFI_AMDSTD=y
CONFIG_MTD_CFI_AMDSTD_RETRY=0
# CONFIG_MTD_CFI_STAA is not set
CONFIG_MTD_CFI_UTIL=y
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_XIP is not set
[ 本帖最后由 smalloc 于 2007-10-25 17:26 编辑 ]