Linux内核MMC里的轮询机制
从这篇文章你能学到如何使用MMC框架里的轮询机制做探卡检测 ,十分简单。1 前言
最近遇到客户提的一个问题,大概意思是他们的SDIO Wi-Fi在卸载Wi-Fi驱动后再加载就检测不到Wi-Fi设备了。从他的问题看大概是热插拔有问题。
想要支持Wi-Fi复位后能重新扫描到Wi-Fi设备,需要host设置MMC_CAP_NEEDS_POLL 。#define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */2 如何使用MMC里的轮询机制做探卡检测?
先说方法,后面再分析。
方法一:修改dts,在对应的节点增加字段broken-cd ,同时,如果有non-removable 字段,必须去掉该字段。
方法二:通过其他手段设置host->caps |= MMC_CAP_NEEDS_POLL 3 MMC里的轮询机制剖析3.1 在dts设置broken-cd字段,代码在哪里解析?
在mmc_of_parse 函数,路径是driversmmccorecore.c ,of_property_read_bool函数读broken-cd 字段,如果读到,就给host设置MMC_CAP_NEEDS_POLL 能力。int mmc_of_parse(struct mmc_host *host) { /* 省略 */ /* * Configure CD and WP pins. They are both by default active low to * match the SDHCI spec. If GPIOs are provided for CD and / or WP, the * mmc-gpio helpers are used to attach, configure and use them. If * polarity inversion is specified in DT, one of MMC_CAP2_CD_ACTIVE_HIGH * and MMC_CAP2_RO_ACTIVE_HIGH capability-2 flags is set. If the * "broken-cd" property is provided, the MMC_CAP_NEEDS_POLL capability * is set. If the "non-removable" property is found, the * MMC_CAP_NONREMOVABLE capability is set and no card-detection * configuration is performed. */ /* Parse Card Detection */ if (of_property_read_bool(np, "non-removable")) { host->caps |= MMC_CAP_NONREMOVABLE; if (of_property_read_bool(np, "cd-post")) host->caps2 |= MMC_CAP2_CD_POST; } else { cd_cap_invert = of_property_read_bool(np, "cd-inverted"); if (of_property_read_bool(np, "broken-cd")) host->caps |= MMC_CAP_NEEDS_POLL; ret = mmc_gpiod_request_cd(host, "cd", 0, true, 0, &cd_gpio_invert); if (!ret) dev_info(host->parent, "Got CD GPIO "); else if (ret != -ENOENT && ret != -ENOSYS) return ret; /* * There are two ways to flag that the CD line is inverted: * through the cd-inverted flag and by the GPIO line itself * being inverted from the GPIO subsystem. This is a leftover * from the times when the GPIO subsystem did not make it * possible to flag a line as inverted. * * If the capability on the host AND the GPIO line are * both inverted, the end result is that the CD line is * not inverted. */ if (cd_cap_invert ^ cd_gpio_invert) host->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH; } /* 省略 */ }3.2 探卡检测流程
mmc_alloc_host函数会创建一个工作队列,mmc_rescan与host->detect绑定。INIT_DELAYED_WORK(&host->detect, mmc_rescan);
mmc_rescan就是扫描卡的函数void mmc_rescan(struct work_struct *work) { struct mmc_host *host = container_of(work, struct mmc_host, detect.work); int i; if (host->trigger_card_event && host->ops->card_event) { host->ops->card_event(host); host->trigger_card_event = false; } if (host->rescan_disable) return; /* If there is a non-removable card registered, only scan once */ if ((host->caps & MMC_CAP_NONREMOVABLE) && host->rescan_entered) return; host->rescan_entered = 1; mmc_bus_get(host); /* * if there is a _removable_ card registered, check whether it is * still present */ if (host->bus_ops && !host->bus_dead && !(host->caps & MMC_CAP_NONREMOVABLE)) host->bus_ops->detect(host); host->detect_change = 0; /* * Let mmc_bus_put() free the bus/bus_ops if we"ve found that * the card is no longer present. */ mmc_bus_put(host); mmc_bus_get(host); /* if there still is a card present, stop here */ if (host->bus_ops != NULL) { mmc_bus_put(host); goto out; } /* * Only we can add a new handler, so it"s safe to * release the lock here. */ mmc_bus_put(host); if (!(host->caps & MMC_CAP_NONREMOVABLE) && host->ops->get_cd && host->ops->get_cd(host) == 0) { mmc_claim_host(host); mmc_power_off(host); mmc_release_host(host); goto out; } mmc_claim_host(host); for (i = 0; i < ARRAY_SIZE(freqs); i++) { if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))) break; if (freqs[i] <= host->f_min) break; } mmc_release_host(host); out: if (host->caps & MMC_CAP_NEEDS_POLL) mmc_schedule_delayed_work(&host->detect, HZ); }
看到最后两行,判断host的能力,如果设置了MMC_CAP_NEEDS_POLL,也就是轮询机制,就会每隔HZ(这是个宏)时间执行一次host->detect,也就是mmc_rescan。总结
对于探卡检测,通过在dts里面配置broken-cd 就可以实现轮询探卡检测。
号主: 一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。
如果你想了解我的经历,转行,欢迎找我交流经验~
一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~
1分!2分!李春江用废超级外援,冠军教头受质疑,下课倒计时?北京时间10月19日,CBA第4轮一场比赛,在上海男篮与天津男篮之间展开,比赛一波三折,两队鏖战到最后时刻,天津男篮把握住了机会,最终10499战胜上海,取得两连胜,上海则吞下赛季
肝肾一旦亏虚,须发就会早白!分享2味药,肝肾同补,摆脱白发你是不是也疑惑正值壮年的你为什么开始有了白发?而且是肉眼可见的增多?并且脱发也随之变多?今天屈医生给大家分享一个简单两味药的方子,一个补肾,一个补肝,滋阴补血,肝肾同补,摆脱白发脱
T97直播间的咖啡,都卖给谁了?新腕儿(bosandao)独家原创作者怜舟导语没有做过线下实体的微商,能做出万店连锁的咖啡品牌吗?最近一段时间,T97咖啡直播间的大嘴妹火了。Rap喊麦洗脑营销直播给公众留下深刻印
奔驰ActrosC比同配国产重卡贵多少你能接受?2022年9月23日,奔驰第一台国产重卡在福田戴姆勒汽车新厂区正式下线,预计将于11月份上市销售。根据商车邦所做的市场调研,目前很多客户都有购买的意愿,但最关心的还是售价。通常来说
方向变了?金价跌进一步扩大,逼近1630周三(10月19日),现货黄金扩大最近两周以来形成的跌势,创9月28日以来新低至1631。72美元盎司,因美联储有理由延续激进加息政策,并且时刻准备根据经济数据表现调整利率预期,美
郭广昌放大招!160亿清仓中国基金报记者文夕传言多日的资产抛售终于实锤!10月19日晚间,复星国际(00656。HK)公告披露,拟向沙钢集团160亿元出售目标公司60股权,公告并未提及目标公司名称,但根据多
假如岳飞没遇到秦桧,南宋北伐能成功吗?我在头条搞创作第二期喜欢宋史的朋友们,一提到风波亭,肯定会扼腕叹息。宋高宗冤杀岳飞,葬送了岳家军北伐的大好前景,很多人心里想过,如果岳飞不死,岳家军不撤,或许真的可以直捣黄龙收复燕
坚守,因为爱的深沉为什么我的眼里常含泪水,因为我对这土地爱得深沉这是出自现代诗人艾青的我爱这土地中的诗句。我不知道你是否和我一样,每天清晨起床后的第一件事,就是打开手机,查看前一天的疫情数据。这冰冷
木叶秋声,不缓不急下了几场淅淅沥沥的雨,短袖变成长衫,是初秋了北方来了一场寒流,衣衫外头罩了件毛衣,秋意渐浓银杏树的落叶铺满一地,深秋连接着初冬,阳光惬意秋天像个中年人,有着自己的妥帖与安宁不缓不急
这些年不容易!马丽娟嫁给赵本山,她在婚姻中哭过,抑郁过头条创作挑战赛点击关注,每天都有名人故事感动您!马丽娟与丈夫赵本山及一双儿女赵本山是家喻户晓的喜剧演员,先后21次登上央视春晚舞台,他表演的相亲牛大叔提干我想有家说事火炬手送水工卖
薛平贵与王宝钏你只知道王宝钏挖野菜,她的美你一无所知网上的热梗真的有时候火的就是莫名其妙,最近王宝钏挖野菜这几个字,直接把90后网友娘胎里自带的记忆都给挖了出来。小时候天天蹲电视前看的薛平贵与王宝钏,原来一直都看了个寂寞。时至今日才