UART 調用流程分析小結

1, serial_in ------ 用於讀取UART的寄存器值;

2,serial_out ------ 用於寫入UART的寄存器值
     serial_out(struct uart_rk_port *up, int offset, unsigned char value)

2.serial_rk_tx_empty  ---------- 用於判斷髮送緩衝區是否爲空


RK---Serial 的串口驅動流程:
發送一個字符的函數調用流程:

 serial_rk_pm    ------------ enable: 使能串口 pclk clk等時鐘
          |
          |
 serial_rk_startup    --------- 啓動串口做一些初始化設置:申請中斷,再次使能時鐘,清空FIFO buffer; 初始化UART;設置DMA傳輸的tx_buffer
          |
          |
serial_rk_set_termios   ------- 設置 波特率和 應用設置的參數  同時設置了 serial_rk_start_rx_dma中設置收數據的DMA
          |
          |
serial_rk_start_tx    -------------開始發送數據
          |
          |
serial_rk_enable_ier_thri   -------- 使能UART_IER寄存器中的:Enable Transmitter holding register int 使能傳輸

          |
          |
serial_rk_handle_port   --------- 處理 port 中斷,在中斷處理函數中 //iir = 0xC2 ---- fifo enable && 0010-- THR empry,一旦THR Empty檢測到該中斷時,啓用中斷處理函數
          |
          |
               判斷up->iir 是否 THR empty 也就是 ,然後再調用transmit_chars

          |
          |
  判斷 __stop_tx     ------------ 判斷傳輸結束
          |
          |
 中斷處理結束
          -------------- serial_rk_tx_empty ------判斷是否傳輸爲空:serial_rk_tx_empty



UART寄存器分析:
    1, UART_THR : Transmit Holding Register  ----------  這個就是串口控制器的發送數據寄存器,從CPU搬運到UART控制器,一旦數據運送到這裏,數據就會通過TX發送出去
               注意1): 由於UART_THR 的寄存器,數據必須在其爲空時才能寫進去,不然之前存在的數據就會被覆蓋掉,造成數據丟失;
                              而判斷的標記就是 The THR Empty(THRE) (LSR[5])bit
                    2): 則是UART寄存器的數據寄存器的長度,一次能發送的數據長度:在FIFO沒有滿之前,都可以寫入X個字,如果滿了,再寫入也會導致數據丟失


    2, UART_IER  : Interrupt Enable Register ----- UART 中斷使能寄存器:其中第二位爲 使能THR也就是發送寄存器爲空時會發一箇中斷產生;
         
   3, UART_IIR : Interrupt  Identification Register ------ UART 中斷識別寄存器,也可以叫做UART中斷狀態寄存器,可以通過讀取該寄存器的值,判斷是哪個產生的中斷:
          0010 ----- THR empty 寄存器;

   4, UART_FCR : FIFO Control Register   -----  UART FIFO 控制寄存器:有字段TX empty Trigger 用於設置產生TX empty的條件: 00 ---- FIFO empty;11 ---- 一半 FIFO 滿的情況爲中斷產生條件;

  5,UART_LSR : Line Status Register ----- 傳輸線狀態寄存器:獲取transmit的一些數據爲空的狀態;

結合上述寄存器,我們可以得到下面的一些流程:
發送數據的過程: apk 調用OutputStream write() 函數 ----- > 會調用到啓動串口傳輸 serial_rk_pm 打開串口傳輸的時鐘-----> serial_rk_startup 設置串口的參數,申請中斷等-----> serial_rk_set_termios 設置雙方通訊需要的參數  ------>  serial_rk_start_tx  準備啓動,然後就打開UART_IER寄存器,在使能了該寄存器後;---->等到串口發送寄存器是否爲空的中斷,若該中斷來臨,則進一步判斷是否爲THR empty產生的,如果是,就準備搬運數據到 UART_THR 。 ------ 而串口控制器在等待UART_THR發到串口線上後,若爲空,再次產生中斷,繼續上述的搬運。----------- 判斷是否數據緩衝區爲空或者------ 則停止傳輸_stop_tx -----> 中斷處理結束後,再恢復serial_rk_tx_empty 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章