前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux内核MMC里的轮询机制

Linux内核MMC里的轮询机制

作者头像
哆哆jarvis
发布于 2023-02-26 05:56:33
发布于 2023-02-26 05:56:33
2.3K00
代码可运行
举报
运行总次数:0
代码可运行

从这篇文章你能学到如何使用MMC框架里的轮询机制做探卡检测,十分简单。

1 前言

最近遇到客户提的一个问题,大概意思是他们的SDIO Wi-Fi在卸载Wi-Fi驱动后再加载就检测不到Wi-Fi设备了。从他的问题看大概是热插拔有问题。

想要支持Wi-Fi复位后能重新扫描到Wi-Fi设备,需要host设置MMC_CAP_NEEDS_POLL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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函数,路径是drivers\mmc\core\core.c,of_property_read_bool函数读broken-cd字段,如果读到,就给host设置MMC_CAP_NEEDS_POLL能力。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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\n");
		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绑定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INIT_DELAYED_WORK(&host->detect, mmc_rescan);

mmc_rescan就是扫描卡的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的经历,转行,欢迎找我交流经验~

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哆哆jarvis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
中美科技「脱钩」或将成为现实:除了GitHub,中国程序员还应该知道这些代码托管平台
机器之心发布 机器之心编辑部 解决卡脖子问题,最关键的还是要建立好自己的开源社区。 2020年6月,哈工大师生陆续发现MATLAB软件无法使用,MATLAB 是美国MathWorks公司出品的商业数学软件,受到全世界上百万名数学家和工程师的喜爱,尤其是中国工科学生绘制论文图表的首选软件。而哈工大的学生却突然收到了正版软件取消激活的通知。 向开发公司MathWorks询问之后得知,因哈工大被纳入实体清单,在特朗普政府的要求下,MATLAB将对哈工大师生强行停止授权,即使是在已付费的情况下。目前,国内共有 1
机器之心
2023/03/29
1.2K0
中美科技「脱钩」或将成为现实:除了GitHub,中国程序员还应该知道这些代码托管平台
打造企业级自动化运维平台系列(三):DevOps 常用的软件工具
项目管理系统是项目的管理者应用专门管理项目的系统软件,在有限的资源约束下,运用系统的观点、方法和理论,对项目涉及的全部工作进行有效地管理。它从项目的投资决策开始到项目结束的全过程进行计划、组织、指挥、协调、控制和评价,以实现项目的目标。
民工哥
2024/01/18
6620
打造企业级自动化运维平台系列(三):DevOps 常用的软件工具
程序员的大本营被黑客攻击了!10天内不交赎金,就公开用户私有代码
就在五一假期的最后一天,一些程序员查看自己托管到GitHub上的代码时发现,他们的源代码和Repo都已消失不见,取而代之的是黑客留下的一封勒索信!
iOSSir
2019/05/05
6920
【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私
在一个月黑风高的夜晚,正准备休息的我突然接到之前外包老总的亲切问候。一顿输出才知道三年前为了搭建流程化部署,将公司的测试代码放到github上后忘记删除。现在被甲方的代码扫描机制扫到,并且检查到代码已经被其他用户fork,虽没有造成损失,但要求清除github所有数据及被fork的代码。以此为戒,特来跟大家分享一下处理流程,重点是GitHub的DMCA 下架通知提交指南。
JavaDog程序狗
2024/10/09
1590
【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私
9102年的数据泄漏,裸奔的不只是你的个人信息 | Alfred数据
日前,疑似“陕西普通话成绩查询网(sxpth.cn)”由于网站的程序员把所有考生信息(包括照片、身份证、准考证号、院校等)通过硬编码的方式直接写进了网页源代码里,导致大量考生信息泄漏。
Alfred数据室
2019/11/10
9100
9102年的数据泄漏,裸奔的不只是你的个人信息 | Alfred数据
Git入门操作
Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。
大家一起学编程
2024/05/21
1210
Git入门操作
SFC宣布退出GitHub!对其利用Copilot作为营利工具的行为感到难以接受!
专注于自由与开源软件(FOSS)的非营利组织软件自由保护协会(SFC)表示,其已停止使用微软GitHub开展项目托管,并敦促其他软件开发者一同退出。 在本周四发布的博文中[1],自由保护协会FOSS许可合规工程师Denver Gingerich及政策研究员Bradley M. Kuhn表示,GitHub在过去十年间,一直以FOSS开发领域的主导工具Git为核心开发界面搭配与社交功能。 通过这种方式,GitHub成功将将FOSS贡献者们的努力导入了自己的专有生态系统。 Gingerich和Kuhn怒斥,“我们
程序猿DD
2022/07/04
6120
SFC宣布退出GitHub!对其利用Copilot作为营利工具的行为感到难以接受!
从开源到云端:最值得关注的CI/CD工具与企业适配方案
随着DevOps的普及,持续集成与持续交付(CI/CD)工具成为企业提升开发效率的关键。本文结合当前技术趋势与工具特性,为您推荐十大CI/CD工具,并重点介绍国内优秀代码托管平台Gitee的CI/CD解决方案。
用户11533487
2025/04/15
2410
迁移进行时,告别GitHub的时候到了?
整理 | 晓亮、钰莹 上周,SFC(软件自由保护协会)在自己的官方博客发布的一篇名为“Give Up GitHub: The Time Has Come!”的文章在 Hacker News 上引发了网友的激烈讨论。 本周,开源项目 kyoto(一个用 go 语言编写的前端工具库)就宣布将从 Github 迁移至其他平台。后续还将有多少项目选择迁移尚未可知,但背后的原因值得探究。 迁出 GitHub kyoto 开源项目的负责人表示:GitHub 最近的更新和公司的整体政策与我对开源项目的愿景背道而
深度学习与Python
2023/03/29
3320
迁移进行时,告别GitHub的时候到了?
标星7.2万热门开源项目youtube-dl遭下架,开发者的权益谁来保护?
开源项目 youtube-dl 是一个使用 Python 编写的脚本,可以下载热门视频网站的音视频,并转换视频格式和清晰度。它是 GitHub 上的热门项目,获得 7.2 万多星。
AI算法与图像处理
2020/11/06
1.4K1
架设私有的Git服务器[通俗易懂]
Git是一个版本控制系统,现如今正在被全世界大量开发者使用。许多公司喜欢使用基于 Git 版本控制的 GitHub 代码托管。根据报道,GitHub 是现如今全世界最大的代码托管网站。GitHub 宣称已经有 920 万用户和 2180 万个仓库。许多大型公司现如今也将代码迁移到 GitHub 上。甚至于谷歌,一家搜索引擎公司,也正将代码迁移到 GitHub 上。
全栈程序员站长
2022/11/10
3.2K0
推特部分源代码泄漏,疑遭离职员工报复!马斯克要求GitHub交出上传下载人员名单
大数据文摘授权转载自AI前线 作者:Tina 最近的法律文件显示,Twitter 的部分源代码已经在网上泄露。这是一次罕见的、严重的知识产权泄露事件。为防止该事件对其服务产生潜在的破坏性损失,Twitter 已经采取了法律行动。 部分源代码在线泄露 根据文件显示,上周五 Twitter 采取了行动,向 GitHub 发送了版权侵权通知,并删除了被泄露的代码。GitHub 遵从了通知并删除了该代码。DMCA 通知显示,这次泄露的源代码是 Twitter 平台和内部工具的私有源代码,严重侵犯了 Twitter
大数据文摘
2023/04/10
3830
推特部分源代码泄漏,疑遭离职员工报复!马斯克要求GitHub交出上传下载人员名单
Twitter部分源代码泄漏、疑遭离职员工报复:马斯克要求GitHub交出所有上传、下载人员名单
作者 | Tina 最近的法律文件显示,Twitter 的部分源代码已经在网上泄露。这是一次罕见的、严重的知识产权泄露事件。为防止该事件对其服务产生潜在的破坏性损失,Twitter 已经采取了法律行动。 部分源代码在线泄露 根据文件显示,上周五 Twitter 采取了行动,向 GitHub 发送了版权侵权通知,并删除了被泄露的代码。GitHub 遵从了通知并删除了该代码。DMCA 通知显示,这次泄露的源代码是 Twitter 平台和内部工具的私有源代码,严重侵犯了 Twitter 的版权。具体的仓库地址是
深度学习与Python
2023/03/29
4040
Twitter部分源代码泄漏、疑遭离职员工报复:马斯克要求GitHub交出所有上传、下载人员名单
21条最佳实践,全面保障 GitHub 使用安全
GitHub 是开发人员工作流程中不可或缺的一部分。无论你去哪个企业或开发团队,GitHub 都以某种形式存在。它被超过8300万开发人员,400万个组织和托管超过2亿个存储库使用。GitHub 是世界上最大的源代码托管服务平台。 ​
宜轩
2022/12/26
2K0
合理吗?法院要求 GitHub 提供开发者真实信息
Twitter 源代码泄露一事引发业内广泛讨论,FreeBuf 曾在【重磅!Twitter 源代码泄露】一文中对此事进行过简单描述。近期,源代码泄露事件又有新进展。 Cybernews 网站消息,Twitter 向美国北加州地区法院提出申请,希望代码托管平台 GitHub 能够提供源代码泄露者的具体信息。目前,法院已经批准,并要求 GitHub 在 4 月 3 号之前,提供发布者详细的身份信息。 从路透社披露的信息来看,法庭文件指出 GitHub 用户 FreeSpeechEnthusiast 可能是有罪
FB客服
2023/04/04
3930
合理吗?法院要求 GitHub 提供开发者真实信息
版本控制及代码托管平台综述
版本控制是协助软件开发的重要工具之一,根据维基百科中“版本控制”词条的描述,版本控制(英语:Version control)是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步。
宋天伦
2023/10/18
4370
GitHub安全最佳实践
Github 类的代码平台是个研发和安全人员的大宝库,阿里云效平台的代码权限事件历历在目,密码泄露到公开代码平台的事件层出不穷,为企业内外部的各种源代码管理系统(gitlab\stash\github\gitee)做好合理配置是新生事物。开发各种 github 敏感信息监控工具均属于事后管理,做好安全配置和培养员工良好的习惯才是安全管理的重中之重。
安全乐观主义
2019/11/20
1.1K0
推特源代码「意外曝光」,GitHub连夜下架:泄露者疑似被解雇员工
机器之心报道 编辑:蛋酱 有人删库跑路,有人发帖控诉,还有人决定替老东家「提前曝光」源代码。 大型科技公司开放源代码不是新鲜事,但推特的一次「被动开源」,却成为了科技圈的热门话题。 最近,推特公司的部分源代码,「意外」出现在了 GitHub 上。 「目前还不清楚泄露的代码在网上发布了多长时间,但它似乎已经公开至少几个月了。」《纽约时报》在报道中写道。有趣的是,推特的高管们似乎不久前才意识到源代码泄露。 发现之后,推特连忙提交了 DMCA(数字千年版权法案)删除通知。DMCA 删除通知要求 GitHub 提
机器之心
2023/03/29
5460
推特源代码「意外曝光」,GitHub连夜下架:泄露者疑似被解雇员工
GitHub遭黑客攻击:窃取数百源码并勒索比特币
五一过后,一些程序员查看自己托管到GitHub上的代码时发现,他们的源代码和Repo都已消失不见,上周四,一位Reddit用户写了一篇帖子,说他的存储库被黑了。代码也被删除了,取而代之的是黑客留下的一封勒索信。
大数据文摘
2019/05/15
1.3K0
GitHub遭黑客攻击:窃取数百源码并勒索比特币
如何破解“开源危机”?开源风险分析与对策中国权威报告出炉
因而国内各界开始重新审视开源项目的法律约束问题。人们呼吁:我们也需要更多 “开源自立”。
新智元
2019/05/29
1.4K0
推荐阅读
中美科技「脱钩」或将成为现实:除了GitHub,中国程序员还应该知道这些代码托管平台
1.2K0
打造企业级自动化运维平台系列(三):DevOps 常用的软件工具
6620
程序员的大本营被黑客攻击了!10天内不交赎金,就公开用户私有代码
6920
【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私
1590
9102年的数据泄漏,裸奔的不只是你的个人信息 | Alfred数据
9100
Git入门操作
1210
SFC宣布退出GitHub!对其利用Copilot作为营利工具的行为感到难以接受!
6120
从开源到云端:最值得关注的CI/CD工具与企业适配方案
2410
迁移进行时,告别GitHub的时候到了?
3320
标星7.2万热门开源项目youtube-dl遭下架,开发者的权益谁来保护?
1.4K1
架设私有的Git服务器[通俗易懂]
3.2K0
推特部分源代码泄漏,疑遭离职员工报复!马斯克要求GitHub交出上传下载人员名单
3830
Twitter部分源代码泄漏、疑遭离职员工报复:马斯克要求GitHub交出所有上传、下载人员名单
4040
21条最佳实践,全面保障 GitHub 使用安全
2K0
合理吗?法院要求 GitHub 提供开发者真实信息
3930
版本控制及代码托管平台综述
4370
GitHub安全最佳实践
1.1K0
推特源代码「意外曝光」,GitHub连夜下架:泄露者疑似被解雇员工
5460
GitHub遭黑客攻击:窃取数百源码并勒索比特币
1.3K0
如何破解“开源危机”?开源风险分析与对策中国权威报告出炉
1.4K0
相关推荐
中美科技「脱钩」或将成为现实:除了GitHub,中国程序员还应该知道这些代码托管平台
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验