i.MX27支持8GBSDHC卡驱动修改

2023-05-16

最近需要给mx27加上SDHC驱动以支持SDHC的SD卡
网上许多关于2440支持SDHC的文章,借鉴很多,但是由于MX27驱动的特殊结构,需要做更多改动,详细如下:

平台wince6 R3

其实原理上都是一样:
1 使用SDBUS2驱动
2 底层增加对ResponseR7的支持

但是MX27驱动上有些特别的地方
首先是使用SDBUS2的驱动,我建议大家把这个驱动拷贝出来在bsp的drivers目录下编译,我觉得这样比较好,方便日后修改。
而且我重命名了SDBUS2的驱动
1 拷贝PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDBUS文件夹到bps的drivers目录
2 修改sources文件

  1. SYNCHRONIZE_BLOCK=1
  2. TARGETNAME=osdbus
  3. TARGETDEFNAME=SDBus2
  4. DEFFILE=$(TARGETDEFNAME).def
  5. TARGETTYPE=DYNLINK
  6. RELEASETYPE=PLATFORM
  7. DLLENTRY=_DllEntryCRTStartup
  8. SOURCES = sdbusreq.cpp /
  9.         sddevice.cpp /
  10.         sdbus.cpp /
  11.         sdslot.cpp /
  12.         sdclient.cpp /
  13.         sddevinf.cpp /
  14.         sdiofeat.cpp /
  15.         sdworki.cpp /
  16.         sddebug.cpp /
  17. TARGETLIBS=                                           /
  18.   $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/defbuslib.lib  /
  19.   $(_SYSGENSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib    /
  20.   $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/ceddk.lib  
复制代码
注意这里我将这个dll命名为 osdbus了,而不是sdbus或者sdbus2,以示区别

然后编译一下sdbus2目录,应该可以通过

2 在bsp的drivers目录的dirs下增加编译sdbus2目录,放在sdhc目录前面

3 修改PLATFORM/COMMON/SRC/SOC/FREESCALE/MX27_FSL_V1/DRIVERS/SDHC/sources文件
  1. TARGETNAME=sdhc_mx27_fsl_v1
  2. TARGETTYPE=LIBRARY
  3. INCLUDES= /
  4.     ../../inc; /
  5.     ../inc; /
  6.     $(_TARGETPLATROOT)/SRC/DRIVERS/sdbus2; /
  7.     ../../../common_fsl_v1/inc;
  8. CDEFINES=$(CDEFINES) -DCEDDK_USEDDKMACRO
  9. SOURCES = main.cpp /
  10.           sdcontrol.cpp
复制代码
这里主要将头文件目录改为$(_TARGETPLATROOT)/SRC/DRIVERS/sdbus2,而不是老的sdbus驱动

4 修改PLATFORM/COMMON/SRC/SOC/FREESCALE/MX27_FSL_V1/DRIVERS/INC/sdhc.h
  1. #include "SDCardDDK.h"
  2. //#include "sdbusdriver.h"
  3. #include "SDHCD.h"
复制代码
5 修改PLATFORM/COMMON/SRC/SOC/FREESCALE/MX27_FSL_V1/DRIVERS/SDHC/sdcontrol.cpp
  1. #include "csp.h"
  2. #include "sdhc.h"
  3. #include "sdbus.hpp"
  4. #include "sddevice.hpp"
复制代码
在SDHBusRequestHandler 函数中增加对ResponseR7的支持
  1. case ResponseR5:
  2.     case ResponseR6:
  3.     case ResponseR7: 
  4.         CSP_BITFINS(cmdatRegister, SDHC_CDC_FORMAT, 1);
复制代码
6 编译PLATFORM/COMMON/SRC/SOC/FREESCALE/MX27_FSL_V1/DRIVERS/SDHC目录
会发现有错误
原因在于sdcontrol.cpp中的SDControllerBusyWaitResponse函数中调用了
  1. cmdArg = (((DWORD)((SDDCGetClientDeviceFromHandle(pRequest->hDevice))->RelativeAddress)) << 16);
复制代码
这个函数的目的是查询卡的状态,等待卡busy结束,但是需要用到卡的地址
这里问题就来了,因为卡的地址(RCA)以前老的sdbus下是通过结构体获得的,现在新的sdbus2找不到这个结构体定义了,怎么把这个地址获得呢?
先考虑一个其他办法
把这个函数屏蔽掉

编译通过

7 修改PLATFORM/iMX27 ADS/SRC/DRIVERS/SDHC/sources文件
  1. SOURCELIBS= /
  2.      $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/sdcardlib.lib /
  3.      $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/sdhclib.lib /
  4.      $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/osdbus.lib /
  5.      $(_PLATCOMMONLIB)/$(_CPUINDPATH)/sdhc_mx27_fsl_v1.lib
复制代码
增加osdbus.lib,去掉sdbus.lib

8 编译PLATFORM/iMX27ADS/SRC/DRIVERS/SDHC通过

9 修改platform. bib,增加
  1. #if defined IMGSDBUS2
  2. ; @CESYSGEN IF CE_MODULES_SDBUS2
  3.    sdbus.dll      $(_FLATRELEASEDIR)/osdbus.dll                 NK  SHK
  4. ; @CESYSGEN ENDIF CE_MODULES_SDBUS2
  5. #else
  6. ; @CESYSGEN IF CE_MODULES_SDBUS
  7.    sdbus.dll      $(_FLATRELEASEDIR)/sdbus.dll                  NK  SHK
  8. ; @CESYSGEN ENDIF CE_MODULES_SDBUS
  9. #endif
复制代码
增加对新的sdbus驱动支持

10 在vs2005的项目 组件选择中,钩上
1.jpg 

11 sysgen一下

进入 系统会发现sdhc卡可以识别了,但是有一个问题,在写sdhc卡后经常出现死机

这时候我们需要回头修改下那个屏蔽的函数,就是说我们不能绕过等待卡busy的那个函数
关键问题就是如何获得 sd卡地址
大家看这个函数
sdcontrol.cpp中的SDHBusRequestHandler
这里是处理所有命令的地方
在sd卡识别流程过程中,在激活卡的时候会有这个命令SD_CMD_SELECT_DESELECT_CARD,这里会将RCA作为参数传递进来
到这里大家就了解了,只要我们在这里截获SD_CMD_SELECT_DESELECT_CARD的参数,我们就能获得RCA了
而且SDControllerBusyWaitResponse这个函数只有SDHBusRequestHandler会调用,而且条件是
  1. if((pController->LastResponedR1b == ResponseR1b) &&
  2.                                         (pRequest->TransferClass != SD_COMMAND))
  3.     {
  4.                 DEBUGMSG(ZONE_INFO, (TEXT("SDHBusRequestHandler: wait for busy!/r/n")));
  5.                 status = SDControllerBusyWaitResponse(pController);
  6.                 if(status != SD_API_STATUS_SUCCESS)
  7.                 {
  8.                         SDHCDIndicateBusRequestComplete(pController->pHCContext, pRequest, SD_API_STATUS_DEVICE_BUSY);
  9.                         return SD_API_STATUS_DEVICE_BUSY;
  10.                 }
  11.     }
复制代码
就是说在传输模式才会用这个函数
而SD_CMD_SELECT_DESELECT_CARD命令是进入传输模式的必经之路,所以可以在传输模式之前获得RCA
添加一个全局变量g_wRCA
修改SDHBusRequestHandler,在入口处增加
  1. if(0 == g_wRCA) {
  2.         if(SD_CMD_SELECT_DESELECT_CARD == pRequest->CommandCode) {
  3.             g_wRCA = (WORD)(((pRequest->CommandArgument) & 0xffff0000) >> 16);
  4.             RETAILMSG(1, (TEXT("SDHBusRequestHandler: Get RCA = 0x%X!/r/n"), g_wRCA));
  5.         }
  6.     }
复制代码
然后修改SDControllerBusyWaitResponse
  1. if(0 == g_wRCA) {
  2.         return SD_API_STATUS_SUCCESS;
  3.     }
  4.    // return status;
  5.     DEBUGMSG(ZONE_FUNCTION, (TEXT("+SDControllerBusyWaitResponse for SDHC/MMC Controller driver/r/n")));
  6.     retryCount = DEFAULT_BUS_REQUEST_RETRY_COUNT;
  7.     pRequest = SDHCDGetAndLockCurrentRequest(pHCDevice->pHCContext, 0);
  8.     cmdArg = g_wRCA << 16;
复制代码
别忘了还要去在适当的地方清楚RCA的值,因为你的SD卡槽可能会换SD卡
我是在SDCardDetectIstThread中加的
只要检测到SD卡中断,无论是插入还是拔出,都将g_wRCA清零
  1. if (WaitForSingleObject(hCardInsertInterruptEvent, INFINITE) != WAIT_OBJECT_0)
  2.         {
  3.             ERRORMSG(ZONE_ERROR, (TEXT("SDCardDetectIstThread: Wait Failed!/r/n")));
  4.             return 0;
  5.         }
  6.         g_wRCA = 0;  
复制代码
好了,所有的都重新编译,这下子就正常了

对于CE5应该也是差不多的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

i.MX27支持8GBSDHC卡驱动修改 的相关文章

  • 用css写进度条

    用css写进度条 我们平时写进度条一般是一个父div包裹一个子div xff0c 用js控制子div的宽度 实现进度条 xff0c 我们现在可以用css简单实现进度条了 代码如下 xff1a 在vue项目里咱们只需要控制数字就行了 xff0
  • SpringBoot集成SpringSecurity

    SpringSecurity 安全简介 在 Web 开发中 xff0c 安全一直是非常重要的一个方面 安全虽然属于应用的非功能性需求 xff0c 但是应该在应用开发的初期就考虑进来 如果在应用开发的后期才考虑安全的问题 xff0c 就可能陷
  • 【ElementUI】进度条 el-progress—进度圆环颜色、自定义文字

    圆环不显示 大概率是因为宽度没有设置 el progress width 100 圆圈背景色 lt el progress type 61 34 circle 34 percentage 61 34 20 34 class 61 34 pe
  • linux使用curl加双引号进行转义

    amp 是个特殊符号 xff0c 如果在控制台使用curl curl http 127 0 0 1 8089 ceshi startTime 61 2018 10 24 02 49 35 amp amp endTime 61 2018 10
  • qt程序的CMakeLists.txt配置转为平台的qt的.pro项目工程文件

    参考这个 跨平台qt程序的CMakeLists txt配置转为平台的qt的 pro项目工程文件 谁能懂我2011的博客 CSDN博客 一些比较正规的跨平台qt项目没有 pro项目文件只有CMakeLists txt文件 xff0c 如果要编
  • 单片机堆栈是什么?它的原理和作用又是什么?

    什么是单片机堆栈 xff1f 在片内RAM中 xff0c 常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出 LIFO FILO 的原则 这个RAM区叫堆栈 它的作用 子程序调用和中断服务时CPU自动将当前PC值压栈保存
  • IMU(陀螺仪、加速度计)&Magnetometer(磁力计)校准方法和流程

    一 何为校准 xff1a 校准的目的是因为厂商在生产器件时 xff0c 由于工艺 技术等原因 xff0c 致使器件存在缺陷 xff0c 导致实际应用时 xff0c 存在误差 xff01 一般器件在出厂时 xff0c 都会做一些校准处理 xf
  • matlab运行RTKDEMO几个小函数

    一 matlab函数 xff1a 1 datenum 将时间点转换为0000年1月0日到现在的天数 xff01 其中起点为 xff1a 0000年1月0日 例如 xff1a K gt gt t0 61 datenum 2005 4 2 0
  • 糖儿飞教你学C++ Socket网络编程——8. 异步通信版的TCP通信程序

    项目3 3中实现的通信程序仍然有很多不足 xff0c 最明显的不足是 xff0c 通信双方不能自动接收对方消息 xff0c 需要单击 接收 按钮才能接收 另外的问题是 xff0c 在服务器端单击 创建服务器 按钮后 xff0c 如果没有客户
  • VINS-Mono

    文章目录 初始化框架缺点ORB SLAM的Local Map VINS的滑窗 逐次逼近式去畸变给后端提供的特征点信息光流追踪对极约束F去除外点 rejectWithF 特征点均匀化预积分系统初始化初始化时不校正bias a误差卡尔曼滤波误差
  • python-异常

    https docs python org 3 library exceptions html 异常 程序在运行过程中 xff0c 不可避免的出现一些错误 没有赋值的变量使用了不存在的索引除0 这些错误在程序中 xff0c 称为异常程序运行
  • STM32CubeMX串口USART中断发送接收数据

    本文代码使用 HAL 库 文章目录 前言一 中断控制二 USART中断使用1 中断优先级设置 xff1a 2 使能中断3 使能UART的发送 接收中断4 中断收发函数5 中断处理函数6 中断收发回调函数 三 串口中断实验串口中断发送数据点亮
  • 关于gcc、make和CMake的区别

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • gcc与g++的区别

    一 编译的四个阶段 预处理 xff1a 编译处理宏定义等宏命令 xff08 eg define xff09 生成后缀为 i 的文件 编译 xff1a 将预处理后的文件转换成汇编语言 生成后缀为 s 的文件 汇编 xff1a 由汇编生成的文件
  • 网络编程第一篇之Select模式

    网络编程第一篇之Select模式 今天总结下Select模式下网络编程模型 xff0c 首先我们要知道一个高级的技术 xff0c 绝对不是凭空产生的 xff0c 它一定是在原来的技术上由于满足不了需求 xff0c 然后经过不断的打磨 xff
  • 佛学八正道

    八正道包括正见 正思惟 正语 正业 正命 正精进 正念 正定 大毘婆娑论 说 xff1a 由正见故 xff0c 起正思惟 xff1b 由正思惟故 xff0c 得正语 xff1b 由正语故 xff0c 复得正业 xff1b 由正业故 xff0
  • C语言疑难点汇总解析

    1 大小端知识点 1 1 大小端定义 1 Little Endian就是低位字节排放在内存的低地址端 xff0c 高位字节排放在内存的高地址端 2 Big Endian就是高位字节排放在内存的低地址端 xff0c 低位字节排放在内存的高地址
  • 常见硬件接口汇总(未完待续)

    1 UART 通用异步收发器 xff0c 用于收发数据的串并转换 2 I2C 双线串行接口 3 I3C 4 SCI SIM卡接口 xff0c 接在APB总线上 xff0c 用于与外部读卡器通信 实际也是串并转换的通信方式 5 CSI 6 P
  • 芯片的ATE测试简介

    ATE xff1a Automatic Test Equipment xff0c 即自动测试设备 xff0c 它用于芯片大规模生产测试 xff0c 保障稳健 xff08 质量 成本和进度 xff09 的供应 ATE测试基本的覆盖理念 xff
  • Android发展历程

    发展历程 2003年10月 xff0c Andy Rubin等人创建Android公司 xff0c 并组建Android团队 2005年8月17日 xff0c Google低调收购了成立仅22个月的高科技企业Android及其团队 安迪鲁宾

随机推荐

  • Android系统源码目录详解

    关于源码的阅读 xff0c 你可以访问 xff1a http androidxref com 我们要先了解Android系统源码目录 xff0c 为后期源码学习打下基础 当然 xff0c 最好是将源码下载下来 下载源码可以使用清华大学开源软
  • 使用Iperf工具测试WiFi的吞吐量

    1 windows 上测试网路吞吐量工具 对于window测试网络吞吐量的工具 http download csdn net download leekwen 3427386 iperf windows版测试软件 针对wifi性能进行测试
  • C++封装的HTTP和HTTPS的接口

    记录下http和https的post方法 在C 43 43 中实现 来源无从考究了 xff0c 这里记录一下 http 的post 方法 BOOL HttpPostToBusinessServer LPCTSTR serverAddr st
  • (*((volatile unsigned long *) 0xE0028000)) 作用小解

    define IO0PIN volatile unsigned long 0xE0028000 no in lpc210x 以此句为例 简述如下 与51单片机的头文件 lt reg51 h gt 类似 在ARM处理器中 也必须有自己的寄存器
  • (M052)利用PWM波实现LED灯亮度调节

    include lt stdio h gt include lt stdint h gt include 34 M051 h 34 include 34 Register Bit h 34 include 34 Common h 34 in
  • 网络调试助手TCP server不能成功连接

    正文 xff1a 在使用网络调试助手时 xff0c 想一个建立TCP server xff0c 一个建立TCP client xff0c 两者之间进行通信 xff0c 打开网络调试助手其默认读取本地IP地址 xff0c 而端口号默认为808
  • 单片机 GSM 模块应用

    如果你只要发送英文而已 xff0c 那你很幸运 xff0c 因为仅仅为了发送个字符而已是很简单的 TEXT模式满足你的要求 xff0c 但是不爽的是 xff0c 我的上司要求我要中文字符一起混发 xff0c 还好有unicode xff0c
  • OSInit()简介

    在uC OS II的学习中 xff0c OSInit 是一个重要的函数 xff0c 它在OS应用中的void main 函数中首先被调用 xff0c 是OS运行的第一个函数 如下程序 xff0c 它完成各初始变量的初始化 xff0c 建立任
  • OSStart()函数简介

    多任务的的启动是通过调用OSStart xff08 xff09 实现的 xff0c 而在启动uc os之前至少需要建立一个应用任务 OSStart xff08 xff09 函数源码 void OSStart void INT8U y INT
  • SMS编码之PDU – 接收短信篇

    上一篇文章简单介绍了下收发短信需要用到的AT指令 xff0c 这篇文章详细分析SMS编码中的PDU编码 首先我用测试手机向短信猫中的sim卡发送了两条短信 xff0c 内容分别为 xff1a Hello World Hello World
  • PDU短信发送与接收格式分析

    一 PDU发送和接收格式分析 PDU是大多数手机短信通讯的核心 xff0c 仅有少数手机只支持Text模式 PDU模式比起Text模式可以提供能为强大的功能 xff0c 但其编码较Text模式困难 无论哪种模式 xff0c 我们都可以通过A
  • ucos OSTimeDly

    来源 xff1a http blog sina com cn s blog 5f9b3de40100e182 html OSTimeDly 在Task中 xff0c 一般执行一段时间之后调用OSTimeDly推迟一段时间再继续运行 xff0
  • WinCE中断结构分析

    以前写的原创博文 xff0c 这里放一份 前一段时间研究了一下WinCE下的中断结构 xff0c 整理了一下 xff0c 希望与大家讨论 最下面有PDF版本下载 xff0c 便于保存 Windows Embedded CE 中断结构分析 关
  • Google chrome 中文版下载

    Google release了自己的浏览器Chrome xff0c 大家可以试试看 xff0c 我觉得还不错 xff0c 对Web2 0的支持还好 xff0c 不知道安全性如何 我发现看tudou和youku等视频有问题 内存占用太大了 x
  • (下载)WinCE注册表编辑器(PC端)

    可以在PC上通过ActiveSync来查看 xff0c 修改device端的注册表 xff0c 方便调试 http download csdn net source 749005 注 xff1a 本人提供的下载均不要资源点
  • (下载)WinCE镜像传输工具ESHELL

    WinCE镜像传输工具ESHELL 使用这个可以不用装PB也可以传输镜像 xff0c 其实就是一个TFTP的传输 xff0c 适用于CE5 xff0c CE6 http download csdn net source 835336 不用资
  • I/O的控制方式——查询,中断,dma

    早期 xff0c I O串行 xff0c 查询方式 发展 xff0c I O并行 xff0c 两种方式其一是中断方式 xff0c 其二是dma方式 xff0c 使得外部设备能直接与主存储器信息交换 xff0c 减轻了cpu的工作量 技术继续
  • 关于WinCE下MC55使用Unimodem进行GPRS拨号,拨上出现断开连接,检查波特率的问题的另一种可能情况

    http www armce com bbs thread 59 1 1 html
  • WinCE上BINFS实现详解

    作者 wwfiney 64 ARMCE 网上不少介绍三星24x0系列的BIN FS启动方式实现 xff0c 有些内容上描述的不是非常全面 下面就WinCE6上的BINFS实现 xff0c 从基本原理 到修改BSP xff0c 再到如何烧录启
  • i.MX27支持8GBSDHC卡驱动修改

    最近需要给mx27加上SDHC驱动 以支持SDHC的SD卡 网上许多关于2440支持SDHC的文章 xff0c 借鉴很多 xff0c 但是由于MX27驱动的特殊结构 xff0c 需要做更多改动 xff0c 详细如下 xff1a 平台 xff