四極管 串列埠驅動的具體開發(一)

2021-06-04 11:31:55 字數 4257 閱讀 1106

**於《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...