分享

U-boot驱动-MMC驱动移植

 新用户0118F7lQ 2023-08-19 发布于海南

“设为星标”及时获取最新文章

精选文章链接:

[1]ARM架构系列(1)—big.LITTLE技术简介

[2]ARM Trusted Firmware系列(1)—初识TF-A

[3]Linux驱动系列(1)-PWM驱动

[4]FreeRTOS系列(1)-手把手教你建立FreeRTOS项目工程

1.概述

    本文主要讲述了U-bootMMC DM框架驱动的移植方法。DMDriver 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进行解析,按照先bindprobe的顺序加载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-bootMMC驱动中,有众多设备遵循了SD Host controller Specification 协议,选取其中的Atmel SDHCI控制器驱动,讲解驱动代码的原理和设计方法,代码路径: ./drivers/mmc/atmel_sdhci.c。自编的驱动文件源码xx_sdhci .c可参考atmel_sdhci.c进行设计。

    MMC驱动包括2个核心函数,即atmel_sdhci_bindatmel_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测试命令的使用方法及执行结果示例。

    dtree命令列出了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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多