MTK平台SD热插拔相关设置以及问题解决

本文解决MTK6735平台SD卡无法热插拔的问题,通过分析驱动函数及硬件设计,调整GPIO设置及中断触发方式,最终实现SD卡热插拔功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MTK6735/53平台项目添加SD卡的热插拔功能
测试报出的bug是SD卡无法进行热插拔,只能在通过重启之后才能读取到SD卡的信息。
根据读取相应的平台手册,找到了一些相应的设置方法,在根据文档设定完dws文件的设置之后,发现仍然不能进行热插拔的动作,之后开始分析情况。
首先,考虑到SD卡能够在重启之后进行读取,则排除了SD卡无法读取方面的相关问题。分析得出是没有生成中断,造成无法识别到SD卡。在查看相应驱动函数,也就是函数中的处理中断和申请中断的函数后,发现中断已经生成,并且中断处理函数也在执行之中。
之后,在对检测口的GPIO进行手动赋值,在设置为低电平有效的情况,向GPIO79口写入低电平的时候,SD卡能够在系统中进行识别,但是仍然无法进行热插拔检测。同时,在检测GPIO79口的状态的时候,看到开机之后保持的是低电平状态,无法通过插拔SD卡进行改变,这说明了中断正常,但是GPIO口有异常,怀疑是GPIO口的设置有问题或者是硬件设计时,gpio79口本身是不支持中断。

*MTK平台SD卡相关设置
1.dws文件中,首先需要去设置对应的GPIO口,需要将对应的GPIO口设定成中断口,同时在中断设定的界面中,需要需要设置中断的名称,去抖动时间,还有触发的方式。
2.针对MTK平台对于SD卡热插拔,在MTK说明文档中,设定了一个热插拔的标志位,这个标志位是MSDC_CD_PIN_EN和MSDC_REMOVABLE,这两个标志位的设置是在
myandroid/CB04/kernel-3.10/drivers/misc/mediatek/mach/mt6735/cb04_6753/core/board.c中的struct msdc_hw msdc1_hw这个结构体。*

**MTK平台SD驱动相关函数分析**

static irqreturn_t msdc1_eint_handler(void)
这个函数的作用是用在热插拔的时候,对于中断的处理函数,其中主要是用来检测SD的状态,同时设置相应的电平触发方式。

static void msdc_enable_cd_irq(struct msdc_host *host, int enable)
这个函数的作用是用来使能中断。通过读取dws文件来读取中断GPIO号和去抖动的延迟时间,同时来设置触发中断的方式,并且申请中断request_irq

关于ADAS项目中SD卡热插拔问题所出现的电平相反的问题
通过硬件分析,得出的结果是在项目中的SD卡的卡槽与其他项目的不同,是在插入SD卡的时候,电平由低电平变成高电平。也就是中断触发的方式是高电平触发,但是在程序中,还是以低电平触发方式,因此,需要对程序中的电平触发方式进行修改。
在项目所在的dws文件中,需要对中断中触发的电平进行设置,要将低电平触发改成高电平触发。
后在进行编译调试之后,发现仍然无法对卡进行识别,因此通过log对代码的执行情况进行调查。发现在程序中设置的电平中断的触发方式的设置仍然是低电平触发,但是没有在当前程序中找到设置电平触发的参数。
之后找到函数初始化函数进行查找,根据追踪的信息,找到了设置电平触发的结构体,进行了相应的修改,之后项目板则可以进行相应的热插拔工作。

**相关文件以及函数说明:
1.ADAS项目的dws文件
kernel-3.10\drivers\misc\mediatek\mach\mt6735\(项目名称)\dct\dct\codegen.dws
2.函数数据结构体文件,在其中修改热插拔的相关文件,以及中断的电平触发方式
kernel-3.10/drivers/misc/mediatek/mach/mt6735/cb04_6753/core/board.c**

<think>嗯,用户想了解在MTK平台上如何禁用SIM卡的热插拔功能。首先,我需要回忆一下MTK相关的配置方法。根据之前的资料,记得热插拔的启用或禁用可能涉及到NV配置项,比如NV70210,这个参数可能控制热插拔的开关。不过需要确认MTK平台是否也使用类似的NV项。 然后,用户提到的参考引用里提到NV70210用于启用或禁用热插拔,所以这可能是一个关键点。但MTK和Qualcomm平台可能有不同的NV编号,所以需要确认MTK对应的NV项是否正确。比如,是否MTK使用不同的NV参数,比如NVXXXX之类的编号。 另外,初始化流程中提到的SIM卡轮询方式,如果不支持热插拔,modem启动时会通过轮询来检测SIM卡状态。所以禁用热插拔可能需要设置相关NV值,让modem不检测热插拔事件,而是固定检查SIM卡的存在。 可能还需要考虑软件防抖的配置,虽然那主要是防抖而非禁用热插拔本身,但可能与热插拔功能相关。比如,防抖的NV设置是否会影响热插拔的启用状态。 还有,用户的问题是关于MTK平台的,可能需要查找MTK特定的文档或配置指南。例如,MTK的modem配置中是否有类似的热插拔开关,或者工程模式中的设置项。 另外,考虑双卡的情况,NV4398可能代表单双卡配置,但用户的问题主要是热插拔,所以可能需要区分这两个设置。但需要确保在修改热插拔设置时,不影响单双卡的其他配置。 总结步骤可能包括:1. 找到MTK平台对应的热插拔NV配置项,比如NV70210是否适用,或者是否有其他编号;2. 修改该NV值为禁用状态;3. 调整modem初始化流程,避免检测热插拔事件;4. 验证配置后重新编译并测试。 同时,需要提醒用户修改NV参数的风险,建议在工程模式下操作,或联系MTK技术支持获取准确信息,因为不同平台可能有差异。</think>根据MTK平台SIM卡热插拔配置的实现机制,禁用方法主要通过以下步骤实现: ### 一、核心配置方法 1. **NV参数控制**: - 修改`NV70210`参数值为0可禁用热插拔功能,该NV项对应热插拔使能开关[^1] - 验证命令示例: ```bash adb shell echo 0 > /sys/devices/platform/mtk-sim/hotswap_enable ``` 2. **硬件寄存器配置**: ```c // 在modem代码中设置寄存器 SET_REG_BIT(0x70030000, 12, 0); // 关闭GPIO12中断检测 ``` ### 二、系统初始化流程修改 1. **UIM驱动层调整**: - 注释热插拔检测线程: ```c // pthread_create(&hotplug_thread, NULL, sim_hotplug_monitor, NULL); ``` - 强制设定卡槽状态: ```c sim_slot_status = SIM_SLOT_FIXED; ``` 2. **MMGSDI配置**: - 在`mmgsdi_session_activate()`函数中增加过滤条件: ```c if(nv_get(70210) == 0) { disable_hotswap_handlers(); } ``` ### 三、编译验证 1. 使用工程模式工具检查NV值: ```bash engmode -s nv_read 70210 ``` 2. 通过QXDM工具抓取初始化日志,确认无`HOTSWAP_DETECTED`事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值