//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
// (C) Copyright 2006 Marvell International Ltd.
// All Rights Reserved
//
//
// Copyright (c) 2002 BSQUARE Corporation. All rights reserved.
// DO NOT REMOVE --- BEGIN EXTERNALLY DEVELOPED SOURCE CODE ID 40973--- DO NOT REMOVE
//
// Module Name:
//
// SDControl.c
//
// Abstract:
//
// PXA SDIO controller implementation
//
// Notes:
//
///////////////////////////////////////////////////////////////////////////////
//#define EXTENSIVE_DEBUGGING
#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include "SD.h"
#if(CEATA_CCS_MODE)
HANDLE hCEATACCSIntrEvent;
XLLP_UINT32_T CCSStatus;
#define SYSINTR_CEATACCS 21
#endif
#define DMA_TEST_MODE
#ifdef DMA_TEST_MODE
#include "xllp_dmac.h"
#include "dmawince.h"
//#include <monahans_base_regs.h>
//#include <monahans_mmc.h>
//#define PAGE_SIZE 0x1000 // ?? Put this is drvglob.h ?? // See ceddk.h
#define TRANSFER_BUF_SIZE ( 2 * 16 * 0x400) // 32KB. Good to be multiple of 4KB, the PAGE_SIZE.
// Double buffering used for Xmt and Rcv.
#define NUM_DESC 0x10 // Desc in a Xmt or Rcv chain
//#define NUM_SDIO_XMT_DESC (2 * NUM_DESC) // Two Xmt Desc chains
//#define NUM_SDIO_RCV_DESC (2 * NUM_DESC) // Two Rcv Desc chains
#define NUM_SDIO_XR_DESC (2 * NUM_DESC) // Two Desc chains. Xmt or Rcv, but never both.
#define SIZE_SDIO_DESC sizeof(XLLP_DMAC_DESCRIPTOR_T)
#define TOTAL_BUF_SIZE (( NUM_SDIO_XR_DESC * SIZE_SDIO_DESC) + TRANSFER_BUF_SIZE )
typedef enum
{
XMT_SDIO,
RCV_SDIO
} SDIOTRANFER;
typedef struct _NextXRBuffers
{
volatile XLLP_DMAC_DESCRIPTOR_T *pVirtDescriptor; // Descriptor Virt Start Addr.
P_XLLP_DMAC_DESCRIPTOR_T pPhysDescriptor; // Descriptor Phys Start Addr.
P_XLLP_INT8_T pStartVirtDataBuffer; //
P_XLLP_INT8_T pStartPhysDataBuffer; //
XLLP_UINT32_T Length; // Bytes specified in Desc chain transfer.
BOOL MoreDataToTransfer;
} NextXRBuffers;
typedef struct _SDHCDmacDescriptor{
XLLP_DMAC_CHANNEL_T RcvChannel ;
XLLP_DMAC_CHANNEL_T XmtChannel ;
HANDLE DMATxEventHandle ;
HANDLE DMARxEventHandle ;
P_XLLP_DMAC_T pDMACHandle ;
XLLP_DMAC_DESCRIPTOR_T *pDescVirtXR ; // Used for both Xmt and Rcv.
P_XLLP_DMAC_DESCRIPTOR_T pDescPhysXR ; // SD/SDIO bus is simplex.
// Buffer pointers for use with HalAllocateCommonBuffer(...)
PHYSICAL_ADDRESS PhysAdr_HalAlloComBuf;
P_XLLP_UINT8_T VirtAdr_HalAlloComBuf;
NextXRBuffers NextTransfer[2]; // Double buffering for Xmt and Rcv DMA.
ULONG i_NT; // Index for NextTransfer array.
ULONG CommittedToRcvNT; // Total Rcv bytes spec'd in current descriptor set.
_TCHAR DMAEventName[20]; //
//other configures to replace hard code
XLLP_DMAC_DRCMR_T rxChannel, txChannel;
}SDHCDmacDescriptor, * PSDHCDmacDescriptor;
//static SDHCDmacDescriptor SDHCDmacDscr;
#endif //end #ifdef DMA_TEST_MODE
// prototypes
DWORD SDControllerIstThread(PSDH_HARDWARE_CONTEXT pHCDevice);
#ifndef DDEBUG
void DumpRegisters(PSDH_HARDWARE_CONTEXT pController) {}
void DumpGPIORegisters(PSDH_HARDWARE_CONTEXT pController) {}
#endif
#ifdef DEBUG
#define HEXBUFSIZE 1024
char szHexBuf[HEXBUFSIZE];
#define TRANSFER_SIZE(pRequest) ((pRequest)->BlockSize * (pRequest)->NumBlocks)
char* HexDisplay(PSD_BUS_REQUEST pRequest, BYTE *pBuffer, DWORD dwLength )
{
DWORD dwTemp = 0;
// we are touching the block buffer, we must set the process permissions
SD_SET_PROC_PERMISSIONS_FROM_REQUEST(pRequest) {
while( dwTemp < dwLength && (dwTemp < (HEXBUFSIZE / 2 - 1) ) )
{
szHexBuf[dwTemp*2] = pBuffer[dwTemp] / 16;
szHexBuf[dwTemp*2+1] = pBuffer[dwTemp] % 16;
if( szHexBuf[dwTemp*2] < 10 )
szHexBuf[dwTemp*2] += '0';
else
szHexBuf[dwTemp*2] += 'a' - 10;
if( szHexBuf[dwTemp*2+1] < 10 )
szHexBuf[dwTemp*2+1] += '0';
else
szHexBuf[dwTemp*2+1] += 'a' - 10;
dwTemp++;
}
} SD_RESTORE_PROC_PERMISSIONS();
szHexBuf[dwTemp*2] = 0;
return szHexBuf;
}
#endif
__inline void WRITE_MMC_REGISTER_DWORD(PSDH_HARDWARE_CONTEXT pHc, DWORD RegOffset, DWORD Value)
{
BYTE *pRegBaseAddr, *regAddr;
volatile DWORD *pdwRegAddr;
pRegBaseAddr = (BYTE*)(pHc->pSDMMCRegisters);
regAddr = pRegBaseAddr + RegOffset;
pdwRegAddr = (DWORD*)regAddr;
*pdwRegAddr = Value;
}
__inline DWORD READ_MMC_REGISTER_DWORD(PSDH_HARDWARE_CONTEXT pHc, DWORD RegOffset)
{
BYTE *pRegBaseAddr, *regAddr;
volatile DWORD *pdwRegAddr;
pRegBaseAddr = (BYTE*)(pHc->pSDMMCRegisters);
regAddr = pRegBaseAddr + RegOffset;
pdwRegAddr = (DWORD*)regAddr;
return (*pdwRegAddr);
}
#define IS_PROGRAM_DONE(pHc) (READ_MMC_REGISTER_DWORD((pHc), MMC_STAT) & MMC_STAT_PROGRAM_DONE)
#define IS_TRANSFER_DONE(pHc) (READ_MMC_REGISTER_DWORD((pHc), MMC_STAT) & MMC_STAT_DATA_TRANSFER_DONE)
//#define RX_FIFO_FULL(pHc) (READ_MMC_REGISTER_DWORD((pHc), MMC_STAT) & MMC_STAT_RCV_FIFO_FULL)
//#define TX_FIFO_EMPTY(pHc) (READ_MMC_REGISTER_DWORD((pHc), MMC_STAT) & MMC_STAT_XMIT_FIFO_EMPTY)
#define TRANSFER_IS_WRITE(pRequest) ((SD_WRITE == (pRequest)->TransferClass))
#define TRANSFER_IS_READ(pRequest) ((SD_READ == (pRequest)->TransferClass))
BOOL CLOCK_IS_ON(PSDH_HARDWARE_CONTEXT pHc)
{
if( READ_MMC_REGISTER_DWORD( pHc, MMC_STAT ) & MMC_STAT_CLOCK_ENABLED )
{
return TRUE;
}
else
{
return FALSE;
}
}
__inline void READ_MOD_WRITE_MMC_REGISTER_AND_OR(PSDH_HARDWARE_CONTEXT pHc, DWORD RegOffset, DWORD AndValue, DWORD OrValue)
{
DWORD regValue;
regValue = READ_MMC_REGISTER_DWORD(pHc, RegOffset);
regValue &= (AndValue);
regValue |= (OrValue);
DEBUGMSG(SDCARD_ZONE_INFO, (TEXT("SHCDriver: - Setting MMC Reg 0x%x to 0x%x\r\n"), RegOffset, regValue));
WRITE_MMC_REGISTER_DWORD(pHc, RegOffset, regValue);
}
__inline void WRITE_MMC_IMASK_DWORD(PSDH_HARDWARE_CONTEXT pHc, DWORD Value)
{
EnterCriticalSection(&(pHc->intrRegCriticalSection));
WRITE_MMC_REGISTER_DWORD( pHc, MMC_IMASK, Value);
LeaveCriticalSection(&(pHc->intrRegCriticalSection));
}
__inline DWORD READ_MMC_IMASK_DWORD(PSDH_HARDWARE_CONTEXT pHc)
{
DWORD dwRetVal;
EnterCriticalSection(&(pHc->intrRegCriticalSection));
dwRetVal = READ_MMC_REGISTER_DWORD( pHc, MMC_IMASK );
LeaveCriticalSection(&(pHc->intrRegCriticalSection));
return dwRetVal;
}
__inline void READ_MOD_WRITE_MMC_IMASK_AND_OR(PSDH_HARDWARE_CONTEXT pHc, DWORD AndValue, DWORD OrValue)
{
EnterCriticalSection(&(pHc->intrRegCriticalSection));
READ_MOD_WRITE_MMC_REGISTER_AND_OR( pHc, MMC_IMASK, AndValue, OrValue );
LeaveCriticalSection(&(pHc->intrRegCriticalSection));
}
#define CLOCK_OFF_INTERRUPT_OFF(pHc) \
READ_MOD_WRITE_MMC_IMASK_AND_OR(pHc, 0xffffffff, MMC_IMASK_CLOCK_OFF_INT_MASKED)
// macro to turn SDIO interrupts on
#define SDIO_INTERRUPT_ON(pHc) \
READ_MOD_WRITE_MMC_IMASK_AND_OR(pHc, ~MMC_IMASK_SDIO_INT_MASKED, 0)
// macro to turn SDIO interrupts off
#define SDIO_INTERRUPT_OFF(pHc) \
READ_MOD_WRITE_MMC_IMASK_AND_OR(pHc, 0xffffffff, MMC_IMASK_SDIO_INT_MASKED)
// macro to turn RX FIFO interrupts on
#define RX_FIFO_INTERRUPT_ON(p
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
公司WINCE产品源码!!!!PXA310 BSP是MARVELL公司的PXA310的BSP和文档 (1139个子文件)
usb20fn.cpp.bak 87KB
Zylonite_mhlv.bat 16KB
oemguids.bat 3KB
oemguids.bat 3KB
CLEAN.BAT 2KB
postmakeimg.bat 2KB
MakeNKImg.bat 2KB
cebasecesysgen_cebase.bat 2KB
cebasecesysgen_smartfon.bat 2KB
cebasecesysgen_wpc.bat 2KB
cebasecesysgen_uldr.bat 2KB
cebasecesysgen.bat 899B
platform.bib 20KB
config.bib 5KB
secure_eboot.bib 5KB
eboot.bib 4KB
ipl.bib 4KB
MHLV_wince_NTOBM_128MBDDR.bin 24KB
MHLV_wince_NTOBM.bin 24KB
NTIM_LV.bin 236B
update.bmp 225KB
coldboot.bmp 225KB
poweron.bmp 225KB
sdcontrol.c 128KB
nandStore.c 81KB
xllp_ethernet.c 79KB
xllp_dfc.c 74KB
xllp_ov7660_hw.c 69KB
fmd.c 69KB
MenuTest.c 67KB
ioctl.c 63KB
blcommon.c 59KB
rndis_pdd.c 56KB
prm_registration.c 56KB
xllp_wm9713.c 53KB
dmawince.c 50KB
flash.c 48KB
xllp_mfp.c 47KB
blcommon.c 42KB
GPX_Driver.c 38KB
kitleth.c 38KB
pxa_usbserkitl.c 38KB
dbgioctls.c 38KB
main.c 37KB
xllp_gpio.c 35KB
dma.c 35KB
xllp_udc.c 34KB
xllp_ci.c 34KB
off.c 32KB
IPM_DFM.c 31KB
ipm_api.c 31KB
IPM_LPM.c 30KB
xllp_lcd_cpu.c 29KB
sample_ipm_client.c 29KB
xllp_adcm2650_hw.c 28KB
main.c 26KB
MenuMain.c 25KB
one_wire_mp.c 24KB
qci.c 24KB
intr.c 22KB
xllp_u2d.c 22KB
xllp_dfc_platform.c 22KB
xllp_mmc_board.c 21KB
fmdutil.c 20KB
xllp_mmc_controller.c 20KB
keypad.c 19KB
aclink.c 19KB
xllp_usbotg_zylonite.c 18KB
SDMMC.c 18KB
xllp_keypad_plat.c 18KB
impl.c 17KB
xllp_lcd_smart.c 17KB
xllp_ac97acodec.c 17KB
battery_pdd.c 17KB
xllp_lcd_zl_vga_qvga_oled.c 17KB
xllp_lcd_common.c 17KB
xllp_dmac.c 17KB
PMU.c 17KB
kitlusbserial.c 16KB
MenuBSPArg.c 16KB
dispdrvr.c 16KB
FAT.c 15KB
pwrbutton.c 15KB
dma.c 15KB
xllp_lcd_tft.c 14KB
xllp_ov2630.c 14KB
reloc.c 14KB
kitlserial.c 14KB
xllp_ov7660.c 14KB
xllp_ov2630_hw.c 13KB
xllp_uart_plat.c 13KB
init.c 13KB
xllp_usbohci.c 13KB
pwrbutton.c 13KB
idle.c 12KB
xllp_adcm2650.c 12KB
PMUIISR.c 12KB
dbgserial.c 12KB
auxdisp_drv.c 11KB
rtc.c 11KB
共 1139 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
- rxylinux2011-12-19资源不错,能用 不过移植的时候要根据自己的板子在做相应的调整。
sunboyljp
- 粉丝: 42
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功