**於《windows ce 工程實踐與完全解析》
由於wince
的串列埠驅動程式的
mdd層是由微軟提供的。
mdd層與
pdd層之間的
pdd common
層也是通用型設計,儘管必要時我們可以對他做修改。
wince
的串列埠驅動開發耗費最大的工作是它的
pdd層。微軟為開發者提供了乙個
cserialpdd
類作為開發工作起點。
cserialpdd類是純虛類,但是它的大多數成員函式都給出了通用型實現。
wince
的串列埠驅動程式的開發者將驅動程式的
pdd層定義成為
cserialpdd
類的繼承類。這個類的成員函式必須準確全面的反映目標硬體平台上的特定型別串列埠的屬性。必要時可以呼叫父類
cserialpdd
的成員函式以減輕重複的工作量。串列埠驅動程式的
mdd層和
pdd common
層不需要知道使用者的
cserialpdd
繼承類的命名和具體實現。以
cserialpdd
類指標引用其繼承類例項的功能。
串列埠驅動程式開發的例項,無非就是定義乙個cserialpdd
類的具體繼承類的,在
cserialpdd
類的基礎上擴充。最重要的是根據目標平台上的串列埠的實際硬體特性實現其虛函式及擴充其虛函式的功能和實現。
s3c2416 的代表串列埠驅動程式
pdd層的抽象資料結構是
cpdd2416uart
類。毫無疑問,它是
cserialpdd
類的繼承類。除了
cserialpdd
外,cpdd2416uart
類還繼承了
cminithread
類。cminithread
類只是乙個封裝了
winced
執行緒管理系統呼叫函式的簡單類。供串列埠驅動程式啟動和管理它的
ist執行緒。
cpdd2416uart
類在標頭檔案
c:\wince500\platform\smdk2416\src\drivers\serial\pdds3c2416_ser.h
中定義如下:
class cpdd2416uart: public cserialpdd, public cminithread ;
virtual void serialregisterrestore() ;
// implement cpddserial function.
// interrupt
virtual bool initialenableinterrupt(bool benable ) ; // enable all the interrupt may include xmit interrupt.
private:
virtual dword threadrun(); // ist
// tx function.
public:
virtual bool initxmit(bool binit);
virtual void xmitinterrupthandler(puchar ptxbuffer, ulong *pbufflen);
virtual void xmitcomchar(uchar comchar);
virtual bool enablexmitinterrupt(bool benable);
virtual bool cancelxmit();
virtual dword getwriteablesize();
protected:
bool m_xmitfifoenable;
handle m_xmitflushdone;
// rx function.
public:
virtual bool initreceive(bool binit);
virtual ulong receiveinterrupthandler(puchar prxbuffer,ulong *pbufflen);
virtual ulong cancelreceive();
virtual dword getwatermark();
virtual byte getwatermarkbit();
virtual void rx_pause(bool bset) ;
protected:
bool m_breceivedcanceled;
dword m_dwwatermark;
// modem
public:
virtual bool initmodem(bool binit);
virtual void modeminterrupthandler() ;
virtual ulong getmodemstatus();
virtual void setdtr(bool bset) ;
virtual void setrts(bool bset);
// line function.
virtual bool initline(bool binit) ;
virtual void lineinterrupthandler() ;
virtual void setbreak(bool bset) ;
virtual bool setbaudrate(ulong baudrate,bool birmodule) ;
virtual bool setbytesize(ulong bytesize);
virtual bool setparity(ulong parity);
virtual bool setstopbits(ulong stopbits);
// line internal function
byte getlinestatus();
virtual void setoutputmode(bool useir, bool use9pin) ;
protected:
creg2416uart * m_preg2416uart;
pvoid m_pregvirtualaddr;
volatile s3c2416_intr_reg * m_pintregs;
dword m_dwintshift;
public:
void disableinterrupt(dword dwint) ;
dword getintrruptmask () ;
protected:
cregistryedit m_activereg;
// interrupt handler
dword m_dwsysintr;
handle m_histevent;
// optional parameter
dword m_dwdevindex;
dword m_dwisttimeout;
但是 cpdd2416uart
類任然不是最具體的
cserialpdd
繼承類,在
s3c2416
的串列埠驅動程式實現中。以
cpdd2416uart
類為父類又定義實現了兩個繼承類
cpdd2416serial1
和cpdd2416serial2
,它們分別抽象代表
s3c2416
晶元內的
uart0
和uart2
埠。其中的
uart1
埠被系統控制用於除錯埠,這三個串列埠埠的硬體原理是基本相同的,但是它們的控制與狀態暫存器的位址各不相同。導致其對
cserialpdd
類的(純)虛函式的實現方式略有不同。比如,在
cpdd2416serial0
類中。除了新的構造與析構函式外,還重新實現了
init()
setdefaultconfiguration()
initmodem(bool binit)
getmodemstatus()
setdtr(bool bset)
等成員函式。
四極管 Ubuntu基本使用
四極管 ubuntu 基本使用 android核心程式設計和模組開發,在 ubuntu 作業系統下開發時,message 會列印到 tty終端,xterm 下面是看不到的,只能去看日誌。故開發驅動時最好是直接到終端下開發,使用 vim最好。所以,得對 vim的操作足夠熟悉才行呀。一 vim 基本使用...
四極管 WINCE基於PWM實現的背光驅動
wince基於 pwm實現的背光驅動 硬體cpu s3c2443,背光 ic at1312b lcd kd50g9 40nm a3 系統wince6.0 1背光驅動的技術分析 lcd顯示屏自身並不發光,為了可以清楚地看到 lcd顯示屏的內容,需要一定的白光背光源。在中小尺寸 lcd顯示屏中,一般採用...
四極管 Uboot執行分析(二)
24 output format elf32 littlearm elf32 littlearm elf32 littlearm 指定輸出可執行檔案是elf格式,32位arm指令,小端 25 output arch arm 指定輸出可執行檔案的平台為arm 26 entry start 其中,ent...