久久精品在这里_成人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少妇免费| 国内成+人亚洲+欧美+综合在线| 日本不卡视频一二三区| 老司机一区二区| 国产福利91精品一区二区三区| 成人综合日日夜夜| 国产成人精品日本亚洲11| 精品国产免费人成电影在线观...| 久久综合中文色婷婷| 亚洲精品一区二区三区四区五区 | 国产成人av影院| 3d精品h动漫啪啪一区二区| 久久久久久九九九九| 日韩精品久久久| 色噜噜夜夜夜综合网| 日韩一区二区三区在线| 国产欧美日本一区二区三区| 亚洲午夜久久久久久久久久久| 久久国产人妖系列| 97se视频在线观看| 一本色道久久99精品综合| 欧美性极品少妇| 日本一区二区三区在线不卡| 亚洲电影在线播放| 国产成人福利片| 久久精品日产第一区二区三区乱码| 伊人久久婷婷色综合98网| 日韩一区二区精品葵司在线 | 国产精品资源网站| 国产伦精品一区二区三区免费视频| 日韩精品久久一区二区三区| 欧美午夜精品久久久| 久久女同性恋中文字幕| 午夜一区二区三区在线观看| 成人黄动漫网站免费app| 秋霞毛片久久久久久久久| 国产成人亚洲综合a∨婷婷图片| 不卡一区二区三区四区| 日韩免费一区二区三区| 日韩亚洲欧美高清| 亚洲成人av免费| 国产成a人亚洲| 视频在线精品一区| 日韩午夜在线观看| 午夜婷婷国产麻豆精品| 成人ar影院免费观看视频| 五月天色一区| 国产亚洲精品超碰| 激情文学综合网| 欧美中日韩免费视频| 精品国产乱码久久久久久影片| 五月天激情综合网| 国产精品v欧美精品∨日韩| 欧美性视频一区二区三区| 亚洲欧洲日产国码二区| 丁香婷婷综合五月| 一本久道久久综合中文字幕| 国产日韩欧美综合在线| 国产一区二区女| 婷婷精品国产一区二区三区日韩| 久久夜色精品国产噜噜av| 精品一区二区三区免费播放| 日韩精品一区二区三区四区五区 | 久久精品国产网站| 欧美日韩视频在线一区二区观看视频| 日韩久久久久久| 久久国产人妖系列| 亚洲无玛一区| 亚洲色欲色欲www| 999国产视频| 欧美大片一区二区| 国产一区在线观看麻豆| 色综合天天综合狠狠| 亚洲精品视频在线看| 成人片在线免费看| 亚洲精品在线免费播放| 极品少妇一区二区三区精品视频| 日日骚一区二区网站| 亚洲欧美在线aaa| 国产精品亚洲综合| 中文字幕精品在线不卡| 成人妖精视频yjsp地址| 91麻豆精品国产91久久久| 另类综合日韩欧美亚洲| 色婷婷综合五月| 天使萌一区二区三区免费观看| 日本一区高清在线视频| 亚洲欧美激情一区二区| 欧美动漫一区二区| 亚洲男同性恋视频| 免费国产一区二区| 亚洲一区二区三区午夜| 中文字幕中文在线不卡住| 2014亚洲精品| 日本一区二区在线不卡| 99一区二区| 国产日产精品1区| 国产精品日韩欧美一区二区| 中文字幕成人网| 麻豆av一区| 亚洲一区av在线| 一区二区不卡在线视频 午夜欧美不卡' | 一区二区成人国产精品| 日韩国产欧美在线播放| 日本道精品一区二区三区| 久久不见久久见免费视频7| 欧美日韩一区在线| 国产成人av一区二区三区在线| 欧美成人精品福利| 国产精品免费看一区二区三区| 亚洲视频你懂的| 中文字幕不卡每日更新1区2区| 美女高潮久久久| 日韩视频在线永久播放| 91精品国产一区二区三区动漫| 中文字幕va一区二区三区| 欧美大陆一区二区| 全部av―极品视觉盛宴亚洲| 在线综合+亚洲+欧美中文字幕| 99久精品国产| 亚洲日本护士毛茸茸| 日本韩国欧美在线| 懂色av一区二区三区免费看| 欧美日韩国产高清一区二区| 免费久久精品视频| 亚洲视频在线一区| 色综合天天视频在线观看| 麻豆精品国产91久久久久久| 自拍另类欧美| 艳妇臀荡乳欲伦亚洲一区| 在线码字幕一区| 精品无人区一区二区三区竹菊| 国产精品1区2区3区| 日日欢夜夜爽一区| 成人欧美一区二区三区在线播放| 91精选在线观看| 一区二区三区四区五区精品| 国产乱人伦精品一区二区| 国产一二精品视频| 天天综合网 天天综合色| 日韩一区在线看| 久久久综合视频| 3atv在线一区二区三区| 一本到三区不卡视频| 欧美极品日韩| 精品一区二区三区国产| 91免费版在线| a在线播放不卡| 国产99久久久精品| 国内精品久久久久影院一蜜桃| 午夜精品aaa| 亚洲在线视频网站| 亚洲色图19p| 国产精品视频一二三区| 999视频在线免费观看| 成人在线视频首页| 国产麻豆成人传媒免费观看| 久久精品国产网站| 免费高清不卡av| 日韩精品一二三| 视频一区二区三| av综合在线播放| 免费人成在线不卡| 亚洲人午夜精品天堂一二香蕉| 7777女厕盗摄久久久| 日本一区精品| av成人免费观看| 亚洲欧美激情小说另类| 国产精品电影院| 国产精品国产三级国产普通话蜜臀| 久久久久久97三级| 久久久蜜桃精品| 亚洲精品一区二区三区福利| 欧美刺激午夜性久久久久久久| 欧美一级日韩不卡播放免费| 91精品黄色片免费大全| 欧美电影影音先锋| 日韩免费观看高清完整版| 日韩一区二区三区在线观看| 欧美电影免费观看高清完整版在线| 91精品在线麻豆| 精品卡一卡二卡三卡四在线| 欧美精品一区二区三区视频| 精品国产乱码久久久久久免费| 26uuu精品一区二区| 国产日韩欧美高清| 亚洲天堂福利av| 亚洲成人激情综合网| 麻豆一区二区在线| 国产一区美女在线| 99综合电影在线视频| 产国精品偷在线| 欧美日韩中文国产一区发布| 一区二区三区我不卡| 欧美丰满嫩嫩电影| 久久精品欧美一区二区三区麻豆|