毛片网站在线看_天堂俺去俺来也www久久婷婷_日韩av免费网站_18性欧美xxxⅹ性满足_一区二区三区韩国免费中文网站 _性xx色xx综合久久久xx_999亚洲国产精


曙海教育集團論壇Win CE 專區WinCE應用開發 → WINCE驅動開發之DMA的使用


  共有11520人關注過本帖樹形打印

主題:WINCE驅動開發之DMA的使用

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
WINCE驅動開發之DMA的使用  發帖心情 Post By:2010-11-26 9:22:53

以下是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
);


支持(0中立(0反對(0單帖管理 | 引用 | 回復 回到頂部

返回版面帖子列表

WINCE驅動開發之DMA的使用








簽名
毛片网站在线看_天堂俺去俺来也www久久婷婷_日韩av免费网站_18性欧美xxxⅹ性满足_一区二区三区韩国免费中文网站 _性xx色xx综合久久久xx_999亚洲国产精
97久久精品人人做人人爽50路| 樱桃视频在线观看一区| 精品少妇一区二区三区视频免付费| 中文字幕一区二区三区在线观看| 国产传媒日韩欧美成人| 精品久久久久久综合日本欧美| 日本特黄久久久高潮| 欧美高清视频www夜色资源网| 亚洲国产sm捆绑调教视频 | 日韩—二三区免费观看av| 911精品国产一区二区在线| 日本不卡一二三| 2020国产精品自拍| 不卡av免费在线观看| 亚洲人成伊人成综合网小说| 91精彩视频在线| 蜜臀久久99精品久久久久宅男| 久久综合狠狠综合久久激情 | 粉嫩av一区二区三区在线播放 | 日韩中文字幕不卡| 国产日韩欧美综合在线| 色8久久人人97超碰香蕉987| 亚洲国产裸拍裸体视频在线观看乱了 | 精品一二线国产| 亚洲国产成人在线| 欧美日韩国产高清一区二区三区 | 欧美精选在线播放| 国产激情视频一区二区三区欧美| 国产精品的网站| 91精品在线一区二区| 国产成人在线视频播放| 亚洲国产精品视频| 欧美国产精品一区二区三区| 欧美三级日韩在线| 成人天堂资源www在线| 午夜欧美视频在线观看| 中文字幕在线不卡视频| 日韩欧美一区二区久久婷婷| 不卡av电影在线播放| 捆绑紧缚一区二区三区视频| 亚洲视频每日更新| 久久精品在线观看| 欧美v国产在线一区二区三区| 91污片在线观看| 国内精品久久久久影院薰衣草| 亚洲视频在线观看三级| 久久综合狠狠综合久久综合88| 欧美午夜精品一区二区三区| www.亚洲在线| 成人激情校园春色| 国产成人亚洲综合a∨婷婷图片 | 亚洲三级久久久| 久久精品在这里| 精品国产伦一区二区三区观看方式| av亚洲精华国产精华| 国产伦精品一区二区三区视频青涩| 亚洲午夜精品在线| 亚洲免费观看高清完整版在线| 国产日韩欧美一区二区三区乱码 | 亚洲二区在线观看| 玉米视频成人免费看| 专区另类欧美日韩| 国产精品美女久久久久久久| 久久久久久日产精品| 精品日韩一区二区三区 | 成人小视频在线观看| 国产一区二区在线视频| 久久99久久久欧美国产| 天天综合日日夜夜精品| 婷婷久久综合九色综合伊人色| 一区二区三区自拍| 亚洲影视资源网| 日本中文字幕不卡| 国产一区二区三区av电影| 国产美女视频91| 成人aa视频在线观看| 国产成人高清视频| 99re成人在线| 欧美日韩精品免费| 91精品国产手机| www久久精品| 国产清纯白嫩初高生在线观看91 | 欧美亚一区二区| 欧美日韩免费不卡视频一区二区三区| 欧美日韩欧美一区二区| 欧美一级片在线看| 国产午夜精品久久久久久免费视| 国产目拍亚洲精品99久久精品| 国产精品乱码一区二三区小蝌蚪| 综合久久久久久久| 婷婷久久综合九色综合伊人色| 免费高清在线视频一区·| 亚洲国产精品久久久久秋霞影院 | 亚洲精品国产高清久久伦理二区| 中文乱码免费一区二区| 亚洲午夜激情网页| 日韩制服丝袜先锋影音| 国模一区二区三区白浆| 91久久国产最好的精华液| 欧美一区三区四区| 中文字幕在线视频一区| 亚洲一区二区四区蜜桃| 国产精品中文字幕日韩精品 | 26uuu久久综合| 亚洲成人av电影在线| 国产精品91一区二区| 欧美日韩一区二区三区视频| 欧美成人伊人久久综合网| 综合久久一区二区三区| 免费高清成人在线| 91久久精品国产91性色tv| 久久亚洲综合av| 亚洲国产精品一区二区久久恐怖片| 黄色成人免费在线| 欧美日韩高清一区| 成人欧美一区二区三区| 国模冰冰炮一区二区| 欧美日韩国产经典色站一区二区三区| 国产精品久久久久久久久搜平片| 日韩电影免费一区| 欧美三区在线观看| 亚洲日本免费电影| 成人午夜av电影| 久久久久久久精| 激情综合网av| 日韩视频123| 天涯成人国产亚洲精品一区av| 91麻豆精品秘密| 国产精品网站在线| 国产一区二区免费在线| 欧美精品一区二区三区高清aⅴ| 免费欧美在线视频| 色狠狠综合天天综合综合| 国产精品视频一二| 成人h动漫精品一区二区| 国产欧美一区二区三区沐欲| 蜜桃久久久久久| 69av一区二区三区| 日本免费在线视频不卡一不卡二| 色偷偷久久人人79超碰人人澡| 国产天堂亚洲国产碰碰| 国产成人免费av在线| 国产欧美日本一区二区三区| 国内成人免费视频| 一区二区三区中文字幕电影 | 日韩一区二区视频在线观看| 亚洲成人av电影| 91精品国产综合久久久久久| 偷窥少妇高潮呻吟av久久免费| 欧美午夜精品久久久| 亚洲午夜精品久久久久久久久| 色女孩综合影院| 亚洲国产精品一区二区www在线| 欧美午夜寂寞影院| 欧美aaa在线| 国产日韩欧美a| 99久久精品免费看国产| 亚洲资源在线观看| 91精品国产高清一区二区三区| 六月丁香综合在线视频| xnxx国产精品| 91日韩一区二区三区| 亚洲成人午夜电影| 精品久久人人做人人爱| 成人激情黄色小说| 天堂影院一区二区| 国产亚洲一本大道中文在线| 成av人片一区二区| 婷婷综合在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 成人精品国产福利| 日日夜夜精品视频天天综合网| 精品国产乱码久久久久久浪潮| 成人免费高清在线观看| 无码av中文一区二区三区桃花岛| 精品动漫一区二区三区在线观看| 成人听书哪个软件好| 婷婷夜色潮精品综合在线| 久久久精品tv| 欧美色图天堂网| 国产91精品在线观看| 丝袜亚洲另类欧美| 国产精品色一区二区三区| 欧洲亚洲精品在线| 国产老妇另类xxxxx| 亚洲一区影音先锋| 亚洲国产精品v| 日韩女优av电影在线观看| 91美女片黄在线观看91美女| 久久超碰97中文字幕| 亚洲综合色噜噜狠狠| 久久先锋影音av| 51精品秘密在线观看| 色综合婷婷久久| 国产aⅴ综合色| 国产黄人亚洲片| 久久99热狠狠色一区二区| 亚洲成人av福利| 亚洲成人av资源| 亚洲午夜在线电影|