uart dma實現方式分析

2021-04-25 00:51:25 字數 2406 閱讀 4365

也就是cpu每次取資料必須從 dma buf中取。

up->rx_dma_buf.buf=(unsigned char *)dma_alloc_coherent(null, page_size, &up->rx_dma_addr, gfp_dma);;

up->rx_dma_addr -=clxsoc_pci_core_start;   //這裡

/** enable receive dma channel

*/spin_unlock(&up->port.lock);

//設定 dma 相關暫存器;enable_dma(rx),enable 接收dma通道,準備接收資料,分析如下

uart_start_dma(up->rx_dma_channel,up->rx_dma_addr,dma_rx_xcount,dma_mode_read);

serial_outp(up,uart_fcr,0x19);

udelay (10);

printk("enable rx dma/n");

return 1;

}設定 dma 相關暫存器, enable傳送,接收dma通道函式分析

引數:chan:通道號

phyaddr:dma buf的匯流排位址

count:dma counter暫存器的值

mode:根據讀,寫的不同,來設定dma dccr暫存器的相關值,比如說:sai,dai,drtr等值

static void uart_start_dma(int chan, unsigned long phyaddr,unsigned int count, int mode)

flags = claim_dma_lock();

disable_dma(chan);      //先disable_dma

clear_dma_ff(chan);       

set_dma_addr(chan, phyaddr);  //設定dma 源位址,目的位址;phyaddr:源位址,目的位址前面

clx_request_dma,中已經給結構體賦值,這裡只需要賦值即可

定時器函式如下:

void serial_rx_dma_timeout(struct uart_8250_port *uart)

spin_unlock_irqrestore(&uart->port.lock, flags);

mod_timer(&(uart->rx_dma_timer), jiffies + dma_rx_flush_jiffies);

}cpu 取走資料

static void serial_dma_rx_chars(struct uart_8250_port *uart)

if (status & uart_lsr_pe)

uart->port.icount.parity++;

if (status & uart_lsr_oe)

uart->port.icount.overrun++;

if (status & uart_lsr_fe)

uart->port.icount.frame++;

status &= uart->port.read_status_mask;

if (status & uart_lsr_bi)

*** = tty_break;

else if (status & uart_lsr_pe)

*** = tty_parity;

else if (status & uart_lsr_fe)

*** = tty_frame;

else

*** = tty_normal;

//從dma buf中取走資料,insert到flip_buf中

for (i = uart->rx_dma_buf.tail; irx_dma_buf.head;i++)

dma_ignore_char:

tty_flip_buffer_push(tty);  //將flip_buf中的資料push 到tty 線路規程

}接收dma中斷

static irqreturn_t uart0_rx_dma_intr(int irq, void *dev_id)

spin_unlock(&uart->port.lock);

mod_timer(&(uart->rx_dma_timer), jiffies);

return irq_handled;

}自此接收dma過程分析完畢

5.4  .shutdown   = cq8401_serial8250_shutdown  //串列埠的關閉

主要做的就是釋放dma通道,dma buf,中斷;刪除定時器,

static void cq8401_serial8250_shutdown(struct uart_port *port)

5.5 uart錯誤中斷處理,暫省略

單例的五種實現方式,及其效能分析。

在23種設計模式中,單例是最簡單的設計模式,但是也是很常用的設計模式。從單例的五種實現方式中我們可以看到程式設計師對效能的不懈追求。下面我將分析單例的五種實現方式的優缺點,並對其在多執行緒環境下的效能進行測試。單例模式適用於資源占用較多的類,保證乙個類只有乙個例項即單例。通用的做法就是構造器私有化,...

C 函式中值的傳遞方式與實現原理分析

include using namespace std 值傳遞 void change1 int n 引用傳遞 void change2 int n 指標傳遞 void change3 int n int main 執行結果 1 值傳遞 change1 int n 在傳入實參後在函式體內新定義了個i...

Spring AOP實現方式

spring中4中aop區別 1.advisor類 需要依賴spring介面,spring版本比較低時可以採取這種方式 2.適合使用者從低版本spring遷移到高版本spring,重複利用以前advice類情況 3.使用配置檔案形式定義切面,比較推薦的一種方式,使用於對維護性要求較高的情況 4.as...