資源描述:
《Linux驅(qū)動之串口驅(qū)動程序分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、串口驅(qū)動分析(國嵌)1.發(fā)送和接收發(fā)送:循環(huán)buffer?發(fā)送fifo?發(fā)送移位寄存器接收:接收移位寄存器?接收fifo?Flip_buf發(fā)送的過程是:把數(shù)據(jù)寫到發(fā)送fifo中,fifo把收到的數(shù)據(jù)傳給發(fā)送移位寄存器(自動的,非driver控制),然后每個時鐘脈沖往串口線上寫一bit數(shù)據(jù)。接收的過程是:接收移位寄存器收到數(shù)據(jù),發(fā)送給接收fifo,接收fifo事先設(shè)置好了觸發(fā)門限,當里面的數(shù)據(jù)量超過門限時就會觸發(fā)一個中斷,調(diào)用驅(qū)動中的中斷處理函數(shù),把數(shù)據(jù)寫到flip_buf中。2.寄存器UARTLineControlRegister:WordLength:數(shù)據(jù)位長度NumberofStop
2、Bit:停止位數(shù)ParityMode:奇偶校驗位類型Infra-RedMode:UART/紅外模式選擇(當以UART模式工作時,需設(shè)為“0”)UARTControlRegisterReceiveMode:選擇接收模式。如果是采用DMA模式的話,還需要指定說使用的DMA信道。TransmitMode:同上。SendBreakSignal:選擇是否在傳1幀資料中途發(fā)送Break信號。LoopbackMode:選擇是否將UART置于Loopback測試模式。RxErrorStatusInterruptEnable:選擇是否使能當發(fā)生接收異常時,是否產(chǎn)生接收錯誤中斷。RxTimeOutEnabl
3、e:是否使能接收超時中斷。RxInterruptType:選擇接收中斷類型。選擇0:Pulse(脈沖式/邊沿式中斷。非FIFO模式時,一旦接收緩沖區(qū)中有數(shù)據(jù),即產(chǎn)生一個中斷;為FIFO模式時,一旦當FIFO中的資料達到一定的觸發(fā)水平后,即產(chǎn)生一個中斷)選擇1:Level(電平模式中斷。非FIFO模式時,只要接收緩沖區(qū)中有數(shù)據(jù),即產(chǎn)生中斷;為FIFO模式時,只有FIFO中的資料達到觸發(fā)水平后,即產(chǎn)生中斷)TxInterruptType:類同于RxInterruptTypeUARTFIFOConrtolRegisterFIFOEnable:FIFO使能選擇。RxFIFOReset:選擇當復(fù)位
4、接收FIFO時是否自動清除FIFO中的內(nèi)容。TxFIFOReset:選擇當復(fù)位發(fā)送FIFO時是否自動清除FIFO中的內(nèi)容。RxFIFOTriggerLevel:選擇接收FIFO的觸發(fā)水平。TxFIFOTriggerLevel:選擇發(fā)送FIFO的觸發(fā)水平。UARTTX/RXStatusRegisterReceivebufferdataready:當接收緩沖寄存器從UART接收端口接收到有效資料時將自動置“1”。反之為“0則表示緩沖器中沒有資料。Transmitbufferempty:當發(fā)送緩沖寄存器中為空,自動置“1”;反之表明緩沖器中正有資料等待發(fā)送。Transmitterempty:當
5、發(fā)送緩沖器中已經(jīng)沒有有效資料時,自動置“1”;反之表明尚有資料未發(fā)送。UARTFIFOStatusRegisterRxFIFOCount:接收FIFO中當前存放的字節(jié)數(shù)。TxFIFOCount:發(fā)送FIFO中當前存放的字節(jié)數(shù)。RxFIFOFull:為“1“表明接收FIFO已滿。TxFIFOFull:為“1“表明發(fā)送FIFO已滿。3.函數(shù)介紹模塊初始化函數(shù):staticint__inits3c2410uart_init(void){returnuart_register_driver(&s3c2410_reg);}使用uart_register_driver注冊串口驅(qū)動。staticstr
6、uctuart_drivers3c2410_reg={owner:THIS_MODULE,normal_major:SERIAL_S3C2410_MAJOR,normal_name:"ttyS%d",callout_name:"cua%d",normal_driver:&normal,callout_major:CALLOUT_S3C2410_MAJOR,callout_driver:&callout,table:s3c2410_table,termios:s3c2410_termios,termios_locked:s3c2410_termios_locked,minor:MINOR_
7、START,nr:UART_NR,port:s3c2410_ports,cons:S3C2410_CONSOLE,};staticstructuart_ports3c2410_ports[UART_NR]={{iobase:(unsignedlong)(UART0_CTL_BASE),iotype:SERIAL_IO_PORT,irq:IRQ_RXD0,uartclk:130252800,fifosize:16,ops:&s3c24