日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

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

          linux UART串口驅(qū)動(dòng)開(kāi)發(fā)文檔

          作者: 時(shí)間:2012-09-06 來(lái)源:網(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è)置等, 在傳送時(shí)打開(kāi)傳送中斷即會(huì)產(chǎn)生傳送中斷.

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

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

          接收中斷讀空FIFO的判斷:

          status = UART_GET_FR(port);

          while (UART_RX_DATA(status) max_count--) {

          ……

          }

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

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

          do {

          status = UART_GET_FR(port);

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

          3. 的參數(shù)配置

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

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

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

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

          √串口次設(shè)備號(hào)(由驅(qū)動(dòng)中的最低次設(shè)備號(hào)依次累加)

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

          w83697的三個(gè)串口對(duì)應(yīng)中斷如下:

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

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

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

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

          w83977的兩個(gè)串口對(duì)應(yīng)中斷如下:

          uart 1: 讀寫(xiě)數(shù)據(jù)寄存器偏移為00x3F8, 對(duì)應(yīng)EGPIO[1].

          uart 2: 讀寫(xiě)數(shù)據(jù)寄存器偏移為00x2F8, 對(duì)應(yīng)EGPIO[2].

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

          {

          .port = {

          .membase = (void *)W83697_UART4_BASE,

          .mapbase = W83697_UART4_BASE,

          .iotype = SERIAL_IO_MEM,

          .irq = W83697_IRQ_UART4, //串口中斷號(hào)

          .uartclk = 1846100, //uart時(shí)鐘,默認(rèn).

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

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

          .flags = ASYNC_BOOT_AUTOCONF,

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

          },

          .dtr_mask = 0,

          .rts_mask = 0,

          }

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

          驅(qū)動(dòng)文件:-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ù)中應(yīng)當(dāng)注意的要點(diǎn)如下:

          接收數(shù)據(jù)時(shí),要注意判斷FIFO是否讀空(參見(jiàn)上述2點(diǎn)中說(shuō)明).

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

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

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

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

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

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

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

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

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

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




          評(píng)論


          相關(guān)推薦

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

          關(guān)閉