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

Rss & SiteMap

曙海教育集團論壇 http://www.bjzhda.cn

曙海教育集團論壇
共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
[瀏覽完整版]

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

1樓
wangxinxin 發表于: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
);

共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

Copyright © 2000 - 2009 曙海教育集團
Powered By 曙海教育集團 Version 2.2
Processed in .01563 s, 2 queries.
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
欧美成人精精品一区二区频| 日韩av中文字幕一区二区| 神马影院午夜我不卡| 国产精品免费看一区二区三区| 国产一区二区美女| 国产精品亚洲一区二区三区在线| 麻豆专区一区二区三区四区五区| 午夜电影网一区| 日本在线不卡一区| 久久国产精品99久久人人澡| 久久精品国产久精国产爱| 久久99九九99精品| 国产一区二区福利视频| 丁香桃色午夜亚洲一区二区三区| 99久久99久久精品免费观看| 91久久爱成人| 久久婷婷人人澡人人喊人人爽| 美日韩免费视频| 亚洲国产日韩欧美| 在线观看日韩国产| 日韩美女视频在线| 中文字幕成人av| 一区二区三区四区国产精品| 亚洲福中文字幕伊人影院| 日本不卡高清视频| 丁香六月综合激情| 精品一区二区日本| 一区二区三视频| 91麻豆精品91久久久久同性| 久久夜色精品国产噜噜av| 亚洲欧美综合另类在线卡通| 亚洲国产精品人人做人人爽| 国产在线精品国自产拍免费| 97超级碰碰| 热re99久久精品国产99热| 色美美综合视频| 日韩欧美国产精品一区| 国产精品久久久久久久久免费桃花 | 日韩国产欧美视频| 成人免费视频播放| 国产精品三区在线| 亚洲伊人婷婷| 亚洲精品一区二区三区香蕉 | 日韩av电影天堂| 99久久er热在这里只有精品15 | 精品国产一区二区三区日日嗨 | 欧美日韩亚洲免费| 欧美疯狂做受xxxx富婆| 欧美国产精品一区二区三区| 午夜在线成人av| 99精品视频一区| 四虎永久国产精品| 久久精品亚洲精品国产欧美| 偷拍亚洲欧洲综合| 91论坛在线播放| 在线免费亚洲电影| 国产欧美一区二区精品秋霞影院| 五月天激情综合网| 国产精品福利视频| 欧美一区二区三级| 亚洲一区二区三区四区在线免费观看| 国内久久婷婷综合| 精品蜜桃一区二区三区| 欧美日韩国产中文| 亚洲精品五月天| 成人伦理片在线| 一区二区三区三区在线| 国产精品日韩精品欧美在线| 精品影视av免费| 亚洲国产激情一区二区三区| 久久久久久久综合色一本| 美女精品一区二区| 欧美日韩一区综合| 日本一区二区三区四区在线视频| 久国产精品韩国三级视频| 欧美成ee人免费视频| 欧美精品丝袜久久久中文字幕| 亚洲国产综合视频在线观看| 国产精品对白一区二区三区| 精品少妇一区二区三区| 久久av中文字幕片| 亚洲春色综合另类校园电影| 中文欧美字幕免费| 国产剧情一区二区| 欧美无人高清视频在线观看| 香蕉久久一区二区不卡无毒影院| 久久66热这里只有精品| 国产片一区二区三区| 丁香激情综合国产| 欧美精品tushy高清| 极品少妇xxxx精品少妇| 欧美无砖专区一中文字| 奇米影视在线99精品| 亚洲激情啪啪| 亚洲国产日韩综合久久精品| 好看的日韩精品视频在线| 国产欧美精品一区二区三区四区| av一区二区三区四区| 欧美一级高清大全免费观看| 国产一区二区在线视频| 在线播放中文一区| 精一区二区三区| 欧美色综合网站| 久久精品免费看| 欧美日韩你懂得| 国内精品在线播放| 欧美日韩一卡二卡| 国产精品一区一区| 在线播放91灌醉迷j高跟美女 | 一区二区三区 在线观看视频| 精品乱码一区| 伊人开心综合网| 色一情一乱一伦一区二区三区| ㊣最新国产の精品bt伙计久久| 激情视频在线观看一区二区三区| 中文字幕中文字幕一区二区 | 久久99久久久久| 欧美美女bb生活片| 国产原创一区二区三区| 日韩三级中文字幕| 2014国产精品| 国产精品卡一卡二卡三| 欧美极品一区| 爽爽淫人综合网网站| 欧美日韩你懂的| 99久久精品免费精品国产| 国产亚洲短视频| 欧美日韩一区在线播放| 日本女优在线视频一区二区| 欧美三级日韩三级国产三级| 国产高清不卡一区| 国产人伦精品一区二区| 日本午夜精品电影| 久久99精品国产麻豆婷婷洗澡| 91精品国产综合久久香蕉的特点| 91丨九色丨国产丨porny| 国产精品国产自产拍高清av王其| 亚洲精品9999| 东方aⅴ免费观看久久av| 国产欧美日韩不卡免费| 日韩欧美亚洲精品| 国产乱人伦偷精品视频不卡| 久久综合色天天久久综合图片| 国产综合精品一区二区三区| 亚洲18色成人| 欧美一三区三区四区免费在线看| 99久久伊人网影院| 亚洲精品成人天堂一二三| 欧美日韩久久一区二区| 97久草视频| 日韩精品一级二级 | 国产女同互慰高潮91漫画| 免费成人看片网址| 久久国产乱子精品免费女| 久久嫩草精品久久久久| 亚洲视频在线观看日本a| 免费成人美女在线观看.| 欧美色网一区二区| 99精品视频在线观看免费| 亚洲人吸女人奶水| 国产精品亚洲第一区在线暖暖韩国| 久久riav| 亚洲第一电影网| 91精品久久久久久久99蜜桃| 久久99精品国产99久久| 激情久久久久久久久久久久久久久久| 国产亚洲人成网站| 欧美又粗又大又爽| 国内精品写真在线观看| 亚洲女人小视频在线观看| 欧美一区二区三区四区久久 | 色综合网站在线| 91精品国产高清久久久久久91裸体| 亚洲va欧美va人人爽| 久久精品一区二区三区不卡牛牛 | 欧美日本一道本在线视频| 久久精品国产美女| 国产福利一区二区三区视频| 亚洲午夜三级在线| 久久奇米777| 欧美三级电影在线观看| 欧美精品国产精品久久久| av资源网一区| 韩国v欧美v日本v亚洲v| 亚洲成av人片在线| **欧美大码日韩| www亚洲一区| 91精品国产高清一区二区三区蜜臀| 日韩伦理一区二区三区av在线| 成人av电影免费在线播放| 日韩一区欧美二区| 亚洲男女一区二区三区| 久久久久久久久久久久久久久99| 欧美色成人综合| 亚洲国产午夜伦理片大全在线观看网站 | 91色九色蝌蚪| 国产精品一级二级三级| 日韩成人dvd| 亚洲国产精品综合小说图片区| 国产精品欧美精品|