问题描述
最近在搞SD卡相关的东西,按说高通平台的SD卡相关的东西都采用源生的配置,不会有什么问题。毕竟硬件电路是采用源生的设计方案。可是插入SD卡一直无法识别。自己稀里糊涂的又把检测流程看了一下,配置应该没啥问题啊。咋就检测不到呢,于是拿着卡托和SD卡在开发机器上试验了一下。咦,貌似拔出SD卡弹出了提示界面。心里大致有个数。上代码。哈哈
问题跟踪
以8953为例,sd卡的配置文件在msm8953-qrd.dtsi中 sdhc_2为SD卡的配置。
&sdhc_2 {
/* device core power supply */
vdd-supply = <&pm8953_l11>; //选择ldo11 为供电电源
qcom,vdd-voltage-level = <2950000 2950000>; //设置电压范围
qcom,vdd-current-level = <15000 800000>; //电流范围
/* device communication power supply */
vdd-io-supply = <&pm8953_l12>;
qcom,vdd-io-voltage-level = <1800000 2950000>;
qcom,vdd-io-current-level = <200 22000>;
pinctrl-names = "active", "sleep";
pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; //配置pinctrl
pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>;
#address-cells = <0>;
interrupt-parent = <&sdhc_2>;
interrupts = <0 1 2>;
#interrupt-cells = <1>;
interrupt-map-mask = <0xffffffff>;
interrupt-map = <0 &intc 0 125 0
1 &intc 0 221 0
2 &tlmm 133 0>;
interrupt-names = "hc_irq", "pwr_irq", "status_irq";
cd-gpios = <&tlmm 133 0x1>; //设置SD卡探测引脚 实现热插拔功能
qcom,clk-rates = <400000 20000000 25000000 50000000 100000000
200000000>;
qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104";
status = "ok";
};
在其他博客上看过一篇文章,描述如下;
// cd-gpios这个属性名的定义取决于host driver将cd gpio定义成了什么名字
// tlmm,也就是要使用的GPIO所使用的gpio controller
// 133:sd card的cd引脚连接到GPIO133上
// 0x01:取决于host driver如何解释这个flag的,一般来说,0x01表示低电平有card插入,0x00则表示高电平有card插入
高通默认的是检测低电平,但是用万用表量了一下检测引脚,发现插入SD卡后显示是高电平,于是可以肯定是这里问题。后来编译测试
问题解决了。
其实高通文档也有讲解 KBA-160615040708
简述一下检测流程。
在开机过程中,mmc core会扫描mmc总线 即去检测SD卡卡槽有没有插入。
sd card的插入或者拔出可以触发某个GPIO产生中断。
此时,可以在中断处理中调用mmc_detect_change来进行扫描mmc硬件总线,并且根据总线上的card状态变化进行处理。
{
/* Schedule a card detection after a debounce timeout */
struct mmc_host *host = dev_id;
host->trigger_card_event = true;
mmc_detect_change(host, msecs_to_jiffies(1000));
return IRQ_HANDLED;
}
void mmc_detect_change(struct mmc_host *host, unsigned long delay)
{
_mmc_detect_change(host, delay, true);
}
EXPORT_SYMBOL(mmc_detect_change);
通过调用mmc_detect_change和执行host->detect工作来发起mmc硬件总线的扫描