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


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


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

主題: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欧美一区二区三区
免费成人深夜夜行视频| 国产91露脸合集magnet| 国产精品女主播av| 国产精品大尺度| 亚洲色欲色欲www在线观看| 亚洲欧洲日韩一区二区三区| 亚洲欧美另类久久久精品| 亚洲高清不卡在线| 久久精品国产亚洲a| 国产成人免费视| 2014国产精品| 日韩免费三级| 欧美日韩日日骚| 精品久久人人做人人爰| 国产精品麻豆久久久| 亚洲一区在线电影| 紧缚捆绑精品一区二区| 北条麻妃国产九九精品视频| 国产在线欧美日韩| 欧洲人成人精品| 国产婷婷色一区二区三区在线| 一区二区三区国产精品| 久久成人羞羞网站| av噜噜色噜噜久久| 色偷偷88欧美精品久久久| 欧美一区二区精品在线| 亚洲欧美日韩国产综合在线| 乱中年女人伦av一区二区| 97久久精品人人澡人人爽| 日韩欧美电影一区二区| 日韩一区二区三区免费观看| 亚洲图片另类小说| 精品亚洲成av人在线观看| 国产精品伊人日日| 欧美日韩国产成人在线免费| 中文字幕精品三区| 久久99久久99精品免视看婷婷| 翡翠波斯猫1977年美国| 欧美色手机在线观看| 国产精品高潮久久久久无| 久久爱另类一区二区小说| 国产精品青青草| 91精品国产综合久久福利| 亚洲精品免费一二三区| 成人国产精品免费| 91精品91久久久中77777| 国产精品色在线| 国产福利一区二区三区视频| 水蜜桃亚洲一二三四在线| 久久色.com| 韩国av一区二区三区在线观看| 久久伦理网站| 精品日韩成人av| 精品系列免费在线观看| 色涩成人影视在线播放| 久久久精品欧美丰满| 国产精品系列在线观看| 一区二区三区视频| 中文字幕亚洲电影| 97久久精品人人做人人爽 | thepron国产精品| 一区二区三区四区视频在线| 中文字幕一区二区在线观看| 高清shemale亚洲人妖| 在线观看亚洲一区| 午夜成人免费电影| 久久精品日产第一区二区三区| 精品国产成人在线影院| 麻豆高清免费国产一区| 日韩欧美精品在线不卡| 国产精品网友自拍| 91免费国产在线观看| 91精品蜜臀在线一区尤物| 免费观看在线色综合| 日本一区高清不卡| 亚洲精品写真福利| 精品国产一二| 国产精品第四页| 国产精品伊人日日| 欧美国产精品一区二区三区| caoporn国产一区二区| 日韩欧美激情在线| 国产成人精品免费在线| 欧美日本乱大交xxxxx| 日韩成人午夜电影| 91福利在线导航| 免费观看91视频大全| 色婷婷精品久久二区二区蜜臀av| 亚洲成人资源网| 亚洲国产精品视频一区| 性做久久久久久久免费看| 在线观看日韩羞羞视频| 秋霞影院一区二区| 欧美伊人精品成人久久综合97| 日本亚洲免费观看| 欧美日韩一区二区欧美激情| 精品综合免费视频观看| 91精品国产入口在线| 国产91在线观看| 久久伊人中文字幕| 99国内精品久久久久久久软件| 国产精品你懂的| 久久久久成人精品免费播放动漫| 亚洲天堂av老司机| 日韩视频精品| 日韩精品久久理论片| 色中色一区二区| 国内精品久久久久影院一蜜桃| 日韩一级视频免费观看在线| 91色九色蝌蚪| 亚洲少妇中出一区| 色婷婷综合久久久中文一区二区| 国产综合久久久久久鬼色 | 天天综合日日夜夜精品| 欧美日韩国产a| 99riav久久精品riav| 亚洲国产精品激情在线观看| 欧美1o一11sex性hdhd| 美女高潮久久久| 久久综合中文字幕| 日本一区二区三区精品视频| 久久精品99久久久| 久久久亚洲欧洲日产国码αv| 久久青青草原| 精品一区二区三区影院在线午夜| 日韩欧美国产一二三区| 久久99欧美| 激情成人综合网| 国产精品剧情在线亚洲| 色噜噜久久综合| 91麻豆精品秘密| 亚洲国产日韩综合久久精品| 777奇米四色成人影色区| 国产精品日韩一区二区三区| 午夜精品久久久久久久99水蜜桃 | 亚洲成人免费av| 日韩欧美激情在线| 婷婷久久青草热一区二区 | 国产精品国产三级国产aⅴ原创| 日本在线免费观看一区| 国产黄色精品视频| 亚洲欧美区自拍先锋| 91精品国产一区二区三区| 免费在线观看一区二区| 国产麻豆视频精品| 伊人性伊人情综合网| 日韩一区二区视频| 日韩精品久久一区| 国产99久久久国产精品潘金 | 国产亚洲欧美日韩在线一区| 亚洲综合欧美日韩| 91色婷婷久久久久合中文| 日韩中文字幕av电影| 欧美激情一区二区三区| 欧美日韩午夜在线| 欧美精品一区二区三区久久| 国产成人亚洲综合a∨婷婷| 一区二区三区欧美激情| 久久久久久97三级| 欧美日韩在线免费视频| 欧美精品123| 91免费在线看| 国产精品一区二区三区四区| 亚洲国产综合色| 国产精品久久久久久久久果冻传媒 | 亚洲欧美一区二区原创| 91亚色免费| 国产精品一二一区| 丝袜美腿亚洲一区二区图片| 中文字幕欧美激情| 欧美一区二区三区男人的天堂| 一区二区精品在线观看| 久久久www免费人成黑人精品| av亚洲精华国产精华精华| 日本欧美一区二区在线观看| 亚洲美女屁股眼交| 欧美国产日本韩| 精品免费国产一区二区三区四区| 欧美网站大全在线观看| 亚洲精品中文字幕乱码三区不卡| 九九九九精品| www日韩av| 91小视频免费看| 成人av先锋影音| 国产成人综合亚洲网站| 免费在线看成人av| 天天爽夜夜爽夜夜爽精品视频| 一区二区三区在线视频观看| 国产精品乱码人人做人人爱 | 97伦理在线四区| 成人性生交大片免费看视频在线 | 奇米精品一区二区三区在线观看 | 一二三区精品福利视频| 中国一区二区三区| 久久久久久久有限公司| 91在线国内视频| 91精品国产91久久久久青草| 成人免费毛片高清视频| 国产成人精品一区二区三区四区| 国产一区在线看|