在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > linux UART串口驅(qū)動開發(fā)文檔

            linux UART串口驅(qū)動開發(fā)文檔

            作者: 時間:2012-09-06 來源:網(wǎng)絡(luò) 收藏

            #define _GET_CHAR(p) ((readb((p)->membase + W83697_DR)) 0xff)

            #define _PUT_CHAR(p, c) writeb((c), (p)->membase + W83697_UARTDR)

            2>. 接收發(fā)送狀態(tài).

            #define UART_GET_RSR(p) ((readb((p)->membase + W83697_UARTRSR)) 0xff)

            #define UART_PUT_RSR(p, c) writeb((c), (p)->membase + W83697_UARTRSR)

            3>. 發(fā)送及接收中斷狀態(tài).

            #define UART_GET_CR(p) ((readb((p)->membase + W83697_UARTCR)) 0xff)

            #define UART_PUT_CR(p,c) writeb((c), (p)->membase + W83697_UARTCR)

            #define UART_GET_INT_STATUS(p) ((readb((p)->membase + W83697_UARTIIR)) 0xff)

            4>. 以及其它的中斷使能設(shè)置等, 在傳送時打開傳送中斷即會產(chǎn)生傳送中斷.

            #define UART_PUT_ICR(p, c) writeb((c), (p)->membase + W83697_UARTICR)

            5>. FIFO的狀態(tài), 是否讀空/是否寫滿; 每次讀時必須讀至FIFO空, 寫時必須等到FIFO不滿時才能寫(要等硬件傳送完) .

            接收中斷讀空FIFO的判斷:

            status = UART_GET_FR(port);

            while (UART_RX_DATA(status) max_count--) {

            ……

            }

            發(fā)送中斷寫FIFO: 當發(fā)送緩沖區(qū)中有數(shù)據(jù)要傳送時, 置發(fā)送中斷使能, 隨后即產(chǎn)生傳送中斷, 此時FIFO為空, 傳送半個FIFO大小的字節(jié), 如果發(fā)送緩沖區(qū)數(shù)據(jù)傳完,則關(guān)閉發(fā)送中斷.

            6>. 傳送時可直接寫數(shù)據(jù)口, 而不使用中斷, 但必須等待檢測FIFO的狀態(tài)

            do {

            status = UART_GET_FR(port);

            } while (!UART_TX_READY(status)); //wait for tx buffer not full...

            3. 的參數(shù)配置

            的參數(shù)主要包括如下幾個參數(shù),全部都記錄在uart_port結(jié)構(gòu)上,為靜態(tài)的賦值,本串口支持6個設(shè)備,所以中就包括了6個port,一個串口對應一個port口,他們之間除了對應的中斷號/寄存器起始基址/次設(shè)備號不同之外,其它的參數(shù)基本相同.

            √串口對應中斷, 這里六個串口,其中有3個串口使用的系統(tǒng)外部中斷0/1/2, 其中另外幾個中斷用提GPIO中斷,具體有關(guān)GPIO中斷的內(nèi)容可參見EP93XX芯片手冊, GPIO中斷共享一個系統(tǒng)中斷向量,涉及中斷共享的問題,后面將詳述LINUX中的中斷共享支持.

            √串口時鐘, 串口時鐘用來轉(zhuǎn)換計算須要設(shè)置到配置寄存器當中的波特率比值,其計算方法為:quot = (port->uartclk / (16 * baud)); baud為當前設(shè)置的波特率,可為115200等值, 取決于所選的串口時鐘源, quot即為要設(shè)置到寄存器當中的比值.

            √串口基址, 即串口所有配置寄存器基礎(chǔ)址.

            √串口次設(shè)備號(由驅(qū)動中的最低次設(shè)備號依次累加)

            前面已經(jīng)講過了六個串口中斷,這里詳細列出對應情況如下,方便查找:

            w83697的三個串口對應中斷如下:

            uart 1: 讀寫數(shù)據(jù)寄存器偏移為00x3F8, 對應系統(tǒng)外部中斷INT_EXT[0].

            uart 2: 讀寫數(shù)據(jù)寄存器偏移為00x2F8, 對應系統(tǒng)外部中斷INT_EXT[1].

            uart 3: 讀寫數(shù)據(jù)寄存器偏移為00x3e8, 對應系統(tǒng)外部中斷INT_EXT[2].

            uart 4: 讀寫數(shù)據(jù)寄存器偏移為00x3e8, 對應EGPIO[8].

            w83977的兩個串口對應中斷如下:

            uart 1: 讀寫數(shù)據(jù)寄存器偏移為00x3F8, 對應EGPIO[1].

            uart 2: 讀寫數(shù)據(jù)寄存器偏移為00x2F8, 對應EGPIO[2].

            下面列出其中一個具體的串口port的定義如下:

            {

            .port = {

            .membase = (void *)W83697_UART4_BASE,

            .mapbase = W83697_UART4_BASE,

            .iotype = SERIAL_IO_MEM,

            .irq = W83697_IRQ_UART4, //串口中斷號

            .uartclk = 1846100, //uart時鐘,默認.

            .fifosize = 8, //硬件fifo大小.

            .ops = amba_pops, //底層驅(qū)動的硬件操作集,如開關(guān)中斷等.

            .flags = ASYNC_BOOT_AUTOCONF,

            .line = 3, //串口在次設(shè)備數(shù)組中的索引號,須注意從0計起…

            },

            .dtr_mask = 0,

            .rts_mask = 0,

            }

            4. 串口驅(qū)動的底層接口函數(shù)

            驅(qū)動文件:-2.4.21/drivers/serial/Ep93xx_w83697.c

            相關(guān)文件: -2.4.21/drivers/serial/core.c 下面詳述.

            函數(shù): w83697uart_rx_chars(struct uart_port *port, struct pt_regs *regs)

            描述: 串口接收數(shù)據(jù)中斷, 此函數(shù)中應當注意的要點如下:

            接收數(shù)據(jù)時,要注意判斷FIFO是否讀空(參見上述2點中說明).

            接收數(shù)據(jù)放入flip緩沖區(qū),此緩沖區(qū)專供緩存中斷中接收到的數(shù)據(jù),是最原始的串口數(shù)據(jù),為更上一層中各種終端處理模式的原始數(shù)據(jù),可以進行各種加工處理。

            接收數(shù)據(jù)到flip緩沖區(qū)中時,須根據(jù)硬件接收狀態(tài),置每一個接收到的字符的接收標志,放在flag_buf_ptr當中, 標志類型有TTY_NORMAL/ TTY_PARITY/ TTY_FRAME等,分別表示正常/校驗出錯/幀出錯(無停止位)等.

            每接收數(shù)據(jù)之后,會通過在退出中斷前調(diào)用tty_flip_buffer_push()來往tq_timer任務列表中加一個隊列任務,串口的隊列任務主要是負責將中斷接收到flip緩沖區(qū)中的數(shù)據(jù)往上傳輸至終端終沖區(qū), 隊列任務的機制將在后面介紹,它是一種異步執(zhí)行機制,在軟中斷中觸發(fā)執(zhí)行.

            函數(shù): static void w83697uart_tx_chars(struct uart_port *port)

            描述: 串口發(fā)送數(shù)據(jù)中斷, 發(fā)送中斷中要做的事比較少,比起接收中斷簡單了好多,注意事項如下:

            當上層要發(fā)送數(shù)據(jù)時,就會打開串口發(fā)送中斷,此時FIFO為空,傳送半個FIFO大小數(shù)據(jù)即退出, 通常打開中斷是通過更上一層的uart_flush_chars()調(diào)用,最終調(diào)用的是w83697uart_start_tx().

            檢測當沒有數(shù)據(jù)要傳輸?shù)臅r候,關(guān)閉傳送中斷,在傳送之前與傳送完之后都有檢測.

            最重要的一點是如果傳送緩沖區(qū)當中的字符數(shù)已經(jīng)小于WAKEUP_CHARS, 則可以喚醒當前正在使用串口進行傳送的進程,這里是通過tasklet機制來完成,這也是一異步執(zhí)行機制.

            linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

            linux相關(guān)文章:linux教程




            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉