CSDIOControllerBase类实现了主控制器驱动的硬件实现,定义了很多成员变量和函数,原型如下:
其中有几个纯虚函数是由继承类实现的(CSDIOController类,sdiocontroller.cpp)
virtual BOOL InitializeHardware( BOOL bOnPowerUp = FALSE ) = 0;
virtual void DeinitializeHardware( BOOL bOnPowerDown = FALSE ) = 0;
virtual BOOL CustomSetup( LPCTSTR pszRegistryPath ) = 0;
virtual BOOL IsCardWriteProtected() = 0;
virtual BOOL IsCardPresent() = 0;
下面我们来一一看看每个成员函数:
1.构造函数CSDIOControllerBase
初始化成员变量,大部分初始化为0或NULL,当前状态m_CurrentState设为Idle
2.~CSDIOControllerBase
未做任何工作.
3.PreDeinit
这个函数被SDH_PreDeinit调用,m_bDriverShutdown为FALSE时调用Deinitialize进行资源释放.
4.Initialize
该函数被SDHCDInitialize调用.
(1)设置crtical section临界访问,然后映射GPIO寄存器空SDI控制器,时钟能源管理寄存器,DMA控制器IO地址空间. 然后分配内存给DMA传输(64KB大小).
接着初始化寄存器
(2).MMC_Hardware_PowerUp设置CLKCONN使能SDI PCLK.
(3).设置GPIO寄存器使能SDI功能
(4).SetClockRate设置SDI时钟(100HZ)
(5).设置SDI寄存器模式,little edian,512 bytes per block,设置timeout,reset fifo
(6).创建SD卡检测事件m_hCardInsertInterruptEvent及线程SD_CardDetectThread
(7).创建接收应答事件m_hResponseReceivedEvent
(8).创建IST线程m_hSDIOInterruptThread处理SDIO数据传输中断事件m_hSDIOInterruptEvent,并初始化中断
(9).设置DMA传输中断事件m_hDMAInterruptEvent和线程m_hDMAInterruptThread
(10).调用继承类InitializeHardware函数.
(11).出错处理,调用Deinitialize
5.Deinitialize
Deinitialize用来关闭Initialize创建的事件IST线程,释放DMA buffer,关闭SDI power等
6.CancelIoHandler
CancelIoHandler被SDHCDCancelIoHandler调用.首先调用Stop_SDI_Hardware设置SDIDCON强制停止数据传输.调用SDHCDReleaseHCLock释放lock,最后调用SDHCDIndicateBusRequestComplete使用Cancel状态(SD_API_STATUS_CANCELED)来完成Bus请求.
7.SlotOptionHandler
CancelIoHandler被SDHCDSlotOptionHandler调用.Slot选项变化时该函数被调用.
(1)SDHCDSetSlotPower:设置slot power,因为系统一直工作在3.3V,不会变化,这里不做任何处理.
(2)SDHCDSetSlotInterface:设置slot接口模式,根据输入数据(pData)设置4bit还是1bit bus模式,调用SetClockRate设置SDI时钟频率.
(3)SDHCDEnableSDIOInterrupts:调用Enable_SDIO_Interrupts使能SDIO中断.
(4)SDHCDDisableSDIOInterrupts:调用Disable_SDIO_Interrupts禁止SDIO中断.
(5)SDHCDAckSDIOInterrupt:调用Ack_SDIO_Interrupts和InterruptDone(m_dwSDIOSysIntr)确认SDIO中断完成.
(6)SDHCDGetWriteProtectStatus:调用IsCardWriteProtected获得写保护状态.
(7)SDHCDQueryBlockCapability:查询Block性能参数.通过输入参数pData来获得ReadBlockSize,WriteBlockSize并根据设定的最大最小值进行修正.
(8)SDHCDGetSlotInfo:获得特定slot的信息.调用SDHCDSetSlotCapabilities等函数设置slot参数,如电压,时钟频率,上电延时等.
8.BusRequestHandler
BusRequestHandler被SDHCDBusRequestHandler调用,用来处理总线请求.
首先复位FIFO和状态寄存器,然后使能SDI CLOCK,
CSDIOControllerBase类实现了主控制器驱动的硬件实现
最新推荐文章于 2024-06-26 16:03:02 发布