久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

以文本方式查看主題

-  曙海教育集團論壇  (http://www.rfoamep.cn/bbs/index.asp)
--  WinCE應用開發  (http://www.rfoamep.cn/bbs/list.asp?boardid=35)
----  WINCE驅動開發之DMA的使用  (http://www.rfoamep.cn/bbs/dispbbs.asp?boardid=35&id=1799)

--  作者:wangxinxin
--  發布時間:2010-11-26 9:22:53
--  WINCE驅動開發之DMA的使用

以下是MSDN中的說法:

The Windows CE NDIS implementation does not support direct memory access (DMA). Do not use the NdisSetupDmaTransfer, NdisCompleteDmaTransfer, NdisMRegisterDmaChannel, NdisMDeregisterDmaChannel, NdisMAllocateMapRegisters, NdisMFreeMapRegisters, NdisMReadDmaCounter, and NdisGetSharedDataAlignment functions. 

Use the NdisMAllocateSharedMemory and NdisMFreeSharedMemory functions for PCI bus master DMA transfers. 


具體如何實現DMA呢?

在microsoft windows CE device driver kit中有一節是:Implementing DMA for NDIS Miniport Drivers 
專門提到了這個問題,當前ce還沒有自己的DMA機制,然而開發人員可以在他們自己的小端口卡驅動程序中實現相同的功能,但是寫的太簡單了

Implementing DMA for NDIS Miniport Drivers
DMA is important for efficient networking because it enables the layers in 
the networking architecture to share data without first copying that data

two categories of DMA: slave DMA and busmaster DMAB
 
Slave DMA
Slave DMA is appropriate for OEMs because it requires a block of memory that 
is pre-allocated in the device memory map of the Windows CE–based platform. 
Miniport drivers can map that block of physical memory to the driver’virtual
memory space, and then use the VirtualAlloc and VirtualCopy functions to move 
data in and out of that space
 
busmaster DMA 
To receive data, the driver allocates a shared memory block, transfers the 
data to buffers within that block, and uses NDIS functions to indicate that a 
packet has arrived. To send data, the driver uses the LockPages and 
UnlockPages functions to map the virtual memory to device memory, informs the 
NIC of the addresses of the data, and instructs the NIC to send the data. 
This method can be faster for larger data block sizes.

后來發MAIL給一位曾經遇到此問題的朋友,回復如下:

事實上在使用DMA是的關鍵是得到一個連續的物理地址空間,然后將該空間的物理地址放入DMA控制器的源地址或者目的地址寄存器中(根據你使用DMA的方向決定);
然后等待DMA中斷;
由于DMA使用的是物理地址但是在wince中只能使用虛擬地址,所以在DMA中斷產生之后如需分析數據請使用虛擬地址;
特別提示參考一下的文章:
 DMA的使用
1、 芯片DMA的使用要點:
AK3224芯片的DMA使用中,RAM的地址作為DMA傳輸的目標地址、源地址,必須要4字節對齊。而且DMA的操作長度以內的RAM地址,必須連續。
不過在使用中發現:Nandflash驅動中RAM地址作為目標地址時,只需要2字節對齊。RAM地址作為源地址可不需對齊。(其他情況需要逐一驗證)
2、 wince中的DMA使用:
根據DMA一次操作的RAM地址必須連續的特性,在驅動DMA使用時,我們需要確保虛擬地址映射的物理地址是連續的。有3個途徑:
1:數據區地址是由應用層或者其他進程、線程傳入的,驅動并不知道其虛擬地址對應的物理地址是否一直連續。
由于wince的內存申請,是以4K字節為一個頁,一段數據的內存申請可能跨越多個頁。因此,只要數據區長度大于1字節,就有可能其物理地址是跨越的、不連續的。為了確保DMA操作,我們必須查詢這段數據區在RAM上的物理分布。
首先,得到數據區所在的虛擬頁: VirPageStart = (ULONG)pSourceBuffer & 0xFFFFF000;
其次,得到數據區在頁內的偏移地址 :offset = (ULONG)pSourceBuffer & 0x0FFF;
計算數據區是否跨越頁段
if(offset + NumberOfBytes > 4096)
PageSize = WCE_UNIFORM_SIZE - offset;       //整個數據跨越此頁,則DMA傳輸需要分多個部分,一次一個頁段的傳
else
PageSize = NumberOfBytes;                //數據區沒有跨越頁
由得到的頁地址,查詢映射的物理地址。
if(!LockPages((LPVOID)VirPageStart, 4096, &TransAddr, LOCKFLAG_READ))
{
        //異常處理
}
UnlockPages((LPVOID)VirPageStart, 4096);
得到了映射的物理地址TransAddr后,根據RAM是目標地址還是源地址,做進一步的處理。
假設一個數據區作為DMA源地址,大小為9K。在虛擬地址首頁的偏移為4K。那么它必然跨越3個頁段。
首先查詢第一頁的物理地址發送,第一個頁的2K數據。然后查詢第二頁的物理地址,發送4K數據。最后查詢第三頁的物理地址,發送3K數據。

2:數據區的申請可以使用AllocPhysMem函數申請。
LPVOID AllocPhysMem(
DWORD cbSize,                 參數1:數據區大小
DWORD fdwProtect,             參數2:保護標記
DWORD dwAlignmentMask,         參數3:0(default system)
DWORD dwFlags,                參數4:0(Reserved for future use)
PULONG pPhysicalAddress         參數5:得到數據區對應的物理地址
);
AllocPhysMem函數返回值為指向申請后的虛擬地址指針。
如:pSerialHead->RxBufferInfo.RxCharBuffer =            //alloc physical memory
AllocPhysMem(pSerialHead->RxBufferInfo.Length + 16, PAGE_READWRITE, 0, 0, &RX_PhyAddr);
由于此函數必定申請到一片連續的物理地址,因此pSerialHead->RxBufferInfo.RxCharBuffer的使用不再需要查詢是否跨越多個頁段。
但是,AllocPhysMem函數申請的物理地址可能會跨越多個RAM CHIP。因此,在使用1片以上RAM芯片的系統中,依然需要查詢是否跨越CHIP。
       AllocPhysMem函數使用后,需要使用FreePhysMem函數進行釋放。
3:數據區可以在系統config.bib文件中,預先定義好一片連續、不跨越CHIP的RAM空間。
如下,系統保留了虛擬地址0x80024000開始,大小為0x3000的一段RAM。
SER_DMA                80024000 00003000 RESERVED
那么驅動DMA使用中,不再需要對這段內存,進行任何的查詢動作。我們只需要在進程空間中做映射即可。
pSerialHead->RxBufferInfo.RxCharBuffer = VirtualAlloc(0, RX_PhySize, MEM_RESERVE, PAGE_NOACCESS);
    if (pSerialHead->RxBufferInfo.RxCharBuffer == NULL)
    {
        DEBUGMSG(ZONE_ERROR, (TEXT("COM_Init:: VirtualAlloc failed!\\r\\n")));
        return(NULL);
    }
    else
    {
        if (!VirtualCopy((PVOID)pSerialHead->RxBufferInfo.RxCharBuffer, (PVOID)(RX_PhyAddr),
            RX_PhySize, (PAGE_READWRITE | PAGE_NOCACHE)))
        {
           DEBUGMSG(ZONE_ERROR, (TEXT("COM_Init:: VirtualCopy failed!\\r\\n")));
           return(NULL);
        }
    }
上面這段程序中,先使用函數VirtualAlloc,在進程空間中申請一段保留的虛擬地址空間。然后使用VirtualCopy,把需要使用的物理地址空間,映射到已經申請好的虛擬地址上。使用完畢,必須使用函數VirtualFree進行釋放。
LPVOID VirtualAlloc(
LPVOID lpAddress,                  
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect
);
BOOL VirtualCopy(
LPVOID lpvDest,
LPVOID lpvSrc,
DWORD cbSize,
DWORD fdwProtect
);
BOOL VirtualFree(
LPVOID lpAddress,
DWORD dwSize,
DWORD dwFreeType
);


久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
av在线不卡电影| 日本一不卡视频| 在线电影院国产精品| 在线观看网站黄不卡| 91黄色免费看| 在线不卡a资源高清| 久久综合久久综合九色| 久久久不卡网国产精品二区 | 欧美一区二区三区喷汁尤物| 欧美videossexotv100| 国产精品区一区二区三| 亚洲国产日韩一区二区| 国内精品国产成人国产三级粉色| av网站免费线看精品| 91丨九色丨黑人外教| 日韩亚洲视频在线| 欧美久久久久中文字幕| 国产精品美女www爽爽爽| 午夜精品久久久久久久| 成人午夜精品一区二区三区| 国产午夜精品在线| 精品视频一区二区三区免费| 国产欧美日韩激情| 五月婷婷综合网| 国产.欧美.日韩| 俄罗斯精品一区二区三区| 欧美三级电影在线播放| 一本一道综合狠狠老| 久久婷婷一区二区三区| 综合久久久久久久| 日韩精品成人一区二区在线| 国精产品一区一区三区mba视频| 国产成人综合在线播放| 91麻豆蜜桃| 青青草原亚洲| 欧美性色综合网| 精品国产一区二区国模嫣然| 日韩一区二区在线看| 久久久久久免费| 免费一级片91| 95精品视频在线| 欧美一区三区二区在线观看| 欧美午夜片在线看| 久久久99精品免费观看不卡| 一区二区三区中文在线| 九九精品一区二区| 国产精品日韩二区| 欧美天天综合网| 欧美精品一二三| 亚洲美女淫视频| 国产精品中文字幕欧美| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 亚洲三区视频| 精品成人佐山爱一区二区| 亚洲一区二区欧美| 成人免费视频app| 亚洲欧洲精品一区| 久久丝袜美腿综合| 日韩av一区二区三区| 国产一区二区电影| 久久国产精品 国产精品| 欧美中文字幕一区二区三区亚洲| 26uuu亚洲综合色| 亚洲欧美另类在线| 国产丶欧美丶日本不卡视频| 日本在线免费观看一区| 久久影音资源网| 蜜桃av噜噜一区| 久久久久久久免费| 欧美成人高清电影在线| 天堂资源在线中文精品| 国产成人精品福利一区二区三区 | 精品一区久久| 欧美一级电影网站| 日本午夜一本久久久综合| 国内一区二区在线视频观看| 日韩久久久久久| 蜜臂av日日欢夜夜爽一区| 久久99导航| 精品日本一线二线三线不卡| 日韩国产欧美在线播放| 欧美xxxx黑人又粗又长精品| 久久人人爽人人爽| 国产福利一区二区| 91精品福利在线| 亚洲综合一区在线| 国产欧美一区二区视频| 精品999在线播放| 国产福利一区在线观看| 椎名由奈jux491在线播放| 亚洲黄色片在线观看| 福利视频一区二区三区| 欧美精品一区二| 国产精品一二三| 欧美日韩综合在线| 日产国产欧美视频一区精品| 日韩中文字幕一区| 亚洲美女淫视频| 久久涩涩网站| 国产精品日产欧美久久久久| 国产综合色视频| 欧美日韩的一区二区| 美国十次了思思久久精品导航| 亚洲视频在线二区| 亚洲成av人片在线| 日韩精品欧美在线| 亚洲一区在线观看免费 | 久久久美女毛片| 北条麻妃国产九九精品视频| 欧美一区二区高清| 国产精品亚洲一区二区三区在线 | 精品乱子伦一区二区三区| 欧美韩国日本不卡| 99久热re在线精品视频| 国产欧美日韩卡一| 国产日韩久久| 17c精品麻豆一区二区免费| 97se在线视频| 国产三级精品在线| 亚洲欧美成人一区| 日韩中文字幕麻豆| 在线一区二区三区做爰视频网站| 日本在线观看不卡视频| 欧美性xxxxxxxx| 国产精品一区专区| 亚洲精品一区在线观看| 99精品99久久久久久宅男| 国产精品激情偷乱一区二区∴| 久久久久综合一区二区三区| 一区二区三区欧美日韩| 一区二区视频在线播放| 日韩av不卡一区二区| 精品视频色一区| 成人av在线资源网| 国产日韩欧美高清在线| 麻豆av一区二区三区久久| 午夜伦欧美伦电影理论片| 国产精品成人一区二区三区| 青青青伊人色综合久久| 91精品欧美一区二区三区综合在| www.欧美日韩| 亚洲三级免费电影| 色婷婷综合五月| 国产成人综合自拍| 国产精品天天看| 中文精品一区二区三区 | 91网上在线视频| 综合激情成人伊人| 色综合av在线| 成人一级视频在线观看| 国产精品久久久久久久久动漫| 久热这里只精品99re8久 | 日韩限制级电影在线观看| 91精品久久久久久蜜桃| 亚洲一区视频在线| 欧美午夜理伦三级在线观看| 久久国产精品高清| 麻豆国产欧美一区二区三区| 久久蜜桃香蕉精品一区二区三区| 免费精品视频一区二区三区| 看国产成人h片视频| 久久久www成人免费毛片麻豆 | 91丝袜脚交足在线播放| 亚洲影视资源网| 欧美一区二区三区在线电影| 99精品在线免费| 午夜视频一区二区| 国产偷国产偷精品高清尤物| 色激情天天射综合网| av动漫一区二区| 午夜日韩在线观看| 久久久五月婷婷| 在线亚洲一区观看| 国产精品久久久久久久久久直播| 美女高潮久久久| 中文一区二区完整视频在线观看| 日韩一区二区免费高清| 亚洲第一综合| 91在线短视频| 国产资源精品在线观看| 一区二区三区在线视频免费| 日韩免费视频一区二区| 在线一区高清| 狠狠色综合色区| 波多野结衣中文字幕一区二区三区| 亚洲h动漫在线| 中文字幕一区日韩精品欧美| 欧美一区二区观看视频| 色综合天天做天天爱| 国产精品视频500部| 国产精品一区久久久久| 亚洲h动漫在线| 国产精品福利一区二区| 欧美一区二区观看视频| 色哦色哦哦色天天综合| 精品久久蜜桃| 99re视频在线| 成人免费黄色在线| 久久福利视频一区二区| 亚洲成人高清在线|