linux下MMC/SD/SDIO驱动系列之三 ---- host注册过程(二)
2013-10-24 00:14
204 查看
上篇文章说到了探测函数sdhci_s3c_probe,现在就来仔细分析这个函数的作用
在分析代码之前,先简要的概括一下这个函数的功能:
1、既然是讲host的注册,那么首先必须构造出一个host,这个host就是通过sdhci_alloc_host函数来构造出来的,它是一个struct sdhci_host类型的结构体。同时,也通过mmc_alloc_host函数构造了一个struct mmc_host的结构体变量mmc。
2、初始化host的时钟,设置host的gpio等等其他一些“乱七八糟”的参数初始化(需要的时候再详细分析)。
3、通过sdhci_add_host函数来注册host。
下面重点来看sdhci_add_host函数
该函数主要是对mmc的注册,同样mmc也有很多的参数,先来看看他的操作函数集mmc->ops = &sdhci_ops
![](http://img.blog.csdn.net/20131021230556250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlld2VpaHVhMjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其中,request函数指针指向的函数用来处理host向从设备发送命令的请求,
set_ios用来设置电源、时钟等等之类(需要重点关注),
get_ro用来判断是否写保护
再来看该函数里面的中断注册部分
![](http://img.blog.csdn.net/20131024134921421)
我们先看一下mmc_add_host这个函数,它的功能就是通过device_add函数将设备注册进linux设备模型,最终的结果就是在sys/bus/platform/devices目录下能见到s3c-sdhci.1,s3c-sdhci.2,s3c-sdhci.3设备节点。
中断注册函_irq的第一个参数中断号就取自于s3c_device_hsmmc3.resource里面的irq参数,sdhci_irq就是中断服务程序,该中断函数一般在插卡、拔卡或者从设备反馈给host信息时会被调用数request
中断服务程序
![](http://img.blog.csdn.net/20131022135204687)
程序首先读取寄存器NORINTSTSn的值,该寄存器中有两个bit分别来表示卡的插入与拔出过程(注意,必须是动态变化过程,才会让相应的两个bit置1),那么接下来的if语句就是从该寄存器的那两个bit来判断是否有卡的插入或拔出,并同时清除这两个bit,准备下一次的检测,紧接着就调用中断的下半部分函数 sdhci_tasklet_card,其实这个函数也没做什么事情,就是判读如果此时有卡的话就通过mmc_detect_chang函数调用mmc_rescan函数。从这个函数的名字都可以猜出个八九不离十,它的功能就是扫描所插入的卡。
扫描卡的程序
![](http://img.blog.csdn.net/20131023234041828)
这个函数我们重点关注上述两个地方,其实真正的扫描动作发生在函数mmc_rescan_try_freq函数里面,该函数的第二个参数表示以什么样的频率去进行扫描,那么可选的频率值在那个数组freqs里面,一般当用某个频率值扫描成功后,就直接退出了,否则,会以下一个更低的频率值来扫描,笔者所使用的WIFI模块就是以400KHz的频率扫描成功的。
扫描过程
![](http://img.blog.csdn.net/20131024000504437)
该函数首先发送复位命令(不过该命令只有SDIO类型的卡才能够识别),然后发送CMD0,让设备进入IDLE模式,紧接着发送CMD8,获取该卡所支持的电压值,最后就是重点了(从1998-2003行),从所调用的各个函数名字可以看出,它是在试探该卡是否为SDIO? SD?
MMC?
那么接下来的文章就是要分析上面的三个函数,看它是如何识别SDIO、SD、MMC的
在分析代码之前,先简要的概括一下这个函数的功能:
1、既然是讲host的注册,那么首先必须构造出一个host,这个host就是通过sdhci_alloc_host函数来构造出来的,它是一个struct sdhci_host类型的结构体。同时,也通过mmc_alloc_host函数构造了一个struct mmc_host的结构体变量mmc。
2、初始化host的时钟,设置host的gpio等等其他一些“乱七八糟”的参数初始化(需要的时候再详细分析)。
3、通过sdhci_add_host函数来注册host。
下面重点来看sdhci_add_host函数
该函数主要是对mmc的注册,同样mmc也有很多的参数,先来看看他的操作函数集mmc->ops = &sdhci_ops
其中,request函数指针指向的函数用来处理host向从设备发送命令的请求,
set_ios用来设置电源、时钟等等之类(需要重点关注),
get_ro用来判断是否写保护
再来看该函数里面的中断注册部分
我们先看一下mmc_add_host这个函数,它的功能就是通过device_add函数将设备注册进linux设备模型,最终的结果就是在sys/bus/platform/devices目录下能见到s3c-sdhci.1,s3c-sdhci.2,s3c-sdhci.3设备节点。
中断注册函_irq的第一个参数中断号就取自于s3c_device_hsmmc3.resource里面的irq参数,sdhci_irq就是中断服务程序,该中断函数一般在插卡、拔卡或者从设备反馈给host信息时会被调用数request
中断服务程序
程序首先读取寄存器NORINTSTSn的值,该寄存器中有两个bit分别来表示卡的插入与拔出过程(注意,必须是动态变化过程,才会让相应的两个bit置1),那么接下来的if语句就是从该寄存器的那两个bit来判断是否有卡的插入或拔出,并同时清除这两个bit,准备下一次的检测,紧接着就调用中断的下半部分函数 sdhci_tasklet_card,其实这个函数也没做什么事情,就是判读如果此时有卡的话就通过mmc_detect_chang函数调用mmc_rescan函数。从这个函数的名字都可以猜出个八九不离十,它的功能就是扫描所插入的卡。
扫描卡的程序
这个函数我们重点关注上述两个地方,其实真正的扫描动作发生在函数mmc_rescan_try_freq函数里面,该函数的第二个参数表示以什么样的频率去进行扫描,那么可选的频率值在那个数组freqs里面,一般当用某个频率值扫描成功后,就直接退出了,否则,会以下一个更低的频率值来扫描,笔者所使用的WIFI模块就是以400KHz的频率扫描成功的。
扫描过程
该函数首先发送复位命令(不过该命令只有SDIO类型的卡才能够识别),然后发送CMD0,让设备进入IDLE模式,紧接着发送CMD8,获取该卡所支持的电压值,最后就是重点了(从1998-2003行),从所调用的各个函数名字可以看出,它是在试探该卡是否为SDIO? SD?
MMC?
那么接下来的文章就是要分析上面的三个函数,看它是如何识别SDIO、SD、MMC的
相关文章推荐
- linux下MMC/SD/SDIO驱动系列之二 ---- host注册过程(一)
- linux下MMC/SD/SDIO驱动系列之二 ---- host注册过程(一)
- linux下MMC/SD/SDIO驱动系列之二 ---- host注册过程(一)
- linux驱动由浅入深系列:驱动程序的基本结构概览之二(详解驱动注册过程)
- DELL R系列服务器网卡驱动升级过程
- platform_driver平台驱动注册和注销过程(上)
- V4L2 学习笔记1-驱动的注册过程1
- ath9K 驱动注册过程
- linux内核驱动--Platform Device和Platform_driver注册过程
- platform_driver平台驱动注册和注销过程
- Linux内核启动过程中注册platform驱动模型
- platform_driver平台驱动注册和注销过程(下)
- 从编译和链接来看kernel驱动注册的过程 .
- Linux驱动学习之---平台驱动的注册过程(转载)
- SDIO驱动(9)Host注册
- linux powerpc i2c驱动 之 i2c设备层的注册过程
- 从编译和链接来看kernel驱动注册的过程
- 从编译和链接来看kernel驱动注册的过程
- Linux AMBA设备驱动注册过程浅析
- Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程