亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sdio.c

?? AU1100嵌入式處理器SD卡驅(qū)動(dòng)程序源碼
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2002 BSQUARE Corporation.  All rights reserved.
//
// Module Name:
//
//    SDIO.c
//
// Abstract:
//
//    Au1100 SDIO controller driver implementation
//
// Notes:
//
///////////////////////////////////////////////////////////////////////////////

#include "sdcardddk.h"
#include "sdhcd.h"
#include "sdio.h"
#include <gpio.h>

    // clock rate table structure
typedef struct _CLOCK_RATE_ENTRY {
    DWORD  Frequency;
    USHORT ControlValue;
} CLOCK_RATE_ENTRY, *PCLOCK_RATE_ENTRY;

    // lookup table of some of the more useful SD clock frequencies
CLOCK_RATE_ENTRY SDIOClockTable[] = 
    
{       // FREQ                         Divisor    Rate assuming 50MHz MCLK
    {CONTROLLER_CLOCK_FREQUENCY/512,    511},   // 98 Khz 
    {CONTROLLER_CLOCK_FREQUENCY/256,    255},   // 195 Khz
    {CONTROLLER_CLOCK_FREQUENCY/128,    127},   // 391 Khz
    {CONTROLLER_CLOCK_FREQUENCY/64,     63},    // 781 Khz
    {CONTROLLER_CLOCK_FREQUENCY/32,     31},    // 1.5 Mhz
    {CONTROLLER_CLOCK_FREQUENCY/16,     15},    // 3.13 Mhz
    {CONTROLLER_CLOCK_FREQUENCY/8,      7},     // 6.25 Mhz
    {CONTROLLER_CLOCK_FREQUENCY/4,      3},     // 12.5 Mhz
    {CONTROLLER_CLOCK_FREQUENCY/2,      1},     // 25 Mhz
};

#define NUM_CLOCK_ENTRIES sizeof(SDIOClockTable)/sizeof(CLOCK_RATE_ENTRY)

// structure containing configuration information for each slot
typedef struct {
	ULONG SDPhysAddr;
	ULONG TxDmaDeviceId;
	ULONG RxDmaDeviceId;
} AUSDIO_CONFIG;

AUSDIO_CONFIG AuSdConfig[] = {
	{ SD0_PHYS_ADDR, DMA_SD0_TX, DMA_SD0_RX },
	{ SD1_PHYS_ADDR, DMA_SD1_TX, DMA_SD1_RX }
};



///////////////////////////////////////////////////////////////////////////////
//  ResetSlot - reset the slot to its initial state
//  Input:  pSlot -   slot context
//  Output: 
//  Return: 
///////////////////////////////////////////////////////////////////////////////
VOID ResetSlot(PSDIO_SLOT pSlot, BOOL IsInitPath)
{
	ULONG divisor = 0;
	ULONG config2 = 0;

	if (!IsInitPath)
    {
		config2 = READ_REGISTER_ULONG((PULONG)&pSlot->pSD->config2);
		divisor = READ_REGISTER_ULONG((PULONG)&pSlot->pSD->config);
		divisor &= SD_CONFIG_DIV;
	}

		// reset the controller
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->enable, 0);
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->enable, SD_ENABLE_CE);
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->enable, SD_ENABLE_R | SD_ENABLE_CE);

		// enable the state machines
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->config2, config2 | SD_CONFIG2_EN );
		// set the timeout to max
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->timeout, SD_TIMEOUT_MAX );
   
		// write clock
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->config, divisor | SD_CONFIG_DE);

		// Disable all interrupts
	SD_INTERRUPTS_DISABLE(pSlot,0xFFFFFFFF);
		// Clear interrupt status
	SD_INTERRUPTS_CLEAR(pSlot,0xFFFFFFFF);
		// Enable master inerrupt
	SD_INTERRUPTS_ENABLE(pSlot, SD_Int_Master );
}     

///////////////////////////////////////////////////////////////////////////////
//  DumpSlot - dump the states of the slot 
//  Input:  pSlot -   slot context
//  Output: 
//  Return: 
///////////////////////////////////////////////////////////////////////////////
VOID DumpSlot( PSDIO_SLOT pSlot )
{
    RETAILMSG(1,(TEXT("SDIO SLOT %d\r\n"),pSlot->SlotNumber));
    RETAILMSG(1,(TEXT("SD_CONFIG = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->config)));
    RETAILMSG(1,(TEXT("SD_ENABLE = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->enable)));
    RETAILMSG(1,(TEXT("SD_CONFIG2 = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->config2)));
    RETAILMSG(1,(TEXT("SD_BLKSIZE = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->blksize)));
    RETAILMSG(1,(TEXT("SD_STATUS = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->status)));
    RETAILMSG(1,(TEXT("SD_DEBUG = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->debug)));
    RETAILMSG(1,(TEXT("SD_CMD = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->cmd)));
    RETAILMSG(1,(TEXT("SD_CMDARG = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->cmdarg)));
    RETAILMSG(1,(TEXT("SD_TIMEOUT = 0x%08X\r\n"),READ_REGISTER_ULONG((PULONG)&pSlot->pSD->timeout)));

    if (NULL!=pSlot->pCurrentRequest) {
        RETAILMSG(1, (TEXT("pCurrentRequest->CommandCode = %d\r\n"),pSlot->pCurrentRequest->CommandCode));
        RETAILMSG(1, (TEXT("pCurrentRequest->NumBlocks = %d\r\n"),pSlot->pCurrentRequest->NumBlocks));
        RETAILMSG(1, (TEXT("pCurrentRequest->BlockSize = %d\r\n"),pSlot->pCurrentRequest->BlockSize));
        RETAILMSG(1, (TEXT("pCurrentRequest->HCParam = %d\r\n"),pSlot->pCurrentRequest->HCParam));
    }

    RETAILMSG(1,(TEXT("InterruptMask = 0x%08X\r\n"),pSlot->InterruptMask));
    RETAILMSG(1,(TEXT("CardPresent   = %d\r\n"),pSlot->CardPresent));
    RETAILMSG(1,(TEXT("CheckSlotOnStartUp = %d\r\n"),pSlot->CheckSlotOnStartUp));
    RETAILMSG(1,(TEXT("CardInitialised = %d\r\n"),pSlot->CardInitialised));
}

///////////////////////////////////////////////////////////////////////////////
//  DumpController - dump the states of the controller 
//  Input:  pController -   controller context
//  Output: 
//  Return: 
///////////////////////////////////////////////////////////////////////////////
VOID DumpController( PSDIO_HW_CONTEXT pController )
{
	int i;
	
	for (i=0;i<SDIOPlatNumSlots();i++) {
		DumpSlot(&pController->Slots[i]);
	}
}

///////////////////////////////////////////////////////////////////////////////
//  SDIOClockOff - turn off the SD clock
//  Input:  pSlot -   slot context
//  Output: 
//  Return: 
//  Notes:  Currently simply leave the clock along for now.
///////////////////////////////////////////////////////////////////////////////
VOID SDIOClockOff(PSDIO_SLOT pSlot)
{
	ULONG tmp;

	    // turn off the clock
	tmp = READ_REGISTER_ULONG((PULONG)&pSlot->pSD->enable);
	tmp &= ~SD_ENABLE_CE;
//	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->enable,tmp);

    DbgPrintZo(SDIO_CLOCK_ZONE, (TEXT("SDIOClockOff - Clock is now off \n")));
}

///////////////////////////////////////////////////////////////////////////////
//  SDIOClockOn - turn on the MMC Clock
//  Input:  pSlot -   slot context
//  Output: 
//  Return: 
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
VOID SDIOClockOn(PSDIO_SLOT pSlot)
{
	ULONG tmp;

	    // turn on the clock
	tmp = READ_REGISTER_ULONG((PULONG)&pSlot->pSD->enable);
	tmp |= SD_ENABLE_CE;
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->enable,tmp);

    DbgPrintZo(SDIO_CLOCK_ZONE, (TEXT("SDIOClockOn  - Clock is now on \n")));
}

///////////////////////////////////////////////////////////////////////////////
//  SDIOSetRate - sets rate of SD Clock
//  Input:  pSlot -   slot context
//          pRate - desired clock rate in Hz
//  Output: pRate - the clock rate now in use
//  Return: 
//  Notes:  Divisor could easily be calculated
///////////////////////////////////////////////////////////////////////////////
VOID SDIOSetRate(PSDIO_SLOT pSlot, PDWORD pRate)
{
    ULONG ii;           // table index variable
	ULONG regValue;		// temp register value

        // check to see if the rate is below the first entry in the table
    if (*pRate <= SDIOClockTable[0].Frequency) {
        ii = 0;
    } else {
            // scan through the table looking for a frequency that
            // is close to the requested rate
        for (ii = 0; ii < (NUM_CLOCK_ENTRIES - 1); ii++) {
            if ((*pRate >= SDIOClockTable[ii].Frequency) &&
                (*pRate < SDIOClockTable[ii+1].Frequency)) {
                break;
            } 
        }
    }

    DbgPrintZo(SDIO_CLOCK_ZONE, (TEXT("SDIOSetRate - Requested Rate: %d, Setting clock rate to %d Hz \n"),
           *pRate, SDIOClockTable[ii].Frequency ));

        // return the actual frequency
    *pRate = SDIOClockTable[ii].Frequency;
		// update the divisor setting
	regValue = READ_REGISTER_ULONG((PULONG)&pSlot->pSD->config );
        // clear old divisor
	regValue &= ~SD_CONFIG_DIV;
        // set new divisot
	regValue |= SDIOClockTable[ii].ControlValue;
	regValue |= SD_CONFIG_DE;
        // write new value back
	WRITE_REGISTER_ULONG((PULONG)&pSlot->pSD->config, regValue );
}

#ifdef USE_DMA
///////////////////////////////////////////////////////////////////////////////
//  CopyFromDmaBuffer - Copy data from a DMA buffer into a requests data buffer
//  Input:  pRequest   - the request that this data belongs to
//          pDmaBuffer - which buffer to copy from
//  Output: 
//  Return:
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
VOID CopyFromDmaBuffer(PSD_BUS_REQUEST pRequest,
                       PULONG          pDmaBuffer)
{
        // we are touching the block buffer, set the process permissions
    SD_SET_PROC_PERMISSIONS_FROM_REQUEST(pRequest) {
            // safe copy data into block buffer
        SDPerformSafeCopy(pRequest->pBlockBuffer+(pRequest->HCParam*pRequest->BlockSize),
                          pDmaBuffer, 
                          pRequest->BlockSize);
    } SD_RESTORE_PROC_PERMISSIONS();
}

///////////////////////////////////////////////////////////////////////////////
//  CopyToDmaBuffer - Copy data to a DMA buffer from a requests data buffer
//  Input:  pRequest   - the request that this data belongs to
//          pDmaBuffer - which buffer to copy to
//  Output: 
//  Return:
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
VOID CopyToDmaBuffer(PSD_BUS_REQUEST pRequest,
                     PULONG          pDmaBuffer)
{
        // we are touching the block buffer, set the process permissions
    SD_SET_PROC_PERMISSIONS_FROM_REQUEST(pRequest) {
            // safe copy data into block buffer
        SDPerformSafeCopy(pDmaBuffer,
                          pRequest->pBlockBuffer+(pRequest->HCParam*pRequest->BlockSize),
                          pRequest->BlockSize);
    } SD_RESTORE_PROC_PERMISSIONS();
}

///////////////////////////////////////////////////////////////////////////////
//  SDIOInitializeDMA - Initialize DMA resources for an SD slot
//  Input:  pSlot        - slot context
//  Output: 
//  Return:
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
BOOL SDIOInitializeDMA(PSDIO_SLOT pSlot)
{
    ULONG hwIntr;
    DWORD threadID;                         // thread ID

	// Allocate Tx DMA Channel
	pSlot->TxDmaChannel = HalAllocateDMAChannel();

	if (pSlot->TxDmaChannel==NULL) {
        DbgPrintZo(SDCARD_ZONE_ERROR,(TEXT("SDIO[%d]: Can't allocate Tx DMA Channel\r\n"),
                   pSlot->SlotNumber));
		goto ErrorReturn;
	}

	// Allocate Rx DMA Channel
	pSlot->RxDmaChannel = HalAllocateDMAChannel();

	if (pSlot->RxDmaChannel==NULL) {
        DbgPrintZo(SDCARD_ZONE_ERROR,(TEXT("SDIO[%d]: Can't allocate Rx DMA Channel\r\n"),
                   pSlot->SlotNumber));
		goto ErrorReturn;
	}

    pSlot->UsingDma = TRUE;

	// Initialize channels
	HalInitDmaChannel(pSlot->TxDmaChannel,
	                  AuSdConfig[pSlot->SlotNumber].TxDmaDeviceId,
	                  pSlot->DmaBufferSize,
					  TRUE);

	// Initialize channels
	HalInitDmaChannel(pSlot->RxDmaChannel,
	                  AuSdConfig[pSlot->SlotNumber].RxDmaDeviceId,
	                  pSlot->DmaBufferSize,
					  TRUE);

	HalSetDMAForReceive(pSlot->RxDmaChannel);

	// set up DMA interrupt
	hwIntr = HalGetDMAHwIntr(pSlot->TxDmaChannel);
	hwIntr |= (HalGetDMAHwIntr(pSlot->RxDmaChannel) << 8);

	RETAILMSG(1,(TEXT("SDIO Hooking HWINTR %08X\r\n"),hwIntr));

    pSlot->DmaSysIntr = InterruptConnect(Internal, 0, hwIntr, 0);
        
    if (SYSINTR_NOP==pSlot->DmaSysIntr) {
        DbgPrintZo(SDCARD_ZONE_ERROR,(TEXT("SDIO[%d]: Can't allocate DMA SYSINTR\r\n"),
                   pSlot->SlotNumber));
        goto ErrorReturn;
    }

	RETAILMSG(1,(TEXT("DmaSysIntr = %X\r\n"),pSlot->DmaSysIntr));

        // allocate the dma interrupt event
    pSlot->hDmaInterruptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    if (NULL == pSlot->hDmaInterruptEvent) {
        DbgPrintZo(SDCARD_ZONE_ERROR,(TEXT("SDIO[%d]: Can't create DMA interrupt event\r\n"),
                   pSlot->SlotNumber));
        goto ErrorReturn;
    }

    if (!InterruptInitialize(pSlot->DmaSysIntr,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人综合在线| 26uuu精品一区二区| 99r精品视频| 成人开心网精品视频| eeuss鲁片一区二区三区在线观看| 国产真实精品久久二三区| 六月丁香综合在线视频| 极品美女销魂一区二区三区| 精品一区二区久久| 狠狠色综合日日| 国产suv精品一区二区6| jiyouzz国产精品久久| 色偷偷一区二区三区| 欧美日韩亚洲综合| 欧美一三区三区四区免费在线看| 欧美情侣在线播放| 日韩欧美在线1卡| 久久午夜国产精品| 亚洲欧美一区二区视频| 一区二区三区中文字幕在线观看| 亚洲电影一区二区| 久久99热这里只有精品| 国产成人免费网站| 色8久久人人97超碰香蕉987| 欧美日韩中文字幕一区| 欧美一区二区黄| 国产无一区二区| 亚洲欧美偷拍卡通变态| 亚洲国产精品久久久久婷婷884| 日本美女视频一区二区| 国产91精品精华液一区二区三区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产精品一二一区| av不卡在线观看| 欧美日韩精品一二三区| 久久亚洲二区三区| 亚洲视频每日更新| 蜜桃av噜噜一区| 成人av一区二区三区| 欧美日韩黄色一区二区| 国产亚洲欧美色| 亚洲成人av电影在线| 国产成人亚洲综合a∨婷婷图片| 日本乱人伦aⅴ精品| 精品久久国产字幕高潮| 亚洲色图在线播放| 激情五月激情综合网| 91丨porny丨在线| 欧美va在线播放| 一区二区三区在线视频观看58| 麻豆久久一区二区| 91蝌蚪porny| 精品久久人人做人人爱| 亚洲一区二区三区四区的| 国产精品99久久久| 911国产精品| 亚洲欧洲综合另类在线| 国产精品中文有码| 欧美挠脚心视频网站| 日本一区二区三区在线观看| 日韩中文字幕91| 99re热这里只有精品免费视频 | 国产精品灌醉下药二区| 视频在线观看一区| 色婷婷综合久久久中文一区二区| 精品久久五月天| 午夜精品成人在线| 色视频成人在线观看免| 国产午夜精品一区二区三区嫩草 | 久久众筹精品私拍模特| 亚洲第一成年网| 91视频观看视频| 亚洲国产成人私人影院tom| 免费亚洲电影在线| 欧美日韩午夜影院| 一区二区在线免费观看| 成人午夜视频在线| 久久久久99精品国产片| 喷白浆一区二区| 欧美挠脚心视频网站| 一区二区成人在线| 91国产视频在线观看| 国产精品狼人久久影院观看方式| 国产一区二区在线影院| 精品欧美一区二区三区精品久久| 亚洲成人7777| 欧美日韩国产影片| 亚洲一区二区三区国产| 在线一区二区三区四区| 中文字幕一区二区三区四区| 成人伦理片在线| 中文一区在线播放| 粉嫩aⅴ一区二区三区四区五区| 精品免费国产二区三区| 久久精品国产秦先生| 日韩一区二区在线看片| 蜜桃久久精品一区二区| 91精品国产免费| 蜜桃视频一区二区三区在线观看| 日韩一级在线观看| 久草在线在线精品观看| 精品少妇一区二区三区免费观看| 美女脱光内衣内裤视频久久网站| 欧美一区二区在线免费观看| 日本欧美在线看| 日韩精品一区二区在线观看| 激情综合色综合久久综合| 日韩欧美123| 国产精品91xxx| 国产精品理论片在线观看| av成人动漫在线观看| 樱花影视一区二区| 欧美日韩一区二区三区四区五区 | av欧美精品.com| ...中文天堂在线一区| 91一区二区三区在线观看| 一区二区三区四区激情| 精品视频一区二区不卡| 日韩精品一卡二卡三卡四卡无卡| 日韩免费性生活视频播放| 国产剧情在线观看一区二区| 国产精品全国免费观看高清| 91一区二区三区在线播放| 亚洲电影视频在线| 精品国内片67194| 成人免费视频国产在线观看| 亚洲伦在线观看| 欧美精品123区| 国产自产v一区二区三区c| 欧美国产精品劲爆| 色狠狠一区二区| 日日骚欧美日韩| 26uuu久久综合| av在线播放一区二区三区| 亚洲一区二区三区四区在线观看| 日韩欧美在线综合网| 成人性生交大片免费| 亚洲第四色夜色| 久久久久久久免费视频了| jiyouzz国产精品久久| 五月天欧美精品| 久久久精品tv| 欧美视频一区在线| 精品一二三四在线| 亚洲精选一二三| 日韩一区二区三区视频| 成人h精品动漫一区二区三区| 午夜在线成人av| 国产精品天天摸av网| 欧美日韩大陆在线| 成人毛片在线观看| 日本不卡一二三| 亚洲素人一区二区| 日韩限制级电影在线观看| 99精品久久只有精品| 蜜臂av日日欢夜夜爽一区| 亚洲欧美日韩中文字幕一区二区三区| 91精品国产福利| 色婷婷av一区二区三区大白胸| 久久精品久久综合| 洋洋av久久久久久久一区| 久久蜜桃av一区二区天堂 | 伊人性伊人情综合网| 久久综合九色综合久久久精品综合| 91女厕偷拍女厕偷拍高清| 黑人巨大精品欧美一区| 亚洲一二三区在线观看| 日韩一区中文字幕| 久久先锋影音av鲁色资源网| 欧美精品第1页| 色哟哟精品一区| 国产91对白在线观看九色| 免费成人在线观看视频| 亚洲国产精品综合小说图片区| 国产欧美日本一区二区三区| 日韩一区二区在线观看视频| 91国模大尺度私拍在线视频| 国产a精品视频| 精品中文字幕一区二区小辣椒| 亚洲成av人片在线观看| 亚洲视频1区2区| 中日韩免费视频中文字幕| 精品区一区二区| 欧美一区二区三区婷婷月色| 欧美性猛交xxxxxx富婆| 99riav久久精品riav| 成人少妇影院yyyy| 成人免费不卡视频| 丁香激情综合国产| 国产一区二区网址| 国产一区二区女| 狠狠色综合播放一区二区| 琪琪久久久久日韩精品| 日韩国产精品大片| 丝袜美腿亚洲色图| 丝袜美腿成人在线| 视频精品一区二区| 日韩电影一区二区三区| 日本不卡一区二区三区| 视频一区在线播放|