曙海教育集團(tuán)論壇Win CE 專區(qū)WinCE應(yīng)用開發(fā) → WINCE驅(qū)動(dòng)開發(fā)之DMA的使用


  共有9409人關(guān)注過(guò)本帖樹形打印

主題:WINCE驅(qū)動(dòng)開發(fā)之DMA的使用

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


加好友 發(fā)短信
等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
WINCE驅(qū)動(dòng)開發(fā)之DMA的使用  發(fā)帖心情 Post By:2010-11-26 9:22:53

以下是MSDN中的說(shuō)法:

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. 


具體如何實(shí)現(xiàn)DMA呢?

在microsoft windows CE device driver kit中有一節(jié)是:Implementing DMA for NDIS Miniport Drivers 
專門提到了這個(gè)問(wèn)題,當(dāng)前ce還沒(méi)有自己的DMA機(jī)制,然而開發(fā)人員可以在他們自己的小端口卡驅(qū)動(dòng)程序中實(shí)現(xiàn)相同的功能,但是寫的太簡(jiǎn)單了

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.

后來(lái)發(fā)MAIL給一位曾經(jīng)遇到此問(wèn)題的朋友,回復(fù)如下:

事實(shí)上在使用DMA是的關(guān)鍵是得到一個(gè)連續(xù)的物理地址空間,然后將該空間的物理地址放入DMA控制器的源地址或者目的地址寄存器中(根據(jù)你使用DMA的方向決定);
然后等待DMA中斷;
由于DMA使用的是物理地址但是在wince中只能使用虛擬地址,所以在DMA中斷產(chǎn)生之后如需分析數(shù)據(jù)請(qǐng)使用虛擬地址;
特別提示參考一下的文章:
 DMA的使用
1、 芯片DMA的使用要點(diǎn):
AK3224芯片的DMA使用中,RAM的地址作為DMA傳輸?shù)哪繕?biāo)地址、源地址,必須要4字節(jié)對(duì)齊。而且DMA的操作長(zhǎng)度以內(nèi)的RAM地址,必須連續(xù)。
不過(guò)在使用中發(fā)現(xiàn):Nandflash驅(qū)動(dòng)中RAM地址作為目標(biāo)地址時(shí),只需要2字節(jié)對(duì)齊。RAM地址作為源地址可不需對(duì)齊。(其他情況需要逐一驗(yàn)證)
2、 wince中的DMA使用:
根據(jù)DMA一次操作的RAM地址必須連續(xù)的特性,在驅(qū)動(dòng)DMA使用時(shí),我們需要確保虛擬地址映射的物理地址是連續(xù)的。有3個(gè)途徑:
1:數(shù)據(jù)區(qū)地址是由應(yīng)用層或者其他進(jìn)程、線程傳入的,驅(qū)動(dòng)并不知道其虛擬地址對(duì)應(yīng)的物理地址是否一直連續(xù)。
由于wince的內(nèi)存申請(qǐng),是以4K字節(jié)為一個(gè)頁(yè),一段數(shù)據(jù)的內(nèi)存申請(qǐng)可能跨越多個(gè)頁(yè)。因此,只要數(shù)據(jù)區(qū)長(zhǎng)度大于1字節(jié),就有可能其物理地址是跨越的、不連續(xù)的。為了確保DMA操作,我們必須查詢這段數(shù)據(jù)區(qū)在RAM上的物理分布。
首先,得到數(shù)據(jù)區(qū)所在的虛擬頁(yè): VirPageStart = (ULONG)pSourceBuffer & 0xFFFFF000;
其次,得到數(shù)據(jù)區(qū)在頁(yè)內(nèi)的偏移地址 :offset = (ULONG)pSourceBuffer & 0x0FFF;
計(jì)算數(shù)據(jù)區(qū)是否跨越頁(yè)段
if(offset + NumberOfBytes > 4096)
PageSize = WCE_UNIFORM_SIZE - offset;       //整個(gè)數(shù)據(jù)跨越此頁(yè),則DMA傳輸需要分多個(gè)部分,一次一個(gè)頁(yè)段的傳
else
PageSize = NumberOfBytes;                //數(shù)據(jù)區(qū)沒(méi)有跨越頁(yè)
由得到的頁(yè)地址,查詢映射的物理地址。
if(!LockPages((LPVOID)VirPageStart, 4096, &TransAddr, LOCKFLAG_READ))
{
        //異常處理
}
UnlockPages((LPVOID)VirPageStart, 4096);
得到了映射的物理地址TransAddr后,根據(jù)RAM是目標(biāo)地址還是源地址,做進(jìn)一步的處理。
假設(shè)一個(gè)數(shù)據(jù)區(qū)作為DMA源地址,大小為9K。在虛擬地址首頁(yè)的偏移為4K。那么它必然跨越3個(gè)頁(yè)段。
首先查詢第一頁(yè)的物理地址發(fā)送,第一個(gè)頁(yè)的2K數(shù)據(jù)。然后查詢第二頁(yè)的物理地址,發(fā)送4K數(shù)據(jù)。最后查詢第三頁(yè)的物理地址,發(fā)送3K數(shù)據(jù)。

2:數(shù)據(jù)區(qū)的申請(qǐng)可以使用AllocPhysMem函數(shù)申請(qǐng)。
LPVOID AllocPhysMem(
DWORD cbSize,                 參數(shù)1:數(shù)據(jù)區(qū)大小
DWORD fdwProtect,             參數(shù)2:保護(hù)標(biāo)記
DWORD dwAlignmentMask,         參數(shù)3:0(default system)
DWORD dwFlags,                參數(shù)4:0(Reserved for future use)
PULONG pPhysicalAddress         參數(shù)5:得到數(shù)據(jù)區(qū)對(duì)應(yīng)的物理地址
);
AllocPhysMem函數(shù)返回值為指向申請(qǐng)后的虛擬地址指針。
如:pSerialHead->RxBufferInfo.RxCharBuffer =            //alloc physical memory
AllocPhysMem(pSerialHead->RxBufferInfo.Length + 16, PAGE_READWRITE, 0, 0, &RX_PhyAddr);
由于此函數(shù)必定申請(qǐng)到一片連續(xù)的物理地址,因此pSerialHead->RxBufferInfo.RxCharBuffer的使用不再需要查詢是否跨越多個(gè)頁(yè)段。
但是,AllocPhysMem函數(shù)申請(qǐng)的物理地址可能會(huì)跨越多個(gè)RAM CHIP。因此,在使用1片以上RAM芯片的系統(tǒng)中,依然需要查詢是否跨越CHIP。
       AllocPhysMem函數(shù)使用后,需要使用FreePhysMem函數(shù)進(jìn)行釋放。
3:數(shù)據(jù)區(qū)可以在系統(tǒng)config.bib文件中,預(yù)先定義好一片連續(xù)、不跨越CHIP的RAM空間。
如下,系統(tǒng)保留了虛擬地址0x80024000開始,大小為0x3000的一段RAM。
SER_DMA                80024000 00003000 RESERVED
那么驅(qū)動(dòng)DMA使用中,不再需要對(duì)這段內(nèi)存,進(jìn)行任何的查詢動(dòng)作。我們只需要在進(jìn)程空間中做映射即可。
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);
        }
    }
上面這段程序中,先使用函數(shù)VirtualAlloc,在進(jìn)程空間中申請(qǐng)一段保留的虛擬地址空間。然后使用VirtualCopy,把需要使用的物理地址空間,映射到已經(jīng)申請(qǐng)好的虛擬地址上。使用完畢,必須使用函數(shù)VirtualFree進(jìn)行釋放。
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反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

WINCE驅(qū)動(dòng)開發(fā)之DMA的使用








簽名
主站蜘蛛池模板: 欧美xxxxx69| 国内露脸中年夫妇交换视频| 欧美激情综合亚洲五月蜜桃| 日本免费精品一区二区三区| 出差被绝伦上司侵犯中文字幕| 91天堂国产在线在线播放| 晚上睡不着来b站一次看过瘾| 又大又硬又爽又深免费看 | 中文字幕无线码一区| 特一级黄色毛片| 国产在线精品香蕉麻豆| 一区二区三区无码高清视频| 欧美成人小视频| 四虎永久地址4hu2019| 69视频在线观看高清免费| 无码中文资源在线播放| 亚洲欧洲日产国码在线观看| 色婷婷久久综合中文久久蜜桃| 国内精品自产拍在线观看91| 久久伊人精品青青草原高清| 爱情岛论坛亚洲高品质| 国产成人久久777777| JAPANESE国产在线观看播放| 日本高清在线不卡| 亚洲精品人成无码中文毛片| 超碰97久久国产精品牛牛| 国产麻豆一精品一av一免费| 久久亚洲AV午夜福利精品一区| 毛片网站在线观看| 国产91热爆ts人妖在线| 色爱区综合激情五月综合激情| 性无码一区二区三区在线观看| 亚洲av无码精品色午夜果冻不卡| 精品一区二区三区在线观看l | 北岛玲日韩精品一区二区三区| 亚洲综合在线另类色区奇米| 好吊妞788gaoc视频免费| 久久人妻内射无码一区三区| 欧美日韩一区二区综合| 兴奋的阅读td全集视频| 麻豆安全免费网址入口|