详解linux 驱动编写(sd卡驱动)
随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多。那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的?
1、代码目录地址
drivers/mmc
2、基本结构
从mmc的代码结构可以看得出,主要分为两个部分,其中core为协议部分,host为各个soc的适配部分
host是我们需要真正关心的代码
3、以s3c为例,观察makefile
obj-$(CONFIG_MMC_SDHCI_S3C)+=sdhci-s3c.o ...... obj-$(CONFIG_MMC_S3C)+=s3cmci.o
4、根据s3c阅读Kconfig,确认s3c下的sd卡还依赖哪些文件
configMMC_SDHCI_S3C tristate"SDHCIsupportonSamsungS3CSoC" dependsonMMC_SDHCI&&PLAT_SAMSUNG help ThisselectstheSecureDigitalHostControllerInterface(SDHCI) oftenreferreredtoastheHSMMCblockinsomeoftheSamsungS3C rangeofSoC. Ifyouhaveacontrollerwiththisinterface,sayYorMhere. Ifunsure,sayN. configMMC_SDHCI_S3C_DMA bool"DMAsupportonS3CSDHCI" dependsonMMC_SDHCI_S3C help EnableDMAsupportontheSamsungS3CSDHCIglue.TheDMA hasprovedtobeproblematicifthecontrollerencounters certainerrors,andthusshouldbetreatedwithcare. YMMV. configMMC_S3C tristate"SamsungS3CSD/MMCCardInterfacesupport" dependsonARCH_S3C24XX dependsonS3C24XX_DMAC help ThisselectsadriverfortheMCIinterfacefoundin Samsung'sS3C2410,S3C2412,S3C2440,S3C2442CPUs. IfyouhaveaboardbasedononeofthoseandaMMC/SD slot,sayYorMhere. Ifunsure,sayN.
5、MMC_S3C和MMC_SDHCI_S3C是主要的macro,接着了解两个macro对应文件的数据结构
首先看一下s3cmci.c文件,
staticconststructmmc_host_opss3cmci_ops={ .request=s3cmci_request, .set_ios=s3cmci_set_ios, .get_ro=mmc_gpio_get_ro, .get_cd=mmc_gpio_get_cd, .enable_sdio_irq=s3cmci_enable_sdio_irq, };
再看一下sdhci-s3c.c文件,
staticstructsdhci_opssdhci_s3c_ops={ .get_max_clock=sdhci_s3c_get_max_clk, .set_clock=sdhci_s3c_set_clock, .get_min_clock=sdhci_s3c_get_min_clock, .set_bus_width=sdhci_set_bus_width, .reset=sdhci_reset, .set_uhs_signaling=sdhci_set_uhs_signaling, };
6、从host角度来说,有了platformdriver和上面的hostdriver,驱动流程就算搞清楚了。
但是如果深入下去的话,还是需要好好读一下sd协议,这里面花的时间最多。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。