map_word_equal 检测不到QRY

发布于 2022-09-26 13:06:22 字数 2183 浏览 18 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

万水千山粽是情ミ 2022-10-03 13:06:22

原帖由 againyuan 于 2007-10-22 20:35 发表
///////////////////////////
///////              map_word_equal  检测不到QRY,请问是什么原因?
//////////////////////

有两个可能的原因:
1. map 不对
没有找到正确的设备或是数据结构没有赋正确的值
2. flash chip is unready
先做reset, 可能解决问题

蓝礼 2022-10-03 13:06:22

好像kernel本身不支持你这个sst39vf6401b设备, 是吗??????

我爱人 2022-10-03 13:06:22

这是micrel的ks8695x的开发板上的code,我们只是对其更换了flash芯片,原来的8 bit am29lv033c换成了16bit sst39vf6401b.
map设置是正确的,串口输出 physmap flash device: 800000 at 2000000.

我对比了一下qry和val的值,不能得到正确的Q R Y的值。
代码应该没有问题吧,应该是哪里的配置不对。
请指出,谢谢俄。

她比我温柔 2022-10-03 13:06:22

算你运气好,我迷惑了一个星期呢
http://linux.chinaunix.net/bbs/v ... p;highlight=smalloc

情深缘浅 2022-10-03 13:06:22

注意到代码里面的interleave的意义和.config文件里面的对应参数,有可以这个设置不对。
inerleave的并列的意思,比如2个8位的并成16位用,这样在地址上会有所变化。看看吧

感情旳空白 2022-10-03 13:06:22

太好了,这位仁兄,我的项目就是在这里停下了。
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.
那会是配置有问题,可到底是哪里的配置出现了问题?

假面具 2022-10-03 13:06:22

那么cfi->device_type 是不是就是flash的位宽呢,我的flash是16bit .
那么cfi->device_type 是不是 2?

摇划花蜜的午后 2022-10-03 13:06:22

因为并列,所以地址会变宽,如果确实是支持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;
        }
}

岛徒 2022-10-03 13:06:22

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 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文