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


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


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

主題: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的使用








簽名
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
99久久国产综合色|国产精品| 亚洲自拍偷拍av| 亚洲精品国产精品久久| 欧美精品国产精品久久久 | 亚洲人成在线观看一区二区| 中文字幕+乱码+中文字幕一区| 久久免费国产精品| 26uuu亚洲综合色欧美| 久久久久久麻豆| 1024成人网| 一区二区三区中文字幕| 五月天欧美精品| 国内外成人在线视频| 国产精品99久久久| 999视频在线观看| 免费av一区二区三区| 日韩久久精品一区二区三区| 一区二区三区我不卡| 欧美美女激情18p| 久久久一区二区| 亚洲激情自拍偷拍| 久久99国产精品麻豆| 成人黄色片在线观看| 国产青春久久久国产毛片| 日本一区二区三区四区在线观看 | www.亚洲人| 国模一区二区三区私拍视频| 欧美在线播放一区| 色av成人天堂桃色av| 日韩三级在线免费观看| 中文字幕在线免费不卡| 秋霞国产午夜精品免费视频| 成人美女在线视频| 蜜桃视频在线观看91| 欧美日韩免费一区二区三区视频 | 成人欧美一区二区三区白人 | 波多野结衣精品久久| 欧美日韩精品久久久免费观看| 欧美最猛黑人xxxxx猛交| 精品国产凹凸成av人网站| 亚洲精品国产高清久久伦理二区 | 欧美国产一区二区在线| 欧美性极品少妇| 久久色在线观看| 五月天久久比比资源色| 国产不卡视频在线播放| 麻豆av一区| 日韩一级二级三级| 亚洲电影视频在线| av成人免费在线观看| 天堂资源在线亚洲资源| 久久久久久久久免费| 免费的成人av| 国产精品中出一区二区三区| 欧美色倩网站大全免费| 国产精品久久久久影院亚瑟| 精品在线观看视频| 日本高清视频一区二区三区| 欧美电视剧在线看免费| 日产国产高清一区二区三区| 好看的日韩精品视频在线| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲美女精品一区| 久久99精品国产.久久久久久 | 欧美午夜宅男影院| 中文字幕在线一区二区三区| 国产伦理精品不卡| 亚洲国产高清国产精品| 国产嫩草影院久久久久| 国产在线视频一区二区三区| 亚洲高清视频在线观看| 日韩美女视频19| 91最新地址在线播放| 欧美另类z0zxhd电影| 亚洲成年人网站在线观看| 国产伦视频一区二区三区| 日韩欧美亚洲另类制服综合在线 | 亚洲色图一区二区三区| 不卡一区二区中文字幕| 欧美日韩在线直播| 亚洲超碰精品一区二区| 精品免费二区三区三区高中清不卡| 日韩午夜在线影院| 狠狠色丁香婷婷综合| 一区二区不卡在线视频 午夜欧美不卡'| 日本一区二区视频在线观看| 国产精品一区二区不卡| 欧美性欧美巨大黑白大战| 日韩中文字幕1| 视频在线精品一区| 亚洲精品综合在线| 国内精品一区二区| 国产女人18水真多18精品一级做| 99久精品国产| 精品国精品自拍自在线| 国产999精品久久久久久| 777午夜精品免费视频| 久久99深爱久久99精品| 欧洲av一区二区嗯嗯嗯啊| 免费看欧美美女黄的网站| 夜夜爽99久久国产综合精品女不卡| 亚洲色图欧美在线| 久久久久久久久一区二区| 国产精品久久久久久久午夜片| 91黄在线观看| 日本一区二区免费在线观看视频| 91看片淫黄大片一级| 久久久久久久网| 国产精品裸体一区二区三区| 国产精品久久久久影视| 久久99国产精品99久久| 亚洲激情中文1区| 亚洲黄色成人久久久| 午夜欧美视频在线观看| 色婷婷国产精品久久包臀| 久久国产三级精品| 91麻豆精品久久久久蜜臀| 高清成人在线观看| www精品美女久久久tv| 国产成人免费电影| 亚洲乱码日产精品bd| 亚洲一一在线| 国产精品一区二区在线观看网站| 日韩精品资源二区在线| 97自拍视频| 亚洲美女偷拍久久| 一本一道久久a久久精品综合蜜臀| 免费观看在线综合| 日韩限制级电影在线观看| 99re视频精品| 亚洲美女屁股眼交| 91成人免费在线视频| 风间由美一区二区av101| 国产欧美日本一区二区三区| 欧美日韩国产免费一区二区三区| 日韩va亚洲va欧美va久久| 91精品国产手机| 国产九色91| 日韩avvvv在线播放| 精品久久一区二区| 麻豆成人在线播放| 另类中文字幕网| 久久久777精品电影网影网| 久中文字幕一区| 激情久久五月天| 国产精品激情偷乱一区二区∴| 日韩影片在线播放| 国产美女主播视频一区| 欧美高清在线一区二区| 色婷婷狠狠综合| 97se国产在线视频| 日韩一区精品字幕| 久久综合色8888| 翔田千里亚洲一二三区| 大胆欧美人体老妇| 亚洲国产另类av| 精品国产乱码久久久久久1区2区| 日本不卡二区高清三区| 国产a视频精品免费观看| 成人免费在线观看入口| 欧美日韩在线播放三区| 国产精华一区二区三区| 久国产精品韩国三级视频| 国产精品高潮呻吟| 欧美精品一级二级三级| 精品一区二区不卡| 国产精品一区在线观看乱码 | 国产高清在线观看免费不卡| 一区二区三区四区激情| 日韩精品一区二区三区在线播放 | 亚洲地区一二三色| 精品va天堂亚洲国产| 在线中文字幕不卡| 精品国产一区二区三区日日嗨| 久久精品99国产国产精| 亚洲免费观看在线视频| 精品电影一区二区| 在线观看一区二区视频| 精品视频一区二区| 成人黄色片在线观看| 男女男精品视频| 一区二区三区 在线观看视频 | 国产精品家庭影院| 7777精品伊人久久久大香线蕉最新版 | 男人的天堂亚洲一区| 亚洲人午夜精品天堂一二香蕉| 日韩欧美一区二区不卡| 中文字幕日韩一区二区三区| 国产精品一区二区你懂得| 国产 日韩 欧美大片| 久久av中文字幕片| 日韩国产在线一| 一区二区三区四区不卡在线| 国产欧美一区二区精品婷婷| 欧美一区二区播放| 欧美乱熟臀69xxxxxx| 在线欧美一区二区| 香蕉久久夜色| 欧美国产二区| 久久另类ts人妖一区二区|