遵循SD Host controller Specification协议的MMC设备驱动开发讨论

1.概述
本文主要讲述了u-boot的mmc dm框架驱动的移植方法。dm是driver model的简称,是u-boot的基本驱动框架。常见的mmc设备包括sd卡、emmc存储器等。本文讨论遵循sd host controller specification协议的mmc设备驱动开发。
示例u-boot版本:2022.10。硬件平台:arm soc。
2.原理
在u-boot中,对遵循sd host controller specification 协议的mmc设备有着完备的底层驱动支持。因此,移植某个特定mmc外设驱动,具体工作为调用u-boot自有的mmc底层标准驱动,实现对mmc外设的访问和操作。
mmc驱动的工作原理 :首先对设备树文件xx.dts进行解析,按照先bind后probe的顺序加载mmc驱动,分别通过相应的bind函数和probe函数完成。
u-boot启动后,在读取mmc设备节点的compatible字段后,找到与之匹配的u_boot_driver,然后执行bind函数对驱动进行绑定,最后通过probe函数对驱动进行激活,解析设备树的节点属性,对驱动进行配置,从而使驱动具备工作条件,供上层应用程序调用。
u-boot的命令子系统包含了众多测试命令子集,其中mmc命令集可用来对mmc驱动进行功能测试,对mmc设备进行信息查询和访问操作。
3.移植方法
3.1 主要工作
向u-boot移植mmc dm框架驱动的主要工作包括:(1)向./drivers/mmc/添加驱动文件源码xx_sdhci .c(名称xx由驱动开发者定义,下同);
(2)在./drivers/mmc/makefile添加xx_sdhci .c的编译条目;
(3)在./drivers/mmc/kconfig添加xx_sdhci .c的编译配置选项;
(4)向./arch/arm/dts/xx.dts中添加mmc设备节点。
3.2 驱动源码设计
在u-boot的mmc驱动中,有众多设备遵循了sd host controller specification 协议,选取其中的atmel sdhci控制器驱动,讲解驱动代码的原理和设计方法,代码路径: ./drivers/mmc/atmel_sdhci.c。自编的驱动文件源码xx_sdhci .c可参考atmel_sdhci.c进行设计。
** mmc驱动包括2个核心函数,即atmel_sdhci_bind和atmel_sdhci_probe函数** 。
atmel_sdhci_bind函数用于驱动的绑定。调用了sdhci_bind函数,位于./drivers/mmc/sdhci.c;而mmc作为一种块设备,sdhci_bind函数进一步调用了mmc_bind函数,位于./drivers/mmc/mmc-uclass.c。
atmel_sdhci_probe函数用于驱动的激活。atmel_sdhci_probe函数的主要流程为:首先对设备树进行参数解析,解析出mmc控制器的工作时钟频率、寄存器地址、数据宽度、最高工作频率等参数;然后通过sdhci_setup_cfg函数进行参数配置,sdhci_setup_cfg函数位于./drivers/mmc/sdhci.c;最后调用sdhci_probe函数完成probe操作。
3.3 mmc设备树节点
在设备树添加mmc设备节点,节点设计方法可以参考./doc/device-tree-bindings/mmc下的文档。
4.验证方法
4.1编译mmc测试工具
为编译mmc测试工具,应配置u-boot,使能config_cmd_mmc。
4.2驱动加载结果查询
从本节开始,将介绍mmc测试命令的使用方法及执行结果示例。
dm tree命令列出了dm框架驱动的加载结果。
下面xx_sdhci和mmc_blk前的probed标志为[+],表示驱动已经加载成功了。
cli>dm tree
class index probed driver name
root 0 [ + ] root_driver root_driver
mmc 0 [ + ] xx_sdhci `-- mmc@xxxxxxxx
blk 0 [ + ] mmc_blk `-- mmc@xxxxxxxx.blk
4.3mmc设备信息查询
下面mmc info命令输出了sd卡的基本信息。
cli>mmc info
manufacturer id: 3
oem: 5344
name: sd32g
bus speed: 2000000
mode: sd high speed (50mhz)
rd block len: 512
sd version 3.0
high capacity: yes
capacity: 29.7 gib
bus width: 4-bit
erase group size: 512 bytes
4.4写操作
从ddr的0x80000000地址向sd卡的100# block位置连续写入2个block数据。
cli>mmc write 0x80000000 100 2
2 blocks written: ok
4.5读操作
从sd卡的100# block位置向ddr的0x90000000地址连续读入2个block数据。
cli>mmc read 0x90000000 100 2
2 blocks read: ok

LC正弦波振荡电路的振荡条件分析
爱立信新软件通过5G独立组网新空口,打造更加优质的用户体验
技术科普 | 催化传感器零点产生漂移的原因
基于MPC7448芯片和vME单板机实现嵌入式SMP系统的设计
云计算将助力金山云进一步打开传统行业市场,提前布局企业级市场
遵循SD Host controller Specification协议的MMC设备驱动开发讨论
近5亿台电视面临4K升级 8K电视渐成新品标配
荣耀10青春版渲染图以及配置信息曝光 将搭载骁龙710处理器芯片
screen在屏幕拆分功能上的优缺点
兆元光电与福建中科芯源合作 将在陶瓷荧光片领域展开战略合作
3D IC掀革命,半导体材料、封装加速换血
竞赛报名 I 乐鑫科技赞助 2022 全国大学生物联网设计竞赛,释放边缘 AI 强大潜力
回顾周其凤同志参访星云加速器的相关事宜
甲苯检测仪产品特点介绍
解读《星闪安全白皮书——网络安全》:全周期、高安全规格、强认证机制和全面安全防护!
iPhone或将重新使用Touch ID
苹果13什么时候出正式版
折叠屏手机2021 全面爆发,8 款折叠屏手机国内屏幕厂商积极投产
变压器大修有哪些项目_变压器的大修周期如何规定
工业机器人常见的三大应用误区盘点