午夜久久久精品一区二区三区,日韩一区二区三区在线,久久久久久久成人午夜精品福利http://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團論壇wince下usb驅動攻堅戰(zhàn)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1833&Page=1wangxinxin2010-11-26 14:08:26HeadPtr-->ED-->ED-->ED-->ED
ED-->TD-->TD-->TD...

    根據(jù)OHCI spec:每個ED(Endpoint Descriptor)描述USB設備的一個端點的所有數(shù)據(jù)傳輸,所有的ED被連接在一起;而TD(Transfer Descriptor)描述的才是最終要在USB總線上傳輸?shù)臄?shù)據(jù)包,屬于同一個USB設備端點的TD被連接在一起,并掛在相應的ED上。
1)ohcd.c
該文件在platform下,可替代wince自帶的system.c文件(在public/common/oak/drivers/usb/hcd/ohc/下)。該文件中的函數(shù)被hcddrv.c文件中的HCD_流形式接口函數(shù)調用。
2)hcddrv.cpp
該文件在public/common/oak/drivers/usb/hcd/common下面,文件中的具體設置函數(shù):
HcdMdd_CreateMemoryObject
HcdMdd_CreateHcdObject
HcdMdd_DestroyMemoryObject
HcdMdd_DestroyHcdObject
HcdMdd_PowerOn
HcdMdd_PowerDown
HcdMdd_SetCapability
又被ohcd.c中的函數(shù)調用
CUHcd-->CHW-->CHcd(繼承關系,CUHcd的實例被創(chuàng)建)
 
初始化函數(shù)調用流程
1)HCD_Init()[hcddrv.cpp]
2)HcdPdd_Init()[ohcd.c]
3)InitializeOHCI()[ohcd.c]
配置IOBASE,IRQ。可讀取注冊表,也可以通過程序自配
4)HcdMdd_CreateMemoryObject();HcdMdd_CreateHcdObject()[hcddrv.cpp]
HcdMdd_CreateMemoryObject()==>CPhysMem->InittedOK()[usb/hcd/common/cphysmem.hpp]
HcdMdd_CreateHcdObject()==>CHcd->DeviceInitialize()[usb/hcd/ohcd2/cuhcd.cpp]
 
CHcd::DeviceInitialize()過程
1)CDeviceGlobal::Initialize()[usb/hcd/common/cdevice.cpp]
加載usbd.dll,并調用其中的HcdAttach()[usb/usbd/usbddrv.cpp]用hcddrv.cpp中的gc_HcdFuncs來設置usbd層的功能函數(shù)[pHcd->pHcdFuncs]
2)CHW::Initialize()[usb/hcd/ohcd2/chw.cpp]
初始化硬件,控制器寄存器,并創(chuàng)建線程用于處理HC的IST,并調用SignalCheckForDoneTransfer()來偵聽傳輸?shù)耐瓿?br/>3)CHCCArea::Initialize()[usb/hcd/ohcd2/cpipe.cpp]
初始化CPipe的靜態(tài)變量,建立一個禎鏈表的空調度,同時建立中斷Queue Head樹,創(chuàng)建線程用于處理傳輸完成。
 
IoPortBase = USB_BASE 以及Sys_Irq的初始化流程
1)HcdPdd_Init()[ohcd.c]
2)InitializeOHCI()[ohcd.c]
3)ConfigureOHCICard()[ohcd.c]:在此配置;HcdMdd_CreateHcdObject()[hcddrv.cpp]
4)CreateHCDObject()[cuhcd.cpp]:在此new CUhcd并初始化其父類CHW,在CHW初始化時初始化其成員變量m_portBase[chw.cpp]
 
Transfer流程
所有的IssueTransfer最終都要調用CPipe::IssueTransfer()[cpipe.cpp]
1)new STransfer并配置
2)拷貝client buffer到out transfer
3)AddTransfer:設置TDs鏈表并加到相應的ED下
4)ScheduleTransfer
5)CHW::ListControl()
 
[以下以bulk為例]
1)在CHW::Initialize()中有
CHW::m_pBulkHead = &m_portBase->HcBulkHeadED;
2)在各pipe類的::OpenPipe()中有
*(CHW::m_pBulkHead) = (pa)m_pED;
 
故此:傳輸過程由HC根據(jù)各ED值來讀寫指定內存,具體數(shù)據(jù)在各ED下的TDS鏈表中的各TD中,過程由HcControl和HcCommandStatus寄存器的各相應位來控制。
]]>
WinCE中串口驅動及接口函數(shù)介紹http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1832&Page=1wangxinxin2010-11-26 14:01:54  

       串口驅動本身分為MDD層和PDD層。MDD層對上層的Device Manager提供了標準的流設備驅動接口(COM_xxx),PDD層實現(xiàn)了HWOBJ結構及結構中若干針對于串口硬件操作的函數(shù)指針,這些函數(shù)指針將指向PDD層中的串口操作函數(shù)。DDSI是指MDD層與PDD層的接口,在串口驅動中實際上就是指HWOBJ,PDD層會傳給MDD層一個HWOBJ結構的指針,這樣MDD層就可以調用PDD層的函數(shù)來操作串口。

       微軟針對于串口驅動提供了參考源代碼,可以在下面的目錄下找到:”\WINCE600\PUBLIC\COMMON\OAK\DRIVERS\SERIAL”。

   串口驅動的結構也就是這樣了,下面介紹相關的驅動中的接口。

1. HWOBJ結構

    在串口驅動中,HWOBJ結構中的函數(shù)實現(xiàn)了對串口硬件的操作,并在MDD層被調用。可以說,該結構描述了串口設備的所有特性,先來介紹一下該結構,具體定義如下:
typedef struct __HWOBJ
{  
    ULONG BindFlags;  
    DWORD dwIntID;  
    PHW_VTBL pFuncTbl;
} HWOBJ, *PHWOBJ;
BindFlags:用于控制MDD層如何來處理IST,具體值如下:           

                       THREAD_IN_PDD:MDD層不處理,中斷在PDD層處理。            

                       THREAD_AT_INIT:在驅動初始化的時候,MDD層啟動IST。            

                       THREAD_AT_OPEN:在驅動被Open的時候,MDD層啟動IST。

dwInitID: 系統(tǒng)的中斷號 pFuncTbl: 指向一個PHW_VTBL結構,該結構中包含一個函數(shù)指針列表,這些函數(shù)指針指向串口硬件操作函數(shù),用于操作串口。

view plaincopy to clipboardprint?
typedef struct __HW_VTBL   
  
    {   
  
    PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);   
  
    ULONG (*HWDeinit)(PVOID pHead);   
  
    BOOL (*HWOpen)(PVOID pHead);   
  
    ULONG (*HWClose)(PVOID pHead);   
  
    ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);   
  
    PVOID (*HWGetRxStart)(PVOID pHead);   
  
    INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);   
  
    VOID (*HWOtherIntrHandler)(PVOID pHead);   
  
    VOID (*HWLineIntrHandler)(PVOID pHead);   
  
    ULONG (*HWGetRxBufferSize)(PVOID pHead);   
  
    VOID (*HWTxIntrHandler)(PVOID pHead);   
  
    ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);   
  
    BOOL (*HWPowerOff)(PVOID pHead);   
  
    BOOL (*HWPowerOn)(PVOID pHead);   
  
    VOID (*HWClearDTR)(PVOID pHead);   
  
    VOID (*HWSetDTR)(PVOID pHead);   
  
    VOID (*HWClearRTS)(PVOID pHead);   
  
    VOID (*HWSetRTS)(PVOID pHead);   
  
    BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);   
  
    BOOL (*HWDisableIR)(PVOID pHead);   
  
    VOID (*HWClearBreak)(PVOID pHead);   
  
    VOID (*HWSetBreak)(PVOID pHead);   
  
    BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);   
  
    ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);   
  
    VOID (*HWReset)(PVOID pHead);   
  
    VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);   
  
    VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);   
  
    VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);   
  
    BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);   
  
    BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);   
  
    BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);   
  
} HW_VTBL, *PHW_VTBL;  

typedef struct __HW_VTBL

{

  PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);

   ULONG (*HWDeinit)(PVOID pHead);

   BOOL (*HWOpen)(PVOID pHead);

   ULONG (*HWClose)(PVOID pHead);

   ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);

   PVOID (*HWGetRxStart)(PVOID pHead);

   INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);

   VOID (*HWOtherIntrHandler)(PVOID pHead);

   VOID (*HWLineIntrHandler)(PVOID pHead);

   ULONG (*HWGetRxBufferSize)(PVOID pHead);

   VOID (*HWTxIntrHandler)(PVOID pHead);

   ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);

   BOOL (*HWPowerOff)(PVOID pHead);

   BOOL (*HWPowerOn)(PVOID pHead);

   VOID (*HWClearDTR)(PVOID pHead);

   VOID (*HWSetDTR)(PVOID pHead);

   VOID (*HWClearRTS)(PVOID pHead);

   VOID (*HWSetRTS)(PVOID pHead);

   BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);

   BOOL (*HWDisableIR)(PVOID pHead);

   VOID (*HWClearBreak)(PVOID pHead);

   VOID (*HWSetBreak)(PVOID pHead);

   BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);

   ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);

   VOID (*HWReset)(PVOID pHead);

   VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);

   VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);

   VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);

   BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);

   BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);

   BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);

} HW_VTBL, *PHW_VTBL; 這些函數(shù)將在PDD層實現(xiàn),用于實際的串口硬件操作。


2. MDD層API

MDD層向上提供了流設備接口,這部分代碼微軟已經(jīng)實現(xiàn),用于管理串口。雖然我們不需要實現(xiàn)這部分,但是還是對相應的接口做個簡單介紹。

2.1HANDLE COM_Init(ULONG Identifier):

       初始化串口設備,該函數(shù)通過讀取注冊表獲得串口設備號,并獲得相應的HWOBJ的結構指針,通過該指針調用PDD層的硬件初始化函數(shù)初始化串口。

Identifier:如果驅動被設備管理器加載,那么這個參數(shù)將包含一個注冊表鍵值在” HKEY_LOCAL_MACHINE\Drivers\Active”路徑下。如果驅動是通過調用RegisterDevice函數(shù)來加載的,那么這個值等于dwInfo的值。在COM_Init中,會先打開該鍵值,用返回的句柄來查詢DeviceArrayIndex值,并根據(jù)該值獲得PDD層的HWOBJ結構指針。

2.2 BOOL COM_Deinit(void):

       卸載串口設備,該函數(shù)中主要做了一些釋放資源的操作。也可以被DeregisterDevice函數(shù)調用。

2.3 HANDLE COM_Open(HANDLE pContext, DWORD AccessCode, DWORD ShareMode):

       打開串口設備。應用程序調用CreateFile函數(shù)打開串口時,該函數(shù)會被調用。

       pContext:COM_Init函數(shù)返回的Handle。

       AccessCode:設置訪問模式,比如共享讀或者是讀寫模式。

       ShareMode:在參數(shù)從應用程序中的CreateFile函數(shù)中傳來,表示是否支持獨自占有。

2.4 BOOL COM_Close(DWORD pContext):

       關閉串口設備。應用程序調用CloseHandle函數(shù)關閉串口時,該函數(shù)會被調用。

       pContext:該參數(shù)為COM_Open函數(shù)返回的Handle。

2.5 ULONG COM_Read(HANDLE pContext, PUCHAR pTargetBuffer, ULONG BufferLength, PULONG pBytesRead):

       讀串口數(shù)據(jù)。應用程序調用ReadFile函數(shù)讀串口的時候,該函數(shù)被調用。

       pContext:COM_Open函數(shù)返回的Handle。

       pTargetBuffer:指向一個用于存放讀到數(shù)據(jù)的Buffer。

       BufferLength:pTargetBuffer指向的Buffer的大小。

       pBytesRead:實際讀到的數(shù)據(jù)的大小。

2.6 ULONG COM_Write(HANDLE pContext, PUCHAR pSourceBytes, ULONG NumberOfBytes):

       寫串口數(shù)據(jù)。應用程序調用WriteFile函數(shù)寫串口的時候,該函數(shù)被調用。

       pContext:COM_Open函數(shù)返回的Handle。

       pSourceBytes:指向一個Buffer,該Buffer包含要寫入串口的數(shù)據(jù)。

       NumberOfBytes:要寫入串口的數(shù)據(jù)的大小。

2.7 BOOL COM_PowerUp(HANDLE pContext):

       該函數(shù)主要用于串口設備從suspend模式恢復到正常模式。

       pContext:串口設備的Handle。

2.8 BOOL COM_PowerDown(HANDLE pContext):

       該函數(shù)主要用于串口設備從正常模式進入suspend狀態(tài)。

       pContext:串口設備的Handle。]]>
WinCE驅動程序的分類http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1831&Page=1wangxinxin2010-11-26 13:56:33最近有一些同學發(fā)郵件問我,驅動調試助手到底能動態(tài)加載哪些驅動,為什么在加載USB設備驅動時總是失敗。要解釋這個問題,首先得弄清楚WinCE中驅動的相關概念。本文將主要介紹WinCE下驅動程序的分類。

       驅動程序是介于操作系統(tǒng)和設備之間的一 個代碼層,它的主要作用是為操作系統(tǒng)提供一個接口,以操作不同的硬件,包括物理的和虛擬的設備。雖然驅動程序有很多種,但從編程的角度來看,無非是往一個 固定的框架中添加相應的代碼。這里的框架指的是一個接口,面向操作系統(tǒng)。代碼實現(xiàn)的宗旨是,在正確的時間往正確的寄存器中寫正確的值。

       驅動程序的分類,從不同的角度有不同的 分法。拿串口驅動來說,你可以說它是一個分層驅動,你也可以說它是一個流驅動,你還可以說它是開機時自動加載的驅動……這似乎有點亂。如果你也這么認為, 那建議往下看。如果這些你都了如指掌,那就不浪費時間了,當然,您愿意找茬,我會很感謝!

       先說本地驅動(Native Drivers)和流驅動(Stream Drivers)WinCE下的驅動都可以歸類到這兩個里面,二者必居其一。這是從驅動程序提供給操作系統(tǒng)的接口來區(qū)分的。流驅動為操作系統(tǒng)提供了流接口函數(shù),如XXX_Init()XXX_Open()XXX_Read()XXX_Write()XXX_Close()等等。這一類的驅動由Device Manager來管理,它調用ActivateDeviceEx()函數(shù)來加載流驅動。ActivateDeviceEx()的參數(shù)是注冊表中相應的鍵,用來設定加載流驅動的屬性,如IndexOrderPrefix等等。流驅動的注冊表配置信息一般存放在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下。流驅動加載成功后,應用程序通過調用CreateFile()ReadFile()WirteFile()等來訪問流驅動的設備。流驅動可以動態(tài)管理,驅動調試助手就是用來幫助調試這一類驅動的。

與流驅動相反,本地驅動提供給操作系統(tǒng)的不是標準的流接口,而是事先約定好的特定接口。不同的設備,接口也不一樣。WinCE中,常見的本地驅動有LCD顯示驅動、觸摸屏驅動、鼠標和鍵盤驅動及打印機驅動等。可以看到,本地驅動主要是人機界面相關的驅動。它們由GWES管理,在系統(tǒng)啟動時加載。他們在注冊表中也有各自相應的配置信息。如鍵鼠的注冊表配置如下:

[HKEY_LOCAL_MACHINE"System"CurrentControlSet"Control"Layouts"00000409]

"Layout File"="kbdmouse.dll"

"Layout Text"="US"

"PS2_AT"="kbdmouse.dll"

"Matrix"="kbdmouse.dll"

本地驅動由操作系統(tǒng)調用,應用程序不能訪問。對于這類驅動,驅動調試助手是無能為力的,只能老老實實的編譯、下載、驗證。

WinCE驅動中經(jīng)常會聽到MDD(Model Device Driver)PDD(Platform Dependent Driver)的概念,這是從驅動代碼實現(xiàn)的結構來區(qū)分的。WinCE的驅動可以是單層的,也可以是PDD+MDD。這沒有硬性規(guī)定,一個驅動程序可以采用分層結構,也可以采用單層結構。一般來說,單層結構的驅動執(zhí)行效率更高,而分層結構的驅動方便代碼維護和移植。拿串口驅動來說,完全可以采用單層結構。而把它分為PDDMDD,作為一般的開發(fā)者,我們只需實現(xiàn)PDD層就可以了,MDD層由微軟實現(xiàn)。這樣,驅動開發(fā)的工作量少很多,而代碼的可靠性則有了更好的保證。至于采用哪一種結構的驅動,主要看你的需求。

WinCE 6.0引入了內核態(tài)驅動和用戶態(tài)驅動的概念。在WinCE5.0及先前的版本中,驅動工作在用戶態(tài)。從代碼方面看,內核態(tài)驅動和用戶態(tài)驅動沒太大差別。如果驅動中沒有采用什么特別的技術,內核態(tài)驅動和用戶態(tài)驅動甚至是二進制兼容的。我曾經(jīng)試過將一個DLL分 別加載到內核態(tài)和用戶態(tài),都工作得很好。內核態(tài)驅動被加載到內核空間,用戶態(tài)驅動被加載到特定的用戶進程空間中。從執(zhí)行效率來看,內核態(tài)的驅動效率比用戶 態(tài)的驅動高。從穩(wěn)定性方面考慮,用戶態(tài)的驅動不會對系統(tǒng)產(chǎn)生致命影響,而內核態(tài)的驅動相對危險。同樣,采用哪一種類型的驅動,也是看你的需求。

從驅動加載的時間來看,可分為兩種:系統(tǒng)啟動時加載和需要時加載。一般來說本地驅動都是在啟動時加載的,所以這里說的主要是流驅動。如果想要驅動在系統(tǒng)啟動時加載,只需將它的注冊表配置信息放到[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\]下,如[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery],系統(tǒng)啟動時,Device Manager會自動加載它。需要時加載,顧名思義,就是想加載就加載,想卸載就卸載,很靈活。這里很有必要說一下USB設備的驅動加載,如USB攝像頭驅動,它也屬于需要時加載的驅動。從驅動的接口來看,它屬于流驅動,但相對普通的流驅動,它增加了幾個函數(shù):USBDeviceAttach()USBInstallDriver()USBUnInstallDriver()等。USB攝像頭驅動的加載在USBDeviceAttach()中完成。所以,它無須,也不能,用驅動調試助手加載。需要時加載的驅動還有一個作用,在無法修改系統(tǒng)的情況下,應用程序中動態(tài)加載該驅動,以完成對硬件的操作。

......

]]>
基于FM2010和WinCE平臺的回音消除驅動設計http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1830&Page=1wangxinxin2010-11-26 13:52:271 開發(fā)平臺與基本概念介紹
WinCE是Microsoft公司推出的功能強大、緊湊高效、可伸縮的32位嵌入式操作系統(tǒng),主要面對各種各樣的嵌入式系統(tǒng)和產(chǎn)品。該系統(tǒng)所具有的多線程、多任務、完全搶占式的特點是專為各種具有嚴格資源限制的硬件系統(tǒng)所設計的。
FM2010是ForteMedia公司推出的一款語音處理器,具有迷你型尺寸、單芯片解決方案、高性能、低功耗,以及優(yōu)良的回聲消除和噪聲抑制功能,利用創(chuàng)新的SAM(小型陣列麥克風)技術與波束形成能力使其功率消耗僅為25 mW。FM2010具有提高電池壽命、降低功耗和節(jié)省芯片尺寸等優(yōu)點,可滿足便攜式手持掌上電腦、筆記本電腦、平板電腦和手機的嚴格要求。


2 回聲產(chǎn)生的原理與消除方法
2.1 回聲的基本概念和產(chǎn)生原理
通常意義上的回聲可以分為電學回聲和聲學回聲,前一種是由于服務提供商的線路質量所致,而后一種則是由于用戶端設備的質量所致。
2.1.1 電學回聲
在PSTN (Public Switched Telephone Network,公共交換電話網(wǎng)絡)中,為了降低電話中心局與電話用戶之間電話線的價格,用戶線間的連接采用兩線制,而電話中心局之間連接采用四線制。在這樣采用混合線制的電路中,由于阻抗的失配,會不可避免地產(chǎn)生電流泄漏。電流泄漏使得一部分信號的能量反射回信號源,這種反射和信道延遲結合在一起,使講話者聽到自己的聲音,即為電學回聲。
2.1.2 聲學回聲
聲學回聲是指揚聲器播出的聲音在被受話方聽到的同時,也通過多種路徑被麥克風拾取到,傳輸?shù)秸f話方的一端,從而形成聲音回路。當回聲返回時間超過10 ms時,人耳就可聽到明顯的回聲了。多路徑反射的結果產(chǎn)生了不同延時的回聲,包括直接回聲和間接回聲。
①直接回聲是指由揚聲器播出的聲音未經(jīng)任何反射直接進入麥克風。這種回聲的延時最短,它同遠端說話者的語音能量,揚聲器與麥克風之間的距離、角度,揚聲器的播放音量,麥克風的拾取靈敏度等因素直接相關。
②間接回聲是指由揚聲器播出的聲音經(jīng)過不同的路徑(如房屋或房屋內的任何物體)的一次或多次反射后,進入麥克風所產(chǎn)生的回聲的集合。房屋內的任何物體的任何變動都會改變回聲的通道,因此,這種回聲的特點是多路徑的、時變的。
對于電學回聲的消除,通常由服務提供商提供解決方案。本文研究的重點是聲學回聲的消除機制,為了防止聲音回路的產(chǎn)生,通常需要在硬件和軟件設計中采取一定的解決方案。
如圖1所示,雙方在使用PDA或者手機進行通話時,假設B是主話方,A是受話方:

圖片點擊可在新窗口打開查看

①B說話的聲音經(jīng)過電信或者移動路徑傳輸?shù)紸的設備上;
②聲音經(jīng)過揚聲器發(fā)出,由于硬件和機構設計上的局限性,會有部分聲音滲透到A的麥克風;
③滲透出的聲音又傳輸回到B,導致B能聽到自己的聲音。
這樣,便形成了聲音回路,即產(chǎn)生了回聲。
PDA或者手機內部結構聲音回路示意圖如圖2所示。在全雙工的情況下,揚聲器和麥克風之間至少要保持4 cm以上的距離,才能比較好地避免回聲問題。在實際情況下,絕大部分的回聲回路形成于機構內部,而由機構外部揚聲器回流到麥克風的聲音,由于距離較長,基本可以忽略。

圖片點擊可在新窗口打開查看

由于硬件和機構設計上的局限性,在機構內部不可能完全隔離聲音的傳播,因此從揚聲器出來的聲音會有一部分會滲透到麥克風,從而產(chǎn)生回聲。
2.2 基于FM2010的回聲消除原理
FM2010使用的是自適應回聲抵消原理,它的基本思想是:估計回聲路徑的特征參數(shù),產(chǎn)生一個模擬的回聲路徑,得出模擬回聲信號,從接收信號中減去該信號,實現(xiàn)回聲抵消。以圖3所示的受話端通話流程為例,圖中左上方的MIC IN是麥克風進入的信號,即用戶的聲音輸入信號,其中包含由本機揚聲器漏進去的部分主話端的語音信號;右下方的Line IN接入是主話端的語音信號,即由本機揚聲器輸出的信號直接接入到FM2010回音消除芯片的Line IN輸入端。在FM2010內部會經(jīng)過DSP芯片的運算處理對兩者進行比較,消除MIC IN信號中與LineIN端相同的信號(即回聲音頻信號),使用自適應回聲抵消原理達到消除回聲的目的。MIC IN和Line OUT之間路徑上的寄存器需要進行配置和調試,DSP使用這些配置的數(shù)據(jù)作為特征參數(shù)來進行運算處理。

圖片點擊可在新窗口打開查看

3 基于FM2010的回音消除驅動設計
3.1 硬件架構設計

圖4是硬件架構示意圖。CPU 通過I2C總線 來控制回音消除芯片讀/寫回音消除參數(shù)(echo parameter)。錄音信號先經(jīng)過回音消除芯片處理后經(jīng)移動信道傳輸?shù)綄Ψ浇邮赵O備,經(jīng)過對方音頻編解碼器處理后再通過揚聲器或者耳機輸出。

圖片點擊可在新窗口打開查看

3.2 音頻設備機構設計
音頻設備是否產(chǎn)生回聲,很大程度上取決于機構的設計是否合理。不合理的機構設計會大大增加出現(xiàn)回聲的概率,而且出現(xiàn)的回聲會比較嚴重,難于消除。我們改進了音頻設備機構上的設計,在設計之初就盡可能避免回音的產(chǎn)生,而且揚聲器和麥克風的距離盡可能保持一定遠的距離,如圖5所示。實踐中發(fā)現(xiàn),揚聲器和麥克風之間的距離保持在10 cm以上,效果會比較好。

圖片點擊可在新窗口打開查看

為了盡可能減少揚聲器和麥克風之間的聲音傳播,可以采用以下2種設計方案:方案一是把麥克風隔離開來,如圖5(a)所
示;方案二是把揚聲器隔離開來,如圖5(b)所示。當然,為了達到更好的效果,可以把揚聲器和麥克風分別隔離開;但是鑒于成本的考慮,使用其中的一種即可達到比較好的效果。具體的實現(xiàn)方法分別是:
①用橡膠套密封揚聲器的邊緣,盡可能避免聲音從機構內部回流到麥克風;同時把麥克風密封在一個腔體之內,以隔離外
部噪聲的進入。
②把揚聲器密封在一個腔體之內,以盡可能隔離揚聲器的聲音向外部傳播;同時使用橡膠套密封麥克風的邊緣,以避免揚聲器發(fā)出的聲音進入。
另外,揚聲器和麥克風在設置的方向上也有講究,如圖6所示。兩者最好是相差180°,90°也可以接受;但是如果兩者的方向相同,如圖6(c)所示,則出現(xiàn)回聲的概率和程度都很大。

圖片點擊可在新窗口打開查看

3.3 軟件架構設計與實現(xiàn)
軟件架構示意圖如圖7所示。

圖片點擊可在新窗口打開查看

回音消除驅動的開發(fā)需要完成以下幾步:
①給回音消除芯片上電,并初始化其相關的寄存器和GPIO;
②初始化I2C總線,并配置I2C速率等的寄存器,使其處于正常運行狀態(tài);
③檢查I2C總線是否已準備好;
④通過I2C總線讀取回音消除參數(shù);
⑤等待回音消除芯片處于可讀/寫狀態(tài),然后把參數(shù)寫入到芯片里,使配置的參數(shù)生效。
3.3.1 FM2010上電時序
當對FM2010初始化時,比較重要的一點是要按照其規(guī)格說明書定義的上電時序進行,否則可能會導致錄音聲音時有時無的情況發(fā)生。具體的要求如圖8所示。在初始化FM2010時,PWD high的狀態(tài)必須要在RESET high狀態(tài)之前設定,兩者之間相差5 ms。

圖片點擊可在新窗口打開查看

3.3.2 讀/寫Echo parameter
FM2010芯片的初始化比較簡單,只要按照上述的時序進行初始化即可。下面重點剖析回音消除驅動的開發(fā)要點,即如何讀/寫回音消除參數(shù)(詳見代碼中的①和④)、設置回音消除芯片的工作模式(詳見②處),以及配置I2C總線(詳見③處)。

圖片點擊可在新窗口打開查看

圖片點擊可在新窗口打開查看

圖片點擊可在新窗口打開查看
結 語
本文在分析語音通話中回聲產(chǎn)生的機理的基礎上,詳細研究了回聲消除的原理、基本聲學回聲產(chǎn)生根源,提出了改進的PDA或者手機等音頻設備的機構設計方案;針對FM2010芯片的特點,給出了回聲消除驅動開發(fā)的軟硬件設計方案,并且給出了回音消除驅動程序關鍵代碼的實現(xiàn)。本文設計的軟硬件解決方案已經(jīng)在基于WinCE操作系統(tǒng)平臺和FM2010硬件平臺上得以實現(xiàn),在實際項目開發(fā)中得到采用,并且獲得了良好的應用效果。

]]>
WinCE流驅動開發(fā)流程http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1829&Page=1wangxinxin2010-11-26 13:43:25PDD:Platform Dependence Driver,平臺相關驅動

MDD:Model Device Driver,模型設備驅動

DDSI:Device Driver Service Provider Interface,DDSI函數(shù)

單體驅動:

顧名思義,所有的驅動程序代碼——包括中斷處理、I/O操作及硬件控制都被放在了一起。這也是比較傳統(tǒng)的驅動程序編寫方法。單體驅動程序的代碼直接與硬件交互,因此它包含與特定的某款硬件相關聯(lián)的代碼。通常,單體驅動程序會暴露DDI接口(Device Driver Interface)給操作系統(tǒng),DDI函數(shù)是操作系統(tǒng)與驅動程序交互的接口協(xié)議。因為單體驅動程序對驅動程序的代碼不做分層處理,因此驅動程序的代碼相對緊湊,對于一些效率要求較高的場合,選用單體驅動程序會提高驅動的性能,同時,對于一些較簡單的硬件設備驅動,使用單體驅動程序模型,可更加清晰明了。

附單體驅動和分層驅動圖如下:


原博主正文如下:

首先是wince驅動的分類問題。按照書上講的說CE下驅動分成單體驅動和分層驅動,而看到另一種說法是本機驅動和流式驅動。經(jīng)過microsun大哥的指點,把這兩種分類法分開了。在這里引用一下:
   “單體與分層只是從代碼的形式上做的分類.分層驅動代碼上分為PDD與MDD,一般的微軟已經(jīng)實現(xiàn)了MDD,可能也實現(xiàn)了PDD,我們只需要對PDD做些修改就能使用,比如音頻的驅動,顯示的驅動。單層驅動是把PDD與MDD寫在一起,沒有做嚴格的區(qū)分,通常這種驅動比較簡單,比如:ATADISK。至于本地驅動和流式驅動是從驅動與系統(tǒng)其它模塊(調用者)的接口形式上做的分類.其實,本地驅動這個名稱不大恰當,可能叫專用驅動或其它名字更為合適.它是指調用它的模塊給它有特定的接口,比如電源驅動和通用LED驅動。而串口,網(wǎng)卡等就是流接口驅動程序. 所以,一個驅動程序可以是單體的流式驅動,例如:ATADISK.也可以是分層的流式: 如OHCI ” 
    按照我的理解,單體和分層是驅動實現(xiàn)方式上的分類,而本地和流式則是驅動模型上的分類,所謂本地驅動就是操作系統(tǒng)有保留專門的接口,所謂流式是指編寫的DLL文件里可以導出各種流式接口函數(shù)。 
    第二點:驅動的功能屬性。設備驅動程序是操作系統(tǒng)內核和硬件的接口,操作系統(tǒng)定義了一組標準的接口,編寫驅動的過程也就是實現(xiàn)這些接口。從應用程序到具體硬件間有如下這些環(huán)節(jié)起作用:應用程序-調用OS函數(shù)-操作系統(tǒng)-驅動接口-驅動程序-硬件操作函數(shù)-硬件。在wince里驅動都以用戶態(tài)的DLL存在,需要通過進程加載到slot里。共有三類系統(tǒng)進程用來加載:Device.exe,GWES.exe,FileSys.exe.絕大多數(shù)設備驅動都是通過Device.exe加載的。需要注意的是,不同的OS保留的設備驅動接口是不一樣的,如桌面windows和wince就不同。
     第三點:wince下設備的初始化分為兩個階段:Device.exe的初始化;外設的枚舉和加載。其流程是:上電-啟動bootloader-啟動NK-啟動注冊表init鍵(Device.exe啟動)-初始化數(shù)據(jù)結構,I/O,電源管理等-加載BusEnum.dll(總線枚舉器)-枚舉注冊表下Driver/buildin的所有子鍵。這里的枚舉過程就是循環(huán)調用ActivateDeviceEx()函數(shù)加載驅動的過程。在OS啟動完畢后,我們可以用PB的Remote Registry Tool查看H_L_M/drivers/active包含的子鍵,看哪些驅動隨啟動而加載 。
     第四點:流接口驅動的概念。暴露流式接口函數(shù)的驅動即是流驅動,它把外設抽象成一個文件。過程是:應用程序使用文件API對設備進行訪問,OS接受API調用FileSys.exe,轉到device.exe,調用流接口,與硬件交互。所謂流接口函數(shù)有十個,包括XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、XXX_IOControl,在wince5.0中增加le了XXX_PreClose,XXX_PreDeinit.而我們在應用程序里對應的文件API有CreateFile、DeviceIoControl、 ReadFile、 WriteFile,CloseHandle,SetFilePointer.  
     第五點:編寫流驅動的步驟。有兩種實現(xiàn)途徑:1。寫DLL,做成Project,加入到OS里。2。改BSP,把驅動寫在BSP里,再選擇那個BSP做OS。第一種方法步驟是在PB中新建一個DLL項目,編寫一些輸入函數(shù),寄存器,外設的聲明,寫DLLENTRY函數(shù);實現(xiàn)流接口函數(shù);編寫DLL的導出函數(shù)文件.DEF;為驅動程序寫入注冊表項,還需要修改bib文件。 第二種方法就是在platform/BSP/drivers下新建一個目錄,然后在drivers目錄中的dirs文件中加入新建的目錄名。在新建的目錄下,新建你的源代碼文件,在其中實現(xiàn)DLL函數(shù)。新建名稱分別為sources, makefile, ***.def的文件;修改platform.reg和platform.bib文件。

]]>
WinCE平臺USB攝像頭驅動開發(fā)流程http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1828&Page=1wangxinxin2010-11-26 13:42:30  前段時間,公司委派我負責一個嵌入式項目,項目要求是在WinCE平臺上集成USB攝像頭驅動和視頻采集程序。這個項目的關鍵是要集成USB攝像頭驅動,并高效的把攝像頭設備進行初始化以取得一幅完整的圖像。幸好我以前開發(fā)過WinCEUSB的主從設備的驅動程序。但雖然如此,我還是花了一些時間來調整系統(tǒng)的穩(wěn)定性和可靠性。在這里我分享在這次項目實踐中得到的經(jīng)驗和教訓,希望大家能少走彎路。

  一.什么是USB設備驅動程序開發(fā)?

  隨著USB設備的普及,USB設備驅動開發(fā)在嵌入式系統(tǒng)變得越來越重要了。為了支持不同類型的硬件可以連接到WinCE平臺上,微軟提供了具有定制接口的流接口驅動程序模型。WinCE的USB外圍設備一般是使用流接口驅動程序。流接口驅動程序是指通過系統(tǒng)提供的文件系統(tǒng)API與應用程序交互;WinCE內核系統(tǒng)會通過設備管理器來完成對流接口驅動程序的加載、卸載等管理工作;而流接口驅動程序則會通過調用USBD模塊提供的接口函數(shù)實現(xiàn)與底層USB設備通信。因此,在進行USB設備驅動程序開發(fā)之前,我們必須先了解USB設備驅動的結構和分類。

  (1)主機與USB攝像頭的通訊結構

  USB攝像頭驅動程序主要是利用系統(tǒng)提供的底層接口配置設備和攝像頭設備進行通訊。因此,WinCE的USB攝像頭驅動分為兩層:USBClient設備驅動程序和底層的WinCE函數(shù)實現(xiàn)層。而底層的函數(shù)層本身又由兩部分組成,即通用串行總線驅動程序(USBD)模塊和較低層的主控制器驅動程序(HCD)模塊。HCD負責最底層的處理,USBD模塊實現(xiàn)較高的USBD函數(shù)接口。因此,USB攝像頭驅動主要是利用USBD接口函數(shù)和外圍USB攝像頭打交道。

  一般來說,主機和USB外設之間的通訊是由在主機端通過USBD模塊和HCD模塊使用的PIPE訪問一個通用的邏輯設備來完成。也就是說,USBD和HCD是一組抽象出來用于訪問USB設備的邏輯接口,它們主要是負責管理USB外設的連接、加載、移除、數(shù)據(jù)傳輸和通用的配置。其中HCD是由主機控制和驅動的,是為USBD提供底層的功能訪問服務。而USBD則是由USB總線驅動的,位于HCD的上層,是利用HCD的服務提供較高層次抽象的功能。

  由于HCD和USBD都是面向一致的邏輯設備接口,因此如果嵌入式系統(tǒng)中擁有多種USB物理外設的話,那么就需要有唯一對應的外設驅動程序,也就是要有最上層的PIPE所連接的物理設備和USB設備驅動程序。有了對這個結構的認識,那么我們在進行USB設備驅動程序開發(fā)時首先要寫的就是最上端的USB攝像頭客戶端驅動程序,在WinCE的樣例程序中它也被稱為USBClientDriver。它是工作于USBD之上,所以實際上我們的工作就變成了利用USBD提供的接口針對特定的物理設備來完成USB設備驅動程序。(見圖)

  (2)流驅動程序的分類和函數(shù)結構

  WinCE驅動程序是介于內核系統(tǒng)和物攝像頭驅動理設備之間的一個代碼層,它的主要作用是為內核系統(tǒng)提供一個接口用來操作不同的外圍設備,包括物理設備和虛擬設備。驅動程序提供給內核系統(tǒng)的接口一般可以分為:本地驅動(NativeDrivers)和流驅動(StreamDrivers)。我從這次項目實踐中得到的經(jīng)驗是,WinCE下的所有驅動都可以歸類到這兩個里面,二者必居其一。

  流驅動是指通過為內核系統(tǒng)提供流接口函數(shù)來實現(xiàn)驅動外圍設備,如XXX_Init()、XXX_Open()、XXX_Read()、XXX_Write()、XXX_Close()等。這一類的驅動由DeviceManager來管理,它是通過調用ActivateDeviceEx()函數(shù)來實現(xiàn)加載流驅動的。ActivateDeviceEx()的參數(shù)是注冊表中相應的鍵,用來設定加載流驅動的屬性,如Index、Order、Prefix等等。流驅動加載成功后,應用程序就可以通過調用CreateFile()、ReadFile()、WirteFile()等函數(shù)來訪問流驅動設備了。而與流驅動相反,軟裝,本地驅動提供給內核系統(tǒng)的不是標準的流接口,而是事先約定好的特定接口。因此不同的本地驅動設備,接口也是不一樣的。在WinCE中,常見的本地驅動有LCD顯示驅動、觸摸屏驅動、鼠標和鍵盤驅動及打印機驅動等。從這里可以看出,本地驅動主要是涉及與人機界面相關的驅動。它們是由GWES來管理的,由于他們在注冊表中有各自相應的配置信息,因此它們會在系統(tǒng)啟動時自動加載。簡單的說,就是本地驅動是由內核系統(tǒng)操作和調用的,一般的應用程序是不能訪問和調用的

]]>
wince驅動開發(fā)3http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1827&Page=1wangxinxin2010-11-26 11:16:356、驅動中注意的要點

1:CE下同名設備不能大于10

CE5.0中已經(jīng)沒有這個問題了,以前的版本可以這樣做:只給上層輸出一個設備,然后用一個IOCTL去打開一個個的物理設備這樣就可以做到不受任何限制了。

 

2:MDD與PDD
一個驅動程序通常會被分成硬件相關(PDD)與硬件無關(MDD)層兩部分。
當然,這種分層不是必須的,只是采用這種分層以后可以少寫很多代碼,因為微軟提供了很多驅動程序的MDD。即使CE中沒有我們所寫的驅動程序的樣例,采用這種結構以后,當需要寫第二個程序時,就可以重用它的代碼,就可以提高開發(fā)效率。

 

MDD是提供同類型的設備(比如串口)都會有的功能,這樣PDD基本上就只有寄存器操作了。

像串口的中斷處理,Read/Write函數(shù),其大部分代碼都是在MDD中實現(xiàn)的,不同的串口實現(xiàn)中只需要提供一些實際操作寄存器的函數(shù)。不同的驅動程序,其MDD與PDD的接口不盡相同,

 

3:XXX_Init函數(shù)的返回句柄
通常,這個句柄是驅動程序自己保存數(shù)據(jù)的一個指針,我們在Init返回時告訴上層程序,以后上層調用其它函數(shù)(例如Open)時,會將這個值傳入,這樣,我們就可以訪問自己的一些私有數(shù)據(jù)。

當然,也可以返回一個任意的非0值對于一個設備驅動程序,系統(tǒng)不用的層會有不同的句柄。我們在XXX_Init中返回的句柄保存在設備管理器中,別的程序中應該是看不到的,而用CreateFile也會得到一個文件句柄,這個保存在哪我不知道,但和前者是不一樣的。也就是說不同層的軟件所關心的句柄也會不一樣

4:DEBUGMSG與RETAILMSG的區(qū)別
它們都是輸出調試信息用的,區(qū)別是:
DEBUGMSG只在DEBUG版中有效,RELEASE版中它被定義成了NULL
RETAILMSG在DEBUG和RELEASE版中都可以輸出,
而且DEBUGMSG可以在運行時刻用DEBUZONE控制要不要輸出信息。

 

在ship build 時,RETAILMSG 和DEBUGMSG都無效。

 

5調試區(qū)與dpCurSettings

我們都是利用OutpubDebugString函數(shù)來實現(xiàn)調試信息的輸出的,但是由于系統(tǒng)底層的調試信息非常繁多,如果這樣大量的調試信息用于實時輸出的話一定會影響到系統(tǒng)的性能和實時性,也就影響到了系統(tǒng)的運行。如果有一種方式能允許開發(fā)人員自己選擇輸出哪些調試信息,不輸出哪些調試信息的話,那么就可以讓開發(fā)人員只看到關心的調試信息,而把諸如鍵盤按鍵、鼠標移動等無用的調試信息隱去,則可以更好的提高開發(fā)效率。

 

調試區(qū)就是為了解決以上提出的問題的,對某一個驅動程序,它規(guī)定好自己向外輸出的調試信息的分類,比如初始化時的信息,出錯時的信息,釋放時的信息,激活時的信息等,然后分成幾個調試區(qū),在現(xiàn)有的CE版本中最多允許16個調試區(qū)。

 

開發(fā)人員通過Platform Builder中Target菜單下的CE Debug Zones命令來決定想要得到哪一個或哪幾個調試區(qū)的信息,在驅動程序中則可以根據(jù)開發(fā)人員的選擇來輸出指定調試區(qū)的信息。這就是調試區(qū)大體上的工作原理。

 

調試區(qū)的定義,聲明,注冊及使用。
在程序中使用調試區(qū)之前必須先定義它們,一個程序的16個調試區(qū)編號分別為0-15。代碼樣例如下所示:
#ifdef DEBUG
//
// For debug builds, use the real zones.
//
#define ZONE_TEST DEBUGZONE(0)
#define ZONE_PARAMS DEBUGZONE(1)
#define ZONE_VERBOSE DEBUGZONE(2)
……
#define ZONE_WARN DEBUGZONE(14)
#define ZONE_ERROR DEBUGZONE(15)

#else
//
// For retail builds, use forced messages based on the zones turned on below.
//
#define ZONE_TEST 0
#define ZONE_PARAMS 0
#define ZONE_VERBOSE 0
……
#define ZONE_WARN 0
#define ZONE_ERROR 0

#endif

這樣,就可以程序的DEBUG版本中使用調試區(qū)了,而在RELEASE版本中則將其全部定義為0,調試信息即不再輸出。
在程序中,除了以上的定義以外,還要聲明幾個專用的調試信息輸出函數(shù),這些函數(shù)與OutputDebugString函數(shù)的區(qū)別就在于在調用時需要指定對應的調試區(qū),這些函數(shù)以及以上用到的DEBUGZONE宏的定義都在DbgApi.h頭文件中,因此只要在源程序中包含此頭文件即可。除此以外,還需要一個全局的DEBPARAM類型的變量命名為dpCurSettings,以供集成開發(fā)環(huán)境和調試信息輸出函數(shù)使用。其代碼樣例如下:
#ifdef DEBUG
DBGPARAM dpCurSettings = {
   TEXT("WaveDriver"), {
   TEXT("Test") // 0
   ,TEXT("Params") // 1
   ,TEXT("Verbose") // 2
   ,TEXT("Interrupt") // 3
   ,TEXT("WODM") // 4
   ,TEXT("WIDM") // 5
   ,TEXT("PDD") // 6
   ,TEXT("MDD") // 7
   ,TEXT("Regs") // 8
   ,TEXT("Misc") // 9
   ,TEXT("Init") // 10
   ,TEXT("IOcontrol") // 11
   ,TEXT("Alloc") // 12
   ,TEXT("Function") // 13
   ,TEXT("Warning") // 14
   ,TEXT("Error") // 15
  }
  ,
  (1 << 15) // Errors
  | (1 << 14) // Warnings
};
#endif
此例中還把ERROR和WARN調試區(qū)作為默認被開發(fā)人員選中的調試區(qū)。
要想使用調試區(qū),還需要做的最后一件準備的事情就是在程序中進行注冊,也就是在程序啟動時通知集成開發(fā)環(huán)境本程序中要使用調試區(qū),這個注冊很簡單,只要在程序的入口處使用DEBUGREGISTER宏即可,樣例如下:
DllEntry (
HANDLE hinstDLL,
DWORD Op,
LPVOID lpvReserved
)
{
switch (Op) {

case DLL_PROCESS_ATTACH :
DEBUGREGISTER((HINSTANCE)hinstDLL);
break;
……

 

]]>
wince6.0驅動開發(fā)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1826&Page=1wangxinxin2010-11-26 11:14:16

1、基礎知識:

1)系統(tǒng)調用是操作系統(tǒng)內核和應用程序之間的接口,設備驅動程序是操作系統(tǒng)內核和機器硬件之間的接

口。設備驅動程序為應用程序屏蔽了硬件細節(jié),在應用程序看來硬件只是一個設備文件,應用程序可以

像操作普通文件一樣對硬件設備進行操作。設備驅動是內核的一部分。

2)驅動程序完成以下功能:
——對設備初始化和釋放;
——把數(shù)據(jù)從內核傳送到硬件和從硬件讀取數(shù)據(jù);
——讀取應用程序傳送給設備文件的數(shù)據(jù)和回送應用程序請求的數(shù)據(jù);
——檢測和處理設備出現(xiàn)的錯誤。

3)上層應用程序運行在用戶模式(非特權模式,Ring 3),代碼被嚴格約束執(zhí)行。如不能執(zhí)行硬件IO指

令。所有的這些被阻止的操作如果想運行必須通過陷阱門來請求操作系統(tǒng)內核。

4)操作系統(tǒng)內核運行在內核模式(特權模式,Ring 0),可以執(zhí)行所有有效的CPU指令。包括IO操作,

可訪問任何內存區(qū)。

5)整個硬件系統(tǒng)資源在驅動程序面前是赤裸裸的,驅動可以使用所有系統(tǒng)資源,編寫驅動程序時我們必

須格外小心驅動代碼的邊界條件,確保它們不會損壞整個操作系統(tǒng)。

2、Windows支持的驅動:
           1)虛擬設備驅動程序(Virtual Device Driver):Windows3.1(Windows95/98/Me)
           2)內核模式驅動程序(Kernel Mode Driver):Windows NT
           3)Win32驅動程序模型(Win32 Driver Mode):從Windows98開始使用。
其中WDM是目前主流,然而在WinCE系統(tǒng)中,由于硬件資源有限和嵌入式系統(tǒng)的特點,對其的支持非常有

限。

3、WinCE系統(tǒng)驅動簡介:

1)WinCE畢竟是一個嵌入式系統(tǒng),有其自身的特殊性,為了提高運行效率,所有驅動皆為動態(tài)鏈接庫,

驅動實現(xiàn)中可以調用所有標準的API。而在其他Windows系統(tǒng)中可能的驅動文件還有.vxd, .sys和動態(tài)鏈

接庫。
2)WinCE驅動從結構上講分為本地驅動(Native Driver)和流接口驅動(Stream Driver)。

——本地驅動主要用于低級、內置的設備。實現(xiàn)它們的接口并不統(tǒng)一,而是針對不同類型的設備相應設

計。因此開發(fā)過程相對復雜,沒有固定的模式,一般做法是通過移植、定制現(xiàn)有的驅動樣例來實現(xiàn)。
——流接口驅動是最基本的一種驅動結構,它的接口是一組固定的流接口函數(shù),具有很高的通用性,

WinCE的所有驅動程序都可以通過這種方式來實現(xiàn)。流接口驅動程序通過文件系統(tǒng)調用從設備管理器和應

用程序接收命令。該驅動程序封裝了將這些命令轉換為它所控制的設備上的適當操作所需的全部信息。

           流接口驅動是動態(tài)鏈接庫,由一個叫做設備管理程序的特殊應用程序加載、管理和卸載。與本地

驅動程序相比,所有流接口驅動程序使用同一組接口函數(shù)集,包括實現(xiàn)函數(shù):XXX_Init、XXX_Deinit、

XXX_Open、XXX_Close、XXX_Read、XXX_Write、XXX_PowerUp、XXX_PowerDown、XXX_Seek、

XXX_IOControl,這些函數(shù)與硬件打交道。用戶函數(shù):CreateFile、DeviceIoControl、 ReadFile、

WriteFile,這些函數(shù)方便用戶使用驅動程序。

3)WinCE下驅動的加載方式:

——通過GWES(Graphics, Windowing, and Events Subsystem):主要加載與顯示和輸入有關的驅動,

如鼠標、鍵盤驅動等。這些驅動一般為本地驅動。
——通過設備管理器:兩種結構的驅動都加載,加載的本地驅動主要由PCMCIA Host Controller,USB

Host Controller driver,主要是總線類的驅動;流接口驅動主要有音頻驅動,串并口驅動。
——動態(tài)加載:前兩者都是系統(tǒng)啟動時加載的,動態(tài)加載則允許設備掛載上系統(tǒng)時將驅動調入內核,主

要有外接板卡驅動,USB設備驅動等。

4、流接口驅動函數(shù)介紹:
1)DWORD XXX_Init(LPCTSTR pContext, LPCVOID lpvBusContext);
pContext:指向一個字符串,包含注冊表中該流接口活動鍵值的路徑
lpvBusContext:
該函數(shù)是驅動掛載后第一個被執(zhí)行的。主要負責完成對設備的初始化操作和驅動的安全性檢查。由

ActiveDeviceEx通過設備管理器調用。其返回值一般是一個數(shù)據(jù)結構指針,作為函數(shù)參數(shù)傳遞給其他流

接口函數(shù)。

2)BOOL XXX_Deinit(DWORD hDeviceContext);
hDeviceContext:XXX_Init的返回值。
整個驅動中最后執(zhí)行。用來停止和卸載設備。由DeactivateDevice觸發(fā)設備管理器調用。成功返回TRUE



3)DWORD XXX_Open(DWORD hDeviceContext, DWORD AccessCode ,        DWORD ShareMode);
hDeviceContext:XXX_Init的返回值。
AccessCode:訪問模式標志,讀、寫或其他。
ShareMode:驅動的共享方式標志。

打開設備,為后面的操作初始化數(shù)據(jù)就夠,準備相應的資源。應用程序通過CreateFile函數(shù)間接調用之

。返回一個結構指針,用于區(qū)分哪個應用程序調用了驅動,這個值還作為參數(shù)傳遞給其他接口函數(shù)

XXX_Read、XXX_Write、XXX_Seek、XXX_IOControl。

4)BOOL XXX_Close(DWORD hOpenContext);
hOpenContext:XXX_Open返回值。
關閉設備,釋放資源。由CloseHandle函數(shù)間接調用。


5)DWORD XXX_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
hOpenContext:XXX_Open返回值。
pBuffer:緩沖區(qū)指針,接收數(shù)據(jù)。
Count:緩沖區(qū)長度。
由ReadFile函數(shù)間接調用,用來讀取設備上的數(shù)據(jù)。返回讀取的實際數(shù)據(jù)字節(jié)數(shù)。


6)DWORD XXX_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count);
hOpenContext:XXX_Open返回值。
pBuffer:緩沖區(qū)指針,接收數(shù)據(jù)。
Count:緩沖區(qū)長度。
由WriteFile函數(shù)間接調用,把數(shù)據(jù)寫到設備上,返回實際寫入的數(shù)據(jù)數(shù)。

7)BOOL XXX_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn,      DWORD dwLenIn, PBYTE

pBufOut, DWORD dwLenOut,        PDWORD pdwActualOut);
hOpenContext:XXX_Open返回值。
dwCode:控制命令字。
pdwActualOut:實際輸出數(shù)據(jù)長度。

用于向設備發(fā)送命令,應用程序通過DeviceIoControl調用來實現(xiàn)該功能。要調用這個接口還需要在應用

層和驅動之間建立一套相同的命令,通過宏定義CTL_CODE(DeviceType, Function, Method, Access來實

現(xiàn)。如:

#define IOCTL_INIT_PORTS \ CTL_CODE

(FILE_DEVICE_UNKNOWN,0X801,METHOD_BUFFERED,FILE_ANY_ACCESS)

8)void XXX_PowerDown(DWORD hDeviceContext);

hDeviceContext:XXX_Init的返回值。

]]>
WinCE下驅動開發(fā)入門記錄(一)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1825&Page=1wangxinxin2010-11-26 11:11:21        首先說明一下,我可能仍然是個門外漢,因為以前基本沒做過和硬件相關的東西,這方面知識缺乏的要命,現(xiàn)在公司要求做個驅動出來,也只有硬著頭皮上了,學習研究了兩天,基本掌握了一些有用的信息,所以認為自己入門了,但僅從自己的感覺出發(fā)都可以說我只是窺見了冰山之一角,還有很多很多都不懂。上次的帖子里面介紹了一些當時收集到的比較有用的資料,那個PB我也試著下了,下了一兩天沒多少,公司網(wǎng)太破,那個ftp又不支持斷點續(xù)傳,可害苦了我了,一個個的文件包100多M,一掉線就得重來,最后我干脆放棄了。那個弟兄有的,干脆打個包把代碼發(fā)給我好了,謝謝了先。
         好,怎們切入正題。首先介紹一下我的驅動目標,目的是為了使在pda上運行的應用程序能夠通過USB口和我們這個外設通訊,可以發(fā)送指令給外設,也要求從外設獲取數(shù)據(jù),因此我把它定位在流接口上,這就引出第一個概念,流接口,應該說這里所說的流接口是Wince上驅動的一種,象串口啊這樣的可以用CreateFile打開的都屬于這個范疇。其關鍵在于1)實現(xiàn)xxx_系列的函數(shù)2)注冊表中定義Prefix和Dll。其中xxx就是注冊表中Prefix的值,比如串口就是“COM”。而注冊表中的DLL就是你的驅動程序dll(wince下的驅動就是一個dll),加載驅動的時候,會到你的dll中去找xxx_系列的函數(shù),所以你的dll一定要導出這些函數(shù)符號。
XXX_Init
XXX_Deinit
XXX_Open
XXX_Close
XXX_Read
XXX_Write
XXX_Seek
XXX_IOControl
XXX_PowerDown
XXX_PowerUp
經(jīng)過測試,其中前六個是必須實現(xiàn)且導出的,否則是不能夠成功加載的。

         好,先介紹了一些關于流接口驅動的相關知識,這部分在網(wǎng)上還是能夠找到不少資料的,我就不多說,回到我要開發(fā)的驅動上,說到底我這個還首先是個USB設備,被識別之后才能將它驅動成一個流設備
        說到USB驅動,就要先介紹一下USB驅動加載過程了。當usb設備接到主機(usb host,因此你的pda必須是能夠作為usb host使用的)上時,系統(tǒng)就會根據(jù)它的信息去從注冊表里查找它的驅動相關信息,在HKLM\Drivers\Usb\LoadClients下面會有一些主鍵Group1_ID\Group2_ID\Group3_ID\DeviceID,而DeviceID下面有一個字符串Dll=DriverFile.dll
注意,其中Group1_ID,Group2_ID,Group3_ID分別表示什么,以及其匹配的優(yōu)先級別,可以在《WindowsCE 驅動開發(fā)指南》一書中USB驅動開發(fā)一章去詳細研究。
         如果找到匹配的注冊表信息,系統(tǒng)就會加載DriverFile.dll,否則就會提示用戶輸入一個驅動名稱。
         那么加載dll的時候會有些什么動作呢?驅動程序DLL和普通的DLL是否具備不同的入口點呢?
         先回答第二個問題,答案是否定的,其入口點和普通的dll沒有區(qū)別。但是加載的過程就不那么簡單了。你可以理解系統(tǒng)已經(jīng)作了一些事情,使得你可以用一個普通的dll來作為驅動程序,但是顯然,你必須實現(xiàn)系統(tǒng)所要求的接口函數(shù)。
         對于USB驅動程序來說,有這么幾個接口函數(shù)是必須實現(xiàn)且導出的:
BOOL USBDeviceAttach(USB_HANDLE hDevice,
                                    LPCUSB_FUNCS lpUsbFuncs, 
                                    LPCUSB_INTERFACE lpInterface,
                                    LPCWSTR szUniqueDriverId, 
                                    LPBOOL fAcceptControl,
                                    LPCUSB_DRIVER_SETTINGS lpDriverSettings,
                                     DWORD dwUnused);
BOOL USBInstallDriver(LPCWSTR szDriverLibFile);
BOOL USBUnInstallDriver();
          建議大家先讀一下sdk的include目錄下的usbdi.h頭文件,這里面定義了很多usb驅動相關的結構、函數(shù)接口,包括注釋]]>
WinCE5.0入門全過程http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1824&Page=1wangxinxin2010-11-26 11:10:30以下內容僅供參考,由于我也是初學者,很多概念理解不準,錯誤與模糊之處還請大家指出,以利于我們大家共同學習與提高!
以下內容不接受任何攻擊性評論,學習WinCE是我現(xiàn)階段本科畢業(yè)設計的內容,所以所有觀點僅從學術角度出發(fā),如果有說的不當之處,希望大家多多指點!
再說明一下,如果本帖中有什么其它問題,比如言之不當之處,希望大家另開一帖,在論壇里討論一下,標題注明一下jbb0523,我這些天會常來論壇看看的,這樣大家就共同提高了!

一、前言

1、首先談談本人基礎。我熟悉AVR單片機,使用過ATmega16單片機大部分功能,如4X4鍵盤、UART、SPI、I2C、Timer、PWM等等,接觸過DSP芯片TMS320C54X,懂得VHDL語言,簡單使用過LPC2131,并在其上移植過uC/OS-II,學習過有關操作系統(tǒng)的基本知識。
用過的相關軟件有:ICCAVR、ADS1.2、CCS、uVision等。

2、學習不要著急,如果你沒有操作系統(tǒng)的基礎,可能一時接受不了操作系統(tǒng)這個概念,而是拿著自已天天用的PC機的Windows操作系統(tǒng)的界面鉆牛角尖。不要總感覺這資料是垃圾,那本書是騙錢的,之所以你看不懂那是因為你還沒達到看懂的程度!當然現(xiàn)在騙錢的書很多,著書者很少從讀者的角度去寫書!

3、我所使用的開發(fā)環(huán)境:PC XP+GEC2440+WinCE5.0+VS2008+ActiveSync4.5+DNW
GEC2440是廣嵌科技術的開發(fā)板,不喜歡廣嵌,售后技術支持做的不好,而且技術論壇也沒人回帖,不建議使用本實驗板!其實板子做的還行,只是相關服務有待加強!!!

二、入門準備

1、什么是操作系統(tǒng)?
這個問題是困擾了我很久的問題。由于我們大家對于Windows XP等PC機操作系統(tǒng)過于熟悉,而此操作系統(tǒng)又過于傻瓜式,以致于使我們感覺不到操作系統(tǒng)的本質,僅感覺操作系統(tǒng)就是一個窗口,反正在我接觸嵌入式操作系統(tǒng)前是這樣認為的。那么什么是操作系統(tǒng)呢?從我使用uC/OS-II的體驗來說,簡單點兒說操作系統(tǒng)就是一個調度器,從我現(xiàn)在使用WinCE的體驗來說,操作系統(tǒng)就是管家婆。總的來說吧,操作系統(tǒng)就是用算法實現(xiàn)的管理系統(tǒng)所有資源一個后臺。可能這樣說還是有些抽象,別急,慢慢來!

2、操作系統(tǒng)安裝在哪兒呢?界面呢?
這個問題絕對是Windows操作系統(tǒng)使用后遺癥,總感覺操作要像我們PC機裝系統(tǒng)一樣進行安裝,要有像XP等OS一樣的操作界面。其實界面僅僅是人機交互的一種方式而已,不是操作系統(tǒng)必備的元素,而是操作系統(tǒng)的一種趨勢,因為現(xiàn)在對友好的人機交互界面要求越來越高,而且是傻瓜程度過高越好!
以uC/OS-II為例,它的核代碼就是幾個C源文件,使用它時將其像其它程序一樣加入你所建立的工程即可,當然在uC/OS-II與你所寫的普通代碼之間要有一個橋梁來進行鏈接,這個橋梁就是我們在移植操作系統(tǒng)時所要寫的文件,它根本沒有界面一說,為什么說它是操作系統(tǒng)呢?因為uC/OS-II有操作系統(tǒng)的一切特征!操作系統(tǒng)都有什么特征呢?自已網(wǎng)上查一吧!
那么移值uC/OS-II在CPU上有什么好處呢?個人認為,操作系統(tǒng)的核心好處在于多作務管理與調度。任務較少時,也許感覺不到它的好處,但任務多了,操作系統(tǒng)的好處就明顯了,比如說吧,你的實驗板上有八個LED,要求你實現(xiàn)這八個LED以八種不同頻率進行閃爍,你該怎么寫呢?如果有了uC/OS-II操作系統(tǒng),這就太簡單了,將每個LED閃爍按uC/OS-II要求形式寫成任務,然后將八個任務交由uC/OS-II調度即可!
說了一大堆uC/OS-II的相關內容,下面進入正題,談WinCE!

3、相關術語
0)PC機(Personal Computer)就是指你的電腦,OS(Operating System)是指操作系統(tǒng)!
1)BSP(Board Support Package,板級支持包),介于硬件平臺和操作系統(tǒng)之間的一層,屬于操作系統(tǒng);不同的操作系統(tǒng)對應于不同定義形式的BSP。
2)Bootloader與BIOS:Bootloader是引導程序,就是對實驗平臺進行初始化,設定一些相關參數(shù)等等。就我現(xiàn)在使用的WinCE5.0來說,根據(jù)個人理解,Bootloader與BIOS是一個東西,就是在ADS1.2下的一個工程而已,里面含有start.s及其它的一些相關代碼。這個現(xiàn)在我還有些模糊,僅談到此。
3)OEM:Original Equipment Manufacturer原始設備制造商
4)OAL:OEM Abstraction Layer
5)DLL:Dynamic Link Library,動態(tài)鏈接庫 
6)MFC:Microsoft Foudation Class,微軟基礎類 
7)API:Win32 Application Programming Interface,Win32應用程序編程接口
8)SDK:Software Development Kit,使用WinCE時必須安裝SDK,你不必在網(wǎng)上找SDK的安裝包,對于每個具體實驗板都對于一個SDK,這個可以用PB生成。
9)PB、VS、EVC:PB是Platform Builder的簡稱,VS是Visual Studio的簡稱,EVC是Embedded Visual C++的簡稱。
10)Nand flash與Nor flash:與非flash和或非flash,前者價格便宜,后者較貴。

4、所需開發(fā)軟件
1)Platform Builder 5.0:此軟件用來定制操作系統(tǒng),生成內核,生成SDK,編譯驅動程序等。
2)Visual Studio 2008:我用的是此版本,當然也許不許這么高版本,網(wǎng)上用的多的是VS2005,還有使用EVC++的。此軟件用來編寫應用程序。
3)ActiveSync 4.5:此軟用來同步PC機與實驗板進行同步。此軟件可以在微軟中國官方網(wǎng)站下載。
4)DNW:串口調試工具,在上電時用來顯示BIOS發(fā)往串口的相關信息,也可以輸入相關參數(shù)進行設置的。
5)USB同步驅動:必備!!!
VS2008的安裝按提示按裝即可,PB5.0的安裝可以參考天嵌科技的手冊進行安裝,講的很好很詳細,至于PB5.0補丁的安裝只需安裝Net2.0與Net3.5的那一個即可,其實安裝與否我原由我也不清楚,好好參考天嵌科技術的手冊吧。另外要參考天嵌科技術的手冊添加BSP,生成相應的SDK,然后安裝SDK,這些都安裝好后還有一個工作就是安裝USB驅動,這一關一定要過,安不上的話就等著安上再說!

5、相關參考書目:
何宗鍵 編著.Windows CE嵌入式系統(tǒng).北京:北京航空航天大學出版社
還有就是各個開發(fā)板廠商的使用手冊都是很好的資料,必備!
主要有天嵌科技TQ2440、朗成電子AT2440EVB、友善之臂mini2440和QQ2440、廣嵌科技GEC2440、飛凌等等,只有飛凌的資料是不公開的,其它的都可以在相關網(wǎng)站下載到。
有關Visual Studio的書可以參考一下機械工業(yè)出版社劉冰等編著的《C++程序設計教程——基于Visual Studio 2008》,這本書我也沒細看過,掃了一眼,講的還抽合吧。

三、打開WinCE的大門

0、我的學習方法
我學習的理念是首先把整套開發(fā)環(huán)境搭建起來,然后運行一個最簡單的程序入門再說,至于更深一層次的內容慢慢研究!
1、開發(fā)平臺的建立
個人認為,學習單片機也好,ARM也罷,首先要解決的事情就是將整套開發(fā)環(huán)境搭建好,成功跑一個最簡單的程序,就算入門了,下面我說說WinCE開發(fā)環(huán)境的建立。

1)安裝VS2008,根據(jù)提示安裝即可,沒什么注意事項,唯一的提示就是要留有足夠的硬盤空間,僅VS就得留2G空間吧,如果安裝MSDN幫助文檔的話,再留3G吧!
安裝好VS后初次打開會讓你選擇默認開發(fā)環(huán)境,有1、Visual Basic 開發(fā)設置;2、Visual C#開發(fā)設置;3、Visual C++開發(fā)設置;4、Web開發(fā)設置;5、常規(guī)開發(fā)設置。個人認為選哪一個都無所謂,差別僅在于新建項目時項目類型一欄的排列順序有所差別而已。這個設置可以按如下更改:工具---》導入和導出設置(I)…---》重置所有設置---》否,僅重置設置,從而覆蓋我的當前設置
2)安裝Microsoft_DotNetFXCHS1.1.exe,這是安裝WinCE的前提,如果你電腦上裝過VC++等軟件,應該就不用安裝了,因為Visual Studio系列軟件都需要這個的。
3)安裝Platform Builder5.0,安裝PB其實就是所謂的安裝WinCE,這個參考天嵌的手冊1.1節(jié)內容安裝即可,有一點天嵌手冊中沒提到的是:
圖片點擊可在新窗口打開查看
 (原文件名:PB安裝.jpg) 
引用圖片

安裝選擇處理器到這一步時如果ARMV4I是一個“×”,則應單擊向下的小黑三角,選擇第一個或第二個選項,其它的我也不是很懂,反正第一次入門多安裝了總比不能用好,以后精通了再選擇最優(yōu)方法吧。
4)安裝WinCEPB50-081231-Product-Update-Rollup-Armv4I.msi,這是PB5.0的一個補丁,網(wǎng)上相關文章千篇一率,寫了一大堆補丁,個人認為安裝這個就足夠了,其它的等你用到時再安吧,我用了這么些天也沒感覺到補丁有什么用。
5)安裝ActiveSync4.5,這個很簡單!安裝完后打開“我的電腦”就會有一個“移動設備”圖標,這個以后有用!
6)DNW不用安裝,是一個綠色版的軟件,累似于串口調試助手,但功能強一些吧!
7)安裝USB同步用驅動,用USB線將實驗板與PC機連接起來會提示安裝驅動,這個實驗板廠商應該會提供的,也可以從網(wǎng)上下載!USB驅動安裝不當會導致PC機藍屏,所以這一步必須過關,否則原地待命!
8)添加BSP:打開PB5.0,添加BSP包,BSP是由廠商提供的,別告訴我實驗板是你自已做的,一上手就寫B(tài)SP有點不現(xiàn)實吧。參考天嵌手冊2.1.1節(jié)內容,很輕松搞定!
9)安裝SDK:參考天嵌手冊2.4節(jié)內容很輕松搞定,然后安裝即可!
到現(xiàn)在為止環(huán)境基本搞定,其它相關細節(jié)參考開嵌手冊即可!

2、什么叫定制操作系統(tǒng)?為什么要安裝WinCE到PC機上?
由于受uC/OS-II操作系統(tǒng)的影響,總想著WinCE的源代碼在哪兒?那些API函數(shù)的原型在哪兒頭文件中?須知uC/OS-II的源代碼是開源的,而WinCE的代碼則相反!uC/OS-II的呈現(xiàn)在我們面前的是幾個C語言源文件,WinCE呢?就我現(xiàn)在的理解,將PB5.0裝到PC機上意味著將WinCE的全部功能放到了PC機上,然后我們需要做的是通過PB從WinCE所有功能中挑選出自已需要的功能,這些功能經(jīng)自已通過PB組合后生成一個NK.bin和NK.nb0文件,關于這兩個的區(qū)別參考天嵌手冊的第92頁,具體我也不太懂。但我個人的理解是,生成的NK.nb0就好像是我們在學單片機時生成的hex文件,我們將.nb0燒到實驗板上也就是將我們裁剪(即所謂的定制!!!)好的WinCE“安裝”到實驗板上了,這個過程可以近似理解為將hex文件通過ISP或其它方式燒到單片機里一樣的。
綜上所述,我們安裝PB在PC機上是將WinCE所有功能“暫時放到”PC機上,然后通過PB“挑出”你所需要的功能后并將其組合(即.nb0文件)“放到”實驗板上即可!
打個比方說吧,WinCE各種功能就好像一塊塊積木(即安裝PB),然后我們用需要的積木搭出我們需要圖形(即我們用PB定制的操作系統(tǒng))。
WinCE代碼是不開源的,不要天天去想API函數(shù)在哪兒呢?真想看的話去找找比爾蓋茨看看能不能讓你看看!

3、Bootloader(BIOS)、WinCE核(即nb0文件)及我們用VS編寫的應用程序怎么燒到實驗板上?都燒在哪里了呢?
1)Bootloaer與BIOS的區(qū)別我還沒搞懂,就現(xiàn)在的理解還是將它們合二為一,這個有待解決。它們可以用sjf2440.exe進行燒寫;燒到哪兒了呢?這個由自已設定,我也沒有燒過,只有一個粗略的理解:S3C2440外擴了Nand flash和Nor flash,還有SDRAM,芯片內部也有(應該有吧?),這里我們不用管內部與外部,這個只要按要求進行外擴后用尋址到什么地址CPU會自動找相關存儲空間的。我們可以將所有的flash看成一個整體,它是用來固化程序的,把所有RAM看成一個整體,它是用來運行程序的。我們將flash分成不同的分區(qū),上電時CPU要從根據(jù)設定的起始地址的代碼開始執(zhí)行,個人認為Bootloader應該就燒在這里吧!這里的理解個人還有待加強,僅供參考!
2)WinCE核可以通過過USB等方式下載到實驗板上,比如用DNW就可以進行下載,之所以下載到哪兒了?下載到flash其中的一個分區(qū),具體由Bootloader引導程序和你自已設定的參數(shù)!CPU再聰明還得聽人的指揮!
3)VS編的應用程序燒在哪兒了?這個我還沒弄明白,我是通過ActiveSync將VS生成的.exe文件發(fā)送到實驗板上或直接復制到實驗板上的。怎么粘呢?安裝好ActiveSync后PC機的“我的電腦”會多一個移動設備圖標,如果你的USB同步驅動安裝好的,雙擊“移動設備”其實就是相當于在遠程控制著實驗板,將VS的應用程序復制過來然后在實驗板端相關目錄下找到應用程序運行即可!不過這樣運行應用程序是在RAM中運行,沒有進行固化,至于怎么固化,我再好好研究!
4)這里一直提到flash分區(qū)的問題,至于究竟是怎么分區(qū)的目前我也不是很懂,個人認為是通過bootloader進行相關設計的吧,在以前接觸LPC2131時似乎看到過相關內容。

四、走進WinCE

以下默認開發(fā)平臺所有軟件已安裝完畢:

1、燒寫B(tài)ootloader(沒燒過,只是這樣認為要首先燒寫B(tài)IOS)
2、燒寫WinCE核
由于本人拿到實驗板時以上兩步已做好,即我拿到的實驗板上就有燒好的WinCE5.0操作系統(tǒng),因此以上兩步是我猜測的!
3、打開VS,按照天嵌手冊4.2節(jié)內容進行操作,如果成功運行,則OK!本步驟成功后則說明平臺搭建成功,但HELLO程序不涉及實驗板上的任何具體硬件,個人認為這只能算是入門了一半,還有一個坎沒邁過去,那就是流驅動的開發(fā),因為開發(fā)第一個流驅動的工作量并不比搭建平臺省事,尤其是全靠自已琢磨,旁邊無人指導、無人探討!
4、運行成功HELLO程序后你可能會想,如果想點亮實驗板上的LED燈該怎么用啊?基于VS開發(fā)環(huán)境也沒法控制CPU的IO寄存器啊?這就需要流驅動了!
大部分實驗板的手冊都有詳細的HELLO程序過程,但很少有手冊詳細講解流驅動的開發(fā)過程,下面以我的經(jīng)歷詳細的寫一寫:
流驅動的基本介紹可以看看天嵌手冊的第五章,腦子里起碼要先有個基本概念!
1)打開以下目錄:E:\WINCE500\PLATFORM\smdk2440\DRIVERS,并在該目錄下新建一個文件夾,命名為GPIOdriver,并用記事本打開該目錄下的dirs文件,按其格式添加\GPIOdriver,dirs沒有擴展名,打開看看就懂,沒什么特別的!
注:其中E盤是我的安裝目錄,smdk2440是GEC2440實驗板提供的BSP,按要求拷貝到了E:\WINCE500\PLATFORM\ 目錄。
2)打開剛剛新建的GPIOdriver文件夾,新建txt記事本文件,命名為makefile,打開加入以下內容:!INCLUDE $(_MAKEENVROOT)\makefile.def,然后將.txt擴展名去掉,使其變?yōu)闊o擴展名的文件。
3)仍然在GPIOdriver文件夾內,仍然新建txt文件,命名為GPIOdriver,加入以下內容后將其擴展名更改為.def文件:
LIBRARY GPIOdriver
EXPORTS
GIO_Close
GIO_Deinit
GIO_Init
GIO_IOControl
GIO_Open
GIO_PowerDown
GIO_PowerUp
GIO_Read
GIO_Seek
GIO_Write
4)仍然在GPIOdriver文件夾內,仍然新建txt文件,命名為sources,加入以下內容后將其擴展名刪除,使其成為無擴展名文件:
RELEASETYPE=PLATFORM
TARGETNAME=GPIODriver
TARGETTYPE=DYNLINK
DLLENTRY=DllEntry
]]>
Windows CE下驅動開發(fā)基礎http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1823&Page=1wangxinxin2010-11-26 11:07:19嵌入式開發(fā)版以來第一次發(fā)表文章,加上以前瑣碎的文章共計30篇。研究的越多就越感覺自己懂的太少,其實在驅動開發(fā)方面我還是個菜鳥,我是想再次拋磚引玉,讓做驅動有N年經(jīng)驗的人奉獻一點出來,讓大家減少一些研究驅動源碼而又缺少注釋所帶來的痛苦。
  我想即使讀者看過微軟的關于驅動開發(fā)的培訓教材和CE幫助文檔中的驅動部分,頭腦中仍然一片茫然。要想真正了解驅動程序必須結合一些驅動程序源碼,在此我以串口驅動程序(COM16550)中初始化過程為線索簡單講一講驅動開發(fā)的基礎知識。
Windows CE下的串口驅動程序能夠處理所有I/O行為類似串口的設備,包括基于16450、16550 UART(通用異步收發(fā)芯片)的設備和一些采用DMA的設備,常見的有9針串口、紅外I/O口、Modem等。在%_WINCEROOT%\Public\Common\OAK\Drivers\Serial目錄下,COM_MDD2子目錄包含新的串口驅動MDD層函數(shù)代碼。COM16550子目錄包含串口驅動PDD層代碼。SER16550子目錄包含的一系列函數(shù)專用于控制與16550兼容的UART,這樣PDD層的主要工作就是調用SER16550中的函數(shù)。還有一個ISR16550子目錄包含的是串口驅動程序專用的可安裝ISR(中斷服務例程),而很多硬件設備驅動程序采用CE默認的可安裝ISR giisr.dll。一般串口設備相應的注冊表設置例子及意義如下:
意義
"SysIntr"=dword:13 串口1的中斷ID為十進制13
"IoBase"=dword:02F8 串口1的IO空間首地址為十六進制2F8
"IoLen"=dword:8 串口1的IO空間長度為8個字節(jié)
"DeviceArrayIndex"=dword:0 串口1的索引,是1的由來
"Order"=dword:0 串口1驅動的加載順序
"DeviceType"=dword:0 串口1的設備類型
"DevConfig"=hex: 10,00 .... 串口1在與Modem設備通訊時的配置,如波特率、奇偶校檢等
"FriendlyName"="COM1:" 串口1在撥號程序中顯示的名字
"Tsp"="Unimodem.dll" 串口1 被用于與Modem設備通訊的時候要加載的TSP(TAPI Service provider)DLL
"Prefix"="COM" 串口1的流接口的前綴
"Dll"="com16550.Dll" 串口1的驅動程序DLL

  SysIntr由CE在文件Nkintr.h中預定義,用于唯一標識中斷設備。OEM可以在文件Oalintr.h中定義自己的SysIntr。常見的預定義SysIntr有SYSINTR_NOP(中斷只由ISR處理,IST不再處理),SYSINTR_RESCHED(重新調度線程),SYSINTR_DEVICES(由CE預定義的設備中斷ID的基值),SYSINTR_PROFILE、SYSINTR_TIMING、SYSINTR_FIRMWARE等都是基于SYSINTR_DEVICES定義的。IoBase是串口1的IO地址空間的首地址,IoLen是IO空間的大小。IO地址空間只存在于x86平臺,如果在其它平臺硬件寄存器必須映射到物理地址空間,那子鍵的名稱為MemBase和MemLen。在x86平臺更多硬件的寄存器由于IO空間的局限也映射到物理地址空間。DeviceArrayIndex是設備的索引,用于區(qū)分同類型的設備。Prefix是流驅動程序的前綴,當應用程序調用CreateFile函數(shù)傳遞COM1:參數(shù)時,文件系統(tǒng)負責與串口驅動程序通信,串口驅動程序是在CE啟動時由device.exe加載的。

  下面從MDD層函數(shù)COM_Init開始探索串口驅動的初始化過程。COM_Init是在串口設備被檢測后由設備管理器device.exe調用的,主要的作用是初始化設備,它的唯一參數(shù)Identifier是由device.exe傳遞的,其類型是一個字符串指針,字符串的內容是HLM\Drivers\Active\xx,xx是一個十進制數(shù)(device.exe會跟蹤系統(tǒng)中每個驅動程序,把加載的驅動程序記錄在Active鍵下)。COM_Init先分配一個HW_INDEP_INFO結構體,這個結構體是獨立于串口硬件的頭信息(MDD、PDD、SER16550都包含自己獨特的結構體,具體的結構體定義請參見串口驅動源碼),分配之后再初始化結構體中每個成員,初始化結構體后調用 OpenDeviceKey((LPCTSTR)Identifier)打開HLM\Drivers\Active\xx\Key包含的注冊表路徑,在這里路徑一般為HLM\Drivers\BuiltIn\Serial,即串口的驅動程序信息在注冊表中所處的位置。COM_Init接著在HLM\Drivers\BuiltIn\Serial下查詢DeviceArrayIndex、Priority256的值,Priority256指定了驅動程序的優(yōu)先級,如果沒有就用默認的優(yōu)先級。接下來調用GetSerialObject(DeviceArrayIndex),這個函數(shù)由PDD層定義,返回HWOBJ結構體,這個結構體主要包含PDD層和SER16550定義的函數(shù)的指針。也就是說MDD通過調用這個函數(shù)才能調用底層實現(xiàn)的函數(shù)。接下來的大多數(shù)工作都是調用底層函數(shù)實現(xiàn)初始化。第一個調用的底層函數(shù)SerInit主要設置由用戶設置的硬件配置,例如線路控制、波特率。它調用Ser_GetRegistryData函數(shù)得到保存在注冊表中的硬件信息,Ser_GetRegistryData在內部調用系統(tǒng)提供的DDKReg_GetIsrInfoDDK和DDKReg_GetWindowInfo函數(shù)得到在HLM\Drivers\BuiltIn\Serial下保存的IRQ、SysIntr、IsrDll、IsrHandler、IoBase、IoLen。IRQ是邏輯中斷號,IsrDll表示當前驅動程序的可安裝ISR所在的DLL名稱,IsrHandler 表示可安裝ISR的函數(shù)名稱。在這里順便提一下可安裝ISR,讀者在我以前發(fā)表的關于OAL的文章中可以了解到OEM在OEMInit函數(shù)中關聯(lián)IRQ和SysIntr,當硬件設備發(fā)生中斷時,ISR會禁止同級和低級中斷,然后根據(jù)IRQ返回關聯(lián)的SysIntr,內核根據(jù)ISR返回的SysIntr喚醒相應的IST(SysIntr與IST創(chuàng)建的Event關聯(lián)),IST處理中斷之后調用InterruptDone解除中斷禁止。在OEMInit中關聯(lián)的缺點是一旦編譯了CE內核后就無法添加這種關聯(lián)了,而一些硬件設備會隨時插拔或者共享中斷,要關聯(lián)這樣的硬件設備解決方法就是可安裝ISR,可安裝ISR專用于處理指定的硬件設備發(fā)出的中斷,所以如果硬件設備需要可安裝ISR必須在注冊表中添加IsrDll、IsrHandler。多數(shù)硬件設備采用CE默認的可安裝ISR giisr.dll,格式如下:

 "IsrDll"="giisr.dll"

"IsrHandler"="ISRHandler"

  如果一個硬件驅動程序需要可安裝ISR而開發(fā)者又不想自己寫一個,那么可以利用giisr.dll來實現(xiàn)。除了在注冊表中添加如上所示外,還要在驅動程序中調用相關函數(shù)注冊可安裝ISR。偽代碼如下:

g_IsrHandle = LoadIntChainHandler(IsrDll, IsrHandler, (BYTE)Irq);

GIISR_INFO Info;

PHYSICAL_ADDRESS PortAddress = {PhysAddr, 0};

TransBusAddrToStatic(BusType, dwBusNumber, PortAddress, dwAddrLen, &dwIOSpace, &(PVOID)PhysAddr)

Info.SysIntr = dwSysIntr;

Info.CheckPort = TRUE;

Info.PortIsIO = (dwIOSpace) ? TRUE : FALSE;

Info.UseMaskReg = TRUE;

Info.PortAddr = PhysAddr   0x0C;

Info.PortSize = sizeof(DWORD);

Info.MaskAddr = PhysAddr   0x10;

KernelLibIoControl(g_IsrHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL);

  LoadIntChainHandler函數(shù)負責注冊可安裝ISR,參數(shù)1為DLL名稱,參數(shù)2為ISR函數(shù)名稱,參數(shù)3為IRQ。TransBusAddrToStatic函數(shù)在后面講。如果要利用giisr.dll作為可安裝ISR,必須先填充GIISR_INFO結構體,CheckPort=TRUE表示giisr要檢測指定的寄存器來確定當前發(fā)出中斷的是否是這個設備。PortIsIO表示寄存器地址屬于哪個地址空間,F(xiàn)ALSE表示是內定空間,TRUE表示IO空間。UseMaskReg=TRUE表示設備有一個掩碼寄存器,專用于指定當前設備是否是中斷源,也就是發(fā)出中斷,而MaskAddr表示掩碼寄存器的地址。如果對Info.Mask賦值,那么PortAddr表示一個特殊的寄存器地址,這個寄存器的值與Mask的值&運算的結果如果為真,則證明當前設備是中斷源,否則返回SYSINTR_CHAIN(表示當前ISR沒有處理中斷,內核將調用ISR鏈中下一個ISR),如果UseMaskReg=TRUE,那么MaskReg寄存器的值與PortAddr指定的寄存器的值&運算的結果如果為真,則證明當前設備是中斷源。
  函數(shù)SerInit接著調用函數(shù)Ser_InternalMapRegisterAddresses轉換IO地址并且映射地址,Ser_InternalMapRegisterAddresses在內部調用系統(tǒng)提供的HalTranslateBusAddress(Isa, 0, ioPhysicalBase, &inIoSpace, &ioPhysicalBase)函數(shù)將與總線相關的地址轉換為系統(tǒng)地址,參數(shù)1為總線類型,參數(shù)2為總線號,參數(shù)3為要轉換的地址(PHYSICAL_ADDRESS類型,實際是LARGE_INTEGER型),參數(shù)4指定寄存器地址屬于IO地址空間還是物理地址空間,參數(shù)5返回轉換后的物理地址。觀察HalTranslateBusAddress的源碼得知如果是在x86平臺,這個函數(shù)除了把參數(shù)3賦給了參數(shù)5其余什么都沒有做,而非x86平臺將inIoSpace的值置為0,表示一定是物理地址。在調用HalTranslateBusAddress前要確定從注冊表中得到的寄存器地址到底是屬于哪個地址空間的

]]>
詳解WinCE下USB Host驅動開發(fā)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1822&Page=1wangxinxin2010-11-26 11:00:37詳解WinCE下USB Host驅動開發(fā)(2)
當用戶需要卸載USB Host設備驅動時,將會調用USBUnInstallDriver函數(shù)BOOL USBUnInstallDriver()
它與USBInstallDriver類似,不過是調用如下兩個函數(shù)UnRegisterClientSettings BOOL UnRegisterClientSettings(LPCWSTR szUniqueDriverId, LPCWSTR szReserved, LPCUSB_DRIVER_SETTINGS lpDriverSettings)
BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId)
其中szUniqueDriverId是注冊時,使用的ID,szReserved保留,故設置為NULL,lpDriverSettings則是驅動程序設置信息。例程如下:BOOL USBUnInstallDriver(){RETAILMSG(1,(TEXT("USBUninstallDriver\r\n")))BOOL fRet = FALSEUSB_DRIVER_SETTINGS DriverSettingsDriverSettings.dwCount = sizeof(DriverSettings)DriverSettings.dwVendorId = 0x10C4DriverSettings.dwProductId = 0x0003DriverSettings.dwReleaseNumber = USB_NO_INFODriverSettings.dwDeviceClass = USB_NO_INFODriverSettings.dwDeviceSubClass = USB_NO_INFODriverSettings.dwDeviceProtocol = USB_NO_INFODriverSettings.dwInterfaceClass = 0DriverSettings.dwInterfaceSubClass = 0DriverSettings.dwInterfaceProtocol = 0fRet = UnRegisterClientSettings(L"USBTest", NULL, DriverSettings)if(fRet) {fRet = UnRegisterClientDriverID(L"USBTest")if(!fRet)RETAILMSG(1,(TEXT("UnRegisterClientDriverID error\r\n")))} elseRETAILMSG(1,(TEXT("UnRegisterClientSettings error\r\n")))return fRet} 其中DriverSettings必須與USBInstallDriver的DriverSettings一致。
回到原來的流程,WinCE注冊表中已經(jīng)包含了驅動信息,WinCE系統(tǒng)自動查找注冊表,在找到設備對應鍵值的DLL后,將會調用該DLL的USBDeviceAttach函數(shù)。BOOL USBDeviceAttach(USB_HANDLE hDevice,LPCUSB_FUNCS lpUsbFuncs,LPCUSB_INTERFACE lpInterface,LPCWSTR szUniqueDriverId,LPBOOL fAcceptControl,DWORD dwUnused)
hDevice 設備句柄,操作USB設備時,需要使用該句柄 lpUsbFuncs 指向一個包含各種USB操作的函數(shù)指針 lpInterface USB接口信息,這里需要注意的是,如果在DriverSettings里dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol設置為USB_NO_INFO,則該指針為NULL
szUniqueDriverId 注冊設備ID fAcceptControl 該值被賦值為TRUE,表示該驅動能操作該設備。如果不能操作該設備,則“未能識別的USB設備”對話框會再次出現(xiàn),要求用戶輸入驅動程序名稱 dwUnused 未使用
在該函數(shù)內,主要是做一些檢查,判斷是否能驅動設備,還有就是注冊USB事件通知回調函數(shù),以及激活流驅動。對于檢查部分,這里不再詳細說明。 首先,介紹一下激活流驅動。 流驅動為應用程序提供了一個訪問設備的接口,利用該接口可以像訪問文件一樣訪問設備。USB設備同樣可以使用該接口來為應用程序提供支持。在注冊表的
HKEY_LOCAL_MACHINE\Drivers\BuiltIn鍵下,保存了各種WinCE內建流驅動程序的入口。這些驅動通過device.exe在系統(tǒng)啟動時被激活。像USB這樣的設備,只有插入時,才存在流
驅動接口,所以我們需要手動激活流驅動。激活流驅動的函數(shù)是: HANDLE ActivateDevice(LPCWSTR lpszDevKey, DWORD dwClientInfo)lpszDevKey 字符串指明了流驅動所在注冊表的鍵。獲悉流驅動的人都知道,流驅動在注冊表中必須包含兩個鍵Prefix和Dll。 流驅動中所有接口函數(shù)都有類似XXX_的前綴,而這個Prefix則指明XXX對應的字符串,如Prefix為COM,則流驅動包含如COM_Open、COM_Close、COM_Write、COM_Read這樣接口函數(shù)。Dll則說明了這些函數(shù)所在的動態(tài)鏈接庫。在我的例子中存在如下的注冊表鍵:[HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers\USBTest] "Prefix"="TST" "Dll"="MyUSBTest.dll" 通過dwClientInfo,可以把參數(shù)間接傳給驅動的XXX_init。我們可以把hDevice、lpUsbFuncs、lpInterface這樣信息放置在一個結構體中,通過該函數(shù)傳遞給流驅動使用。
USB通知回調函數(shù),可以用來判斷各種USB事件的發(fā)生,如USB拔出。當發(fā)生事件后,系統(tǒng)會根據(jù)注冊的回調函數(shù)做相應的處理,在USB設備拔出后,所要做的事情,就是卸載流驅動,并釋放占用的各種資源。 注冊回調函數(shù)是一個包含在lpUsbFuncs中的函數(shù)指針:LPUN_REGISTER_NOTIFICATION_ROUTINE lpUnRegisterNotificationRoutine該函數(shù)的聲明如下:typedef BOOL (* LPREGISTER_NOTIFICATION_ROUTINE)( USB_HANDLE hDevice, LPDEVICE_NOTIFY_ROUTINE lpNotifyRoutine, LPVOID lpvNotifyParameter)hDevice 設備句柄lpNotifyRoutine 回調函數(shù)lpvNotifyParameter 傳遞給回調函數(shù)的參數(shù)
在回調函數(shù)中卸載流驅動使用BOOL DeactivateDevice(HANDLE hDevice)其中,hDevice 傳入ActivateDevice時返回的句柄。
下面是具體的示例:
typedef struct {DWORD dwSizeUSB_HANDLE hDevice,LPCUSB_FUNCS lpUsbFuncs,LPCUSB_INTERFACE lpInterface,HANDLE hStreamDevice} TESTUSBINFO, PTESTUSBINFO
//回調函數(shù)extern "C" BOOL USBDeviceNotifications(LPVOID lpvNotifyParameter,DWORD dwCode,LPDWORD *dwInfo1,LPDWORD *dwInfo2,LPDWORD *dwInfo3,LPDWORD *dwInfo4){if (dwCode == USB_CLOSE_DEVICE) {PTESTUSBINFO pDrv = (PDRVCONTEXT) lpvNotifyParameterDeactivateDevice(pDrv-hStreamDevice) //卸載流驅動LocalFree(pDrv) //釋放資源}RETAILMSG(1,(TEXT("Free Driver Resources!\r\n")))return TRUE}
BOOL USBDeviceAttach(USB_HANDLE hDevice,LPCUSB_FUNCS lpUsbFuncs,LPCUSB_INTERFACE lpInterface,LPCWSTR szUniqueDriverId,LPBOOL fAcceptControl,DWORD dwUnused){RETAILMSG(1,(TEXT("USBDeviceAttach\r\n")))*fAcceptControl = FALSE
//顯示USB設備的一些信息if(lpInterface != NULL) {RETAILMSG(1,(TEXT("usbserialhost: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u, Prot:%u\r\n"),lpInterface-Descriptor.bInterfaceNumber,lpInterface-Descriptor.bNumEndpoints,lpInterface-Descriptor.bInterfaceClass,lpInterface-Descriptor.bInterfaceSubClass,lpInterface-Descriptor.bInterfaceProtocol))RETAILMSG(1,(TEXT("Endpoint 1:%u\r\n"), lpInterface-lpEndpoints.Descriptor.bmAttributes))RETAILMSG(1,(TEXT("Endpoint 2:%u\r\n"), lpInterface-lpEndpoints.Descriptor.bmAttributes))RETAILMSG(1,(TEXT("Endpoint 3:%u\r\n"), lpInterface-lpEndpoints.Descriptor.bmAttributes))}
LPCUSB_DEVICE lpUsbDev = (lpUsbFuncs-lpGetDeviceInfo)(hDevice)if(!lpUsbDev){RETAILMSG(1,(TEXT("Unable to get USB device!\r\n")))return FALSE}
//保存必要的信息供驅動程序其他部分使用PTESTUSBINFO pDrv = (PTESTUSBINFO)LocalAlloc (LPTR, sizeof (PTESTUSBINFO))pDrv-dwSize = sizeof (DRVCONTEXT)pDrv-hDevice = hDevicepDrv-lpUsbFuncs = lpUsbFuncspDrv-lpInterface = lpInterface
//激活流驅動pDrv-hStreamDevice = ActivateDevice (L"Drivers\\USB\\ClientDrivers\\USBTest", (DWORD)pDrv)if (pDrv-hStreamDevice) {//注冊回調函數(shù)(*lpUsbFuncs-lpRegisterNotificationRoutine)(hDevice,USBDeviceNotifications,pDrv)} else {RETAILMSG(1, (TEXT("Can't activate stream device! rc=%d\r\n"), GetLastError()))LocalFree(pDrv)return FALSE}//驅動可以操作該設備*fAcceptControl = TRUEreturn TRUE}
至此,USB Host端設備驅動程序所必須實現(xiàn)的功能都已經(jīng)實現(xiàn)。并且和流驅動相連接。應用程序已經(jīng)可以使用流驅動的接口來操作USB設備了。
]]>
WinCE中觸摸屏驅動開發(fā)詳解http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1821&Page=1wangxinxin2010-11-26 10:59:311.觸摸屏驅動程序的模型

1.1 分層觸摸屏驅動層序結構

本觸摸屏驅動采用分層驅動程序結構,其驅動模型如下圖所示,這種結構將驅動程序代碼區(qū)分為上層模型設備驅動層(MDD),下層是依賴平臺的驅動層(PDD)。其中MDD層通常無需修改就可以直接使用,改部分提供面向GWES的DDI的接口,而MDD通過指定的DDSI函數(shù)接口調用PDD,這就是我們通常驅動要實現(xiàn)的部分。PDD部分和MDD部分除了DDSI函數(shù)集接口外,還要實現(xiàn)一些指定的變量的定義或變量初始化動作(比如,gIntrTouch和gIntrTouchChanged在PDD層定義,但主要在MDD層使用。),也就是說MDD層和PDD層之間并不一定是以嚴格的分層模型來實現(xiàn)的,有時候也要通過共享變量的方式來完成交互。

1.2 DDI函數(shù)集(MDD層)

TouchPanelPowerHandler(BOOL boff)

Touch Screen的電源管理函數(shù),boff:TRUE表示關閉電源,F(xiàn)ALSE表示打開電源,其只是調用DdsiTouchPanelPowerHandler()函數(shù),該函數(shù)在進入或退出poweroff狀態(tài)時產(chǎn)生。

TouchPanelCalibrationAPoint()

該函數(shù)用于校準輸入的觸摸屏坐標,把觸摸屏坐標轉換為顯示坐標,利用了公式Sx=A1*Tx+B1*Ty+C和Sy=A2*Tx+B2*Ty+C2。

TouchPanelReadCalibrationPoint()

在執(zhí)行觸摸屏校準程序時,用這個函數(shù)獲得在當前校準點的十字形上點擊的觸摸屏坐標。

TouchPanelReadCalibrationAbord()

該函數(shù)在校準取消時被調用(在觸摸屏校準程序運行過程中取消校準),僅僅設置狀態(tài)位和事件后返回。

TouchPanelDisable()

禁用觸摸屏(touch panel)設備,該函數(shù)關閉ISR,停止中斷和注銷事件及其他同步手段,此函數(shù)調用了DdsiTouchPanelDisable()函數(shù)。

TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK    pfnCallback)

PfnCallback是指向處理touch panel事件的回調函數(shù),該函數(shù)的執(zhí)行動作:

⑴創(chuàng)建事件hTouchPanelEvent和hCalibrationSampleAvailable,其中當觸筆按下或抬起,或者定時器中斷時會觸發(fā)hTouchPanelEvent事件,而在校準狀態(tài)下當有校準數(shù)據(jù)輸入時會觸發(fā)hCalibrationSampleAvailable事件。

⑵初始化臨界區(qū),初始化所需的觸摸屏中斷gIntrTouch和gIntrTouchChanged,并且把它們關聯(lián)到事件hTouchPanelEvent中。

⑶創(chuàng)建IST TouchPanelpISR,并設定其優(yōu)先級。

TouchPanelSetCalibration()

該函數(shù)通過運行觸摸屏校準程序時的校準動作獲得顯示坐標(Sx,Sy)和觸筆在十字形上按下的觸摸坐標(Tx,Ty)用于計算校準參數(shù)A1,B1,C1和A2,B2,C2。

TouchPanelGetDeviceCaps()

用于查詢觸摸屏設備支持的具體功能,通過DDSI函數(shù)查詢相應的信息,當查詢屏幕坐標信息時保存屏幕信息,供后面程序計算校準參數(shù)所用。

TouchPanelSetMode()

用于設置觸摸屏的工作模式(采用低采樣率還是高采樣率),當設置IST優(yōu)先級時直接通過內核API來完成,而直接將其他設置交給DdsiTouchPanelSetMode()函數(shù)來處理。

1.3WinCE  DDSI函數(shù)集(PDD層)

DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)

查詢touch panel設備的相關信息。

IIndex:查詢的索引值,其取值如下:

TPDC_SAMPLE_RATE_ID:查詢采樣率信息。

TPDC_CALIBRATION_POINT_COUNT_ID:查詢用于校驗的點的個數(shù)。

TPDC_CALIBRATION_POINT_ID:查詢需要校驗的點的坐標。

LpOutput:根據(jù)iIndex值分別指向相關的信息。

DdsiTouchPanelSetMode()

設置Touch Panel工作模式。

iIndex:模式索引

TPSM_SAMPLERATE_HIGH_ID:高采樣率

TPSM_SAMPLERATE_LOW_ID:低采樣率

lpInput:指向包含相關信息的內存

DdsiTouchPanelEnable()

該函數(shù)所執(zhí)行的動作:

⑴為需要用到的I/O,ADC,PWM和INT寄存器分配內存空間。

⑵配置觸摸屏控制器、中斷控制器和PWM的寄存器。

⑶申請觸摸屏中斷gIntrTouch和定時器中斷gIntrTouchChanged,并且對它們進行初始化,為物理中斷號分配相應的系統(tǒng)邏輯中斷號。。

DdsiTouchPanelDisable()

屏蔽觸摸屏中斷和釋放為I/O,ADC,PWM和INT寄存器分配的WinCE內存空間。

DdsiTouchPanelAttach()

只是簡單地返回1。

DdsiTouchPanelDetach()

只是簡單地返回0。

DdsiTouchPanelGetPoint (TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,

                       INT * pUncalX,

                       INT * pUncalY )

獲得Touch Panel上被按下的點的狀態(tài)和坐標。

◆pTipState:當前觸摸點的狀態(tài),比如無效點,有效點,被按下的點等。

◆pUnCalX:觸摸點的X坐標

◆pUnCalY:觸摸點的Y坐標

◆DdsiTouchPanelPowerHandler()

設置touch panel的電源狀態(tài),boff:TRUE表示關閉電源,F(xiàn)ALSE表示打開電源,

2.觸摸屏驅動程序的實現(xiàn)

Windows CE5.0觸摸屏驅動程序采用中斷方式對觸摸筆的按下狀態(tài)進行檢測,如果檢測到觸摸筆按下將產(chǎn)生中斷并觸發(fā)一個事件通知一個工作線程開始采集數(shù)據(jù)。同時,驅動將打開一個硬件定時器,只要檢測到觸摸筆仍然在按下狀態(tài)將定時觸發(fā)同一個事件通知工作線程采集數(shù)據(jù),直到觸摸筆抬起后關閉該定時器,并重新檢測按下狀態(tài)。驅動中采用了觸摸屏中斷以及定時器中斷2個中斷源,不僅可以監(jiān)控觸摸筆按下和抬起狀態(tài),而且可以檢測觸摸筆按下時的拖動軌跡。觸摸屏驅動流程下圖所示

3.四線電阻式觸摸屏的工作原理

四線電阻式觸摸屏的結構如圖1,在玻璃或丙烯酸基板上覆蓋有兩層透平,均勻導電的ITO層,分別做為X電極和Y電極,它們之間由均勻排列的透明格 點分開絕緣。其中下層的ITO與玻璃基板附著,上層的ITO附著在PET薄膜上。X電極和Y電極的正負端由“導電條”(圖中黑色條形部分)分別從兩端引 出,且X電極和Y電極導電條的位置相互垂直。引出端X-,X+,Y-,Y+一共四條線,這就是四線電阻式觸摸屏名稱的由來。當有物體接觸觸摸屏表面并施以 一定的壓力時,上層的ITO導電層發(fā)生形變與下層ITO發(fā)生接觸,該結構可以等效為相應的電路,

計算觸點的X,Y坐標分為如下兩步:

1. 計算Y坐標,在Y+電極施加驅動電壓Vdrive, Y-電極接地,X+做為引出端測量得到接觸點的電壓,由于ITO層均勻導電,觸點電壓與Vdrive電壓之比等于觸點Y坐標與屏高度之比。

2. 計算X坐標,在X+電極施加驅動電壓Vdrive, X-電極接地,Y+做為引出端測量得到接觸點的電壓,由于ITO層均勻導電,觸點電壓與Vdrive電壓之比等于觸點X坐標與屏寬度之比。

測得的電壓由ADC轉化為觸摸點的原始坐標(數(shù)值范圍由所選用的A/D轉換器位數(shù)決定)后,還要根據(jù)具體使用的液晶屏實際像素進行轉換,轉換后通過校準直接轉化為屏幕上的坐標,供GWES使用。

4.觸摸屏的接口部分

◆X+:連接觸摸屏控制器的TSXP,。

◆X-:連接觸摸屏控制器的TSXM。

◆Y+:連接觸摸屏控制器的TSYP。

◆Y-:連接觸摸屏控制器的TSYM。

在觸摸屏接口使用時,TSXM或TSYM應該接觸摸屏接口的。

5.配置控制器硬件

5.1 ADCCON-----ADC控制寄存器

ECFLG:ADCCON[15],AD轉換結束標志,只讀,0表示AD轉換在過程中;1表示AD轉換結束。

PRSCEN:ADCCON[14],AD轉換器預分頻器使能,在此使能,故為1。

PRSCVL:ADCCON[13:6],AD轉換器預分頻器值,在此為49。

SEL_MUX:ADCCON[5:3],模擬信號輸入通道選擇,在此選擇XP,故為7。

STDBM:ADCCON[2],備用操作模式選擇,在此選擇普通操作模式,故為0。

READ_START:ADCCON[1],通過讀取來啟動A/D轉換,在此選擇通過讀取操作無效來啟動A/D轉換,故為0。

ENABLE_START,ADCCON[0],通過使能該位來啟動A/D轉換,在此選擇無操作。此位在A/D轉換開始后被使能。

5.2 ADCTSC-----ADC觸摸屏控制寄存器

UD_SEN:ADCTSC[8],在此選擇檢測到觸筆按下就產(chǎn)生中斷信號,故為0。

YM_SEN:ADCTSC[7],YM開關使能,在此選擇YM輸出驅動有效(GND),故為1。

YP_SEN:ADCTSC[6],YP開關使能,在此選擇YP輸出驅動無效(AIN5),故為1。

XM_SEN:ADCTSC[5],XM開關使能,在此選擇XM輸出驅動無效(Hi-Z),故為0。

XP_SEN:ADCTSC[4],XP開關使能,在此選擇XP輸出驅動無效(AIN7),故為1。

PULL_UP:ADCTSC[3],上拉開關使能,在此選擇XP上拉有效,故為0。

AUTO_PST:ADCTSC[2],初始化時,在此選擇自動連續(xù)測量X坐標和Y坐標,故為0,但如果開始轉換時,應該置1。

XY_PST:ADCTSC[1:0],手動測量X坐標和Y坐標,在此選擇等待中斷模式,故為3。

注:當?shù)却|摸屏中斷時,XP_SEN位(XP輸出無效)應該置為1,且PULL_UP(XP上拉使能)位應該置為0。

5.3 ADCDLY-----ADC開始延時寄存器

DELAY:ADCDLY[154:0],因為選擇等待中斷模式,此值表示,當觸筆按下出現(xiàn)在睡眠模式時,產(chǎn)生一個用于推出睡眠模式的信號,有幾個毫秒的時間間隔。在此此值為40000?????????(40s,太長了吧?)

SUBINTMSK-----WinCE中子中斷屏蔽寄存器

該寄存器有11位,每位和一位中斷源相關。觸摸屏中斷請求有效,故第十位應設為0。

v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);

5.4 TCFG1-----5路多路器及DMA模式選擇寄存器

MUX3:TCFG1[15:12],為PWM計時器3選擇多路輸入,并初始化其值,每個定時器都有一個時鐘分頻器,其可以生成5鐘不同的分頻信號(1/2,1/4,1/8,1/16和TCLK),在此選擇1/16分頻。

v_pPWMregs->TCFG1 &= ~(0xf << 12); /* Timer3's Divider Value   */

v_pPWMregs->TCFG1 |= (3   << 12);     /* 1/16   

TCNTB3-----PWM定時器3計數(shù)緩存寄存器,選擇定時器3為時鐘,比如定義10ms中斷一次,提供觸摸屏采樣時間基準,即10ms觸摸屏采樣一次。在此為17×1000/100=170,在此PCLK=400MHz/6,可以得出timer3的時鐘頻率=PCLK/(244+1).16,可以算數(shù)觸摸屏就是10ms產(chǎn)生一次定時中斷,進行一次采樣

]]>
OMAP3530 WINCE GPIO驅動開發(fā)過程http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1820&Page=1wangxinxin2010-11-26 10:58:35    言歸正傳,OMAP3530的GPIO(General-purpose Interface)按照分組的原則,共有6組,每組的控制類寄存器是32bit的,代表了32個GPIO,所以總共有192個GPIO,這些是屬于MPU控制的,超過192編號的GPIO是屬于IVA2.2(DSP)控制的。結構框圖如下:
    WINCE GPIO驅動開發(fā)過程" height=274 alt="OMAP3530 WINCE GPIO驅動開發(fā)過程" src="http://static12.photo.sina.com.cn/middle/68e59675x8ab48e529b6b&690" width=653 real_src="http://static12.photo.sina.com.cn/middle/68e59675x8ab48e529b6b&690">
OMAP3530的GPIO具有以下功能:
1)數(shù)據(jù)輸入(捕獲)/輸出(驅動)
2) 帶有防抖功能的鍵盤接口
3)外部事件檢測(電平中斷、邊沿中斷)
4) 在空閑模式下通過外部事件的睡眠喚醒功能
相關的配置需要仔細參照技術手冊
    接下來是WINCE下的GPIO驅動,跳過流驅動的標準框架以及MDD層框架和PDD層的與硬件相關的寄存器設置。這些和三星ARM的GPIO驅動大同小異。
    著重介紹可能遇到的問題,忽略的地方:
我在編寫完OMAP3530的GPIO驅動后,發(fā)現(xiàn)有的GPIO能夠控制輸入輸出,有的則不能。經(jīng)過同學提醒,重新看了技術手冊,原來在技術手冊的第7章System Control Module(SCM)中明確介紹了core modul(內核模塊)和wake-up module(喚醒模塊)。
    SCM主要負責以下功能
1)I/O端口功能復用、多工選擇
2) Pad塊配置(端口上拉/下拉)
3) 設備狀態(tài)
4) MPU和DSP(IVA2.2)的外圍擴展設備特性
5) 靜態(tài)設備配置
6)調試和觀測功能IO復用
7) 存儲pad塊的配置
pad塊配置寄存器如下:
WINCE GPIO驅動開發(fā)過程" height=273 alt="OMAP3530 WINCE GPIO驅動開發(fā)過程" src="http://static2.photo.sina.com.cn/middle/68e59675x8ab4e91d0761&690" width=690 real_src="http://static2.photo.sina.com.cn/middle/68e59675x8ab4e91d0761&690">

其中pad塊的配置中有一項就是端口的MODE(3bits),由于一個GPIO可能有多個功能,他們是互斥的,只能選擇一個,就涉及到端口功能的選擇,總共有MODE0到MODE7八個模式,默認是MODE0,MODE7是安全模式。比如GPIO143總共有實實在在的5個模式:mcbsp3_fsx/uart2_rx/gpio143/hsusb3_till_data7/safemode。所以在配置GPIO的時候需要選擇成GPIO模式,不然操作GPIO就沒有效果,這是問題1.
   另外,上面的配置只能解決端口的輸出控制,當端口配置成輸入時,就不一定能讀取端口電平。問題出在哪里呢,繼續(xù)仔細參照技術手冊的SCM模塊。pad塊中還有兩項是GPIO的上拉/下拉選項、輸入使能選項。針對當GPIO端口配置為輸入時不能讀取正確的引腳電平的問題,主要原因是由于GPIO端口的輸入使能被關閉了。
   輸入使能(INPUTENABLE)(1bits)的描述如下:
1)INPUTENABLE = 0,關閉引腳輸入,引腳只能夠作為輸出。
2) INPUTENABLE = 1,使能引腳輸入,引腳具有雙向端口功能,即輸入/輸出。
所以我們應該使能SCM中,pad塊的這項功能。
   具體到相關的WINCE文件有
GPIO驅動:
   1) $\WINCE600\PLATFORM\TI_EVM_3530\SRC\DRIVERS\GPIO\gpio.cpp
   2)$\WINCE600\PLATFORM\COMMON\SRC\SOC\OMAP35XX_TPS659XX_TI_V1\omap35xx\GPIO\omap35xx_gpio.cpp
啟動時安裝配置成GPIO的文件:
   1)$\WINCE600\PLATFORM\TI_EVM_3530\SRC\BOOT\XLDR\platform.c
比如:
   VOID GpioSetup()函數(shù)下的GPIO模式和端口方向定制:
 OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D0, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D1, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D2, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D3, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D4, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D5, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D6, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D7, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D8, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
 
   綜上所述:SCM模塊決定了端口的功能,而GPIO模塊控制了端口的GPIO功能;GPIO只是端口功能的一個子集。
]]>
WINCE下的USB驅動開發(fā)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1819&Page=1wangxinxin2010-11-26 10:53:36首先USB加載式流接口驅動要點分析

為了支持不同類型的外圍設備,WinCE平臺提供了具有定制接口的流接口驅動程序模型。因為大部分USB外圍設備由于功能性更適合流接口驅動的結構,所以一般都采用加載式流接口驅動程序模型來開發(fā)USB設備驅動程序。

(1)USB系統(tǒng)結構分析
WinCE下USB系統(tǒng)軟件由兩層組成:較高USB設備驅動程序層和較低的USB函數(shù)層。較低的USB函數(shù)層本身又由兩部分組成:較高的通用串行總線驅動程序(USBD)模塊和較低的主控制器驅動程序(HCD)模塊。通過HCD模塊功能和USBD模塊實現(xiàn)高層的USBD接口函數(shù),USB設備驅動程序就能與外圍設備進行通訊。

在數(shù)據(jù)傳輸?shù)倪^程中,操作流程通常按下列的次序進行:①USB設備驅動程序進行數(shù)據(jù)傳輸?shù)某跏蓟赐ㄟ^USBD接口函數(shù)給USBD模塊發(fā)送數(shù)據(jù)傳輸?shù)恼埱蟆"赨SBD模塊將該請求分成一些單獨的事務。③HCD模塊排出事務次序。④主控制器硬件執(zhí)行事務。這里需要提醒的是,所有的事務都是從主機發(fā)出的,外圍設備完全是被動接受型的。

(2)USB設備驅動程序入口點函數(shù)
從結構分析我們可知,所有的USB設備驅動程序必須在它們的DLL庫設置一定的入口點與USBD模塊進行適當?shù)慕换ァTO置入口點函數(shù)有兩個作用:一是使得 USBD 模塊能與外部設備交互;二是使得驅動程序能創(chuàng)建和管理任何可能需要的注冊鍵。

下面簡要介紹相關函數(shù)的作用:USBDeviceAttach是當 USB 設備連接到主計算機時運行,USBD模塊會調用這個函數(shù)初始化USB設備,取得USB設備信息和配置USB設備,并且申請必需的資源。 USBInstallDrive是在第一次加載USB設備驅動程序時首先被調用,它使得驅動程序能創(chuàng)建需要的注冊鍵,用于將一個驅動程序所需的注冊表信息寫入到HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers目錄下,例如設備名稱等。需要注意的是,USB設備驅動程序不使用標準的注冊表函數(shù),而是使用RegisterClientDriverID()、RegisterClientSettings()函數(shù)來注冊相應的設備信息。

USBUninstallDriver是在用戶刪除USB設備驅動程序時調用,負責刪除注冊鍵并釋放其它相關資源。它通過調用 UnRegisterClientSettings()和UnRegisterClientDriverID()函數(shù)來刪除由驅動程序的 USBInstallDriver()函數(shù)創(chuàng)建的所有注冊鍵。因此,我們在驅動程序中就需要嚴格按照這三個函數(shù)的原型來實現(xiàn),否則就不能為設備管理器所識別。

3.USB設備流接口驅動的實現(xiàn)步驟

從WinCE USB設備驅動模型及結構分析中,我們可以清晰的看到主機和外設之間的實現(xiàn)方式。在主機端,通過USBD模塊和HCD模塊使用默認的PIPE訪問一個通用的邏輯設備,實際上就是說USBD和HCD是一組訪問所有USB設備的邏輯接口,它們負責管理所有USB設備的連接、加載、移除、數(shù)據(jù)傳輸和通用配置。其中HCD是主機控制驅動,是為USBD提供底層的功能訪問服務,USBD是USB總線驅動,位于HCD的上層,利用HCD的服務提供較高層次的功能。因此,實現(xiàn)USB加載流驅動程序大致需要完成以下步驟:

(1)選擇代表設備的文件名前綴。前綴非常重要,設備管理器在注冊表中通過前綴來識別設備。同時,在流接口命名時也將這個前綴作為入口點函數(shù)的前綴,如果設備前綴為XXX,那么流接口對應為XXX_Close,XXX_Init等。

(2)設置驅動的各個入口點函數(shù)。所謂入口點是指提供給設備管理器的標準文件I/O接口。在生成一個DLL后,就用設備文件名前綴替換名字中的XXX。因此,每個加載式流接口驅動程序必須實現(xiàn)XXX_Init()、XXX_IOControl()以及XXX_PowerUp()等一組標準的函數(shù),用來完成標準的文件I/O函數(shù)和電源管理等。

(3)建立.DEF文件。當設備管理器初始化USB設備編譯出來的流接口函數(shù)后,還必須建立一個.def文件。DEF文件定義了DLL要導出的接口集,而且加載式流驅動大多是以DLL形式存在的,所以應將DLL和DEF的文件名統(tǒng)一起來。DEF文件告訴鏈接程序需要輸出什么樣的函數(shù),最后將驅動程序編譯到內核中去,這樣這個USB設備流接口驅動程序就可以被應用程序調用。

(4)在注冊表中為驅動程序建立表項。在注冊表中建立驅動程序入口點,這樣設備管理器才能識別和管理這個驅動。此外,注冊表中還能存儲額外的信息,這些信息可以在驅動運行之后被使用到。

在這次USB驅動開發(fā)過程中,錯走許多冤枉路使我叫苦連天。我感受最深的是由于WinCE提供了通用串行總線驅動程序(USBD)模塊、USBD接口函數(shù)全集、樣本主機控制器驅動程序(HCD)模塊。所以,我們只需要根據(jù)USB設備硬件特性,利用USBD提供的不同函數(shù),實現(xiàn)流接口函數(shù)與外圍設備的交互。在沒有特別的情況下,我最大的收獲經(jīng)驗是把這些公用的源程序照搬過來,能極大的縮短開發(fā)周期,從而能更快速地進行嵌入式開發(fā)。

隨著USB設備的普及,擺在開發(fā)人員面前的驅動開發(fā)任務也是越來越繁重了,特別是對于一些嵌入式開發(fā)廠商來講,由于設備所采用的操作系統(tǒng)不同,相應的硬件接口也是不一樣的,開發(fā)相關的USB 驅動程序更是難上加難。Windows CE.NET 是微軟推出的功能強大的嵌入式操作系統(tǒng),國內采用此操作系統(tǒng)的廠商已經(jīng)很多了,本文就以windows ce.net為例,簡單介紹一下如何開發(fā)windows ce.net下的USB驅動程序。

首先要熟悉一些USB的基本概念,當然最好把USB 1.1的協(xié)議看一遍,(當然現(xiàn)在2。0的協(xié)議都已經(jīng)有了)http://www.usb.org
上可以下載,我記得好像有個中文版的,翻譯的還可以,http://www.driverdevolep.com
上有的,具體位置記不太清楚了,中文版的協(xié)議可以快速翻一邊,了解一些基本的概念,但是設計到一些關鍵性的東西最好還是看英文版的心里比較清楚些。

這里我就不介紹USB的基本協(xié)議了,假設用戶已經(jīng)熟悉了USB設備的一些基本的概念,并且對Winows CE.NET的開發(fā)有一定的了解。

下面簡略介紹一下Windows CE.NET中USB設備驅動開發(fā)的一些基礎知識。

Windows CE.NET 的USB系統(tǒng)軟件分為兩層: USB Client設備驅動程序和底層的Windows CE實現(xiàn)的函數(shù)層。USB設備驅動程序主要負責利用系統(tǒng)提供的底層接口配置設備,和設備進行通訊。底層的函數(shù)提本身又由兩部分組成,通用串行總線驅動程序(USBD)模塊和較低的主控制器驅動程序(HCD)模塊。HCD負責最最底層的處理,USBD模塊實現(xiàn)較高的USBD函數(shù)接口。USB設備驅動主要利用 USBD接口函數(shù)和他們的外圍設備打交道。

USB設備驅動程序主要和USBD打交道,所以我們必須詳細的了解USBD提供的函數(shù)。

主要的傳輸函數(shù)有:
AbourtTransfer   IssueControlTransfer
CloseTransfer    IssueInterrupTransfer
GetIsochResult   IssueIsochTransfer
GetTransferStatus  IstransferComplete
IssueBulkTransfer  IssueVendorTransfer

主要的用于打開和關閉USBD和USB設備之間的通信通道的函數(shù)有:
AbortPipeTransfers  ClosePipe
IsDefaultPipeHalted  IsPipeHalted
OpenPipe       ResetDefaultPipe
ResetPipe

相應的打包函數(shù)接口有:
GetFrameLength   GetFrameNumber   ReleaseFrameLengthControl
SetFrameLength   TakeFrameLengthControl

取得設置設備配置函數(shù):
ClearFeature   SetDescriptor
GetDescriptor  SetFeature
GetInterface   SetInterface
GetStatus    SyncFrame

與USB進行交互的實現(xiàn)方法相關的多任務函數(shù):
FindInterface         RegisterClientDeviceId
GetDeviceInfo         RegisterClientSettings
GetUSBDVersion         RegisterNotificationRoutine
LoadGenericInterfaceDriver   TranslateStringDescr
OpenClientRegisterKey     UnRegisterNotificationRoutine
常見的Windows CE.NET下USB的設備驅動程序的編寫有以下幾種方法:

● 流式接口函數(shù)
這種驅動程序主要呈現(xiàn)流式函數(shù)接口,主要輸出XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Open,XXX_Close,XXX_Read,XXX_Write,
XXX_Seek, XXX_IOControl,XXX_PowerUp,XXX_PowerDown等流式接口,注意上述的幾個接口一定都要輸出,另外XXX必須為三個字符,否則會出錯。但是此類的驅動程序不是通過設備管理接口來加載的,所以必須手工的調用RegisterDevice()和 DeregisterDevice()函數(shù)來加載和卸載驅動程序。用戶可以將此類的設備作為標準的文件來操作,只要調用相應的文件操作就可以和驅動程序打交道。

● 使用現(xiàn)有的Window CE.NET的應用程序接口
此類設備主要是利用Windows CE.NET中已經(jīng)有了現(xiàn)成的函數(shù)接口,例如USB Mass Storage Disk,它主要利用現(xiàn)有的Windows CE.Net中已經(jīng)有的可安裝文件系統(tǒng)接口,呈現(xiàn)給系統(tǒng)可用的文件系統(tǒng),對于用戶來講,它是透明的,用戶僅僅感覺在操作一個文件夾。

● 創(chuàng)建指定到特定的USBD的用戶指定的API
這種方法在USBD呈現(xiàn)設備時不需要任何限制,主要是特制的提供API給用戶,一般不太常見。


USB設備驅動程序必須輸出的函數(shù)有:
● USBDeviecAttach
當USB設備連接到計算機上時,USBD模塊就會調用此函數(shù),這個函數(shù)主要用于初始化USB設備,取得USB設備信息,配置USB設備,并且申請必需的資源。
● USBInstallDriver
主要用于創(chuàng)建一個驅動程序加載所需的注冊表信息,例如讀寫超時,設備名稱等。
● USBUninstallDriver
主要用于釋放驅動程序所占用的資源,以及刪除USBInstallDriver函數(shù)創(chuàng)建的注冊表等。
上述的三個函數(shù)接口是所有的USB驅動程序必須提供的,缺一不可。
另外比較重要的是USB設備驅動程序的注冊表配置,一般的USB設備驅動程序的注冊表配置在HKEY_LOCAL_MACHINE\Drivers\USB \LoadClients下,每個驅動程序的子鍵都有Group1_ID\Group2_ID\Group3_ID\DriverName格式,如果注冊表信息與USB設備信息符合,USBD就會加載此驅動程序。否則設備的子鍵應該由供應商,設備類和協(xié)議信息通過下劃線組成。
具體的配置舉個例子:
例如你有個PDA設備,它具有一個USB接口,它的供應廠商ID假設為0x0888,設備ID為0x0999,沒有使用特殊的協(xié)議,那么它的加載注冊表應該寫為:
[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\2184_2457\Default\Default\PDA] "DLL"="pdausb.dll"
需要注意的是注冊表構成都是十進制數(shù)值來標識的,注意一下十進制和十六進制的轉換。
再舉個USB鼠標的例子,USB鼠標是標準的HID設備,它的協(xié)議為:InterfaceClassCode為3(HID類), InterfaceSubclassCode為1(引導接口類),InterfaceProtocolCode為2(鼠標協(xié)議類),所以它的注冊如下:
[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\Default\Default\3_1_2\USBMouse] "DLL"="usbmouse.dll"

到此為止,我們可以看出,其實驅動開發(fā)無非做兩件事情,一件是和硬件打交道,另外一件是和操作系統(tǒng)打交道。舉個簡單的例子,例如:我們需要開發(fā)一個USB鼠標驅動程序,我們就需要了解USB鼠標硬件上是怎么發(fā)送數(shù)據(jù)的?操作系統(tǒng)怎么才能得到鼠標的控制事件?其實USB鼠標是有一個中斷PIPE的,用于傳送鼠標產(chǎn)生的數(shù)據(jù),Windwos CE.NET中有個接口函數(shù)叫做mouse_event(),專門用于產(chǎn)生鼠標事件,但是它是不關心具體什么硬件的,甚至我們自己在應用程序中調用這個函數(shù)都可以實現(xiàn)模擬鼠標,對應的有個keybd_event(),用于產(chǎn)生鍵盤事件,知道了這個就好辦多了,只要將相應的數(shù)據(jù)轉換一下,調用一下 mouse_event()即可

例如我們有個USB Mouse設備,設備信息描述如下:
Device Descriptor:
bcdUSB: 0x0100
bDeviceClass: 0x00
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x08 (8)
idVendor: 0x05E3 (Genesys Logic Inc.)
idProduct: 0x0001
bcdDevice: 0x0101
iManufacturer: 0x00
iProduct: 0x01
iSerialNumber: 0x00
bNumConfigurations: 0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Low
Device Address: 0x02
Open Pipes: 1

Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Interrupt
wMaxPacketSize: 0x0003 (3)
bInterval: 0x0A

可以看出上述設備有一個中斷PIPE,包的最大值為3。可能有人問上述的值怎么得到的,win2k 的DDK中有個usbview的例程,編譯一下,將你的USB設備插到PC機的USB口中,運行usbview.exe即可看得相應的設備信息。

有了這些基本信息,就可以編寫USB設備了,首先聲明一下,下面的代碼取自微軟的USB鼠標樣本程序,版權歸微軟所有,此處僅僅借用來描述一下USB鼠標驅動的開發(fā)過程,讀者如需要引用此代碼,需要得到微軟的同意。

首先,必須輸出USBD要求調用的三個函數(shù),首先到設備插入到USB端口時,USBD會調用USBDeviceAttach()函數(shù),相應的代碼如下:
extern "C" BOOL
USBDeviceAttach(
USB_HANDLE hDevice, // USB設備句柄
LPCUSB_FUNCS lpUsbFuncs, // USBDI的函數(shù)集合
LPCUSB_INTERFACE lpInterface, // 設備接口描述信息
LPCWSTR szUniqueDriverId, // 設備ID描述字符串。
LPBOOL fAcceptControl, // 返回TRUE,標識我們可以控制此設備, 反之表示不能控制
DWORD dwUnused)
{
*fAcceptControl = FALSE;
// 我們的鼠標設備有特定的描述信息,要檢測是否是我們的設備。
if (lpInterface == NULL)
return FALSE;
// 打印相關的USB設備接口描述信息。
DEBUGMSG(ZONE_INIT,(TEXT("USBMouse: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u,Prot:%u\r\n"), lpInterface->Descriptor.bInterfaceNumber,lpInterface->Descriptor.bNumEndpoints, lpInterface->Descriptor.bInterfaceClass,lpInterface->Descriptor.bInterfaceSubClass,lpInterface->Descriptor.bInterfaceProtocol));
// 初試數(shù)據(jù)USB鼠標類,產(chǎn)生一個接受USB鼠標數(shù)據(jù)的線程
CMouse * pMouse = new CMouse(hDevice, lpUsbFuncs, lpInterface);
if (pMouse == NULL)
return FALSE;

if (!pMouse->Initialize())
{
delete pMouse;
return FALSE;
}

// 注冊一個監(jiān)控USB設備事件的回調函數(shù),用于監(jiān)控USB設備是否已經(jīng)拔掉。
(*lpUsbFuncs->lpRegisterNotificationRoutine)(hDevice,
USBDeviceNotifications, pMouse);

*fAcceptControl = TRUE;
return TRUE;
}

第二個函數(shù)是 USBInstallDriver()函數(shù),
一些基本定義如下:
const WCHAR gcszRegisterClientDriverId[] = L"RegisterClientDriverID";
const WCHAR gcszRegisterClientSettings[] = L"RegisterClientSettings";
const WCHAR gcszUnRegisterClientDriverId[] = L"UnRegisterClientDriverID";
const WCHAR gcszUnRegisterClientSettings[] = L"UnRegisterClientSettings";
const WCHAR gcszMouseDriverId[] = L"Generic_Sample_Mouse_Driver";

函數(shù)接口如下:
extern "C" BOOL
USBInstallDriver(
LPCWSTR szDriverLibFile) // @parm [IN] - Contains client driver DLL name
{
BOOL fRet = FALSE;
HINSTANCE hInst = LoadLibrary(L"USBD.DLL");

// 注冊USB設備信息
if(hInst)
{
LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID)
GetProcAddress(hInst, gcszRegisterClientDriverId);

LPREGISTER_CLIENT_SETTINGS pRegisterSettings =
(LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst,
gcszRegisterClientSettings);

if(pRegisterId && pRegisterSettings)
{
USB_DRIVER_SETTINGS DriverSettings;

DriverSettings.dwCount = sizeof(DriverSettings);

// 設置我們的特定的信息。
DriverSettings.dwVendorId = USB_NO_INFO;
DriverSettings.dwProductId = USB_NO_INFO;
DriverSettings.dwReleaseNumber = USB_NO_INFO;

DriverSettings.dwDeviceClass = USB_NO_INFO;
DriverSettings.dwDeviceSubClass = USB_NO_INFO;
DriverSettings.dwDeviceProtocol = USB_NO_INFO;

DriverSettings.dwInterfaceClass = 0x03; // HID
DriverSettings.dwInterfaceSubClass = 0x01; // boot device
DriverSettings.dwInterfaceProtocol = 0x02; // mouse

fRet = (*pRegisterId)(gcszMouseDriverId);

if(fRet)
{

]]>
WINCE6.0+S3C2443系統(tǒng)速度測試http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1818&Page=1wangxinxin2010-11-26 10:52:10根據(jù)客戶的需要,我們公司的GPS產(chǎn)品決定采用WINCE6.0操作系統(tǒng),采用基于長高的WINCE6.0+S3C2443的BSP包來開發(fā),就系統(tǒng)速度這個問題做了以下測試:

測試硬件和軟件
硬件:
同一塊板子,LCD是800*480分辨率的
軟件:
同是TCPMP0.81版本的視頻播放軟件

測試:
1. 在板子上運行長高的WINCE5.0系統(tǒng),使用TCPMP0.81版本進行benchmark測試(用GDI格式),得到的Average Speed =100.48%
2. 在板子上運行長高的WINCE6.0系統(tǒng),使用TCPMP0.81版本進行benchmark測試(用GDI格式),得到的Average Speed =72.18%

問題:
為什么在同一塊板子上運行同一個視頻播放軟件,測試出來的Average Speed的值會差這么多,而且反而是WINCE5.0的NK的播放速度更快(100.48%>72.18%)

我在測試過程中發(fā)現(xiàn)以下問題:
在5.0的系統(tǒng)開機后第一次運行TCPMP時,這個視頻播放軟件很快就加載起來了(運行起來),而在6.0的系統(tǒng)開機后第一次運行TCPMP時,要等大概30s中才能加載起來,而且有如下的串口輸出信息:
Exception 'Undefined Instruction' (1): Thread-Id=084e0002(pth=83c29270), Proc-Id=084d0002(pprc=83c0f024) 'PLAYER.EXE', VM-active=084d0002(pprc=83c0f024) 'PLAYER.EXE'
PC=4170b6c8(common.dll+0x0004b6c8) RA=416f9f40(common.dll+0x00039f40) SP=0003fba8, BVA=00000000
OALIoCtlHalGetDeviceInfo():SPI_GETPLATFORMNAME
OALIoCtlHalGetDeviceInfo():SPI_GETOEMINFO
+GetGameXInfo 
Stride=1600, Width=800, Height=480, FrmaeBuffer=d2e20000 
-GetGameXInfo 
Exception 'Data Abort' (4): Thread-Id=084e0002(pth=83c29270), Proc-Id=084d0002(pprc=83c0f024) 'PLAYER.EXE', VM-active=084d0002(pprc=83c0f024) 'PLAYER.EXE'
PC=416ffb44(common.dll+0x0003fb44) RA=416ffb3c(common.dll+0x0003fb3c) SP=0003fb10, BVA=d2e20000
In else------------>>>

根據(jù)我的分析,至于為什么會出現(xiàn)WINCE5.0的NK的播放速度對6.0下的快這個問題,我想問題在以下部分:
1. TCPMP0.81不能很好的兼容WINCE6.0,這需要TCPMP針對WINCE6.0做一些修改和移植。
2. 可能WINCE6.0的BSP包的顯示驅動沒有完善好

 
]]>
如何為WinCE的定制鍵盤寫驅動http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1817&Page=1wangxinxin2010-11-26 10:49:40常看到有人問怎么給定制鍵盤制作驅動程序,在這里談談我的經(jīng)驗。完整的鍵盤驅動怎么寫不是這篇文章的目的,這些MSDN上有很詳細的介紹。這里談的是,舉個例子,標準的美國英語鍵盤的數(shù)字鍵SHIFT+2輸出符號@,你想改成歐元符號該怎么做?或者你想做一個法語鍵盤,又該怎么做?又或者你想基于同樣的鍵盤硬件設計,軟件上同時支持英語、法語、俄語layout,又該怎么弄?

在WinCE上,從鍵盤驅動的角度看,鍵盤驅動對按鍵動作的響應過程大約可描述為:

按鍵產(chǎn)生中斷
鍵盤驅動讀取按鍵的scan code
鍵盤驅動把scan code映射成virtual key和unicode字符
鍵盤驅動把按鍵消息發(fā)送到圖形窗口子系統(tǒng)(GWES)。
鍵的scan code由keyboard matrix決定,跟鍵盤的硬件設計有關。因此從軟件角度看,鍵盤的scan code是不能改的。但是由于按鍵最終輸出的是可打印字符或者virtual key,這里面就有個映射關系,這個映射關系可以在鍵盤驅動理指定,甚至可以動態(tài)切換。WinCE的標準鍵盤驅動框架定義了兩張映射表:即Scan code到virtual key的映射表(Device layout),和virtual key到unicode的映射表(input language)。通過修改這兩張映射表的定義,我們就可以控制鍵盤上的每一個按鍵或者按鍵組合的輸出。

 D:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\KEYBD目錄下有一些針對標準鍵盤的源代碼:DEVICELAYOUTS子目錄下是Scan code到virtual key映射表,INPUTLANGS子目錄下是virtual key到unicode映射表。具體做時主要是改這兩張表,加上其他一些輔助代碼編譯成DLL。除此之外,WinCE還提供一個工具 (D:\WINCE500\PUBLIC\COMMON\OAK\BIN\I386\kbdgen.exe),可以從Windows XP系統(tǒng)鍵盤驅動中提取映射表。比如下面命令生成法語鍵盤映射表的源代碼:

kbdgen.exe kbdfr.dll -o kbd_040c -i 0000040C

結果輸出三個文件:

kbd_040c.reg:注冊表文件
kbd_040cDL.cpp:scan code -> virtual key映射表
kbd_040cIL.cpp:virtual key -> wide character映射表

鍵盤驅動名在注冊表里[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts]可以查到,比如法語的locale是040C,在0000040c子鍵下可以找到驅動為kbdfr.dll。

scan code到virtual key(即device layout)在ScanCodeToVKeyTable數(shù)組里定義,一般不用改:

#define ScanCodeTableFirst  0x00
#define ScanCodeTableLast   0x8f
static UINT8 ScanCodeToVKeyTable[] =
{
    0,      // Scan Code 0x0
    VK_F9,  // Scan Code 0x1
    0,      // Scan Code 0x2
    VK_F5,  // Scan Code 0x3
    VK_F3,  // Scan Code 0x4
    VK_F1,  // Scan Code 0x5
    VK_F2,  // Scan Code 0x6
    VK_F12, // Scan Code 0x7
    0,      // Scan Code 0x8
    VK_F10, // Scan Code 0x9
    VK_F8,  // Scan Code 0xA
    VK_F6,  // Scan Code 0xB

};
 有時候你可能想知道鍵盤上每個鍵對應的scan code,你可以在鍵盤驅動KeybdPdd_GetEventEx2函數(shù)中用RETAILMSG把scan code打印出來。

定制的重點是修改virtual key到unicode映射表,即 aVkToWch1~aVkToWch5等幾個數(shù)組,歐洲語言鍵盤還要改aDeadKey數(shù)組,這幾個數(shù)組控制各種組合按鍵輸出,比如用戶按下A, Shift+A, Ctrl+Shift+A, Dead key+A,分別輸出什么東西 。

舉例來說,標準美語鍵盤SHIFT+2輸出@,你想改成歐元符號。先查出的unicode值為20AC(利用MS Office的symbol對話框),然后修改aVkToWch2數(shù)組:

static VK_TO_WCHARS2 aVkToWch2[] = {
  {'2'          ,0      ,'2'      ,0x20ac      },

};
 如果你同時還想讓CTRL+ALT+2輸出§(unicode 00A7),那么要改aVkToWch5而不是aVkToWch2:

static VK_TO_WCHARS5 aVkToWch5[] = {
  {'2'          ,0 ,'2'      ,0x20ac      ,WCH_NONE ,0x0000   ,0xb9    },

};

映射表的修改過程大致如此。有了DLL還要在注冊表中做些配置。在platform.reg中添加:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Layouts\0000040C]
    "Layout File"="kbd_040c.dll"
    "Layout Text"="French"
    "PS2_AT"="kbd_040c.dll"

如果你同時支持英語和法語鍵盤,可以把法語設為第二鍵盤:
[HKEY_CURRENT_USER\Keyboard Layout\Preload\2]
    @="0000040C"

甚至還可以設置熱鍵在運行時切換鍵盤:
;Enabling ALT+SHIFT keyboard layout toggle short cut key
;  "Hotkey"="1" => ALT+SHIFT
;  "Hotkey"="2" => CTRL+SHIFT
;  "Hotkey"="3" => None
; The toggle key is disabled even if the key is not defined.
[HKEY_CURRENT_USER\keyboard layout\toggle]
    "Hotkey"="1"

]]>
WinCE和Win2000/XP設備驅動開發(fā)的區(qū)別http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1816&Page=1wangxinxin2010-11-26 10:44:42引 言

Windows CE是一個32位、多任務、多線程的嵌入式操作系統(tǒng),是微軟專門為信息設備、移動應用、消費類電子產(chǎn)品、嵌入式應用等非PC領域設計的操作系統(tǒng)產(chǎn)品,在外觀和使用的感覺上十分接近桌面Windows系統(tǒng)。它使用平面內存模式尋址,可以同時運行多個程序并支持一個程序中的多個線程,并且非常精煉,只有很小的內存要求。與基于PC的操作系統(tǒng)不同,Windows CE不需要標準硬件,反而支持各種各樣的CPU(如X86、PowerPC、ARM、MIPS等),通過OEM適配層(OEM adaptation layer)可以把Windows CE適配到任何硬件平臺。Windows CE是微軟Windows操作系統(tǒng)家族的一個成員,支持用于Windows 2000/XP和Windows 98等桌面Windows操作系統(tǒng)的Win32 API的一個子集。由于它不是桌面Windows操作系統(tǒng)的一部分或縮減版本,使得開發(fā)Windows CE的驅動程序與開發(fā)桌面Windows的驅動程序有所不同。本文將著重討論這些區(qū)別,以使廣大熟悉桌面Windows驅動程序開發(fā)的程序員能快速掌握嵌入式操作系統(tǒng)WindowsCE驅動程序的開發(fā)方法。

1 驅動結構模型比較

在桌面Windows系統(tǒng),以支持Windows2000/XP的WDM驅動模型為例。WDM體系結構實行分層處理,即設備驅動被分成了若干層——最高層驅動程序、中間層驅動程序、最低層驅動程序,如圖1所示。

圖片點擊可在新窗口打開查看 圖片點擊可在新窗口打開查看

在Windows CE驅動中,按驅動的結構可以分為兩種類型——分層式設備驅動程序和整體式驅動程序,如圖2所示。分層式設備驅動程序由上層和下層兩部分代碼組成。上層的程序叫做模型設備驅動程序(MDD),下層的程序則叫做平臺相關的驅動程序(PDD)。整體式驅動程序的源代碼由中斷服務線程代碼和針對平臺的代碼組成。

同桌面Windows設備驅動結構模型相比,Windows CE設備驅動相對簡單一些。正如圖1和圖2所示,兩種操作系統(tǒng)的設備驅動雖然存在許多相似的地方,都采用了模塊、分層的設計方法,但是還存在許多不同的地方。在Windows CE操作系統(tǒng)中,分層的驅動程序并不適用于所用的驅動,尤其是將驅動程序分為兩層將會導致在驅動程序操作時附加的功能調用,這無疑會降低驅動程序的效率。對于時間或性能關鍵的實時操作,整體式驅動程序將會更適合。

圖片點擊可在新窗口打開查看

在桌面Windows系統(tǒng)中,驅動各層通信之間使用一種稱為I/O請求包(IRP)的數(shù)據(jù)結構進行通信。影響到設備的每個操作都使用I/O請求包,采用層次結構可以使I/O請求過程更加明了。I/O管理器發(fā)送IRP來請求驅動程序的處理,通常IRP由分層的驅動程序棧來處理,高層的驅動程序把請求劃分成更簡單的請求并傳遞給下層驅動程序。IRP首先被送到設備堆棧的最上層驅動程序,然后逐漸過濾到下層的驅動程序。每一層驅動程序都可以決定如何處理IRP。而Windows CE驅動各層之間的通信沒有采用IRP通信機制,而是通過接口函數(shù)調用實現(xiàn)的。設備驅動程序接口(Device Driver Interface,DDI)是在MDD層中實現(xiàn)的函數(shù)集,系統(tǒng)中的GWES模塊通過這個接口調用設備驅動程序;設備驅動程序服務器接口(Device Driver Service Provider Interface,DDSI)是在PDD層中實現(xiàn)的函數(shù)集并由MDD調用。

2 設備驅動組成部分比較

簡單地說,驅動程序是一些例程的集合,它們被動地存在,等待主機系統(tǒng)軟件來調用或激活它們。在Win-dows系統(tǒng)中驅動,具體的驅動程序有所不同,其包含的例程也不同,但其主要例程是相同的。圖3描述一個Windows驅動的基本流程。

圖片點擊可在新窗口打開查看

以下從幾個方面闡述WindowsCE和桌面Windows設備驅動組成的不同。

2.1 驅動程序的入口點

在桌面Windows和Windows CE兩個系統(tǒng)中的驅動程序都含有初始化模塊,該模塊主要功能是完成驅動程序的初始化及卸載。在桌面Windows系統(tǒng)的初始化模塊中,包括每一個設備驅動程序都有的一個初始化入口點——DriverEntry例程,每次設備驅動程序啟動時該例程被系統(tǒng)自動調用。其最重要的功能是設置驅動程序對應于I/O請求的主功能代碼(MajorFunction)的回調例程。DriverEntry例程如下:

圖片點擊可在新窗口打開查看

其中,AddDevice例程是在系統(tǒng)添加一個設備時被PnP管理器調用的,其主要工作是創(chuàng)建并初始化設備對象;DriverUnload例程在系統(tǒng)卸載硬件時使用,由I/O管理器調用,釋放所有資源。初始化模塊中還包括Create和Close兩個例程,這是Win32程序獲得和釋放設備句柄的唯一途徑。

與桌面Windows設備驅動程序開發(fā)相比,WindowsCE設備驅動程序開發(fā)的主要難點是,對于不同類型設備的驅動程序架構是不一樣的。以流接口驅動程序為例,Windows CE設備驅動程序是用戶模式動態(tài)鏈接庫(DLL),其入口點在不同的情況有一些細微的差別,主要入口點包括XXX_Init、XXX_Deinit、XXX_Open、XXX_Close、XXX_IOControl、XXX_Read、XXX_Seek、XXX_PowerUp和XXX_PowerDown,在實際開發(fā)中接口名稱中的XXX三個字母由設備驅動的設備文件名前綴代替。

2.2 與應用程序的通信

設備驅動程序構造成功之后,將它與設備一同安裝進系統(tǒng),以便用戶可以對設備進行適當?shù)目刂萍霸L問。在桌面Windows和Windows CE兩個系統(tǒng)中使用Win32 API實現(xiàn)硬件的訪問。首先調用CreateFile創(chuàng)建一個設備的連接,獲得該設備的句柄(Handle),然后根據(jù)需要調用ReadFile、WriteFile、DeviceIoControI等函數(shù)對設備進行讀寫或者其他I/O控制操作,最后調用CloseHandle關閉設備。

在桌面Windows系統(tǒng)中,當用戶需要訪問某設備時,必須首先取出指定設備全局唯一標識符(GUID)的設備信息集,枚舉設備實例的接口數(shù)據(jù),從中獲得設備的符號鏈接名,然后調用CreatFile創(chuàng)建設備,并獲得設備句柄,而在驅動程序內部通過處理IRP響應來自Win32應用程序對IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE和IRP_MJ_OCTL等請求。IRP由IRP首部結構和一系列的棧單元組成,每個棧單元是一個IO_STACK_LOCA-TION結構。驅動程序僅需知道當前I/O棧單元和IRP首部結構中的信息就可以對IRP進行處理。驅動程序處理完IRP后,使用IoCompleteRequest函數(shù)通知I/O管理器,可以通過其參數(shù)設定狀態(tài)碼和返回的字節(jié)數(shù)。在Windows CE系統(tǒng)中,應用程序需要了解中斷處理線程中數(shù)據(jù)的輸入輸出完成情況,以便及時地處理。這就需要建立應用程序和設備驅動程序的同步通信。

2.3 設備名

在Windows設備驅動中,為了提供Win32程序可用的名字,必須為每個設備創(chuàng)建符號鏈接。在桌面Windows和Windows CE兩個系統(tǒng)中,都可以采用一個明確的符號鏈接名。一個具體設備名稱是由設備名前綴和設備名索引組成的,即3個大寫字母、1位數(shù)字和冒號組成。另外在桌面Windows系統(tǒng)中,還可以采用設備接口為設備創(chuàng)建符號鏈接。每個設備接口由一個128位全局唯一標識符(GUID)標志。把設備注冊為一個特定的設備接口就創(chuàng)建了一個符號鏈接。用戶態(tài)設備可以取得擁有此GUID的設備。

2. 4 驅動程序的運行模式

在Windows系統(tǒng)中支持兩種基本模式的驅動程序類型,即用戶模式(user mode)和內核模式(kernel mode),不同的模式允許不同層次的內存存取和系統(tǒng)資源的分配。內核模式驅動程序則由運行于內核模式的系統(tǒng)級代碼組成,它們沒有系統(tǒng)資源存取的限制,可以執(zhí)行任何有效的CPU指令,被用來直接控制硬件。用戶模式驅動程序是按用戶模式運行的系統(tǒng)級代碼,它們不能使用直接的硬件I/O指令來訪問硬件。

桌面Windows系統(tǒng)一般要求設備驅動運行在內核模式下。內核模式提供設備資源的直接訪問,沒有固定的用戶模式的輔助操作。

Windows CE系統(tǒng)一般要求設備驅動運行在用戶模式下。這種運行在用戶模式下的設備驅動程序有許多優(yōu)點,最明顯的優(yōu)點是當設備驅動開發(fā)有錯誤動作時,內核被有效地保護起來了,因此內核被驅動程序破壞,或者可能導致不能重新啟動內核的潛在目標存儲錯誤,以及其他意想不到的災難等發(fā)生的可能性就明顯地減少。

2.5 驅動程序的安裝

桌面Windows的驅動安裝通過INF文件。INF文件是一個文本文件,含有安裝一個WDM驅動設備程序需要的所有必需的信息,包括要復制的文件列表、要創(chuàng)建的注冊表項等。驅動根據(jù)INF文件中的指令安裝,驅動程序可執(zhí)行文件被復制到正確的位置,通常是Windows Sys-tem32\Drivers目錄,然后創(chuàng)建各種注冊表項。WindowsCE和桌面Windows之間的最大區(qū)別是,Windows CE不支持.sys和.inf文件。Windows CE設備驅動編譯成動態(tài)庫,將驅動的動態(tài)庫文件直接拷入Windows\目錄,然后創(chuàng)建各種注冊表項即可。這就減少了Windows CE加載程序的復雜性和大小。

3 開發(fā)環(huán)境比較

在桌面Windows系統(tǒng)中,驅動程序的開發(fā)采用兩種方式。一類是Microsoft公司提供的Windows DDK(De-vice Driver Kit),由于DDK基于匯編語言的編程方式和內核模式的調用,對沒有深厚的OS原理和編程水平的人員來說,任務相當艱巨。另一類是NuMega公司提供的DriverStudio,它是一個大的開發(fā)工具包,包含VtoolsD、SoftICE和DriverWorks等開發(fā)工具。利用DriverStudio開發(fā)WDM驅動程序,可以大大減輕開發(fā)人員的工作量、縮短開發(fā)周期,以及降低開發(fā)驅動程序的難度。

Windows CE開發(fā)平臺的開發(fā)者、獨立硬件供應商(IHVS)和應用程序開發(fā)者都會從事基于Windows CE平臺的設備驅動程序開發(fā)。對于不同的開發(fā)者,微軟為Windows CE提供了2種開發(fā)工具:Platform Builder和Embedded Visual Tools。Platform Builder是一個定制基于Windows CE操作系統(tǒng)的嵌入式平臺的集成開發(fā)環(huán)境(IDE),為創(chuàng)建Windows CE嵌入式系統(tǒng)提供了全部相關工具,范圍從用來開發(fā)基于Windows CE的應用程序和設備驅動程序,到用來創(chuàng)建操作系統(tǒng)各種自定義版本。而Embedded Visual Tools主要用于上層應用程序、驅動的開發(fā),功能類似于桌面Windows平臺上的開發(fā)工具VC、VB等。這個工具的核心是Embedded Visual C++,它具有和Visual C++6.0基本相同的特性,包括對MFC、ATL以及COM/DCOM的支持、應用程序向導、編譯調試等多種功能。

結 語

理解Windows CE與桌面Windows設備驅動程序開發(fā)的區(qū)別,有助于廣大熟悉桌面Windows設備驅動程序開發(fā)的程序員快速掌握嵌入式操作系統(tǒng)Windows CE的設備驅動程序開發(fā)。近幾年來,信息家電、掌上電腦、電視機頂盒等基于Windows CE操作系統(tǒng)的設備已變得越來越普及,而Windows CE上的設備驅動程序還比較少,因此Windows CE設備驅動程序具有不少潛力和市場。希望本文對打算開發(fā)Windows CE設備驅動程序的人們有所幫助。

]]>
詳解WinCE下USB Host驅動開發(fā)(2)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1815&Page=1wangxinxin2010-11-26 10:38:05BOOL USBUnInstallDriver();
    它與USBInstallDriver類似,不過是調用如下兩個函數(shù)
UnRegisterClientSettings
    BOOL UnRegisterClientSettings(LPCWSTR szUniqueDriverId, LPCWSTR szReserved, LPCUSB_DRIVER_SETTINGS lpDriverSettings);
    BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId);
    其中szUniqueDriverId是注冊時,使用的ID,szReserved保留,故設置為NULL,lpDriverSettings則是驅動程序設置信息。

例程如下:
BOOL USBUnInstallDriver()
{
 RETAILMSG(1,(TEXT("USBUninstallDriver\r\n")));
 BOOL fRet = FALSE;
 USB_DRIVER_SETTINGS DriverSettings;
 DriverSettings.dwCount = sizeof(DriverSettings);
 DriverSettings.dwVendorId = 0x10C4;
 DriverSettings.dwProductId = 0x0003;
 DriverSettings.dwReleaseNumber = USB_NO_INFO;
 
 DriverSettings.dwDeviceClass = USB_NO_INFO;
 DriverSettings.dwDeviceSubClass = USB_NO_INFO;
 DriverSettings.dwDeviceProtocol = USB_NO_INFO;
 
 DriverSettings.dwInterfaceClass = 0;
 DriverSettings.dwInterfaceSubClass = 0;
 DriverSettings.dwInterfaceProtocol = 0;
 
 fRet = UnRegisterClientSettings(L"USBTest", NULL, &DriverSettings);
 if(fRet) {
  fRet = UnRegisterClientDriverID(L"USBTest");
  if(!fRet)
   RETAILMSG(1,(TEXT("UnRegisterClientDriverID error\r\n")));
 } else
  RETAILMSG(1,(TEXT("UnRegisterClientSettings error\r\n")));
 return fRet;
}
    其中DriverSettings必須與USBInstallDriver的DriverSettings一致。
    回到原來的流程,WinCE注冊表中已經(jīng)包含了驅動信息,WinCE系統(tǒng)自動查找注冊表,在找到設備對應鍵值的DLL后,將會調用該DLL的USBDeviceAttach函數(shù)。
BOOL USBDeviceAttach(
 USB_HANDLE hDevice,
 LPCUSB_FUNCS lpUsbFuncs,
 LPCUSB_INTERFACE lpInterface,
 LPCWSTR szUniqueDriverId,
 LPBOOL fAcceptControl,
 DWORD dwUnused)
    hDevice 設備句柄,操作USB設備時,需要使用該句柄
    lpUsbFuncs 指向一個包含各種USB操作的函數(shù)指針
    lpInterface USB接口信息,這里需要注意的是,如果在DriverSettings里dwInterfaceClass、dwInterfaceSubClass、dwInterfaceProtocol設置為USB_NO_INFO,則該指針為NULL 
    szUniqueDriverId 注冊設備ID
    fAcceptControl 該值被賦值為TRUE,表示該驅動能操作該設備。如果不能操作該設備,則“未能識別的USB設備”對話框會再次出現(xiàn),要求用戶輸入驅動程序名稱
    dwUnused 未使用

    在該函數(shù)內,主要是做一些檢查,判斷是否能驅動設備,還有就是注冊USB事件通知回調函數(shù),以及激活流驅動。對于檢查部分,這里不再詳細說明。

    首先,介紹一下激活流驅動。
    流驅動為應用程序提供了一個訪問設備的接口,利用該接口可以像訪問文件一樣訪問設備。USB設備同樣可以使用該接口來為應用程序提供支持。在注冊表的
HKEY_LOCAL_MACHINE\Drivers\BuiltIn鍵下,保存了各種WinCE內建流驅動程序的入口。這些驅動通過device.exe在系統(tǒng)啟動時被激活。像USB這樣的設備,只有插入時,才存在流
驅動接口,所以我們需要手動激活流驅動。激活流驅動的函數(shù)是:

    HANDLE ActivateDevice(LPCWSTR lpszDevKey, DWORD dwClientInfo);
lpszDevKey 字符串指明了流驅動所在注冊表的鍵。獲悉流驅動的人都知道,流驅動在注冊表中必須包含兩個鍵Prefix和Dll。

    流驅動中所有接口函數(shù)都有類似XXX_的前綴,而這個Prefix則指明XXX對應的字符串,如Prefix為COM,則流驅動包含如COM_Open、COM_Close、COM_Write、COM_Read這樣接口函數(shù)。Dll則說明了這些函數(shù)所在的動態(tài)鏈接庫。

在我的例子中存在如下的注冊表鍵:
[HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers\USBTest]
   "Prefix"="TST"
   "Dll"="MyUSBTest.dll"
    通過dwClientInfo,可以把參數(shù)間接傳給驅動的XXX_init。我們可以把hDevice、lpUsbFuncs、lpInterface這樣信息放置在一個結構體中,通過該函數(shù)傳遞給流驅動使用。
USB通知回調函數(shù),可以用來判斷各種USB事件的發(fā)生,如USB拔出。當發(fā)生事件后,系統(tǒng)會根據(jù)注冊的回調函數(shù)做相應的處理,在USB設備拔出后,所要做的事情,就是卸載流驅動,并釋放占用的各種資源。

    注冊回調函數(shù)是一個包含在lpUsbFuncs中的函數(shù)指針:
LPUN_REGISTER_NOTIFICATION_ROUTINE lpUnRegisterNotificationRoutine

該函數(shù)的聲明如下:
typedef BOOL (* LPREGISTER_NOTIFICATION_ROUTINE)(
  USB_HANDLE hDevice,
  LPDEVICE_NOTIFY_ROUTINE lpNotifyRoutine,
  LPVOID lpvNotifyParameter
);
hDevice 設備句柄
lpNotifyRoutine 回調函數(shù)
lpvNotifyParameter 傳遞給回調函數(shù)的參數(shù)
在回調函數(shù)中卸載流驅動使用
BOOL DeactivateDevice(HANDLE hDevice);
其中,hDevice 傳入ActivateDevice時返回的句柄。
下面是具體的示例:
typedef struct {
 DWORD dwSize;
 USB_HANDLE hDevice,
 LPCUSB_FUNCS lpUsbFuncs,
 LPCUSB_INTERFACE lpInterface,
 HANDLE hStreamDevice;
} TESTUSBINFO, PTESTUSBINFO;
//回調函數(shù)
extern "C" BOOL USBDeviceNotifications(
 LPVOID lpvNotifyParameter,
 DWORD dwCode,
 LPDWORD *dwInfo1,
 LPDWORD *dwInfo2,
 LPDWORD *dwInfo3,
 LPDWORD *dwInfo4)
{
 if (dwCode == USB_CLOSE_DEVICE) {
  PTESTUSBINFO pDrv = (PDRVCONTEXT) lpvNotifyParameter;
  DeactivateDevice(pDrv->hStreamDevice); //卸載流驅動
  LocalFree(pDrv); //釋放資源
 }
 RETAILMSG(1,(TEXT("Free Driver Resources!\r\n")));
 return TRUE;
}
BOOL USBDeviceAttach(
 USB_HANDLE hDevice,
 LPCUSB_FUNCS lpUsbFuncs,
 LPCUSB_INTERFACE lpInterface,
 LPCWSTR szUniqueDriverId,
 LPBOOL fAcceptControl,
 DWORD dwUnused)
{
 RETAILMSG(1,(TEXT("USBDeviceAttach\r\n")));
 *fAcceptControl = FALSE;
 //顯示USB設備的一些信息
 if(lpInterface != NULL) {
  RETAILMSG(1,(TEXT("usbserialhost: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u, Prot:%u\r\n"),
   lpInterface->Descriptor.bInterfaceNumber,
   lpInterface->Descriptor.bNumEndpoints,
   lpInterface->Descriptor.bInterfaceClass,
   lpInterface->Descriptor.bInterfaceSubClass,
   lpInterface->Descriptor.bInterfaceProtocol));
  RETAILMSG(1,(TEXT("Endpoint 1:%u\r\n"),
   lpInterface->lpEndpoints[0].Descriptor.bmAttributes));
  RETAILMSG(1,(TEXT("Endpoint 2:%u\r\n"),
   lpInterface->lpEndpoints[1].Descriptor.bmAttributes));
  RETAILMSG(1,(TEXT("Endpoint 3:%u\r\n"),
   lpInterface->lpEndpoints[2].Descriptor.bmAttributes));
 }
 LPCUSB_DEVICE lpUsbDev = (lpUsbFuncs->lpGetDeviceInfo)(hDevice);
 if(!lpUsbDev)
 {
  RETAILMSG(1,(TEXT("Unable to get USB device!\r\n")));
  return FALSE;
 }
 //保存必要的信息供驅動程序其他部分使用
 PTESTUSBINFO pDrv = (PTESTUSBINFO)LocalAlloc (LPTR, sizeof (PTESTUSBINFO));
 pDrv->dwSize = sizeof (DRVCONTEXT);
 pDrv->hDevice = hDevice;
 pDrv->lpUsbFuncs = lpUsbFuncs;
 pDrv->lpInterface = lpInterface;
 //激活流驅動
 pDrv->hStreamDevice = ActivateDevice (L"Drivers\\USB\\ClientDrivers\\USBTest", (DWORD)pDrv);
 if (pDrv->hStreamDevice) {
  //注冊回調函數(shù)
  (*lpUsbFuncs->lpRegisterNotificationRoutine)(
   hDevice,
   USBDeviceNotifications,
   pDrv);
 } else {
  RETAILMSG(1, (TEXT("Can't activate stream device! rc=%d\r\n"), GetLastError()));
  LocalFree(pDrv);
  return FALSE;
 }
 //驅動可以操作該設備
 *fAcceptControl = TRUE;
 return TRUE;
}

    至此,USB Host端設備驅動程序所必須實現(xiàn)的功能都已經(jīng)實現(xiàn)。并且和流驅動相連接。應用程序已經(jīng)可以使用流驅動的接口來操作USB設備了。
]]>
基于WinCE6.0的LPC3250串口驅動程序開發(fā)http://www.022-oo.cn/bbs/dispbbs.asp?BoardID=36&ID=1814&Page=1wangxinxin2010-11-26 10:34:15串口的Active注冊表鍵為依據(jù)查出物理中斷號,并保存在 DDKISRINFO結構體的dwlrq成員中。KernelloCon-trol函數(shù)將物理中斷號轉換為邏輯中斷號,符合條件就將邏輯中斷號回寫到注冊表中。相關代碼如下:

圖片點擊可在新窗口打開查看

  接著調用父類CPdd16550的Init函數(shù),創(chuàng)建中斷服務線程(IST)事件,并通過InterruptInitialize函數(shù)將事件與邏輯中斷號關聯(lián)起來,最后調用CreateHardwareAccess和MapHardware函數(shù)將串口基地址及相關寄存器片內地址映射到內核進程的虛擬地址。

  在MapHardware中,用GetWindowInfo根據(jù)串口的Active注冊表鍵獲得串口的全部I/O端口和內存地址信息,然后用 MmMapIoSpace函數(shù)將串口物理地址和相關控制寄存器地址轉換成內核進程的虛擬地址,以便后面對寄存器進行操作,部分代碼如下:

圖片點擊可在新窗口打開查看

  CreateHardwareAccess函數(shù)根據(jù)MapHardware得到的m_pBaseAddress,構造一個CRegLPC32xx類實例,然后調用CRegLPC32xx類的Init函數(shù)確保串口控制器硬件進入穩(wěn)定的工作狀態(tài)。

  根據(jù)LPC3250的數(shù)據(jù)手冊,設置標準UART的波特率需要設置小數(shù)波特率預分頻器和UART波特率發(fā)生器。當不用小數(shù)波特率預分頻器(即X=Y=1) 時,將標準UART的{Baudrate,DLM:DLL}的值定義一個數(shù)組BaudPairs[]。GetDivisorOfRate根據(jù)這個數(shù)組得到分頻系數(shù),然后調用父類的成員函數(shù)SetBaudRate便可設置波特率。高速UART的波特率類似,只是波特率計算公式和分頻系數(shù)與標準UART不同。

  用GetWaterMark得到接收器FIFO的觸發(fā)深度,分別為16、32、48和60位,然后在CPdd16550的InitReceive中設置FIFO控制寄存器,默認的FIFO觸發(fā)深度是32位。

  Clpc32xxPdd16550UART是個抽象類,實現(xiàn)通用功能,具體的要分別由繼承的標準串口Clpc32xxPdd16550Stan- dardUART類和高速串口Clpc32xxPdd16550HighUART類實現(xiàn)。在各自初始化時,主要是配置各種寄存器,實現(xiàn)具體硬件差異化,包括:配置UART時鐘控制寄存器、時鐘模式寄存器和時鐘選擇寄存器,分別使能UART時鐘、設置自動時鐘模式、選擇相應的時鐘源作為分頻器的輸入時鐘;禁止UART3 Modem和UART6 IrDA功能;禁止UART的回送功能。

  特別要強調的是關于中斷的處理,串口驅動中斷可以用動態(tài)映射,也可以用靜態(tài)映射。在OEMInter-ruptHandler、 Clpc32xxPdd16550UART::Init、CPdd16550::Init、CPdd16550::ThreadRun等處加入調試打印信息,可以較快地找到問題所在,確定硬件中斷是否映射為系統(tǒng)中斷、系統(tǒng)中斷與中斷事件是否綁定、中斷產(chǎn)生時是否進入相應的處理程序。中斷處理好了,串口驅動就基本完成了。

  上述工作結束后,就要添加串口的注冊表。以串口3為例,主要是設置動態(tài)鏈接庫DLL、設備基地址、中斷號、前綴名、被加載的順序等。根據(jù)注冊表的 DeviceArrayIn-dex、CreateSerialObject就可以構造標準串口或高速串口類實例了, DeleteSerialObject在退出驅動時刪除實例。具體代碼如下:

圖片點擊可在新窗口打開查看

圖片點擊可在新窗口打開查看

圖片點擊可在新窗口打開查看

  在廣州致遠電子有限公司的SmartARM3250開發(fā)板上,通過WinCE的串口應用程序與上位PC機進行發(fā)送接收實驗,本驅動已經(jīng)實現(xiàn)標準串口最高460 800 b/s、高速串口最高921 600 b/s的穩(wěn)定傳輸。

  結 語

  本文介紹了WinCE6.0下的串口驅動模型,結合LPC3250的硬件情況,詳細說明了串口驅動開發(fā)過程,包括配置串口相關的寄存器和處理中斷中重要函數(shù)的實現(xiàn),以及注冊表和Source文件編寫等。本驅動程序在廣州致遠電子有限公司的SmartARM3250開發(fā)板上實驗成功。在串口驅動開發(fā)中所用的思路,對其他類似的驅動設計有較高的參考價值。

 
]]>
主站蜘蛛池模板: 爆乳熟妇一区二区三区霸乳 | 五月天婷婷在线视频精品播放 | 亚洲日韩乱码中文无码蜜桃 | 国模冰莲极品自慰人体 | 色婷婷狠狠五月综合天色拍 | 国精产品一区一区三区 | 欧美人妻日韩精品 | 揄拍成人国产精品视频 | 欧洲美女tickling免费网站 | 特级毛片在线大全免费播放 | 久久久亚洲欧洲日产国码aⅴ | 久热久草 | 国产成人一区二区三区免费视频 | 亚洲大色堂人在线视频 | 免费国产a国产片高清 | 欧美三级日韩 | 久热爱精品视频在线◇ | 亚洲精品偷拍无码不卡av | 一二三四社区在线中文视频 | 中国亚洲呦女专区 | 少妇被粗大的猛烈进出69影院一 | 日韩人妻少妇一区二区三区 | 超碰尤物 | 国产亚洲欧洲av综合一区二区三区 | 日日网站 | 成熟妇女性成熟满足视频 | 黄色大片毛片 | 久久国产精品视频 | 黄a大片av永久免费 亚洲裸男gv网站 | 成人在线免费小视频 | 瑟瑟五月天 | 啪啪福利社 | 国产美女在线播放 | 国产乱子伦精品视频 | 91黑人巨炮vs亚裔美女 | 五月婷中文字幕 | 日本高清在线中字视频 | 免费刺激性视频大片区 | 99久久免费国产精品四虎 | 成人精品视频一区二区三区尤物 | 红桃视频国产精品 | 午夜影院官网 | 日韩亚洲欧美久久久www综合 | 亚洲欧美强伦一区二区 | 日韩在线视频线视频免费网站 | 久久人人添人人爽添人人88v | 手机在线一区 | 久久视频免费在线观看 | 少妇真实高潮叫床声 | 99视频| 久久久久女人精品毛片九一韩国 | 五月天看片 | 人人鲁人人莫一区二区三区 | 高清无码午夜福利在线观看 | 亚洲日本影院 | 久久久久久久久久久久91 | 日本一道人妻无码一区在线 | 久久久人人人婷婷色东京热 | 福利视频一区二区 | 新婚之夜玷污岳丰满少妇在线观看 | 伊人干综合 | 亚洲熟妇色自偷自拍另类 | 中文字幕在线观看亚洲 | 九九九精品成人免费视频 | 无码专区亚洲综合另类 | 天天爽天天干 | 国产精品区在线观看 | 日韩在线观看高清 | 亚洲国产成人久久三区 | 国产高清视频在线观看97 | 国产在线欧美日韩 | 久久www免费人成看片高清 | 精品国产黑色丝袜高跟鞋 | 4hu4hu四虎www最新地址884aa | 四虎最新地域 | 成人av在线一区二区三区 | 男人打飞出精视频无码 | 久久黄网站 | 国产在线观看www鲁啊鲁免费 | av一区二区三区四区 | 午夜999| 一本一道久久a久久精品综合蜜臀 | 丰满少妇被猛男猛烈进入久久 | 好爽又高潮了毛片免费下载 | 国产成人精品久久二区二区 | 久久人人爽人人爽人人片av不 | 91精品视频一区二区三区 | 无码精品国产一区二区三区免费 | 亚洲另类激情综合偷自拍图片 | 国产亚洲精品成人aa片 | 女人扒开屁股爽桶30分钟 | 亚洲多毛妓女毛茸茸的 | 亚洲欧美日韩综合久久久久久 | 久久99精品这里精品6 | 成在线人av免费无码高潮喷水 | 饭岛爱av片在线播放 | 日日擼夜夜擼 | 亚洲人成在线免费观看 | 国产成人综合野草 | 伊人激情影院 | 亚洲系列中文字幕 | 一本a道新久 | 成人免费精品 | 深夜福利av | 国产精品亚洲精品一区二区三区 | 国产婷婷成人久久av免费高清 | 少妇人妻系列无码专区视频 | 夜夜操网| 免免费国产aaaaa片 | 少妇性i交大片免费 | 99热在线观看免费 | 欧美va天堂在线电影 | 精品成人一区二区三区四区 | 四虎永久在线高清国产精品 | 亚洲综合第一区 | 18禁美女裸身无遮挡免费网站 | 国产精品亚洲精品日韩己满十八小 | 国产精品尤物视频 | 欧美一区二区三区四区在线观看 | 久久七| 四虎精品 在线 成人 影院 | 在线 | 麻豆国产传媒61国产免费 | 国产青草视频在线观看 | 中文字幕在线观看视频网站 | 在线日韩一区二区 | 无码人妻精品一区二区三区下载 | 中文字幕人妻无码一区二区三区 | 中文中幕a在线 | 欧美黑人又大又粗xxxxx | 超碰97人人做人人爱少妇 | 久久综合激情 | 污网站在线观看免费 | 成人网色 | 爱色视频| 性一交一乱一乱视频 | 美国伊人网 | 日本丰满毛茸茸熟妇 | 亚洲伦理一区 | 欧美日韩一区二区三区四区五区 | videos成人吃奶水 | 欧美国产日韩在线 | 大屁股大乳丰满人妻 | 国产亚洲久久久久久久 | 毛片大全 | 欧美国产日本高清不卡 | 老女人x88av导航 | 国产香蕉97碰碰久久人人 | 91你懂得 | 国产热re99久久6国产精品首页 | 亚洲人成网站在线播放无码 | 婷婷综合av | 久久精品国产只有精品66 | av第下页 | 欧美精品第20页 | 19禁无遮挡啪啪无码网站 | 国产精品1688网站 | 毛片24种姿势无遮无拦 | 亚洲日本色 | 大胸少妇裸体无遮挡啪啪 | 欧美视频一区二区在线 | 亚洲精品色午夜无码专区日韩 | 国产欧美一区二区三区久久人妖 | 国产91热爆ts人妖系列 | 少妇性l交大片7724com | 中文字幕人成乱码熟女香港 | 国产精品美女久久久久图片 | www亚洲精品久久久无码 | 性视频网址 | 国产97人人超碰caoprom三级 | 国产视频三区 | 无码吃奶揉捏奶头高潮视频 | 精品乱码一区内射人妻无码 | 精品日韩视频 | 日本欧美精品 | 亚洲影视大全 | 国产丰满人妻一区二区 | 成人做爰9片免费视频 | 国产精品99久久99久久久不卡 | 国产欧美一区二区三区久久人妖 | 亚洲欧洲成人精品香蕉网 | 国产av午夜精品一区二区三区 | 超碰1000| 日日干天天摸 | 久久国产乱子伦精品免费台湾 | 亚洲一区视频在线 | 成人午夜久久 | 九九热av | 伊人久久久久久久久久久久 | 亚洲四区 | 免费无遮挡无码h肉动漫在线观看 | 亚洲精品第一国产综合境外资源 | 牲交欧美兽交欧美 | 亚洲精品一区二区冲田杏梨 | 欧美字幕 | 在线免费看mv的网站入口 | 无遮挡边摸边吃奶边做视频 | 深夜小视频在线观看 | 久久伊人中文字幕 | 古装激情偷乱人伦视频 | 国内自拍亚洲 | 日韩三级久久久 | 性xxxx欧美老妇胖老太性多毛 | 极品少妇被猛的白浆直喷白浆喷水 | 欧美色v | 成人一区二 | 干欧美少妇 | 欧美性一区二区三区 | 亚洲欧美综合中文 | 四虎影视在线观看 | 丰满少妇aaaaaa爰片毛片 | 中文字幕永久免费视频 | 在线观看免费av网 | 欧美国产日韩视频 | 情趣蕾丝内衣少妇啪啪av | 精品国产杨幂在线观看 | 国产夜夜草 | 国产精品s色 | 麻豆中出 | 无码人妻精一区二区三区 | 久久精品国产久精国产果冻传媒 | 国产三级av在线播放 | 久久亚洲色www成人不卡 | 国产情侣自拍露脸到高潮 | 久久99亚洲精品久久频 | 91色交| 久久综合狠狠综合久久激情 | www国产精品人妻一二三区 | 国产香蕉尹人视频在线 | 久久99精品久久久久久秒播蜜臀 | 97插插 | a天堂在线观看视频 | 丝袜美女啪啪 | 亚洲中文字幕日本无线码 | 18禁超污无遮挡无码免费游戏 | 国产成人无码精品久久久免费 | 啪啪伊人网 | 亚洲 国产 日韩 欧美 | 免费看一级黄色片 | 国产欧美一区二区精品老汉影院 | 欧美日韩国产精品激情在线播放 | av手机网站 | 国产91热爆ts人妖在线 | 中文字幕人成无码人妻综合社区 | 超碰97人人做人人爱网站 | 一本色道久久综合亚州精品蜜桃 | 少妇裸体淫交视频免费观看 | 91免费片 | 国产又爽又黄无码无遮挡在线观看 | 99免费观看| 无码人妻aⅴ一区二区三区 久久天天躁狠狠躁夜夜夜 一级黄色大片网站 | 夜夜6699ww爽爽婷婷 | 91 在线 | 日日碰 | 92精品| 日韩欧美国产aⅴ另类 | 亚洲做受高潮无遮挡 | 国语自产拍91在线a拍拍 | 欧美69wwwcom| 热精品 | 日本不卡视频在线观看 | 国产a国产片国产 | 一本大道东京热无码 | 日本youjizz网站 | a 'v片欧美日韩在线 | 亚洲旡码a∨一区二区三区 国产视频123 | 亚洲另类伦春色综合图片 | 日本一区二区高清 | 天天操天天操天天 | 波多野结衣超清无码专区 | 一道本av在线 | 美女三区 | 国产精品狼人久久久久影院 | 欧美高清视频一区二区 | 肉色丝袜xxxxxxxxxxx | 亚洲色婷婷久久精品av蜜桃久久 | 一个人免费永久观看 | 亚洲成年av天堂动漫网站 | 一级免费看视频 | 天堂一码二码三码四码区乱码 | 美女一级全黄大片 | 国产高潮国产高潮久久久91 | 激情欧美一区二区三区免费看 | 国产一性一交一伦一 | 亚洲第9页 | 国产亚洲精品久久久久久国模美 | 手机在线观看日韩大片 | 美女隐私羞羞视频在线观看 | 国产成人无码a区在线观 | 亚洲在线第一页 | 久久中文字幕免费视频 | 97精品国产97久久久久久春色 | 国产激情久久久久久 | 日韩爆乳一区二区无码 | 亚洲女人被黑人巨大进入 | 国产手机在线αⅴ片无码观看 | 亚洲国产无线乱码在线观看 | 欧美精品亚洲精品日韩专区 | 亚洲欧美成人精品香蕉网 | 成人性生交大片免费看视 | 国产熟女内射oooo | 国精产品一区一区三区mba下载 | 国产精品成人网站 | jizzjizz欧美69巨大 | 99热久久这里只精品国产www | 激情五月六月婷婷 | 色屁屁www影院免费观看入口 | 无码人妻丰满熟妇区五十路 | 亚洲欧美日韩高清 | 在线免费观看av的网站 | 成人影片麻豆国产影片免费观看 | 成 人 网 站 在线 看 免费 | 精品亚洲韩国一区二区三区 | 91亚洲精品国偷拍自产 | 国产精品theporn动漫 | 日本视频免费播放 | 精品免费一区二区三区在 | 人人澡人人澡人人澡 | 欧洲韩国日本黄色录像 | 成人h视频在线 | 97福利在线| av无码av高潮av喷吹免费 | 嫩草研究院在线观看 | 91精品第一页 | 亚洲二新区乱码无人区二 | 日韩国产在线一区 | 午夜精品区 | 久久综合伊人77777麻豆最新章节 | 五月六月丁香婷婷激情 | 国产精品电影一区二区在线播放 | 亚洲精品无码日韩国产不卡av | 亚洲精品久久久一区二区三区 | 欧美视频精品在线 | 国内精品久久久久影院日本 | 夜夜爽夜夜叫夜夜高潮漏水 | 97成人精品国语自产拍 | 亚洲精品久久久艾草网 | 成人免费crm一区二区 | 无码精品人妻一区二区三区人妻斩 | 亚洲色成人www永久网站 | 中文乱码字幕高清一区二区 | www无套内射高清免费 | av影院在线播放 | 激情综合色综合啪啪五月 | 成年人视频免费网站 | 亚洲鲁鲁 | av免费无码天堂在线 | 99久久99久久精品国产片 | 在线超碰av | av无码电影一区二区三区 | 在线日韩中文字幕 | 日韩3p | 日本少妇的性生活 | 国内少妇高清露脸精品视频 | 日本熟妇人妻xxxx | 日韩av男人的天堂 | 一曲二曲三曲在线观看中文字幕动漫 | 黑人爱爱视频 | 3级黄色片 | 精品国产精品久久一区免费式 | 日本不卡一区二区三区视频 | 欧美一级黄视频 | 日韩国产91 | 人妻av中文字幕一区二区三区 | 欧美性video高清精品 | 亚洲第二色 | 亚洲色欲色欲www | 国产精品毛片大码女人 | 中文字幕欧美日韩精品 | 97国产精华最好的产品亚洲 | 久久久久久亚洲精品不卡 | 欧美又黑又粗 | 91高跟紫色丝袜呻吟在线观看 | 欧美乱轮视频 | 欧美六九视频 | 干中文字幕 | 波多野结衣一区二区免费视频 | 亚裔大战黑人老外av | 日本精品一区 | 91看片在线免费观看 | 亚洲精品无码日韩国产不卡av | 在线综合亚洲欧洲综合网站 | 久久久久人妻啪啪一区二区 | 成人嫩草研究院久久久精品 | 97碰碰碰 | 动漫av一区二区三区 | 91亚洲乱码卡一卡二卡新区豆 | 久久综合精品国产一区二区三区无 | 9色视频在线观看 | 成人爽a毛片在线视频淮北 美女私密免费网站 | www.毛片com | 97色伦97色伦国产 | 毛片影视av | 中文字幕乱码中文乱码777 | 免费又色又爽又黄的舒服软件 | 天堂素人 | 日日摸夜夜添夜夜无码区 | 白浆一区二区 | 久草在线香蕉 | 色狠狠色噜噜av一区 | 天天狠狠色综合图片区 | 91在线看片| 国产乱码卡二卡三卡4 | 99九九99九九九99九他书对 | 国产日产欧产精品精品app | 欧美影院一区二区 | 亚洲va欧美va人人爽午夜 | 国产成人午夜福利在线观看视频 | 国产一区二区三区在线 | 亚洲日韩av一区二区三区四区 | 巨乳在线观看视频 | 国产一区二区免费在线观看 | 亚洲无av在线中文字幕 | 国产成人久久精品77777综合 | 尤物视频在线看 | 激情五月av久久久久久久 | 熟妇人妻系列aⅴ无码专区友真希 | 国产精品_九九99久久精品 | 免费又大粗又爽又黄少妇毛片 | 性生交大片免费密桃成熟时 | 欧美一级搡bbbb搡bbbb | 欧美日韩黄色一级片 | 亚洲欧美在线视频免费 | 久久精91久久88香蕉国产 | 偷拍60岁老妇bbbb | 午夜三级a三级三点在线观看 | 久久精品九九亚洲精品 | 欧美人与禽性性生活 | 精品国产乱码久久久久久下载 | 岛国av毛片 | 欧产日产国产精品三级 | 亚洲人屁股眼子交1 | 国产69精品久久久久777糖心 | 人妻护士在线波多野结衣 | 国产成人无码a区在线观 | 久久99热精品免费观看 | 久久久一二三 | 五月天激情婷婷婷久久 | 国产一区二区三区四区hd | 成人精品aaaa网站 | 91亚洲国产成人精品一区 | 久草热视频在线观看 | 国产gv猛男gv无码男同网站 | 日韩最新在线 | 精品国产精品三级精品av网址 | 18美女裸体免费观看网站 | 强伦姧人妻免费无码电影 | 大肉大捧一进一出好爽视频 | 成人国产一区二区精品 | 人人莫人人擦人人看 | 97色在线 | 国产系列第一页 | 永久免费看mv网站入口亚洲 | 成人区人妻精品一区二区三区 | 国产性高爱潮有声视频免费 | www.91麻豆 | 亚洲欧洲日本无在线码 | 欧洲精品码一区二区三区免费看 | 欧美啪啪小视频 | 欧美成人天堂 | 国产精品久久久久影院色 | 日韩视频一区尤物少妇偷拍 | 99re6在线观看国产精品 | 四虎影城| 亚洲欧美另类久久久精品2019 | 久久人人超碰精品caoporen | av永久免费网站在线观看 | 97久久精品人人澡人人爽 | 国产欧美现场va另类 | 国产精品久久久久久久久久久痴汉 | 日本一区精品 | 国产做a爰片久久毛片a片白丝 | 综合无码一区二区三区四区五区 | 美女的胸免费网站 | 小男生小嫩茎网站在线观看 | 国产成_人_综合_亚洲_国产绿巨人 | 少妇性荡欲午夜性开放视频剧场 | 天干夜啦天干天干国产免费 | www.97av| 欧美乱人伦视频在线 | 福利视频亚洲 | 五月激激激综合网亚洲 | 日韩一二三区在线 | 亚洲国产成人熟透妇女 | 欧洲精品在线观看 | 嫩草影院你懂的 | 麻豆国产成人av在线播放 | 最新欧美激情-推荐欧美激情 - 右手影院 | 成人精品一区日本无码网站 | 欧美精品成人久久 | 色丁香婷婷综合久久 | 人摸人人人澡人人超碰97 | 91亚色| 装睡被陌生人摸出水好爽 | 成人黄色短篇小说 | 亚洲精品永久在线 | 最新亚洲国产手机在线 | 成熟女人牲交片免费观看视频 | 国产精品久久久久久久9999 | 久久精品视频久久 | 黄色尤物视频 | 大乳女喂男人吃奶视频 | 国产精品va尤物在线观看蜜芽 | 91精品免费视频 | 国产玖玖在线 | 亚洲综合精品一区二区三区 | 第一福利网| 自慰无码一区二区三区 | 久久精品国产99国产精品最新 | 国产精品欧美久久久久久日木一道 | 亚洲国产精品激情在线观看 | 日韩在线视频播放 | 综合激情丁香久久狠狠 | 亚洲人成色4444在线观看 | 亚洲中文字幕人成影院 | 亚洲男人av天堂午夜在 | 手机看片亚洲 | 啪啪网址| 奇米影音先锋 | 亚洲国产成人久久一区二区三区 | 欧美日韩亚洲国内综合网38c38 | 亚洲综合色婷婷在线观看 | 国产黑色丝袜在线观看下 | 97日日碰人人模人人澡 | 富婆按摩av国产hd | 亚洲国产日韩欧美 | 国厂精品114福利电影免费 | 粗大黑人巨精大战欧美成人 | 蜜臀久久99精品久久久无需会员 | 中文字幕无码不卡免费视频 | 亚洲综合天堂av网站在线观看 | 成人性视频免费看 | www,四虎 | 久久精品国产精品青草 | 99精品视频在线免费观看 | 亚洲免费精品网站 | 亚洲中文久久精品无码99 | 欧美大片免费观看在线观看网站推荐 | 日本黄色性视频 | 欧美性猛交7777777 | 日韩精品1 | 国产免费爽爽视频在线观看 | 一级草逼片 | 能直接看的av网站 | 狠狠干在线观看 | 四虎av | 蜜臀av亚洲一区二区 | 亚洲精品视频播放 | 粗大黑人巨茎大战欧美成人免费看 | 天堂无码人妻精品av一区 | 成人在线三级 | 日韩乱码人妻无码中文字幕 | 蜜桃狠狠色伊人亚洲综合网站 | 九九国产 | 国产精品丝袜久久久久久不卡 | play在线海量a v视频播放 | 亚洲综合五月天 | 无码av免费一区二区三区四区 | 亚洲精品国产一区二区图片 | 久久人妻国产精品 | 美女高潮黄又色高清视频免费 | 噜噜噜网站 | 亚洲欧美日本久久综合网站点击 | 亚洲 自拍 色综合图区av网站 | 国产成人一区二区三区app | 国产欧美一区二区精品性 | 日本怡红院视频www色 | 涩涩免费 | 青娱乐极品视觉盛宴av | 国产精品丝袜一区二区三区 | 超碰影音 | 免费人成网站视频在线观看 | 久久综合资源 | 加勒比av中文字幕 | 91在线网站| 午夜亚洲www湿好大 日本不卡一二区 | 国产探花在线观看 | 午夜九九 | 大伊香蕉在线精品视频75 | 亚洲 综合 欧美 动漫 丝袜 | 一本大道a69 | 干在线视频 | 18禁黄污无遮挡无码网站 | 免费一级特黄特色毛片久久看 | 99久久国产综合精麻豆 | 色五月丁香五月综合五月亚洲 | 欧美你懂得 | 国产日韩在线欧美视频 | 国产精品剧情对白无套在线观看 | 色屁屁xxxxⅹ在线视频 | 男女黄色毛片 | 国产小视频在线观看免费 | 女人被狂躁到高潮视频免费软件 | 欧美一级爽 | r级无码视频在线观看 | 国产又粗又爽又黄的视频 | 天天操妹子 | 在线αv| www国产亚洲精品久久久 | 国产a精彩视频精品视频下载 | 波多野结衣一区二区三区av高清 | 亚洲不卡免费视频 | 亚洲国产天堂av | 国产精品成人av片免费看最爱 | 国产精品一区二区av在线观看 | 午夜亚洲天堂 | 日韩一区二区三区免费高清 | 久久精品免视看国产成人明星 | 国产在线精品一区二区三区 | 新天堂网 | 看全色黄大色黄大片大学生 | 久久人人爽人人爽人人片av超碰 | 91久久久久久波多野高潮 | 国产成人短视频在线观看 | 97欧美一乱一性一交一视频 | 黄色网免费观看 | 国产91丝袜在线播放 | 国产欧美日韩久久久久 | 欧美成人三级视频 | 久久精品国产72国产精 | 日日操夜夜撸 | 成人亚洲精品久久久久软件 | 熟妇玩小男视频在线 | 久久欧美一区二区三区性生奴 | 伊人黄色片 | 国产成人精品亚洲日本语言 | zzijzzij亚洲日本成熟少妇 | 一区不卡在线观看 | 久久人人爽人人爽人人片av不 | 精品视频一区二区在线观看 | 国产麻豆精品一区 | 亚洲欧洲日韩欧美网站 | 亚洲香蕉网久久综合影视 | 青草综合一区二区三区 | 99久久成人精品国产网站 | 大胆欧美熟妇xxbbwwbw高潮了 | 老湿机香蕉久久久久久 | 99v久久综合狠狠综合久久 | 男人边吃奶边做呻吟免费视频 | 久久99九九精品久久久久齐齐 | 欧美性猛交aaaa片黑人 | 一区二区三区不卡视频 | 国产九一视频在线观看 | 无码人妻丰满熟妇啪啪7774 | 欧美自拍偷拍第一页 | 天天躁日日躁狠躁欧美 | 成人性生交大片勉费4 | 亚洲精品专区在线观看 | 一级性视频 | 99久久久无码国产精品秋霞网 | 中文字幕人妻中文 | 日韩精品一区在线播放 | 四虎影视av| 欧美 偷窥 清纯 综合图区 | 44444kk在线观看免费一级 | 一级黄色在线播放 | www.久久视频| 欧美丝袜一区二区三区 | 亚洲毛片无码专区亚洲a片 午夜精品亚洲一区二区三区嫩草 | 欧美一级爆毛片 | 狠狠躁夜夜躁人人躁婷婷视频 | 国产精品久久久久久久久久久久午衣片 | 国产乱xxⅹxx国语对白 | 成人性生交大片免费看r男欢女爱 | 日韩性xx | 久久人人看| av无码av不卡一区二区 | 色综合中文综合网 | 亚洲区色欧美另类图片 | 国产日韩av在线 | 欧洲免费无码视频在线 | 日本视频免费高清一本18 | 黄色毛片黄色毛片 | 亚洲aⅴ无码专区在线观看春色 | 伊人网视频| 日本三级网站在线 | 国产午夜福利片 | 久久精品视频1 | 国产精品无码一区二区三区 | 精品人妻少妇一区二区三区 | 男女啪啪猛烈无遮挡猛进猛出 | 另类亚洲欧美精品久久 | 久久久久久九九精品久 | 亚洲日本精品国产第一区二区 | 麻豆av导航 | 色8激情欧美成人久久综合电影 | 日本在线观看a | 久久天天躁夜夜躁狠狠85 | 日本一区二区高清 | 中文字幕+乱码+中文字幕一区 | 成年人av网站 | 国产成人综合在线视频 | 国产美女永久免费无遮挡 | 欧美亚州国产 | 污网址在线 | 天堂网在线最新版www资源网 | 日本淫少妇 | 蜜臀久久99精品久久久久久做爰 | 377p日本欧洲亚洲大胆张筱雨 | 玩丰满熟妇xxxx视频 | 国产成人在线免费观看视频 | 这里只有精品久久 | 欧美性狂猛xxxⅹxx吞精 | 国产美女精品中文网蜜芽宝贝 | 洗澡被公强奷30分钟视频 | 精品日产一卡2卡三卡4卡自拍 | 国产精品视频一区二区三区无码 | 欧洲美色妇ⅹxxxxx欧美 | 97久久国产 | 秋霞影院午夜伦 | 九九99九九精彩3 | 插插射啊爱视频日a级 | 色噜噜狠狼综合在线 | 国产一区成人在线 | 国产无吗一区二区三区在线欢 | 91精品久久久久久久久中文字幕 | 一区精品在线 | 99久久久国产精品免费无卡顿 | 草草草在线 | 国产高清视频在线 | 国产女人高潮抽搐喷水免费视频 | 欧色av | 久久99精品福利久久久久久 | 香港三级午夜理论三级 | 夜夜狠狠干 | 久久精品国产综合 | 亚洲欧美一二三区 | 男人激烈吮乳吃奶视频免费 | 色婷婷五月在线精品视频 | 国内av自拍 | 男人边吃奶边做好爽免费视频 | 在线看片国产 | 日产国产亚洲 | 国农村精品国产自线拍 | 大伊香蕉在线精品视频75 | 精品国产精品国产偷麻豆 | 国产成人亚洲精品无码电影 | 国产精品无码人妻在线 | 精品一卡2卡3卡4卡新区在线 | 红桃国产视频 | 中文字幕一二三区有限公司 | 在线观看视频免费入口 | 久久久久久天堂 | 老司机一区二区三区 | 国产成人无码午夜福利在线直播 | 91日日拍夜夜嗷嗷叫国产 | 亚洲一区二区三区香蕉 | 婷婷六月综合 | 欧美一区二区三区免费观看 | 激情婷婷网 | 狠狠色狠狠色88综合日日91 | 久久久久成人免费看a含羞草久色 | 国产精品海角社区在线观看 | 久久免费国产视频 | 国产66页 | 亚欧美日韩香蕉在线播放视频 | 国产精品嫩草影院入口日本一区二 | 天天操妹子| 97国产香蕉 | av噜噜噜| 日本午夜免费福利视频 | 风流少妇按摩来高潮 | 少妇极品熟妇人妻200片 | jizz在线观看视频 | 亚洲人成网站18禁止一区 | 国产欧美日韩综合在线成 | 久久网页 | 一区二区激情 | 亚洲国产精品久久艾草纯爱 | 免费看欧美一级片 | 国产精品自在在线午夜免费 | 日本大乳奶做爰洗澡三级 | 四虎影视88aa久久人妻 | 九九免费视频 | 国产suv精二区一片 国产成人黄色av | 亚洲一区二区三区无码久久 | 亚洲人成未满十八禁网站 | 国产清纯在线 | 国产三级自拍视频 | 免费一级黄色毛片 | 女人脱了内裤趴开腿让男躁 | 久久ク成人精品中文字幕 | 国产精品内射视频免费 | 国产八十老太另类视频 | 久久性生活视频 | wwwxxx国产| 久久久久久国产 | 婷婷国产在线 | 欧美黄色小视频 | 日韩欧美一区二区在线视频 | 国产精品高潮露脸在线观看 | аⅴ资源天堂资源库在线 | 日韩精品不卡在线 | 亚洲欧洲无码一区二区三区 | 国内精品国内精品自线一二三区 | 亚洲精品无码少妇30p | 国产成人亚洲日韩欧美久久 | 亚洲国产日韩成人a在线欧美 | 麻豆国产成人av高清在线 | 人妻熟妇乱又伦精品视频无广告 | 色中文字幕 | 亚洲天堂av线 | av大片在线 | 日韩不卡1卡2卡三卡2021免费 | 国产情侣作爱视频免费观看 | 精品国产三级a∨在线欧美 奇米欧美 | 华人在线亚洲欧美精品 | 一本色道久久亚洲精品加勒比 | 香港三日本三级少妇三99 | 欧洲精品一区二区三区久久 | 黄色小视频免费观看 | 国模大尺度啪啪 | 亚洲成_人网站图片 | 在线观看免费日本 | 欧美性大战久久久久久久蜜桃 | 国产av永久无码精品网站 | 国产在线精品观看免费观看 | 欧美精品观看 | 久久996re热这里有精品 | 欧美最黄视频 | 性生交大片免费全毛片 | 性无码专区一色吊丝中文字幕 | 欧美久久综合 | 欧美日韩中文字幕视频 | 99在线视频免费观看 | 久久caoporn国产免费相关 | 国产精口品美女乱子伦高潮 | 亚洲 欧洲 综合 另类小说 | 国产精品污www在线观看17c | 亚洲中文av一区二区三区 | 午夜福利一区二区三区在线观看 | 动漫精品中文无码通动漫 | 天天躁日日躁狠狠躁精品推荐 | 国产福利免费在线 | 午夜视频www | 亚洲欧洲成人精品av97 | 国产又色又爽又黄的 | 久久久久亚洲精品成人网 | 日韩久久精品一区 | 色视频综合无码一区二区三区 | 天堂中文在线观看视频 | 视频精品一区 | 狠狠亚洲婷婷综合色香五月排名 | 奶水喷溅 在线播放 | 婷婷丁香在线 | 在线亚洲精品国产二区图片欧美 | 奇米影视第四色888 青草青草久热精品视频国产4 | 玩弄丰满少妇人妻视频 | 成 人 黄 色 视频免费播放 | 人人玩人人添人人澡欧美 | 无遮无挡爽爽免费视频 | 老司机在线观看视频 | 免费福利视频一区二区三区高清 | 欧美 日本 国产 在线a∨观看 | 国产视频观看 | 国产三级不卡 | 日日摸夜夜爽无码毛片精选 | 国产97成人亚洲综合在线 | 护士的奶头又大又白又好摸 | 久久久一区二区三区四区 | 天干天干啦夜天干天天爽 | 中文字幕一区二区三区在线播放 | 77久久| 午夜免费福利视频 | 成人一区二区在线观看视频 | 东京热人妻一区二区三区 | 四虎国产精品永久在线国在线 | 久久精品麻豆日日躁夜夜躁妓女 | 亚洲精品网页 | 天天操夜夜操狠狠操 | 国产9色在线 | 日韩 | 精品视频在线观自拍自拍 | 欧美整片第一页 | 免费人成激情视频在线观看冫 | 四十五十老熟妇乱孑视频 | 国产成人美女视频网站 | 国产精品 精品国内自产拍 伊人影院久久 | 精品国产一卡2卡3卡4卡新区 | 日韩色黄大片 | 蜜桃tv一区二区三区 | 日韩福利在线视频 | 看国产一级片 | 狠狠88综合久久久久综合网 | 久久国产福利一区二区 | 精品国产九九 | 国内精品人妻无码久久久影院导航 | 国产又色又爽又黄刺激视频 | 在阳台上玩弄人妻的乳球 | 中文字幕11 | 国产一级视频免费观看 | 久久亚洲欧美国产精品 | 久久天堂av女色优精品 | 天天干天天干天天干 | 女主被强啪的动漫视频 | 97超碰福利 | 久久中文字幕人妻熟女 | 免费观看在线a毛片 | 成人性做爰aaa片免费看不忠 | 久久精品一卡二卡三卡四卡 | 无码免费午夜福利片在线 | 中国老妇淫片bbb | 亚洲精品三区 | 国产精品99精品无码视亚 | 国产精品二区三区 | 国内精品久久久久久无码不卡 | 亚洲欧美另类激情 | 国产不卡在线视频 | 免费av一级 | 夜夜春很很躁夜夜躁 | 欧美日韩一区二区三区视频免费观看 | 成年网站在线观看 | av无码免费岛国动作片片段欣赏网 | 99e热久久免费精品首页 | 免费a级毛片18以上观看精品 | 99国产揄拍国产精品人妻 | 日本网站一区 | 97在线精品视频免费 | 欧美老妇与zozozo交 | 欧美一区二区三区喷汁尤物 | 免费日韩一区二区 | 国产免费久久精品99re丫丫 | 亚洲男男网站gy2020 | 欧美日韩视频在线播放 | 一级黄色a毛片 | 久久精品一区二区三 | 欧美男生射精高潮视频网站 | 在线免费观看日本 | 亚洲国产精品国自产拍av | 亚洲另类伦春色综合妖色成人网 | 91亚洲精品久久久蜜桃网站 | av高清一区 | 日本精品一区二区三区在线播放视频 | 亚洲色图少妇 | 中文字幕二区丶 | 熟妇人妻无乱码中文字幕 | 久久日本片精品aaaaa国产 | 一本大道一卡2卡三卡4卡国产 | 亚洲第一二三四区 | 色国产在线 | 亚洲国产欧美中文丝袜日韩 | 国产亚洲精品久久久久丝瓜 | 在线观看视频99 | 女人爽到高潮潮喷18禁网站 | 日本婷婷免费久久毛片 | 欧美激情亚洲色图 | 亚洲精品理论电影在线观看 | 国产美女视频免费观看的网站 | 欧美激情亚洲综合 | 伊人久久青青 | 大陆极品少妇内射aaaaa | 欧美日韩国产激情一区 | 泽村玲子在线观看 | 日韩精品无码一区二区 | 辽宁熟女高潮狂叫视频 | 蜜桃无码一区二区三区 | 久久久亚洲国产美女国产盗摄 | 欧美性午夜视频观看 | 加藤あやのav免费观看 | 中文字幕日韩欧美 | 成人97视频一区二区 | 黄色天堂网站 | 国产www性 | 亚洲成人动漫在线观看 | www.av日韩 | 一道本在线伊人蕉无码 | 日本护士╳╳╳hd少妇 | 色五月丁香五月综合五月4438 | 亚洲激情偷拍 | 欧美日本道 | 人人妻人人做人人爽 | 精品久久久久久久久午夜福利 | 国产成人av免费看 | 国语自产拍在线视频中文 | 日韩免费在线看 | 豆国产97在线 | 亚洲 | 色综合久 | 一区二区精品区 | www.国产99| 欧美日韩国产成人在线 | 日韩精品一卡二卡 | 无码国产精品一区二区免费vr | 一本久道综合在线无码人妻 | 亚洲国产精彩中文乱码av | 亚洲国产成人91精品 | 韩国国内大量揄拍精品视频 | 色综合久久88色综合天天人守婷 | 欧美国产精品一区二区三区 | 中文字幕无码中文字幕有码a | 激情综合激情五月 | 亚洲精品日韩激情欧美 | 香蕉黄色一级片 | 91性高潮久久久久久久久 | 国产在线拍偷自揄拍精品 | 亚洲乱码国产乱码精品精乡村 | 亚洲伊人成人 | 青青免费视频 | 国产av久久人人澡人人爱 | 国产美女mm131爽爽爽免费 | 欧美老妇与禽交 | 人妻夜夜爽天天爽三区麻豆av网站 | 中文字幕第38页 | 在线视频亚洲欧美 | 青青草在线免费视频 | 亚洲精品乱码久久久久久日本蜜臀 | 精品国产杨幂在线观看 | 国产成人av三级在线观看按摩 | 成人在线免费视频观看 | 日韩中文字幕国产 | 日韩成人av在线播放 | 香蕉久久一区二区不卡无毒影院 | 国产色自拍 | 美女100%挤奶水视频吃胸网站 | 久久人人做人人妻人人玩精品hd | 国产成a人亚洲精品无码樱花 | 91精品久久久久久久久不口人 | 久久精品99久久香蕉国产 | 青青青在线视频观看 | 亚洲中文有码字幕青青 | 国产98在线 | 免费 | 国产成人人综合亚洲欧美丁香花 | 国产粉嫩高中无套进入 | 天堂av观看| 欧美黑人粗暴多交高潮水最多 | a男人天堂 | 激情综合激情 | 欧美日韩中文在线字幕视频 | 亚洲日本香蕉视频观看视频 | 强奷乱码中文字幕熟女导航 | 国产精品女上位好爽在线 | 国产又黄又爽胸又大免费视频 | 久久久亚洲欧洲 | 国产成人一区二区三区在线观看 | 国产啊~cao死你个小sao货 | 免费放黄网站在线播放 | 边啃奶头边躁狠狠躁玩爽在水里面 | 亚洲国产成人无码影片在线播放 | 一本在线| 欧美日韩国产三级 | 丰满少妇理论片bd高清 | 天堂资源在线www中文最新偷拍 | 美女av免费观看 | 在线看毛片网站 | www.日本在线播放 | 亚洲色欲或者高潮影院 | 无码人妻精品一区二区三18禁 | 东北少妇不戴套对白第一次 | 无码专区一ⅴa亚洲v专区在线 | 噜噜色综合天天综合网mp3 | 91视频99| 日本少妇久久久 | 三级黄色毛片视频 | 亚洲精品天堂无码中文字幕 | 日韩成人在线看 | 久久久国产片 | 国产乱淫精品一区二区三区毛片 | 男女性行为视频 | 一二三区乱码不卡手机版 | 精品国产乱码久久久久久蜜柚 | 92国产精品午夜福利无毒不卡 | 大陆精大陆国产国语精品 | 国产男女嘿咻视频在线观看 | 天堂中文在线资源库用 | 97se色综合一区二区二区 | 国产13页 | 久久久97丨国产人妻熟女 | 影音先锋无码aⅴ男人资源站 | 最近日韩免费视频 | 隣の若妻さん 波多野结 | 日本精品黄色 | 国产白丝护士av在线网站 | 国产 | 久你欧洲野花视频欧洲1 | 97色干| 特黄特色大片免费播放器 | 日日综合| 九九在线中文字幕无码 | 人人干人人干人人 | 国产亚洲精久久久久久无码 | 黄色资源在线播放 | 国产在线精品无码av不卡顿 | jizzjizz中国精品麻豆 | 一边捏奶头一边高潮视频 | 日日夜夜天天干 | 美日韩一区二区 | 全程露脸3p在线观看91 | 97免费在线观看视频 | 国产午夜性爽视频男人的天堂 | 久久精品网站免费观看 | 国产夜色精品一区二区av | 国产乱码精品一区三上 | 欧美精品一区视频 | 久操影视| av人摸人人人澡人人超碰小说 | 国模吧久久 | 一色综合 | 国产综合福利 | 国产精品成人av电影不卡 | 午夜无码免费福利视频网址 | 国产在线精品视频你懂的 | 久久免费视频在线观看6 | 夜夜夜夜夜猛噜噜噜噜噜gg | 2023av在线| 亚洲欧洲国产精品香蕉网 | 国产精品久久久久久久久久久久午夜 | 波多野结衣50连登视频 | 免费永久看黄在线观看 | 亚洲性在线观看 | 欧美一级视频免费看 | 四虎影视永久无码精品 | 日韩一区二区三区在线播放 | 大胸美女污污污www网站 | 全亚洲最大的免费影院 | 日本人成网站18禁止久久影院 | 亚洲中文有码字幕日本 | 午夜无码区在线观看亚洲 | 欧美影视免费观看 | 免费日韩av| 九九自拍视频 | 麻豆丰满少妇chinese | 色淫av蜜桃臀少妇 | 欧美精品久久久久久久自慰 | www青青草| 国产美女无遮挡网站 | 国产极品美女高潮抽搐免费网站 | 国产精品久久久久久久久久久不卡 | 中国少妇hd | 国产成人精选在线观看不卡 | 国产成人综合久久免费导航 | 99插插 | 日本高清视频色wwwwww色 | 午夜福利不卡在线视频 | 日本妞丰满白嫩ass 欧美国产日韩在线观看成人 | 日韩天天操 | 鲁大师在线视频播放免费观看 | 久久精品国产国产精 | 国产又粗又猛又爽的免费网站 | 久久人人爽人人爽人人片av麻烦 | 国产在线不卡视频免费视频 | 97精品自拍| 国产成人8x人在线视频软件 | a级毛片蜜桃成熟时2免费观看 | 国产黑色丝袜在线观看下 | 亚洲中文在线精品国产百度云 | 国产另类xxxxhd高清 | 91在线观看网站 | 日韩av无码社区一区二区三区 | 强乱中文字幕亚洲精品 | 日韩欧美一区二区三区视频 | 婷婷成人综合激情在线视频播放 | 污网站在线观看免费 | 涩涩屋导航 | 任我爽精品视频在线观看 | 精品免费一区二区 | 台湾佬亚洲 | 伊人久久大香 | 亚洲成人av片 | 99re免费视频国产在线播放 | 五月婷综合网 | 日本aa视频 | 日本的黄色一级片 | 国产亚洲精品久久www | 成人无码一区二区三区网站 | 天海翼一区二区三区高清在线观看 | 欧美色欧美亚洲高清在线视频 | 一区二区三区在线观看亚洲电影 | 国产精品久久久久久久久久三级 | 久久强奷乱码老熟女网站 | 国产精品自在拍首页视频8 亚洲一区二区三区尿失禁 中文在线а√天堂官网 | 中文无码字幕中文有码字幕 | 日韩中文字 | 视色影视 | 少妇又紧又色又爽又刺激视频网站 | 亚洲天堂网av在线 | 看全色黄大色黄大片大学生 | 亚洲欧美日韩在线 | 日韩黄色高清 | 黑人与日本少妇高潮 | 国产成人亚洲综合精品 | 少妇av射精精品蜜桃专区 | 精品国产一区av天美传媒 | 美女福利视频 | 免费人妻无码不卡中文字幕18禁 | 特级a做爰全过程片 | 亚洲精品视频在线看 | 精品人妻少妇嫩草av无码专区 | 中文字幕少妇 | 国产极品一区二区 | 国产精品成年片在线观看 | 天堂资源中文网 | 久久的爱久久久久的快乐 | 欧美精品一区二区黄a片 | 伊人免费网 | 亚洲综合在线播放 | 成人h在线无码精品动漫网站 | 久久合 | 日本乱码一区二区三区芒果 | 日韩 在线 中文 制服一区 | 黑人30厘米少妇高潮全部进入 | 国产亚洲精品一区二三区 | 国产精品乱子伦xxxx裸 | 欧美激情91 | 日韩精品色呦呦 | 亚洲夜夜夜 | av黄在线观看 | 日本乱子伦xxxx | 成人影片在线播放 | 久久久美女视频 | 午夜一级视频 | 99爱精品视频在线观看免费 | 97久久超碰国产精品最新 | 亚洲一区中文字幕永久在线 | 99这里只有精品视频 | 偷自拍亚洲视频在线观看99 | 亚洲女人被黑人巨大进入 | 69xx免费视频 | 国产在线观看黄色 | 国产精品青草久久福利不卡 | 国产精品久久久久久久白丝制服 | 国内成+人 亚洲+欧美+综合在线 | 自拍偷在线精品自拍偷99 | 亚洲色大网站www永久网站 | 国产女人高潮的av毛片 | 免费无码av一区二区三区 | 少妇高潮灌满白浆毛片免费看 | 色情无码www视频无码区澳门 | av青青草| 午夜色影院 | 无码中文字幕乱码一区 | 日韩精品无码久久久久久 | 少妇把腿扒开让我舔18 | 青草久草 | 国产在热线精品视频99公交 | 久久久久久综合网天天 | 四虎国产精品永久在线国在线 | 人成福利视频在线观看 | 好色亚洲 | 亚洲精品久久久久69影院 | 欧美日韩国产专区一区二区 | 美女露出粉嫩小奶头在视频18禁 | 日韩青青草 | aaa人片在线| 青青91| 影音先锋欧美在线 | 一区二区波多野结衣 | 国产男女激情视频 | 韩国中文字幕av | 国产老熟女伦老熟妇露脸 | 天天玩夜夜操 | 亚洲人成网址在线播放 | 欧美日韩一区二区三区视频播放 | 国产美女视频 | 国产一区二区三区四区五区美女 | 欧美成人午夜在线观看视频 | 天堂网一区二区三区 | 亚洲欧美高清在线 | 国产精品三级国产电影 | 亚洲区精品区日韩区综合区 | 精品国精品国产自在久国产不卡 | 亚洲最新版av无码中文字幕 | 国产乱人偷精品人妻a片 | 女久久| 最近中文字幕免费在线观看 | 国产91影院 | 一二三区国产 | 91精品啪| 日韩高清av | 精品厕所偷拍各类美女tp嘘嘘 | 欧美成人免费在线视频 | 亚洲成a人蜜臀av在线播放 | 亚洲综合成人亚洲 | 高清无码不用播放器av | 免费无码黄动漫在线观看 | 国产偷国产偷亚洲清高孕妇 | av片在线观看网站 | 一本大道大臿蕉视频无码 | 久久第四色 | 国产成人无码区免费内射一片色欲 | 欧美激情精品久久久久久大尺度 | 午夜精品久久久久久99热 | 国产成人一区二区精品视频 | 国产毛毛片 | 日韩激情国产 | 91视频1区| 伊人精品久久久久中文字幕 | 久久99国产精品久久99果冻传媒新版本 | 精品视频一二三区 | av伊人久久 | 日韩精品无码一区二区三区不卡 | 精品无码av一区二区三区 | 亚洲中文字幕无码一去台湾 | 国产精品一区二区在线观看99 | 日本一区二区三区免费高清 | 日韩久久在线 | 国产乱码精品一区二区三区四川人 | 久久嫩草av | 久青草国产视频 | 亚洲小视频在线 | 欧美性群另类交 | 日韩一级片免费视频 | 好男人在线社区www在线观看视频 | 国产寡妇色xxⅹ交肉视频 | 中出一区二区 | 亚洲欧美综合精品久久成人网无毒不卡 | 欧美20p | 亚洲熟妇丰满xxxxx | 96av麻豆蜜桃一区二区 | 日韩精品中文字幕av | 中文字幕日韩精品欧美一区蜜桃网 | 女人被狂爆到高潮免费视频 | 性瑜伽xxxtⅴ | 国产女人叫床高潮视频在线观看 | 久久婷婷久久一区二区三区 | 亚欧毛片| 亚洲欧美日韩综合俺去了 | xxxx久久| 日韩手机看片 | 久久精品国产亚洲精品 | 国内精品久久久久久久星辰影视 | 天天综合天天爱天天做 | 在线视频免费观看 | 无套内射无矿码免费看黄 | 日本精品久久久久中文字幕5 | 中文字幕精品久久久久人妻 | 亚洲人成网站日本片 | 国产在沙发上午睡被强 | 免费国产在线视频 | 欧洲做受高潮片 | 狠狠干在线观看 | 91在线免费视频 | 欧美在线视频一区 | 日韩精品免费一区二区三区 | 深夜福利视频免费观看 | 久久精品一区二区三区中文字幕 | 欧美顶级毛片在线播放 | 日韩欧美高清一区 | 免费观看又色又爽又湿的软件 | 激情宗合网 | 情侣av| 大香蕉毛片 | av在线男人天堂 | 日韩一区二区三区无码a片 91插插插影库永久免费 | 在线视频亚洲欧美 | 五月天丁香久久 | 亚洲爆乳精品无码一区二区三区 | 7777少妇色视频免费播放 | 成人亚洲综合 | 巨乳美乳一区二区三区 | 亚洲中文字幕无码爆乳av | 久久亚洲国产精品影院 | 亚洲另类av | 不卡免费在线视频 | 国产福利精品一区二区 | 久久国产一二区 | 国产三区在线成人av | 男女猛烈无遮挡免费视频 | 久草a视频 | 日本在线a一区视频 | 国产明星xxxx精品hd | 亚洲国产精品久久久久婷婷软件 | 777欧美| 性xxxxx欧美老富婆 | 日本丰满熟妇bbxbbxhd | 日韩性色 | 九九综合网 | 男人日女人网站 | 18岁日韩内射颜射午夜久久成人 | 久久香蕉国产线看观看猫咪av | 人妻无码中文字幕永久在线 | 亚洲四区 | 伊人色av| 少妇无码太爽了不卡视频在线看 | h肉动漫无修一区二区无遮av | 天天拍夜夜拍 | 亚洲国产精品va在线播放 | 四虎在线视频 | 久久建筑| 久久九九热 | a天堂最新地址 | 91亚洲乱码卡一卡二卡新区豆瓣 | 乱码一卡2卡3卡4卡精品 | 日本阿v网站在线观看中文 av在线影音 | 娇小xxxx性开放国产精 | 国产在线视频导航 | 青青青在线免费观看 | 无码av无码免费一区二区 | 久久精品成人 | 欧美日韩二三区 | 综合网婷婷 | 免费av福利 | 亚洲午夜久久久久久久久久久 | 亚洲精品图片一区15p | 国产免费久久精品99re丫丫一 | 日本久久丰满的少妇三区 | 国产午夜一级片 | 成人综合区另类小说区 | 伊人久久大香线蕉av不变影院 | 日本一道人妻无码一区在线 | 久久久久99精品成人片 | 学生和学生三级在线看 | 一本久道综合在线无码88 | 天天色综合6 | 无码内射中文字幕岛国片 | 91精品啪在线观看国产手机 | 长腿校花无力呻吟娇喘 | 亚洲国产成人自拍 | 婷婷亚洲久悠悠色悠在线播放 | 中文字幕免费高 | 国产熟妇的荡欲午夜视频 | 亚洲综合色在线观看一区 | 成人有色视频免费观看网址 | 亚洲国产女人aaa毛片在线动漫 | 久久久亚洲成人 | 中文字幕精品亚洲 | 成人三一级一片aaa 国产三级网站在线观看 | 久久久久国色av免费观看性色 | 天天插狠狠干 | 欧美在线视频日韩 | 熟女人妻av五十路六十路 | 国内精品久久久久精免费 | 69久久久久 | 久久6精品 | 中文字幕在线观看不卡 | 国产中文字幕在线视频 | 巨胸不知火舞露双奶头无遮挡 | 综合激情丁香久久狠狠 | 精品高朝久久久久9999 | 成人性生交大片免费看视频app | 国产精品久久久久久久久久综合 | 日本肥老妇色xxxxx日本老妇 | 国产超碰av人人做人人爽 | 未满十八18禁止免费无码网站 | 国产综合色在线视频区 | 国产内射999视频一区 | 大地资源在线观看官网第三页 | 中国女人内射6xxxxx | 桃色av | www.youjizz.com亚洲 | 亚洲专区在线播放 | 亚洲色图17p | 欧美三级在线观看视频 | 伊人久久大香线蕉影院 | 国产高清av在线播放 | 欧美在线播放一区二区 | 日本少妇一区二区三区 | av字幕网 | 午夜精品少妇 | 亚洲ww中文在线 | 久久精品免费看 | 久久精品香蕉绿巨人登场 | 久久精品成人一区二区三区 | 国产精品久久久久蜜芽 | 国产浪潮av性色av小说 | 精品久久久久久亚洲中文字幕 | 毛片视频网站 | 天堂网久久久 | 欧美日韓性视頻在線 | 99久久九九| 就爱啪啪网站 | 国产成人亚洲综合色婷婷秒播 | 日本看片一二三区高清 | 亚洲午夜国产成人av电影 | 色88久久久久高潮综合影院 | 国内精品91 | 成人激情片 | 精品自拍av | 亚洲成色777777女色窝 | 国产成人欧美综合在线影院 | 日日夜夜精品免费观看 | 亚洲精品国产成人99久久6 | 欧美成a| 妇挑战三黑人4p日本中文字幕 | 国产又粗又黄又爽又硬 | 99视频在线 | 少妇饥渴吞精videos | 中文成人精品久久一区 | 又色又爽又黄的视频国内 | 中国中文字幕伦av在线看片 | 亚洲精品一区三区三区在线观看 | 女同亚洲精品一区二区三 | 91免费视频大全 | 国产在线无码视频一区二区三区 | 亚洲黄污| 久久久久久av无码免费看大片 | 97精品人妻一区二区三区香蕉 | 色综合天 | 日韩免费观看完整 | 国产福利一区二区 | 麻豆av导航 | 日本护士吞精囗交gif | 成年无码a√片在线观看 | 热久久视久久精品18 | 久久久久国产精品 | 全部免费毛片在线播放网站 | 久久青青操 | 久久久久免费精品国产小说色大师 | 亚洲国产日本 | 粉嫩av蜜桃av蜜臀av | 婷婷福利| www操操| 国产传媒精品1区2区3区 | 国产熟女出轨做受的叫床声 | 农村+肉+屁股+粗+大+岳小说 | 伊人国产女 | 午夜一区在线 | 亚洲经典视频在线观看 | 香蕉欧美成人精品a∨在线观看 | 国产欧美日韩久久久久 | 国产精品久久久久影院 | 男人天堂网站 | 国产女人高潮嗷嗷嗷叫 | 午夜合集 | 伊人影院中文字幕 | 欧美第七页 | 国产欧美一区二区精品性色超碰 | 日韩av官网 | 欧美精品在线观看一区二区 | 久久精品女人毛片国产 | 黑人干亚洲人 | 亚洲国产精品成人 | 亚洲精品一区国产精品 | 日韩一区二区三区免费高清 | 亚洲免费专区 | 日本黄色的视频 | 日产精品中文一区二区三区 | 成人午夜淫片免费观看 | 精品少妇人妻av免费久久洗澡 | 亚洲美女午夜一区二区亚洲精品 | 日本丰满白嫩大屁股ass | 亚洲国产午夜精品理论片妓女 | 欧美做受视频播放 | www色综合 | 看真人毛片 | 五月天久久久 | 中文字幕av一区中文字幕天堂 | 四虎成人在线 | 久久这里只有精品国产免费10 | 国产亚洲欧美日韩在线观看一区 | 三上悠亚网站在线观看一区二区 | 无码激情亚洲一区 | 一本加勒比hezyo无码资源网 | 人体内射精一区二区三区 | 国产又粗又长又黄又猛 | 亚洲精品性视频 | 国产依人在线 | 中文字幕亚洲欧美日韩在线不卡 | 国产精品久久久久久久久久黑人 | 中字幕久久久人妻熟女 | 久久这里有| 亚洲欧洲日本国产 | 免费国产污网站在线观看15 | av第一福利大全导航 | 在线不卡免费视频 | 边添小泬边狠狠躁视频 | 18禁无遮挡肉动漫在线播放观看 | 97爱亚洲| 成人在线激情网 | 天天干夜夜做 | 欧美黑人性xxx猛交 精品人妻少妇一区二区三区 | 91免费版观看 | 中文字幕+乱码+中文字幕一区 | 亚洲人成网站日本片 | 好男人资源在线社区 | 亚洲ⅴ国产v天堂a无码二区 | 搡老熟女国产 | 一本一道久久精品综合 | 日韩欧美一二 | 国产色秀视频在线播放 | 午夜精品久久久久久99热软件 | 久久久久女人精品毛片九一韩国 | 欧美在线观看一区二区三区 | 欧美成人一区二免费视频小说 | 中文字幕久久波多野结衣av不卡 | 国产一卡2卡三卡4卡 在线观看 | 国产成人精品亚洲日本777 | 日本十八禁视频无遮挡 | 91久久九色| 一本久道高清无码视频 | 亚洲国产精品女同互慰中文 | 午夜成人亚洲理论片在线观看 | 97免费观看视频 | 日日夜夜拍 | 五月综合色 | 国产成人在线免费 | 欧美性高潮| 婷婷五月综合色视频 | 国内精品视频在线观看九九 | 天天综合网天天综合狠狠躁 | 最近中文字幕mv在线资源 | 国产人成高清在线视频99最全资源 | 午夜精品网 | 欧美自拍偷拍第一页 | 亚洲国产精品国自产拍av | 国产免费拔擦拔擦8x高清在线人 | 一区二区三区视频在线观看 | 亚洲一区无| 日韩精品久久久久久久白丝 | 欧美成人一区二区三区在线观看 | 日韩新无码精品毛片 | 久久精品国产精品青草 | 久久国产精品99精国产 | 午夜免费激情视频 | 亚洲另类激情综合偷自拍图片 | 成人综合在线视频 | 内射巨臀欧美在线视频 | 精品国产综合区久久久久久 | 欧美亚洲国产一区二区三区 | 亚洲精品v日韩精品 | 欧美亚洲偷图色综合 | 成 人 网 站 在线 看 免费 | 欧美三级韩国三级日本三斤 | 动漫无遮挡h纯肉亚洲资源大片 | 91成人免费看片 | 乱成熟女人在线视频 | 国产精品欲av | 国产精品嫩草影视久久久 | 中文字幕精品一二三四五六七八 | 春意影院福利社 | 亚洲精品婷婷 | 九九在线中文字幕无码 | 免费无码黄十八禁网站在线观看 | 97视频在线看| 免费无码无遮挡裸体视频在线观看 | 欧美35页视频在线观看 | 欧美一级黄色片视频 | 99精品国产aⅴ | 免费a一级 | 国产日韩欧美综合在线 | 久久精品国产成人午夜福利 | 国产亚洲一区二区手机在线观看 | 狠狠色狠狠色综合久久一 | 深夜精品视频 | 日韩av片无码一区二区三区不卡 | 久久午夜福利无码1000合集 | 二宫光在线播放88av | 亚洲妇熟xxxx妇色黄 | 成人永久免费福利视频免费 | 人妻少妇无码中文幕久久 | 永久免费无码网站在线观看 | 欧美z0zo人禽交欧美人禽交 | 欧美 日韩 一区二区三区 | 国产一区网站 | 黄色激情毛片 | 少妇久久久久久被弄高潮 | 亚洲日韩片无码中文字幕 | 日韩久久色 | 日本少妇又色又爽又高潮 | 最新三级网站 | 久久―日本道色综合久久 | 亚洲综合第一页 | 国产八十老太另类视频 | 国产成人精品日本亚洲999 | jizz大全欧美jizzcom| 夜夜夜夜夜猛噜噜噜噜噜gg | 97精品久久久午夜一区二区三区 | 四虎欧美| 国产黄色在线网站 | 成人午夜sm精品久久久久久久 | 国产99久9在线视频 | 传媒 | 好吊色一区二区三区 | av第一页 | 久久大综合 | 免费日韩成人 | 青青草免费在线观看 | 久久九精品 | 亚洲全黄 | 神马久久av | 久久久亚洲欧洲日产国码是av | 桃花综合久久久久久久久久网 | 日本久色 | 亚洲色图色小说 | 国产清纯在线一区二区vr | 亚洲国产精品成人久久久 | 91宅男噜噜噜66在线观看 | 国产成人免费高清激情视频 | 性无码免费一区二区三区在线 | 国产情侣自拍露脸到高潮 | 九九爱精品视频 | 久久久精品456亚洲影院 | 超碰97人人做人人爱少妇 | 视频一区二区不卡 | 色妞av永久一区二区国产av开 | 嫩草影院污 | 成人国产在线 | 在线看一区二区 | 成人女人免费视频 | 国产精品成人av在线观看 | 国产亚洲精品久久一区二区 | 国内精品免费久久久久软件 | 国产精品对白刺激蜜臀av | 国产在线国偷精品免费看 | 欧美成人精品第一区 | 99热在线观看 | 免费av在线播放 | 一区二区三区在线 | 日本 | 国产欧美va天堂在线观看视频下载 | 欧美性一区二区 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 久久99国产精品久久99小说 | 日韩天堂一区 | 伊人久久大香线焦av综合影院 | 久久久精品国产sm最大网站 | 亚洲欧美日韩自偷自拍 | 精品久久久久久无码中文字幕一区 | 风韵丰满熟妇啪啪区老老熟女百度 | 人妻无码免费一区二区三区 | 亚洲熟女精品中文字幕 | 特级一级黄色片 | 久久影院午夜伦手机不四虎卡 | 精品国产色| 中文字幕av不卡 | 无码国产偷倩在线播放 | 久久精品国产999久久久 | 一区二区三区免费看 | 99久久精品无码一区二区毛片 | 久久99国产综合精品女同 | 欧美日韩视频一区二区三区 | 亚欧在线观看视频 | 亚洲第一极品精品无码久久 | 久久久久久久久99 | 久久久精品免费 | 亚洲欧洲中文日韩久久av乱码 | 91精品国产综合久久香蕉922 | 国产一二三区写真福利视频 | 午夜av导航 | 亚洲欧美日韩国产成人精品影院 | 欧洲美女毛片 | 老熟妇乱子交视频一区 | 精品一卡2卡三卡4卡免费网站 | 色婷婷综合久久久久中文字幕 | 91久久精品人人做人人爽综合 | 亚洲国产另类久久久精品性 | 国产精品久久久久久久久久久久 | 国产66精品久久久久999小说 | 久久久久亚洲精品无码网址 | 菠萝菠萝蜜午夜视频在线播放观看 | 成人一区二区三区视频 | 欧美色偷偷 | 十六以下岁女子毛片免费 | 久久男人av久久久久久男 | 伊人三区| 婷婷六月在线 | 天天艹夜夜 | 欧美大片一区二区 | 日韩a无v码在线播放免费 | 男女性爽大片视频免费看 | 中文字幕色婷婷在线视频 | 国产精品成人在线观看 | 日韩精品欧美精品 | 亚洲www天堂com | 超碰碰碰 | 韩国三级hd中文字幕叫床 | 夜色约爱网站 | 天天干天天天 | 精品高朝久久久久9999 | 欧美精品激情视频 | 国产国语熟妇视频在线观看 | 青青青国产精品国产精品美女 | 丰满少妇被粗大的猛烈进出视频 | 中文字幕一区二区三区不卡 | 国产吞精囗交高潮 | 国产精品国产三级国产密月 | 色诱久久av | 精品一区二区超碰久久久 | 亚洲毛片αv无线播放一区 日本一区二区免费在线 | aa黄色片 | 成人啪啪18免费游戏链接 | 天天干天天色综合网 | 欧美在线观看不卡 | 亚洲女女女同性video | 欧美精品1卡二卡三卡四卡 午夜影院在线免费观看视频 | 一区二区视频免费 | 成人污污www网站免费丝瓜 | 亚洲精品1卡2卡3卡 亚色视频在线观看 | 国产97在线视频 | 欧美精品日韩精品 | 久久r精品国产99久久6不卡 | 国产亚洲精品久久一区二区 | 在线无码午夜福利高潮视频 | 亚洲熟女乱色综合一区小说 | 91极品国产 | 国产精品黄在线观看免费软件 | 久久草在线精品 | 国产精品久久久久久久久久iiiii | 亚洲色在线视频 | 国产一卡二卡四卡无卡免费 | 国产成人综合网 | 亚洲精品久久久久久av | 久久99久久99精品免视看看 | 91在线无精精品一区二区 | 亚洲国产五月综合网 | 黑色丝袜无码中中文字幕 | 特大黑人娇小亚洲女喉交 | 免费大片黄国产在线观看 | 国产成人无码a区视频 | 蜜乳av中文 | 少妇高潮尖叫黑人激情在线 | av在线免费资源 | 黄色片免费视频 | 狠狠色丁香婷婷综合久久片 | 精品女同一区二区免费播放 | 天堂毛片 | 一区二区高清视频 | 国产亚洲色婷婷久久99精品 | 日韩人妻无码精品系列专区 | 香蕉大久久| 色性av| 久久66热这里只有精品 | 久久综合亚洲色1080p | 天天干天天爽天天操 | 国产久爱免费精品视频 | 天天躁日日躁狠狠躁欧美老妇 | 天堂网中文 | 青乐娱精品视频一国产分类 | 国产亚洲精久久久久久叶玉卿 | 小辣椒福利视频精品导航 | 又色又爽又高潮免费观看 | 亚洲va天堂va欧美片a在线 | 国产suv精二区九色 成人午夜视频网站 | 精品无码国产自产野外拍在线 | 狼狼综合久久久久综合网 | 四虎最新影院 | 国产精品久久久久免费观看 | 国产色视频自在线观看 | 四虎免费入口 | 国产精品久久久久久久久免费丝袜 | 亚洲s色大片 | 2020无码专区人妻系列日韩 | 伊人日日夜夜 | 久久精品国产亚洲一区二区 | 欧美综合在线观看 | 国产精品老熟女露脸视频 | 青青草久草 | 国产美女的第一次好痛在线看 | 免费午夜无码片在线观看影院 | 少妇一级淫免费观看 | 国产精品久久久久9999赢消 | 欧美一区二区三区性视频 | 欧美极品少妇性运交 | 亚洲a∨无码无在线观看 | 国产一卡2卡3卡四卡精品国色无边 | 久久久久人人 | 全部免费毛片在线播放一个 | 噜噜噜在线视频 | 一区二区精品视频在线观看 | 精品人妻大屁股白浆无码 | 国产成人麻豆精品午夜在线 | 国产香蕉国产精品偷在线 | 老熟女多次高潮露脸视频 | 国产成人av片在线观看 | 2018亚洲男人天堂 | 国产成人综合久久精品推荐 | 国产午夜激情视频 | 亚洲经典视频在线观看 | 亚洲最新无码成av人 | 国内精品少妇在线播放98 | 欧美激情国产日韩精品一区18 | 色永久 | 国产精品黄页免费高清在线观看 | 久久久久久久久久久久中文字幕 | 波多野吉av无码av乱码在线 | 欧美色精品 | 亚洲精品无码久久久久去q 国产亚洲精久久久久久无码77777 | 精品国产一区二 | 国产女人乱子对白av片 | 四虎最新站名点击进入 | 国产成人无码精品久久涩吧 | jzzjzzjzz成熟丰满少妇 | 456成人精品影院 | 久久亚洲道色宗和久久 | 性猛交xxxx免费看蜜桃 | 亚洲一区二区三区无码影院 | 欧美精品性生活 | 国产精品福利在线观看 | 伊人久久大香线蕉av不卡 | 毛片基地黄久久久久久天堂 | 国产成人av无码永久免费 | 国产成人午夜福利电影在线播放 | 欧美v视频| 婷婷久久一区二区三区 | 99久久精品无码一区二区三区 | 日韩在线观看视频一区二区 | 日韩欧美在线视频 | 黑人爱爱视频 | 伊人久久久久久久久久久久久 | 亚洲五月色丁香婷婷婷 | 久久人人爽人人爽人人片av不 | 玩弄放荡人妻少妇系列视频 | 日韩免费毛片 | 免费人成视频19674不收费 | 国产精品污污 | 中文字幕乱码中文乱码777 | 中文字幕无码中文字幕有码 | 精品一区二区久久久久久久网站 | 精品2区| 国产日产欧美 | 狠狠干夜夜草 | 久久精品无码精品免费专区 | 久久久国产片 | 国产粉嫩嫩00在线正在播放 | 丁香花在线 | 国产亚洲精品久久无码98 | 国产一码二码三码区别 | 免费看内射乌克兰女 | 五十路亲子中出在线观看 | 成人免费一区二区三区视频网站 | 中文字幕亚洲无线码在线一区 | 人妻丰满av无码久久不卡 | 日本无遮羞调教打屁股的导演 | 香蕉视频在线视频 | 日本xxxx裸体xxxx出水 | 国产资源免费 | 狠狠操亚洲 | 嫩草影院在线看 | caoporn国产精品免费公开 | 久久影院av | 日韩av免费片 | 日本三级中文字幕 | 日韩精品一区二区葵司亚洲91 | 色播五月婷婷 | 人狥杂交一区欧美二区 | 国产亚洲图片 | 久久久久九九九 | 国产午夜精品一区二区三区欧美 | 亚洲日本一区二区一本一道 | 色香阁综合无码国产在线 | 天天干天天操天天舔 | 日本大片免a费观看视频 | 无码中文字幕免费一区二区三区 | 97久久久久人妻精品专区 | 成人性生交视频免费观看 | 老妇激情毛片视频 | 精品色区| 亚洲a片成人无码久久精品色欲 | 亚洲欧美男人天堂 | 欧美夜夜操 | 久久久中日ab精品综合 | 免费 黄 色 人成 视频 在 线 | 国产成人精品三级在线影院 | 少妇在线观看888视频 | 久久精品99国产精品酒店日本 | 日本不卡一二区 | 久久精品国产999大香线蕉 | 久久人妻国产精品31 | 依人在线视频 | 久精品视频 | 日韩一区二区三区免费 | 1024亚洲天堂 | 欧日韩视频 | 久草久草 | 国产精品最新免费视频 | 中文字幕无码成人片 | 男人的网站在线观看 | 久久亚洲综合网 | 最新中文字幕第一页 | 国模汤芳大尺度啪啪 | 国产精品国产三级国av | 国产精品久久久久久久毛片明星 | 成年女人在线视频 | 在线看片免费人成视频国产片 | 亚洲国产欧美在线 | 国产精品无码日韩欧 | 91高清免费看 | 无码专区无码专区视频网站 | 亚洲高清码在线精品av | www无套内射高清免费 | 2017日日夜夜 | 韩日在线视频观看 | 中文字幕丝袜美腿 | 欧洲免费无线码在线一区 | 天天看片网站 | 玩弄少妇肉体到高潮动态图 | 日韩成人精品一区二区 | 国产又粗又猛又大爽又黄 | 亚洲欧美综合一区二区三区 | 青青草视频免费播放 | 日韩在线一区二区视频 | 9999精品 | 六月丁香在线视频 | 亚洲综合国产成人无码 | 中文www天堂 | 国产一区二区不卡 | 精品少妇爆乳无码av无码专区 | 亚洲最大成人一区久久久 | 亚洲精品第一国产综合野草社区 | 日韩一区二区三区高清电影 | 欧洲熟妇色xxxx欧美老妇多毛图片 | 国内精品久久久久久久影视 | 久久亚洲在线 | 偷拍自中文字av在线 | 97久久人人超碰超碰窝窝 | 亚洲另类国产综合小说 | 蜜臀免费av | 在线播放无码后入内射少妇 | 日韩精品卡2卡3卡4卡5 | 大香伊蕉在人线国产网站首页 | 中文字幕乱码熟妇五十中出 | 丰满少妇被粗大的猛烈进出视频 | 91夜夜未满十八勿入爽爽影院 | 国产区在线观看成人精品 | 影音先锋中文字幕在线视频 | 91精品中综合久久久婷婷 | 在线日本中文字幕 | 国产福利观看 | 欧美自拍亚洲综合图区 | 成人av无码一区二区三区 | 亚洲伊人久久大香线蕉 | 日产精品卡一卡二 | 黄色国产视频网站 | 免费看黑人强伦姧人妻 | 黄色精品网站 | 在线色网址 | 国产免费拔擦拔擦8x高清在线 | 国产天堂精品 | 国产又粗又猛又色 | 天天人人 | 亚洲v无码一区二区三区四区观看 | 三级三级久久三级久久18 | 欧美性猛交xxxx乱大交视频 | 999视频精品全部免费品 | 色吟av | 亚洲欧美www | 无码国产精品一区二区免费vr | 黄色成人在线免费 | 久久久精品影视 | 天堂在线www天堂 | 中日韩美中文字幕av一区 | 狠狠爱五月丁香亚洲综合 | 一级黄色大片 | 在线看一区二区 | 白峰美羽一区二区三区 | 国产精品亚洲欧美在线播放 | 日韩av综合网 | 亚洲成a人片在线观看无码下载 | 曰本丰满熟妇xxxx性 | 国产午夜免费高清久久影院 | 国产白嫩精品又爽又深呻吟 | 久久久亚洲裙底偷窥综合 | 日本无码一区二区三区不卡免费 | 人妻精品久久久久中文字幕 | 色偷偷中文字幕综合久久 | 91免费高清观看 | 成人免费mmmmm视频 | 狠狠伊人 | 两性免费视频 | 天堂中文av | 乱女午夜精品一区二区三区 | 熟女俱乐部五十路六十路 | 国产三区av | 97不卡视频 | 欧美成人综合久久精品 | 国产开嫩苞视频在线观看 | 午夜视频h| 亚洲毛片无码专区亚洲乱 | 亚洲伊人成综合网 | xxxxxhd日本xxxx47 17c在线看 | 天天爽天天爽天天片a | 天堂资源av | 免费香蕉成视频人网站 | 怡红院男人天堂 | 超碰在线国产 | 性猛交富婆╳xxx乱大交天津 | 日本黄色一级片免费看 | 免费毛片一区二区三区久久久 | 亚洲一区播放 | 成人在线视频免费看 | 看全色黄大色黄女片爽名优 | 午夜福利国产成人无码gif动图 | 99re视频这里只有精品 | 国产精品成人网址在线观看 | 青青草国产精品免费观看 | zzjj国产精品一区二区 | 黑人巨茎大战俄罗斯美女 | 免费av网站在线播放 | 久久精品道一区二区三区 | 少妇人妻真实偷人精品视频 | 欧美xxxx黑人 | 色婷婷av久久久久久久 | 国产在线观看黄色 | 国产精品视频免费观看 | 无码人妻毛片丰满熟妇区毛片国产 | 成人h在线无码精品动漫网站 | 妇子乱av一区二区三区 | 国产精品 精品国内自产拍 伊人影院久久 | 不卡av电影在线 | 亚洲一区二区精品在线 | 鲁在线视频 | 亚洲国产精品无码专区在线观看 | 亚洲中文字幕久久精品蜜桃 | 国产乱码精品一区二区三区中文 | 欧美日韩精品久久久免费观看 | 国产 中文 字幕 日韩 在线 | 99热门精品一区二区三区无码 | 欧美成人免费播放 | 久久精品亚洲精品无码白云tv | 又摸又揉又黄又爽的视频 | 久久精品国产99久久美女 | 免费国精产品—品二品 | 超碰在线cao | 玖玖在线观看 | 在线伊人| 苍井空毛片精品久久久 | 国内精品国产成人国产三级 | 亚洲国产不卡视频 | 青青免费视频 | 精品一区二区三区东京热 | 大香伊蕉在人线国产网站首页 | 天天做夜夜爱爱爱 | 久久91亚洲精品中文字幕奶水 | 中国华裔少妇黑人内谢 | 波多野42部无码喷潮在线 | 成人精品免费 | 精品国产免费一区二区三区香蕉 | 欧洲多毛裸体xxxxx | 五月丁香啪啪激情综合色九色 | 成年轻人电影www无码 | 国产人妻xxxx精品hd | 精品一区二区三区在线观看视频 | 亚洲中文字幕在线精品2021 | 日韩污视频在线观看 | 国内精品久久久久久99蜜桃 | 久久久久久亚洲精品 | 国产91美女视频 | hsck成人网 | 国产又黄又硬又粗 | 久久av在线影院 | 在线看黄色av | 日本熟妇色一本在线视频 | 亚洲欧洲精品成人久久曰 | 亚洲人成人无码www影院 | 成年人免费黄色片 | 日韩中文字幕久久久97都市激情 | 国产精品无码不卡一区二区三区 | 亚洲另类在线制服丝袜国产 | 荫蒂被男人添的好舒服爽免费视频 | 中文字幕亚洲一区 | 国产萌白酱喷水视频在线播放 | 99免费| 亚洲精品一区二区三区98年 | 一色桃子中文字幕 | 国产乱子伦在线观看 | 99爱国产精品免费高清在线 | 嫩草国产福利视频一区二区 | 欧美极品中文字幕 | 亚洲国产欧美一区二区好看电影 | 欧美激情一区二区三区在线 | 亚洲视频在线播放 | 午夜精品一区二区三区aa毛片 | 久久久久久久久久久国产精品 | 亚洲激情图片视频 | 免费女人18毛片a毛片视频 | 成人性欧美丨区二区三区 | 麻豆福利在线观看 | 国产老女人乱淫免费 | 在线观看免费黄色av | 亚洲国产精品尤物yw在线观看 | 四虎永久在线精品视频免费观看 | 久9视频这里只有精品8 | 日韩中文在线字幕 | 重口sm一区二区三区视频 | 国产精品欧美综合亚洲 | 国产欧美高清在线观看 | 91在线观看视频 | 久久久综合久久 | 国产成a人亚洲精v品久久网 | 亚洲中文字幕无码mv | 国产日韩一区二区三区在线观看 | 久久久久国产精品午夜一区 | 三级三级久久三级久久18 | 国内精品自线在拍精品 | 国产精品国产三级国产专区52 | 国产精品香蕉在线观看 | 99热这里是精品 | 国产偷抇久久精品a片蜜臀av | 欧美草b内射在线aaaaaa | 欧洲熟妇乱xxxxx大屁股7 | 国产91对白在线观看九色 | 亚洲色一色噜一噜噜噜 | 九九热这里有精品 | 日韩永久免费视频 | 中文字幕av无码一区二区三区电影 | 91久久精品日日躁夜夜欧美 | www亚洲最大aⅴ成人天堂 | 成人午夜福利视频镇东影视 | 日韩专区一区二区 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 午夜久久久久久久 | 重口道具调教多人高h虐 | 亚洲a视频在线观看 | 顶级欧美熟妇高潮xxxxx | 精品无码一区二区三区av | 热99re久久免费视精品频 | 黄色国产在线 | 99久久精品国产一区二区成人 | 国产欧美视频一区二区 | 日韩免费小视频 | 午夜电影院理伦片8888 | 欧美人体做爰大胆视频 | 日本在线观看视频免费 | 中文一二区 | 免费观看又污又黄在线观看 | 亚洲电影区图片区小说区 | 99国产揄拍国产精品人妻 | 久视频精品 | 波多野结衣一级 | 色偷偷成人网免费视频男人的天堂 | 粉红女士1977年 | 日本真人添下面视频免费 | 成人福利在线视频 | 偷偷做久久久久网站 | 538精品视频在线观看 | 精品国产女主播在线观看 | 少妇把腿扒开让我舔18 | 天天操天天干天天舔 | 色偷偷亚洲男人的天堂 | 日本美女久久久 | 黄色三级av | 久久久精品国产99久久精品芒果 | av福利站 | 亚洲精品国产成人 | 国产精品久久a | 国产欧美va天堂在线观看视频下载 | 99久久亚洲综合精品成人网 | 日韩精品系列产品大全 | 久久久久无码中 | 黄色成人小视频 | 欧美 中文字幕 | 国产亚洲欧美在线观看 | 一区在线视频 | 成人欧美一区二区三区在线观看 | 小明成人免费视频一区 | 婷婷色激情 | 97精品欧美一区二区三区 | 欧美日韩亚洲国产 | 免费毛片a线观看 | 亚洲精品一区二区三区精华液 | 日韩人妻无码免费视频一区二区 | 夜夜爽久久精品国产三级 | 成人乱码一区二区三区av | 亚洲精品字幕在线观看 | 曰本无码不卡高清av一二 | 成人一级视频在线观看 | 法国人性生活xxxx | 中文字幕久久波多野结衣av不卡 | 国产精品久久这里只有精品 | 天堂天躁狠狠躁夜躁2022 | 中文字日产幕码三区的做法大全 | 毛片视频网站 | 国产成人亚洲影院在线观看 | 四虎1515hh.com | 男女男精品视频站 | 大香线蕉伊人超碰 | 日本天堂网站 | 成人欧美一区二区三区黑人 | 成人日批视频 | 亚洲成a人片77777群色 | 国产精品yy9299在线观看 | 久久婷婷国产综合尤物精品 | 国产成熟妇女性视频电影 | 国产av永久无码精品网站 | 丁香花开心四播房麻豆 | 欧美性综合 | 看全色黄大色黄大片女图片第一次 | 特级黄色一级片 | 亚洲成人第一网站 | 精品国产乱码久久久软件使用方法 | 国偷自产一区二区三区蜜臀 | 色天使在线观看 | 国产亚洲欧美日韩亚洲中文色 | 国产美女遭强高潮开双腿 | 国产成人av在线婷婷不卡 | 欧美亚洲熟妇一区二区三区 | 国产乱对白刺激在线视频 | 黑人欧美一区二区三区4p | 久久久久久欧美 | 少妇特黄v一区二区三区图片 | 国内熟女啪啪自拍 | 亚洲女人网| 粉嫩精品国产色综合久久不8 | 国产麻豆剧果冻传媒兄妹蕉谈 | 欧美aⅴ在线观看 | 国产三级91 | 欧美成人看片一区二区三区尤物 | 国产精品免费福利久久 | 成人性生交大片免费看视频hd | 欧美日韩亚洲色图 | 无码一区二区三区 | 成av人片在线观看天堂无码 | 久爱www成人网免费视频 | 欧美亚洲日本在线 | 亚洲国产精品久久久久制服 | 熟妇人妻午夜寂寞影院 | 正在播放白浆 | 精品久久久久久无码中文字幕 | 美女网站在线免费观看 | www.91看片 | 91精品无人区卡一卡二卡三 | 免费无码鲁丝片一区二区 | 一级丰满大乳hd高清 | 超碰美女| 91免费在线视频 | 中文字幕日韩高清 | 久久精品国产亚洲a∨蜜臀 久久6免费视频 | 国产91在线播放精品91 | 亚洲综合大片69999 | www视频在线观看 | 九九热精品视频 | 亚洲人成网线在线播放va蜜芽 | 热久久久久 | 正在播放木下凛凛88av | 97一区二区三区 | 亚洲免费a视频 | 亚洲欧美国产日韩在线观看 | 狠狠躁夜夜躁人人爽天天bl | 国外av片免费看一区二区三区 | 亚洲一区精品视频在线观看 | 亚洲激情黄色小说 | 亚洲制服另类无码专区 | 亚洲日韩色欲色欲com | 天天操天天谢 | 日本午夜小视频 | 亚洲国产良家在线观看 | 国产午夜无码精品免费看动漫 | 自拍偷在线精品自拍偷99九色 | 我和亲妺妺乱的性视频 | 亚洲综合专区 | 色综合久久网 | 久久久69| 欧美极度丰满熟妇hd | 亚洲热妇热女久久精品 | 日韩亚洲精品国产第二页 | 日本中文字幕第一页 | 日本视频免费在线 | 婷婷色婷婷开心五月 | 亚洲欧美日韩中文字幕在线一区 | 少妇av导航 | 一级老太bbbbbbbbb | 日日操夜夜干 | 国产97色在线 | 美洲 | 日韩内射美女人妻一区二区三区 | 超碰人人网 | 免费无码毛片一区二区三区a片 | 亚洲成无码电影在线观看 | 亚洲天堂精品在线 | 91精品国产一区二区三区蜜臀 | 欧美少妇xxxxx | 国产欧美在线一区二区三区 | 国产乱人伦精品一区二区在线观看 | 中文字幕日韩三级 | 精品熟人妻一区二区三区四区不卡 | 亚洲一区二区三区在线观看网站 | 无码免费无线观看在线视 | 奶头好大狂揉60分钟视频 | 精品一区二区久久久 | 免费三级毛片 | 屁屁影院,国产第一页 | 欧美三级网址 | 妇女bbbb插插插视频 | 伊人久久成人网 | 亚洲欧美另类激情综合区 | 亚洲h成年动漫在线观看网站 | 欧美日韩一区二区三区在线观看视频 | 亚洲日韩欧洲无码av夜夜摸 | 男人在线视频 | 国精品午夜福利视频不卡 | 四虎成人精品在永久免费 | 亚洲中文字幕久久精品无码va | 精品爆乳一区二区三区无码av | 国产精品无码久久av嫩草 | 97人人超人人超免费国产 | jzzijzzij亚洲日本少妇熟 | a√天堂中文 | 欧美另类第一页 | 超碰cao已满18进入离开官网 | 日韩视频在线观看 | 又色又爽又黄无遮挡的免费观看 | 一道本久在线中文字幕 | 无码人妻精品一区二区三18禁 | 久久婷婷狠狠综合激情 | 西西人体444www高清大胆 | 一级成人av | 亚洲欧美日韩在线一区 | 天堂a√在线 | x88av 福利| 日本一区二区在线 | 日韩精品人妻系列无码专区免费 | 日本少妇喷水视频 | 日日鲁夜夜如影院 | 国产69精品久久久久孕妇大杂乱 | 无遮挡边吃摸边吃奶边做 | 婷婷综合在线观看 | 女同二区 | 免费精品 | 偷拍呻吟高潮91 | 东京热人妻中文无码 | 九九九热精品免费视频观看网站 | 女十八免费毛片视频 | 欧美一区二区二区 | 一级一片免费播放 | 狠狠亚洲超碰狼人久久 | 亚洲愉拍99热成人精品热久久 | 亚洲综合五月天婷婷 | 91免费在线 | 国产亚洲精品久久久玫瑰 | 丰满少妇大力进入av亚洲 | 亚洲成人在线网 | 奇米影视在线视频 | 国产精品s| 亚洲女初尝黑人巨高清 | 真人无遮挡18禁免费视频 | 欧美福利在线 | 日本在线视频www色 神马久久久久久 | 久草在线青青草 | 欧洲亚洲国产成人综合色婷婷 | 少妇三级全黄在线播放 | 又硬又爽又长又粗又大毛片 | 久久精品中文字幕第一页 | 人妻熟妇乱又伦精品无码专区 | 免费看欧美黑人毛片 | 一二三区在线视频 | 高圆圆的特级毛片 | 91精品久久久久久 | 不卡av在线免费观看 | 中文韩国午夜理伦三级好看 | 一级黄色毛片 | 亚洲熟妇无码一区二区三区导航 | 国产精品你懂的在线 | 免费精品| 黄色网久久 | 欧美肥婆性猛交xxxx中国1 | 国产高清成人久久 | 久久中文精品无码中文字幕下载 | 国产精品午睡沙发系列 | 国产精品久久久久久久久免费桃花 | 97福利影院 | 午夜寡妇啪啪少妇啪啪 | 国产偷人激情视频在线观看 | 国产色精品久久人妻 | 小雪尝禁果又粗又大的视频 | 九草在线观看 | 亚洲天天干 | 正在播放酒店约少妇高潮 | 日韩性插 | 亚洲aaaaa| 失禁大喷潮在线播放 | 人人妻人人澡人人爽人人精品 | 国产资源在线免费观看 | 国语对白自产 | 2018av在线| 久草综合在线观看 | 天天摸天天操 | 国产在线专区 | 国产末成年av在线播放 | 国产薄丝脚交视频在线观看 | 成人爽a毛片免费视频 | 乱人伦人妻精品一区二区 | 国产区一区二区三 | 色99999| 亚洲欧美在线视频观看 | 中文字幕婷婷日韩欧美亚洲 | 亚洲综合一区二区三区 | 久久亚洲a片com人成 | 无码av高潮抽搐流白浆在线 | 亚洲 欧美 日本 国产 高清 | 午夜精品久久久久久中宇牛牛影视 | 亚洲最大无码av网站观看 | 欧洲精品一区二区 | 人人澡人人澡人人看添 | 中文字幕人妻三级中文无码视频 | 欧美一区二区喷水白浆视频 | 98久久人妻少妇激情啪啪 | 国产亚洲日本 | 亚洲精品成人福利网站app | 九九热在线视频观看 | 国产欧美一级二级三级在线视频 | 国内精品久久久久久久影视麻豆 | 久久婷婷国产综合国色天香 | 99热999 | 少妇被又大又粗又爽毛片 | www.婷婷 | 伊人青青久 | 久久免费公开视频 | 777欧美| 国产偷倩视频 | 在线看的av | 久操欧美 | 婷婷啪| 香蕉97视频观看在线观看 | 在线亚洲一区 | 综合色天天鬼久久鬼色 | 亚洲黄色的| 手机av在线不卡 | 国产黄色免费网站 | 草久在线视频 | 久视频精品线在线观看 | 四虎884aa成人精品 | 亚洲乱码国产乱码精华 | 影音先锋久久久 | 影音先锋人妻av在线电影 | 久久久久久久久浪潮精品 | 欧美日韩制服在线 | 91久久久www播放日本观看 | 看黄网站在线 | 99免费精品视频 | 中文字幕国产精品 | 亚洲国产欧美在线观看 | 美女扒开奶罩露出奶头视频网站 | 国产av一码二码三码无码 | 成年大片免费视频播放二级 | 国产成人亚洲影院在线播放 | 中日韩精品无码一区二区三区 | 精品一区二区三区激情在线欧美 | 超碰xx | 尤物yw193can在线观看 | 免费观看的av在线播放 | 白浆av导航 | 熟女人妇交换俱乐部 | 日一日| 一区二区三区四区视频 | 99网曝精品视频久草 | 91tv亚洲精品香蕉国产一区 | 国产午夜大地久久 | 欧日韩一区二区三区 | 国产中年夫妇高潮精品视频 | 激情五月在线 | 日韩精品手机在线 | 乖女的小奶水h公霍水二 | 久久久a级片 | 97人人模人人爽人人喊0 | 7777精品久久久大香线蕉小说 | 精品麻豆丝袜高跟鞋av | av免播放器在线观看 | 国精产品一区一区三区mba视频 | 无码aⅴ免费中文字幕久久 av无码精品一区二区三区三级 | 欧美一区二区在线播放 | 亚洲呦呦| 国产精品毛片一区二区在线看舒淇 | 亚洲午夜无码毛片av久久京东热 | 欧美乱码一区二区三区 | 国产在线视频精品视频 | 欧美一级在线播放 | av看片在线观看 | 97人人精品 | 特级无码毛片免费视频尤物 | 国产又粗又猛又大爽又黄老大爷视频 | 91精品久久久久久久久不口人 | 亚洲成人av一区二区 | 日韩欧美三级 | 日本人妻换人妻毛片 | 亚洲欧美日韩愉拍自拍美利坚 | 5d肉蒲团之性战奶水欧美 | 亚洲 欧美 变态 另类 综合 | 成人午夜福利免费体验区 | 久久99精品久久久子伦 | 国内精品国产三级国产aⅴ久 | 天天综合亚洲 | 7777久久久国产精品消防器材 | 精品综合久久久久久8888 | 在线 | 一区二区三区四区 | 亚洲乱妇熟女爽到高潮的片 | 欧美xxxx做受老人国产的 | 亚洲精品一级片 | 伊人婷婷色香五月综合缴缴情 | av青草 | 粉嫩av在线播放一绯色 | 国产成人免费网站 | 色一级片 | 国产欧美精品在线 | 亚洲乳大丰满中文字幕 | 色噜噜狠狠狠狠色综合久一 | 中文字幕一区二区三区波多野结衣 | 精品免费在线 | 国产精品白浆无码流出 | 日本aⅴ免费视频一区二区三区 | 无码人妻久久一区二区三区免费 | 国产av午夜精品一区二区三区 | 一线二线三线天堂 | 午夜中文字幕 | 超碰综合 | 亚洲欧洲综合 | 国模大尺度啪啪 | 高潮喷吹一区二区在线观看 | 毛片免费视频在线观看 | 久久久人成影片一区二区三区 | 亚洲精品v欧洲精品v日韩精品 | 亚洲无吗视频在线 | 欧洲成人一区二区三区 | 国产极品女主播国产区 | 国产又粗又猛又大爽老大爷 | 日本人与黑人做爰的视频 | 九九爱视频 | 亚洲欧美在线免费 | 亚洲做受高潮软件 | 日本熟妇人妻xxxxx-欢迎您 | 国产欧美一区二区白浆黑人 | 国精产品一二三区传媒公司 | 中出在线视频 | 人人妻人人添人人爽日韩欧美 | 67pao国产成视频永久免费 | 一二三区视频在线观看 | 可以免费在线观看的av | 午夜性刺激在线视频免费 | 黄色毛片黄色毛片 | 性高潮久久久久久 | 91av大片| 国产三级在线观看播放视频 | 欧美精品久久久久久久久大尺度 | 国产精品免费麻豆入口 | 精品国产偷窥一区二区 | 玩弄人妻少妇精品视频 | 午夜三级a三级三点窝 | 久久久久国产精品人妻 | 久久咪咪 | 成人免费视频无码专区 | 国产成人精品一区二区视频 | 第五色婷婷 | 国产h视频在线 | 四虎免费最新在线永久4hu | 精品国产乱码久久久人妻 | 国产sm调教视频在线观看 | 日本精品网 | 免费观看全黄做爰大片国产 | 一级黄色国产 | 丁香婷婷在线 | 色网站在线观看 | 久久精品欧美一区二区三区黑人 | 国产重口老太和小伙乱 | 国产精品视频一区二区噜噜 | 性欧美俄罗斯极品 | 国产一区综合 | 亚洲色图18p | 天堂网中文在线 | 精品推荐国产精品店 | 久久久精品国产sm最大网站 | 蜜臀av 国内精品久久久 | 任你躁久久精品6 | 亚洲国产精品成人一区二区在线 | 天天人人精品 | 欧美牲交视频免费观看 | 成人爱视频 | 亚洲国产成人久久一区二区三区 | 久久婷婷综合色丁香五月 | 樱花草视频www日本韩国 | 少妇暴力深喉囗交3p | 国产手机在线国内精品 | 18禁黄无遮挡网站 | 免费看美女部位隐私网站 | 亚洲精品午夜一区二区电影院 | yw尤物av无码国产在线观看 | 93精品国产乱码久久久 | 国产欧美日韩中文久久 | 国产黄大片在线观看画质优化 | 肉色欧美久久久久久久免费看 | juy416友田真希中文字幕 | 国产精品亚洲一区二区在线观看 | 亚洲欧美熟妇综合久久久久 | 亚洲日韩高清在线亚洲专区 | 久久久久久久亚洲国产精品87 | 中文字幕欧美日韩va免费视频 | 色乱码一区二区三在线看 | 国产黑色丝袜在线看片不卡顿 | 国产亚洲成av人片在线观看桃 | 嫩草影院你懂的 | 中文字幕手机在线观看 | 亚洲尺码电影av久久 | 少妇翘臀亚洲精品av图片 | 三级网站视频在在线播放 | 午夜dj在线观看高清在线视频完整版 | 亚洲国产婷婷六月丁香 | 欧美一区亚洲一区 | 亚洲国产成人综合在线观看 | 亚洲伦理在线播放 | 欧美刺激性大交亚洲丶日韩 | 午夜少妇福利视频 | 性xxxx欧美老妇胖老太269 | 成人精品一区二区三区电影 | 成视频年人黄网站免费视频 | 国产猛男猛女52精品视频 | 亚洲无av码一区二区三区 | 国产视频在线播放 | 免费黄色av | 色婷婷五月综合色啪网 | 亚洲乱码av中文一区二区 | 久久精品福利视频 | 丰满人妻无码∧v区视频 | 人妻av中文系列 | 中文乱码免费一区二区 | 五月天一区二区三区 | 四虎影视在线影院在线观看免费视频 | 特黄特级毛片免费视频 | 男人激情网 | 国产尻逼视频 | 黑人大战日本人妻嗷嗷叫不卡视频 | 亚洲成人婷婷 | 天天天天天天天干 | 日本无遮挡边做边爱边摸 | 网站av| 一本色道久久99精品综合蜜臀 | 四虎国产精品成人影院 | 国产麻无矿码直接观看 | 国产精品久久久久久久久潘金莲 | 丰满岳跪趴高撅肥臀尤物在线观看 | www.久久国产 | 国产精品爽爽v在线观看无码 | 精品国产综合区久久久久久 | 四虎最新地域 | 国产成人精品午夜福利 | 国产精品亚洲专区无码电影 | 久久丝袜脚交足免费播放导航 | 亚洲一区二区影院 | www.99av.com | 刘亦菲又大又嫩在线播放 | 欧美日韩成人一区二区在线观看 | 密臀av一区二区 | 亚洲精品黄色 | 特级黄色毛片 | 国产av综合影院 | 午夜视频日韩 | 制服 丝袜 人妻 专区一本 | 亚洲精品无 | 欧美日韩免费观看视频 | 亚洲综合电影小说图片区 | 91视频免费观看网站 | 女教师淫辱の教室蜜av臀 | 狠狠躁狠狠躁东京热无码专区 | 国产人妻精品无码av在线 | 亚洲精品夜夜夜妓女网 | 狠狠躁夜夜躁人人爽天天天天 | 欧美中文字幕在线播放 | 竹内纱里奈一88av在线 | 久久精品囯产精品亚洲 | 午夜婷婷国产麻豆精品 | 精品少妇无码av无码专区 | 欧美成人吸奶水做爰 | 亚洲精品一区二区三区四区久久 | 色视频www在线播放国产成人 | 精品女同一区二区免费播放 | 一区二区波多野结衣 | 青青操在线免费观看 | 免费午夜男女高清视频 | 国产对白不带套毛片av | 欧美欲妇 | 国产三级aⅴ在在线观看 | 国产成人综合久久精品av | 色蜜av| 亚洲精品在线视频观看 | 天堂网欧美| 久久99精品久久久久蜜芽 | 国产精品久久自在自线 | 激情小说五月天 | 国产无精乱码一区二区三区 | 丁香五精品蜜臀久久久久99网站 | 日韩美女免费线视频 | 国产成人a无码短视频 | 黄色a毛片 | 亚洲a∨大乳天堂在线 | 男女午夜激情视频 | 日韩视频免费在线播放 | 神马久久久久久久久久久 | 男人进女人下部全黄大色视频 | 国产精品黄色av | 国产综合一区二区三区黄页秋霞 | 久久久精品成人免费观看国产 | 午夜乱码爽中文一区二区 | 成年人交配视频 | 久久久青青青 | 亚洲香蕉一区二区三区 | 青青青国产在线观看手机免费 | japanese丰满少妇最高潮 | a毛片成人 | 国产99久久久国产 | 美女内射视频www网站午夜 | 色婷亚洲 | 中文字幕亚洲精品在线 | 4k岛国av超高清aⅴ | 91日日拍夜夜嗷嗷叫国产 | 欧美人与动牲交a精品 | 国产 精品 自在自线 | 老女人色黄大片 | 国产二区一区 | 精品午夜久久福利大片 | 精品性高朝久久久久久久 | 日本中文在线 | 久久久久久久中文字幕 | 日韩综合一区二区 | 99久久精品国产成人一区二区 | yy6080午夜 | 一区二区三区网站 | 波多野结衣小视频 | 亚洲а∨天堂久久精品9966 | 欧美视频在线观看 | 黄色日本免费 | 亚洲国产av无码精品色午夜 | 国产日韩欧美一区二区东京热 | 色妞色综合久久夜夜 | 国产一级一片免费播放放a 国产人妻精品无码av在线 | 双腿高潮抽搐喷白浆视频 | 伊人久久久久久久久久久久 | 曰本又大又粗又黄又爽的少妇毛片 | 亚洲精品无码国产片 | 久久99精品久久久久久清纯 | 中文字幕在线精品视频入口一区 | 一级片免费在线 | 99国产精品国产精品九九 | 中日韩高清无专码区2021 | 国产黄a三级三级三级老年人 | 国产天天在线 | 亚洲精品一区二区 | 性欧美大战久久久久久久 | 丰满少妇被猛烈进入无码 | 久久五十路丰满熟女中出 | 44444kk在线观看免费一级 | 午夜美女视频 | 亚洲欧美精品一区二区三区 | 亚洲精品久久久蜜桃动漫 | 久热这里只精品99国产6 | 午夜伦理影院 | 欧美精品一区二区在线观看播放 | 无码免费婬av片在线观看 | 免费福利视频在线观看 | 天天操夜夜做 | 亚洲精品久久久蜜臀av站长工具 | 又粗又大又黄又爽的免费视频 | www.精品国产| 国产在线观看你懂得 | 岛国av免费在线观看 | 三级国产99久久 | 免费毛片网站 | 欧美资源在线 | 777久久久精品一区二区三区 | 一区二区在线观看视频 | 亚洲 欧洲 综合 另类小说 | 天天舔天天爽 | 国产黄频免费高清视频 | 永久免费看黄网站 | 亚洲领先的自拍视频网站 | 少妇乳大丰满诱人成熟 大胆 | 肉色欧美久久久久久久免费看 | 亚洲中文字幕在线乱码 | 女人被男人桶30分钟无遮挡动态图 | 国产伦精品一区二区三区免费 | 国产精品久久久久久久久久久久午夜片 | 92国产精品午夜免费福利视频 | 丁香五月欧美成人 | 人妻 日韩 欧美 综合 制服 | 免费观看黄网站 | 最新成年女人毛片免费基地 | 国产女同互磨高潮在线观看 | av无码不卡一区二区三区 | 欧美性受xxxx白人性爽 | 真实国产乱啪福利露脸 | 亚洲99影视一区二区三区 | 亚洲熟妇无码av不卡在线观看 | 国产亚洲一区在线 | 狠狠久久噜噜熟女 | 亚洲人成网网址在线看 | 成人精品一区二区三区视频播放 | 99久久国语露脸精品国产色 | 伊人狠狠色丁香综合尤物 | 东北女人毛多水多牲交视频 | 久久免费大片 | 亚洲欧美伊人久久综合一区二区 | 55夜色66夜色国产精品视频 | 69式高清视频在线观看 | 97精品一区二区 | 狂野欧美性猛交免费视频 | 少妇人妻偷人精品无码视频新浪 | 精品亚洲a∨无码一区二区三区 | 日本狂喷奶水在线播放212 | 蜜桃少妇av久久久久久久 | 国产二区视频在线 | 四虎影视在线播免费观看 | 亚洲成a人片在线观看中文无码 | 青青在线精品视频 | 四虎影院新网址 | 2020国产精品久久精品 | 狠狠色先锋资源网 | 久久精品无码专区免费 | 亚拍精品一区二区三区探花 | 韩国黄色在线 | 蜜桃视频韩日免费播放 | 国产又色又爽 | 亚洲欧美不卡高清在线观看 | 日本乱亲伦视频中文字幕 | 丰满多毛的大隂户毛茸茸 | 又黄又爽视频在线观看 | 在线国产视频 | 色图一区| 婷婷综合网站 | 中文字幕一区在线观看 | 国产女人和拘做受视频免费 | 亚洲人成无码网站18禁10 | 天天爱天天做天天添天天欢 | 久久人人爽人人人人片av | 91亚洲精品乱码久久久久久蜜桃 | 韩日少妇| 精品一区二区三区免费毛片爱 | 国产熟妇午夜精品aaa | 日本强伦姧人妻一区二区 | 午夜精品一区二区三区三上悠亚 | 欧美人成在线视频 | 末世极度乱淫h | 日本xxxx少妇高清hd | 色综合久久88 | 91观看在线视频 | 国产精品久久久影视青草 | 亚洲国产二区 | 69综合精品国产二区无码 | 在线不卡欧美 | 大黑人交xxxx18视频 | www.9999av| 亚洲色大成网站www在线观看 | 欧美激情图区 | 豆国产93在线 | 亚洲 | 国产精品老熟女露脸视频 | 99re66久久在热青草 | 亚洲丰满少妇xxxxx高潮对白 | 伊人久久大香线蕉av五月天宝贝 | 国产美女mm131爽爽爽免费 | 97精品伊人久久久大香线蕉 | 蜜臀999 | 午夜神马久久 | 国产无遮挡免费真人视频在线观看 | 日本婷婷 | 欧美成人午夜免费全部完 | 久久99九九精品久久久久齐齐 | 国产高潮流白浆免费观看 | 国91精品久久久久9999不卡 | 夜夜爽夜夜 | 亚洲精品字幕在线观看 | 日本一区二区视频在线 | 亚洲色一区二区三区四区 | 四虎影视永久地址www成人 | 中出视频在线观看 | a视频在线观看免费 | 男人猛躁进女人免费播放 | 偷拍25位美女撒尿视频在线观看 | 欧美亚洲综合久久偷偷人人 | 秋霞国产午夜精品免费视频 | 婷婷在线观看视频 | 天天色图片 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲aⅴ无码专区在线观看 国产美女三级无套内谢 | aa黄色大片 | 久久久www成人免费毛片麻豆 | 中文av日韩 | 玩弄漂亮少妇高潮白浆 | 91在线中文字幕 | 精品国产乱码久久久久久果冻传媒 | 日日狠狠久久8888偷偷色 | 日本www.在线中文字幕 | h番动漫福利在线观看 | 国产午夜aaaaa片在线影院 | 日本一区视频在线 | 国产在线精品成人一区二区三区 | 国语自产少妇精品视频蜜桃 | 亚洲∧v久久久无码精品 | 亚洲精品精华液一区 | 亚洲天堂中文字幕在线 | 久久久久琪琪去精品色无码 | 亚洲日产av中文字幕无码偷拍 | 欧美高清一区三区在线专区 | 国产精品福利视频 | 久草网在线视频 | 在线观看mv的中文字幕网站 | 四虎8848| 久草精品视频在线看网站免费 | 好吊妞国产欧美日韩免费观看 | 欧美成人看片一区二三区图文 | 久久黄色影院 | 日韩精品人妻2022无码中文字幕 | 精品少妇无码av无码专区 | 国内老熟妇乱子伦视频 | 蜜色欲多人av久久无码 | 国产成人福利在线视频播放下载 | 国产亚洲精品久久久闺蜜 | 日日天堂| 欲香欲色天天天综合和网 | 亚洲色大成网站www久久九九 | 国产精品推荐制服丝袜 | 亚洲免费成人在线视频 | 色老头精品午夜福利视频 | 日本高清一二三不卡区 | 夜夜偷天天爽夜夜爱 | 久久精品亚洲一区二区三区观看模式 | 免费在线观看av网站 | 强制高潮18xxxx按摩 | 野花av| 玖玖在线 | va婷婷在线免费观看 | 亚洲gv白嫩小受在线观看 | 九九精品免费视频 | 国产玉足榨精视频在线观看 | 99vv1com这只有精品 | 麻豆一区二区在我观看 | 国产肉丝袜视频在线观看 | 国产高清在线a免费视频观看 | 亚洲日韩一区精品射精 | 中文字幕欧美亚州视频免费 | 国产在线精品观看免费观看 | 色欲色香天天天综合网站免费 | 四虎影院在线观看av | 在线免费观看视频黄 | 蜜色欲多人av久久无码 | 亚洲日b| 欧美 另类 国产 第一页 | 国产香蕉尹人在线视频你看看 | 1区2区av| 色阁五月 | 日本一区二区三区爆乳 | 欧美激情一区二区三区aa片 | 九九热线有精品视频 | 免费精品一区 | 夜夜躁狠狠躁夜躁2021鲁大师 | 夜夜艹天天干 | 欧美视频在线一区 | 亚洲国产欧美人成 | 91精品啪| 真人啪啪高潮喷水呻吟无遮挡 | 91桃色国产在线播放 | 91久久久久久久久久久久 | 岛国av中文字幕 | 亚洲欧洲日产国码久在线 | 欧美黄色免费大片 | 亚洲精品自拍偷拍 | 一区二区免费高清观看国产丝瓜 | 国产精品一区二区6 | 久久亚洲成人网 | 强开小受嫩苞第一次免费视频 | 男女做视频md806xyz | 国产美女www爽爽爽免费视频 | 亚洲精品自拍视频 | 邻居少妇肉体粗喘娇吟 | 狠狠色噜噜狠狠狠狠777米奇 | 曰韩在线视频 | 免费无码成人av在线播 | 亚洲精品揄拍自拍首页一 | 最新国产精品精品视频 视频 | 黑人狠狠的挺身进入 | 久久久综合久久久 | 精品少妇高潮 蜜臀 | 四虎国产精品永久一区高清 | 亚洲免费精品视频 | 日韩欧美亚洲综合久久影院d3 | 色琪琪一区二区三区亚洲区 | 久久婷婷五月综合尤物色国产 | 亚洲精品动漫久久久久 | 中文字幕11| 国产在线入口 | 国产肥白大熟妇bbbb视频 | av播播 | 日日天日日夜日日摸 | 狠狠色丁香久久婷婷综合五月 | 乱人伦人妻中文字幕无码久久网 | 99免费观看视频 | 国产 日韩 欧美 视频 制服 | 天天操夜夜草 | 黄色av在 | 亚洲午夜理论无码电影 | 想要视频在线 | 狠狠色婷婷狠狠狠亚洲综合 |