无法识别apacer CF(compact flash)

原创 2012年03月25日 21:11:08

最近测试CF卡,发现apacer牌子的CF卡无法识别,于是跟踪原因 ,现把分析过程写下,以备参考。

kernel verison 2.6.25.8

在文件

linux-2.6.25.8/drivers/ide/legacy/ide-cs.c

里面注册 pcmcia driver,
static struct pcmcia_driver ide_cs_driver = {
    .owner        = THIS_MODULE,
    .drv        = {
        .name    = "ide-cs",
    },
    .probe        = ide_probe,
    .remove        = ide_detach,
    .id_table       = ide_ids,
};

static int __init init_ide_cs(void)
{
    return pcmcia_register_driver(&ide_cs_driver);
}


//pcmcia_register_driver 的实现。

在 linux-2.6.25.8/drivers/pcmcia/ds.c
int pcmcia_register_driver(struct pcmcia_driver *driver)
{
    int error;

    if (!driver)
        return -EINVAL;

    pcmcia_check_driver(driver);

    /* initialize common fields */
    driver->drv.bus = &pcmcia_bus_type;
    driver->drv.owner = driver->owner;
    spin_lock_init(&driver->dynids.lock);
    INIT_LIST_HEAD(&driver->dynids.list);

    ds_dbg(3, "registering driver %s\n", driver->drv.name);

    error = driver_register(&driver->drv);
    if (error < 0)
        return error;

    error = pcmcia_create_newid_file(driver);
    if (error)
        driver_unregister(&driver->drv);

    return error;

}


//pcmcia driver和device  对应bus 实现


struct bus_type pcmcia_bus_type = {
    .name = "pcmcia",
    .uevent = pcmcia_bus_uevent,
    .match = pcmcia_bus_match,
    .dev_attrs = pcmcia_dev_attrs,
    .probe = pcmcia_device_probe,
    .remove = pcmcia_device_remove,
    .suspend = pcmcia_dev_suspend,
    .resume = pcmcia_dev_resume,
};

//检查设备是否匹配
static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
 ................

    while (did && did->match_flags) {
        ds_dbg(3, "trying to match %s to %s\n", dev->bus_id,
               drv->name);
        if (pcmcia_devmatch(p_dev, did)) {
            ds_dbg(0, "matched %s to %s\n", dev->bus_id,
                   drv->name);
            return 1;
        }
        did++;
    }
....
}


//具体匹配函数,此函数会遍历 drivers/ide/legacy/ ide-cs.c 里面的 ide_ids


static inline int pcmcia_devmatch(struct pcmcia_device *dev,
                  struct pcmcia_device_id *did)
{

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID) {
        if ((!dev->has_manf_id) || (dev->manf_id != did->manf_id))
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID) {
        if ((!dev->has_card_id) || (dev->card_id != did->card_id))
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNCTION) {
        if (dev->func != did->function)
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID1) {
        if (!dev->prod_id[0])
            return 0;
        if (strcmp(did->prod_id[0], dev->prod_id[0]))
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID2) {
        if (!dev->prod_id[1])
            return 0;
        if (strcmp(did->prod_id[1], dev->prod_id[1]))
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3) {
        if (!dev->prod_id[2])
            return 0;
        if (strcmp(did->prod_id[2], dev->prod_id[2]))
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4) {
        if (!dev->prod_id[3])
            return 0;
        if (strcmp(did->prod_id[3], dev->prod_id[3]))
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
        if (dev->device_no != did->device_no)
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_FUNC_ID) {
        if ((!dev->has_func_id) || (dev->func_id != did->func_id))
            return 0;

        /* if this is a pseudo-multi-function device,
         * we need explicit matches */
        if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO)
            return 0;
        if (dev->device_no)
            return 0;

        /* also, FUNC_ID matching needs to be activated by userspace
         * after it has re-checked that there is no possible module
         * with a prod_id/manf_id/card_id match.
         */
        ds_dbg(0, "skipping FUNC_ID match for %s until userspace "
               "interaction\n", dev->dev.bus_id);
        if (!dev->allow_func_id_match)
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_FAKE_CIS) {
        ds_dbg(0, "device %s needs a fake CIS\n", dev->dev.bus_id);
        if (!dev->socket->fake_cis)
            pcmcia_load_firmware(dev, did->cisfile);

        if (!dev->socket->fake_cis)
            return 0;
    }

    if (did->match_flags & PCMCIA_DEV_ID_MATCH_ANONYMOUS) {
        int i;
        for (i=0; i<4; i++)
            if (dev->prod_id[i])
                return 0;
        if (dev->has_manf_id || dev->has_card_id || dev->has_func_id)
            return 0;
    }

    dev->dev.driver_data = (void *) did;

    return 1;
}


//通过跟踪发现,apacer CF卡 无法匹配到任何的匹配方式,因为drivers/ide/legacy/ ide-cs.c 里面的 

ide_ids 没有对应的匹配项。


而通过如下命令
#cd /sys/devices/platform/pxa2xx-pcmcia/1.0/
#cat manf_id
0x00bf
#cat card_id

0x0001


可以查到device的 manufactute id 和 card id 可以查询出来。


故在static struct pcmcia_device_id ide_ids[] 添加如下一行

PCMCIA_DEVICE_MANF_CARD(0x00bf, 0x0001)

顺利实现匹配。目前需要进一步确认是否只有这种匹配方式,其它方式是否可行。



相关文章推荐

compact flash specification ver 2.0

  • 2009年07月07日 11:41
  • 1.09MB
  • 下载

windows无法访问 请检查名称的拼写… 错误代码:0x80004005和0x80070035和 0x800704cf

昨天下午到今天早上真是日了够了,简简单单的要访问一个局域网共享文件夹出幺蛾子,别人的电脑没事,就我的电脑有事,大家都是win7系统,废话少说,上解决思路。 首先在地址栏中或者再开始中输入:\\172...
  • newizan
  • newizan
  • 2015年12月15日 13:34
  • 18253

扩展Selenium对于Flash(Flex)元素识别和操作的实践小结

1.下载Selenium的Flex扩展包:“SeleniumFlex-API_0.2.5”,下载请Google之:) 2.解压后,内含Selenium的Js扩展“user-extensions.js...

在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)

在U-boot下实现自动识别启动Flash的原理(针对S3C24x0) 原文出自点击打开原文 有网友给我一个建议,是否可以同时支持64MB的flash和128MB的flash,我想了一...

在U-boot下实现自动识别启动Flash的原理 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/201

有网友给我一个建议,是否可以同时支持64MB的flash和128MB的flash,我想了一下觉得可行,再想一下觉得还可以实现自动识别Nor boot 还是 Nand boot。 所以在移植u-boot...

Firefox/Chrome下flash的wmode参数设为opaque或transparent时输入文本框中无法输入中文汉字的解决方法

一、前言这段时间做个项目,要涉及到flash开发。真悲催,之前没有接触过flash开发,于是找个哥们临时教了一下Adobe Flash CS5 的使用方法,感觉还蛮简单,所见即所得,和MFC下的开发有...

手把手教你linux下google chrome浏览器root用户无法运行,以及flash插件安装

周末终于被卡爆的win7折腾烦了,无奈之下终于下决心装了双系统,好不容易折腾好双系统,愉快的在linux下写了一个hello world后不愉快的事情终于发生了。 由于装的是kali,没有自带火狐或者...

EasyRTMP手机直播推送rtmp流flash无法正常播放问题

问题简介 EasyRTMP是EasyDarwin团队开发的一套简单易用的RTMP推送SDK。本文想讲述下开发过程中遇到的一个问题。问题的现象是使用EasyRTMP推送音视频流到自己搭建的nginx...

STM32 USB NAND Flash模拟U盘无法格式化问题的解决

前几天,一直在寻找NAND Flash模拟U盘程序无法格式化的问题。在中秋月圆之夜,还苦逼地在实验室调代码,也许是杭州大圆月的原因,今晚感觉整人特别亢奋,效率也特别高,灵感也多。终于,在不懈的努力...

Flash builder 4无法调试问题

一、Flash Builder的安装 我下过standalone版和插件版发现后者其实包含可以独立运行的版本,其Eclipse版本为3.4。所以这次我下载了插件版,下载地址是http://trial...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无法识别apacer CF(compact flash)
举报原因:
原因补充:

(最多只允许输入30个字)