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

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

?? sd_dma.c

?? linux 2.6下的sd卡驅動
?? C
字號:
/****************************************************************************   File:    sd_dma.c  -   Do DMA operations with KernelIoControl* *   The content of this file or document is CONFIDENTIAL and PROPRIETARY*   to Jade Technologies Co., Ltd.  It is subject to the terms of a*   License Agreement between Licensee and Jade Technologies Co., Ltd.*   restricting among other things, the use, reproduction, distribution*   and transfer.  Each of the embodiments, including this information *   and any derivative work shall retain this copyright notice.* *   Copyright (c) 2005 Jade Technologies Co., Ltd. *   All rights reserved.****************************************************************************/#include "sd.h"//------------------------------------------------------------------------------// Global Macros and Variables in SD_DMA.C//------------------------------------------------------------------------------unsigned char	ChannelLine = 0;	// Real DMA Channel Lineunsigned char	ChannelNumber;		// DMA Channel numberunsigned long	InterruptID;		// System interrupt IDHANDLE		DMAIntrEvent;		// Event hooked to the interruptunsigned long	pdwPageList[20];		unsigned char*	TempBufDMA;			// Page-head buffer used in SDI_StartDMA//------------------------------------------------------------------------------//// Allocate DMA - Choose a DMA Line in 0,1,2, and allocate a free channel. //		Then connect the pre-created event to the DMA sys-interrupt. Another//		thing is to allocate a page-head buffer used in SDI_StartDMA. ////------------------------------------------------------------------------------BOOL SDI_AllocateDMA(void){	unsigned long dwRet = 0;	BOOL ret = FALSE;	// allocate channel	ALLOCATE_DMA_PARAMS AllocateDMAParams;	ALLOCATE_DMA_RESULT AllocateDMAResult;	// set the number of device	AllocateDMAParams.ucSourceDevice = ChannelLine;	AllocateDMAParams.ucDestDevice = ChannelLine;	// for device the priority can be any value	AllocateDMAParams.ucPreferedPriority = 0xff;    // no preference	if (!KernelIoControl(IOCTL_HAL_ALLOCATE_DMA_CHANNEL,             &AllocateDMAParams, sizeof(AllocateDMAParams),             &AllocateDMAResult, sizeof(AllocateDMAResult), &dwRet))		return ret;	// the allocated channel and interrupt is returned by "&AllocateDMAResult"	ChannelNumber = AllocateDMAResult.ucChannelNumber;	InterruptID = AllocateDMAResult. dwInterruptID;			// make a interrupt event	if (!InterruptInitialize(InterruptID, DMAIntrEvent, NULL, 0))		return ret;	// make a page-head buffer	TempBufDMA = (unsigned char*)VirtualAlloc(NULL, BYTES_PER_SECTOR, MEM_COMMIT, PAGE_READWRITE | PAGE_NOCACHE);	RETAILMSG(MSG_DMA, (_T("SD: SDI_AllocateDMA - Line:%d, Channel:%d\r\n"), ChannelLine, ChannelNumber));	return TRUE;}//------------------------------------------------------------------------------//// Init DMA - Initialize the DMA channel. Choose SD as the flow controller. //// Arguments://		Opcode - indicate current operation is read or write, affect the flow//		control and source/dest increment. ////------------------------------------------------------------------------------BOOL SDI_InitDMA(unsigned long Opcode){			unsigned long dwRet = 0;	BOOL ret = FALSE;	// initialize channel	INITIALIZE_DMA_PARAMS InitializeDMAParams;	INITIALIZE_DMA_RESULT InitializeDMAResult;	InitializeDMAParams.ucChannelNumber = ChannelNumber;	// set trans width both 32 bits	InitializeDMAParams.ucSourceWidth = TRANSFER_WIDTH_DWORD; 	InitializeDMAParams.ucDestWidth = TRANSFER_WIDTH_DWORD; 	// set trans burst size 8	InitializeDMAParams.ucSourceBurstSize = BURST_SIZE_8; 	InitializeDMAParams.ucDestBurstSize = BURST_SIZE_8;	// choose flow direction, controller, and whether addr increase	if (Opcode == DISK_IOCTL_READ)	{		InitializeDMAParams.fIncrementSource = FALSE;	//source - constant		InitializeDMAParams.fIncrementDest = TRUE;		//dest - auto increment		InitializeDMAParams.ucFlowControl = FLOW_PER_MEM_DMAC;	}	else	{		InitializeDMAParams.fIncrementSource = TRUE;	//source - auto increment		InitializeDMAParams.fIncrementDest = FALSE;		//dest - constant		InitializeDMAParams.ucFlowControl = FLOW_MEM_PER_DMAC;	}	if (!KernelIoControl(IOCTL_HAL_INITIALIZE_DMA_CHANNEL,		 &InitializeDMAParams, sizeof(InitializeDMAParams),		 &InitializeDMAResult, sizeof(InitializeDMAResult), &dwRet))		 return ret;	return TRUE;}//------------------------------------------------------------------------------//// Start DMA - Go on config the DMA channel and set the source/dest address. //		Start Transmiting. When SD send a Last-burn signal, the DMA will //		trigger a interrupt. We wait the event connected to the interrupt. //		If no TIMEOUT, this transfer is succeed.//		Indeed, as the SD is the flow controller, we don't need to tell DMA//		the transfer size. But in this case, DMA can not jump to other page//		list. So we can do only in-page transfer. That's why we use a temp buffer//		to exchange data with the real buffer we needed. //// Arguments://		Opcode - indicate current operation is read or write. //		FIFOAddr - SD FIFO register's physical address. //		buf - pointer of the buffer(virtual address) that exchange data with card////------------------------------------------------------------------------------BOOL SDI_StartDMA(	unsigned long Opcode, 	unsigned long FIFOAddr, 	unsigned char* buf,	unsigned long size	){		unsigned long dwRet = 0;	BOOL ret = FALSE;	BOOL usetemp = FALSE;	// start transmit	START_DMA_PARAMS    StartDMAParams;	START_DMA_RESULT    StartDMAResult;	unsigned long Source, Dest;	unsigned long * Dbuf;	unsigned long DbufOffset = 0;	unsigned long dwPages;	unsigned long i;		Dbuf = (unsigned long *)buf;	DbufOffset = (unsigned long)BYTE_OFFSET(Dbuf);	// account pages needed	dwPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(NULL, size+DbufOffset);	if (Opcode == DISK_IOCTL_READ) 	{		// Lock Virtual Page to physical page		LockPages ((unsigned long *)((unsigned long)Dbuf - DbufOffset), (size + DbufOffset), pdwPageList, 0);		for(i=0;i<dwPages;i++)		{			pdwPageList[i] &= ~(unsigned long)(PAGE_SIZE - 1);		}		pdwPageList[0] += DbufOffset;		StartDMAParams.ucChannelNumber = ChannelNumber;		// source address		Source = FIFOAddr;		StartDMAParams.pdwSourceBuffer = &Source;		// dest address		StartDMAParams.pdwDestBuffer = pdwPageList;		// trans size		StartDMAParams.dwTransferSize = size;				if (KernelIoControl(IOCTL_HAL_START_DMA_TRANSFER,				&StartDMAParams, sizeof(StartDMAParams),				&StartDMAResult, sizeof(StartDMAResult), &dwRet))		{			ret = TRUE;		}	}	else 	{		// LockVirtual Page to physical page		LockPages ((unsigned long *)((unsigned long)Dbuf - DbufOffset), (size + DbufOffset), pdwPageList, 0);		for(i=0;i<dwPages;i++)		{			pdwPageList[i] &= ~(unsigned long)(PAGE_SIZE - 1);		}		pdwPageList[0] += DbufOffset;		StartDMAParams.ucChannelNumber = (unsigned char)ChannelNumber;		// source address		StartDMAParams.pdwSourceBuffer = pdwPageList;		// dest address		Dest = FIFOAddr;		StartDMAParams.pdwDestBuffer = &Dest;		// trans size		StartDMAParams.dwTransferSize = size;		if (KernelIoControl(IOCTL_HAL_START_DMA_TRANSFER,				&StartDMAParams, sizeof(StartDMAParams),				&StartDMAResult, sizeof(StartDMAResult), &dwRet))		{			ret = TRUE;		}	}	return ret;}BOOLSDI_WaitDMA(		unsigned long Opcode, 	unsigned long FIFOAddr, 	unsigned char* buf,	unsigned long size	){	BOOL ret = FALSE;	unsigned long * Dbuf;	unsigned long DbufOffset = 0;	Dbuf = (unsigned long *)buf;	DbufOffset = (unsigned long)BYTE_OFFSET(Dbuf);		// wait for DMA interrupt	if (Opcode == DISK_IOCTL_READ) 	{		if (WaitForSingleObject(DMAIntrEvent, 500) == WAIT_TIMEOUT)			RETAILMSG(MSG_DMA, (_T("SD: SDI_WaitDMA(read) - Intr TIMEOUT\r\n")));		else 			ret = TRUE;	}	else	{		if (WaitForSingleObject(DMAIntrEvent, 500) == WAIT_TIMEOUT)			RETAILMSG(MSG_DMA, (_T("SD: SDI_WaitDMA(write) - Intr TIMEOUT\r\n")));		else			ret = TRUE;	}	InterruptDone(InterruptID);	UnlockPages((unsigned long *)((unsigned long)Dbuf - DbufOffset), (size + DbufOffset));	return ret;}//------------------------------------------------------------------------------//// Release DMA - Do all the clear job. ////------------------------------------------------------------------------------BOOLSDI_ReleaseDMA(void){	unsigned long dwRet;	BOOL ret = FALSE;	FREE_DMA_PARAMS FreeDMAParams;	FREE_DMA_RESULT FreeDMAResult;	FREE_DMA_SYSINTR_PARAMS FreeSysIntrParams;	FREE_DMA_SYSINTR_RESULT FreeSysIntrResult;	// release channel	FreeDMAParams.ucChannelNumber = ChannelNumber;	if (!KernelIoControl(IOCTL_HAL_FREE_DMA_CHANNEL,			&FreeDMAParams, sizeof(FreeDMAParams),			&FreeDMAResult, sizeof(FreeDMAResult), &dwRet))			return ret;	FreeSysIntrParams.ucChannelNumber = ChannelNumber;	if (!KernelIoControl(IOCTL_HAL_FREE_DMA_SYSINTR,			&FreeSysIntrParams, sizeof(FreeSysIntrParams),			&FreeSysIntrResult, sizeof(FreeSysIntrResult), &dwRet))			return ret;	// free the page-head buffer	VirtualFree(TempBufDMA, 0, MEM_RELEASE);	return TRUE;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩有码一区二区三区| 国产精品色眯眯| 欧美一区二区免费视频| 欧美一激情一区二区三区| xnxx国产精品| 亚洲已满18点击进入久久| 日韩av电影天堂| 国产1区2区3区精品美女| 在线观看91视频| 国产欧美一区二区三区网站| 亚洲国产精品视频| 9久草视频在线视频精品| 日韩视频一区二区三区在线播放| 免费在线看一区| 欧美精品色一区二区三区| 中文字幕一区二区三区蜜月 | 欧美成人三级在线| 亚洲视频一二三| 国产91综合网| 亚洲激情图片小说视频| 成人精品高清在线| 久久精品亚洲精品国产欧美kt∨ | 黑人巨大精品欧美一区| 欧美性大战久久| 亚洲乱码国产乱码精品精小说| 欧美综合天天夜夜久久| 久久成人免费日本黄色| 欧美久久一二三四区| 国产美女精品在线| 亚洲精品一区二区精华| 奇米在线7777在线精品| 日本一区二区三区在线观看| 欧美性感一区二区三区| 国产成人综合在线播放| 中文一区在线播放| 成人精品小蝌蚪| 欧美极品美女视频| 欧美日韩成人在线| 蜜桃视频在线一区| 久久网站热最新地址| 欧美中文字幕一区二区三区亚洲| 激情偷乱视频一区二区三区| 亚洲综合999| 国产女人aaa级久久久级| 9191成人精品久久| 久久99精品国产麻豆不卡| 精品少妇一区二区三区在线视频 | 午夜成人免费电影| 日韩一区二区三区视频在线 | 欧美狂野另类xxxxoooo| 91视频在线看| 亚洲高清免费视频| 国产精品色哟哟网站| 久久人人爽爽爽人久久久| 国产成人午夜精品5599| 日韩一区精品视频| 亚洲综合色自拍一区| 国产精品日产欧美久久久久| 精品精品国产高清a毛片牛牛 | 亚洲国产精品久久人人爱蜜臀| 国产亚洲短视频| 日韩精品一区二区三区swag| 国产成人亚洲综合a∨婷婷| 免费人成精品欧美精品| 丝袜亚洲另类丝袜在线| 亚洲国产色一区| 一区二区成人在线| 日韩欧美一级精品久久| 欧美久久久久久蜜桃| 色噜噜狠狠成人中文综合 | 精品国产成人在线影院| 91精品久久久久久蜜臀| 欧美日韩成人在线| 91麻豆精品国产无毒不卡在线观看| 91国产视频在线观看| 日韩欧美亚洲国产精品字幕久久久| 在线观看91精品国产入口| 欧洲中文字幕精品| 欧美三级日韩在线| 国产美女视频91| 国产一区二区三区不卡在线观看| 看电影不卡的网站| 国产一区三区三区| 国产精品18久久久久久久久| 亚洲一二三专区| 亚洲精品成a人| 亚洲一区在线观看网站| 亚洲成人动漫在线免费观看| 亚洲v日本v欧美v久久精品| 亚洲欧美日韩在线不卡| 久久综合色婷婷| 久久久久久久网| 国产精品网友自拍| 亚洲欧美日本韩国| 日韩电影免费在线| 国产乱码精品一区二区三区av| 高清成人免费视频| 欧美伊人精品成人久久综合97 | 日韩毛片精品高清免费| 夜色激情一区二区| 日本在线观看不卡视频| 九九国产精品视频| 成人av电影免费在线播放| 在线一区二区三区四区五区| 在线成人小视频| 久久久亚洲精品石原莉奈| 国产精品久久久一区麻豆最新章节| 欧美一区二区三区婷婷月色| 久久色视频免费观看| 国产精品久久二区二区| 五月天网站亚洲| 国产成人精品亚洲午夜麻豆| 日本电影欧美片| 欧美成人精精品一区二区频| 日韩一区日韩二区| 蜜臀精品久久久久久蜜臀| 成人精品电影在线观看| 欧美一区二区三区在线看| 国产精品久久福利| 久久电影国产免费久久电影| 色综合久久天天| 91视频在线观看| 日韩一区二区三免费高清| 亚洲欧美日韩小说| 国产一区二区三区四区五区入口| 91久久精品网| 久久久精品国产免费观看同学| 亚洲一二三级电影| 不卡视频在线观看| 精品久久人人做人人爽| 午夜影院在线观看欧美| 大胆亚洲人体视频| 欧美成人vr18sexvr| 亚洲成人免费观看| av中文字幕一区| 欧美精品一区二区精品网| 亚洲伊人色欲综合网| 菠萝蜜视频在线观看一区| 欧美成人精品二区三区99精品| 亚洲综合在线电影| 不卡欧美aaaaa| 久久亚洲春色中文字幕久久久| 日韩中文字幕亚洲一区二区va在线| 99re热这里只有精品免费视频| 在线观看日韩精品| 专区另类欧美日韩| 成人毛片在线观看| 久久久久久免费| 狠狠v欧美v日韩v亚洲ⅴ| 91精品国产黑色紧身裤美女| 一区二区三区四区国产精品| 成人av在线看| 久久久久9999亚洲精品| 精品一区二区三区免费观看| 91麻豆精品国产91久久久久久| 亚洲午夜久久久久久久久电影网| 99国产精品久久| 中文字幕佐山爱一区二区免费| 成人性视频免费网站| 欧美国产亚洲另类动漫| 国产激情精品久久久第一区二区 | 成人一级片在线观看| 国产天堂亚洲国产碰碰| 国产乱对白刺激视频不卡| 久久久www免费人成精品| 国产一区二区三区电影在线观看| 26uuu亚洲婷婷狠狠天堂| 久久99精品久久久久久动态图 | 欧美精品日韩精品| 偷拍自拍另类欧美| 欧美一区二区三区影视| 麻豆国产精品视频| 久久久久久久久久久电影| 国产成人av一区| 国产精品国产三级国产专播品爱网| 不卡影院免费观看| 亚洲色图在线看| 91传媒视频在线播放| 亚洲综合男人的天堂| 欧美久久久影院| 国内精品久久久久影院一蜜桃| 久久亚洲私人国产精品va媚药| 国产大陆亚洲精品国产| 中文字幕五月欧美| 欧美伊人精品成人久久综合97| 午夜视频一区二区三区| 欧美一区二区三区男人的天堂| 老司机免费视频一区二区| 久久久久青草大香线综合精品| 99久久99久久精品免费看蜜桃| 亚洲精品欧美综合四区| 欧美日韩不卡一区| 国产一区二区三区免费看| 国产精品久久久久影院老司 | 亚洲狠狠爱一区二区三区| 91精品国产综合久久久蜜臀粉嫩| 狠狠色狠狠色综合| 中文字幕一区不卡| 欧美二区在线观看| 成人亚洲精品久久久久软件|