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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sdio.c

?? linux下SDIO的驅動,請查看具體代碼內容.
?? C
?? 第 1 頁 / 共 5 頁
字號:
///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2002,2004-2005 BSQUARE Corporation.  All rights reserved.
//
// Module Name:
//
//    SDIO.c
//
// Abstract:
//
//    Au1100 SDIO controller driver implementation
//
// Notes:
//
///////////////////////////////////////////////////////////////////////////////

#include <windows.h>	// For min() macro
#include <sdcardddk.h>
#include <sdhcd.h>
#include "sdio.h"
#include "gpio.h"

typedef struct {
	ULONG	BlocksCopied;
	ULONG   BytesCopied;
	ULONG   BuffersOutstanding;
} HC_PARAMS, *PHC_PARAMS;

static HC_PARAMS HCParams;

    // 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/3,      2},     // 16.6 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);

    DEBUGMSG(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);

    DEBUGMSG(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;
            } 
        }
    }

    DEBUGMSG(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)
{
	ULONG blocksToCopy;
	ULONG blocksRemaining;
	
	blocksRemaining = pRequest->NumBlocks - ((PHC_PARAMS)pRequest->HCParam)->BlocksCopied;

	if (blocksRemaining > (DMA_BUFFER_SIZE / pRequest->BlockSize)) {
		blocksToCopy = (DMA_BUFFER_SIZE / pRequest->BlockSize);
	} else {
		blocksToCopy = blocksRemaining;
	}

        // 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+(((PHC_PARAMS)pRequest->HCParam)->BlocksCopied*pRequest->BlockSize),
                          pDmaBuffer, 
                          pRequest->BlockSize * blocksToCopy);
    } SD_RESTORE_PROC_PERMISSIONS();

	((PHC_PARAMS)pRequest->HCParam)->BlocksCopied += blocksToCopy;
	((PHC_PARAMS)pRequest->HCParam)->BuffersOutstanding--;
}

///////////////////////////////////////////////////////////////////////////////
//  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:  
///////////////////////////////////////////////////////////////////////////////
ULONG CopyToDmaBuffer(PSD_BUS_REQUEST pRequest,
                      PULONG          pDmaBuffer)
{
	ULONG blocksToCopy;
	ULONG blocksRemaining;
	
	blocksRemaining = pRequest->NumBlocks - ((PHC_PARAMS)pRequest->HCParam)->BlocksCopied;

	if (blocksRemaining > (DMA_BUFFER_SIZE / pRequest->BlockSize)) {
		blocksToCopy = (DMA_BUFFER_SIZE / pRequest->BlockSize);
	} else {
		blocksToCopy = blocksRemaining;
	}

        // 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+(((PHC_PARAMS)pRequest->HCParam)->BlocksCopied*pRequest->BlockSize),
                          pRequest->BlockSize * blocksToCopy);
    } SD_RESTORE_PROC_PERMISSIONS();

	((PHC_PARAMS)pRequest->HCParam)->BlocksCopied += blocksToCopy;

	// Incrementing count of outstanding blocks
	// IST will decrement this when a block has been transmitted
	((PHC_PARAMS)pRequest->HCParam)->BuffersOutstanding++;

	return (blocksToCopy*pRequest->BlockSize);
}

///////////////////////////////////////////////////////////////////////////////
//  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) {
        DEBUGMSG(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) {
        DEBUGMSG(SDCARD_ZONE_ERROR,(TEXT("SDIO[%d]: Can't allocate Rx DMA Channel\r\n"),
                   pSlot->SlotNumber));
		goto ErrorReturn;
	}

    pSlot->UsingDma = TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品国产成人国产三级粉色| 亚洲人一二三区| 91麻豆文化传媒在线观看| 国内国产精品久久| 久久成人免费网| 全国精品久久少妇| 琪琪久久久久日韩精品| 日本视频免费一区| 奇米亚洲午夜久久精品| 日本亚洲最大的色成网站www| 亚洲成av人片www| 日韩制服丝袜先锋影音| 男女性色大片免费观看一区二区| 五月开心婷婷久久| 久久精品国产亚洲一区二区三区| 日日摸夜夜添夜夜添精品视频 | 蜜臀a∨国产成人精品| 五月激情六月综合| 另类中文字幕网| 国产高清不卡二三区| 成人午夜在线播放| 91香蕉视频mp4| 欧美日韩在线观看一区二区| 欧美白人最猛性xxxxx69交| 5566中文字幕一区二区电影| 欧美刺激脚交jootjob| 久久视频一区二区| 国产精品欧美精品| 亚洲图片欧美综合| 久久精品99久久久| 成人综合婷婷国产精品久久蜜臀| 99久久精品一区| 欧美精品三级在线观看| 337p粉嫩大胆噜噜噜噜噜91av | 中文字幕亚洲在| 亚洲高清免费一级二级三级| 裸体歌舞表演一区二区| 成人丝袜18视频在线观看| 91黄色免费网站| 欧美不卡一区二区| 18成人在线观看| 欧美96一区二区免费视频| 成人永久免费视频| 欧美精品日韩一本| 亚洲国产成人午夜在线一区| 亚洲一区二区精品视频| 国产一区二区三区四| 91成人免费网站| 久久九九久久九九| 日本色综合中文字幕| 波多野结衣亚洲| 日韩女优av电影| 椎名由奈av一区二区三区| 免费一级欧美片在线观看| 91网站在线观看视频| 久久综合视频网| 日日夜夜免费精品| 欧美影院一区二区| 国产精品国产三级国产普通话蜜臀| 日韩精品电影在线| 91热门视频在线观看| 国产色一区二区| 奇米一区二区三区av| 欧洲在线/亚洲| 日韩毛片一二三区| 成人精品视频一区| 日本一区二区免费在线观看视频| 蜜臀精品一区二区三区在线观看 | 久久久精品国产99久久精品芒果| 亚洲妇熟xx妇色黄| 91久久香蕉国产日韩欧美9色| 中文字幕一区三区| 成人免费看黄yyy456| 久久久99精品免费观看| 韩国精品免费视频| 精品久久久网站| 久久99热这里只有精品| 欧美不卡激情三级在线观看| 日本不卡视频在线| 欧美一区二区三区四区久久| 午夜亚洲国产au精品一区二区 | 亚洲福利一二三区| 在线观看www91| 亚洲午夜免费电影| 7777精品伊人久久久大香线蕉完整版 | 91麻豆精东视频| 亚洲丝袜自拍清纯另类| 91麻豆国产精品久久| 亚洲色图欧洲色图| 欧美色视频在线观看| 亚洲成人福利片| 91精品麻豆日日躁夜夜躁| 首页国产欧美日韩丝袜| 日韩一区二区三区观看| 国产麻豆日韩欧美久久| 中文字幕免费一区| 色婷婷精品久久二区二区蜜臂av | 日韩一二三区视频| 国产永久精品大片wwwapp| 国产婷婷色一区二区三区 | 亚洲精品成人精品456| 91黄视频在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 精品剧情在线观看| 欧美午夜影院一区| 日韩极品在线观看| 久久久久久久久久美女| av亚洲精华国产精华| 亚洲成人av免费| 久久综合狠狠综合| 91免费看片在线观看| 日韩精品色哟哟| 国产欧美日韩精品a在线观看| 97se亚洲国产综合自在线观| 日韩国产欧美在线观看| 欧美激情一区二区三区不卡| 欧美日韩中文精品| 国产99久久久国产精品免费看| 一区二区在线观看av| 欧美大片拔萝卜| 91美女片黄在线| 国内精品自线一区二区三区视频| 成人欧美一区二区三区白人| 欧美一区二区三区日韩视频| 99热这里都是精品| 久久99精品一区二区三区| 亚洲黄色小说网站| 国产欧美一区二区精品仙草咪| 欧美美女一区二区| 91小宝寻花一区二区三区| 精品亚洲欧美一区| 亚洲成人777| 亚洲美女屁股眼交| 中文av一区二区| 精品国产制服丝袜高跟| 欧美揉bbbbb揉bbbbb| 99国产精品久久久久久久久久久| 黑人精品欧美一区二区蜜桃| 香蕉乱码成人久久天堂爱免费| 国产精品久久久久久久久动漫| 精品欧美黑人一区二区三区| 欧美卡1卡2卡| 欧美最猛性xxxxx直播| 成人av在线看| 夫妻av一区二区| 国产美女在线观看一区| 久久精品国产成人一区二区三区| 亚洲成人av资源| 亚洲第一电影网| 亚洲成人激情综合网| 一区二区三区小说| 综合精品久久久| 亚洲欧美日韩电影| 日韩理论在线观看| 国产精品高潮久久久久无| 国产农村妇女精品| 国产欧美一区二区精品忘忧草| 欧美精品一区男女天堂| 精品乱人伦小说| 精品国产凹凸成av人导航| 欧美成人高清电影在线| 精品日本一线二线三线不卡| 日韩欧美国产不卡| 日韩精品最新网址| 久久婷婷综合激情| 国产精品天天摸av网| 亚洲欧美中日韩| 亚洲激情自拍视频| 亚洲成人在线免费| 蜜臀久久99精品久久久久宅男 | 日韩欧美国产一区在线观看| 3d动漫精品啪啪| 精品国产百合女同互慰| 中文字幕成人av| 亚洲激情成人在线| 午夜欧美电影在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 国产一区二区三区在线观看精品 | 欧美日韩你懂的| 91精品国产综合久久婷婷香蕉 | 国产精品久线在线观看| 亚洲欧美综合在线精品| 亚洲第一av色| 久久99精品久久久久久国产越南 | 欧美日韩日日夜夜| 欧美一区二区三区小说| 精品久久久久久久久久久久久久久久久 | 国产精品久久久久三级| 亚洲自拍偷拍综合| 美女性感视频久久| 成人国产精品免费观看视频| 色av成人天堂桃色av| 欧美一区日本一区韩国一区| 国产视频一区二区在线观看| 一区二区三区 在线观看视频| 精品一区二区三区免费观看| 欧美剧情片在线观看| 久久久不卡网国产精品二区| 亚洲综合一区在线| 国产在线视视频有精品|