Android N SD卡不识别问题

问题描述

     最近在搞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状态变化进行处理。

       static irqreturn_t mmc_gpio_cd_irqt(int irq, void *dev_id)
       {
     /* 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硬件总线的扫描

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值