修正串列埠控制台無法輸入的BUG

2021-04-23 19:59:53 字數 2008 閱讀 7495

問題:輸入字元,沒有回顯,輸入命令沒有輸出

4020使用的串列埠完全相容8250,8250呼叫串列埠順序如下:

serial8250_interrupt(串列埠晶元層)->

seirial8250_handle_port(串列埠晶元層)->

receive_chars(串列埠晶元層)->

uart_insert_char(串列埠抽象層)->

tty_insert_flip_char(終端裝置層)//儲存受到的資料及其他標記是否有錯誤

tty_flip_buffer_push(終端裝置層)->

flush_to_idisc(終端裝置層)->

disc->receive_buf,即n_tty_receive_buf(行規層)->

n_tty_receive_char(行規層)->

n_tty_receive_char(終端裝置層)->

echo_char(回顯)

可以看出要經過這麼多層呼叫才會出現echo_char(),回顯你輸入的字元,經過排查,我們發現問題出在tty_io.c的函式:

tty_flip_buffer_push()

void tty_flip_buffer_push(struct tty_struct *tty)

spin_unlock_irqrestore(&tty->buf.lock, flags);

if (tty->low_latency)

flush_to_ldisc((void *) tty);

else

schedule_delayed_work(&tty->buf.work, 1);

其中if (tty->low_latency)

flush_to_ldisc((void *) tty);

low_latency的值一直為0,所以進不了flush_to_ldisc()。

在《linux核心驅動第三版》中提到:

「如果 tty 驅動可高速接收資料, tty->low_latency 標誌應當設定, 它是對 tty_flip_buffer_pus 的呼叫被立刻執行當呼叫時. 否則, tty_flip_buffer_push 呼叫會排程它自己來將資料推出緩衝, 在之後近期的乙個時間點.」

可惜還是不懂是什麼意思,跟蹤這個函式的賦值情況,發現在serial_core.c以下函式中有呼叫:

uart_open()

* once we set tty->driver_data here, we are guaranteed that

* uart_close() will decrement the driver module use count.

* any failures from here onwards should not touch the count.

*/tty->driver_data = state;

tty->low_latency = (state->port->flags & upf_low_latency) ? 1 : 0;

tty->alt_speed = 0;

state->info->tty = tty;

其中這句話tty->low_latency = (state->port->flags & upf_low_latency) ? 1 : 0;,對low_latency變數進行了賦值,還有個open函式也進行了同樣的賦值。

upf_low_latency是乙個巨集定義,在serial_core.h中有定義:

#define upf_low_latency   ((__force upf_t) (1 << 13))

因此賦值語句的含義:是state->port->flags中需要對upf_low_latency位進行賦值。解決方法如下:

在/arch/arm/machsep-4020/4020.c檔案中對uart初始話的flag結構中新增upf_low_latency位

static struct plat_serial8250_port serial_platform_data = ,

重新編譯,可以正確操作控制台輸入輸出。

控制台輸入驗證

vs 提供了乙個模版 控制台應用程式 這種應用程式主要不是用來與使用者互動的,或做一些後台程式執行的展示,或用來練習 c 語法,如果當做 c 語法學習的平台,在這裡就說一下在控制台下的輸入驗證吧。控制台狀態下,程式的輸入輸出是流的方式進行的,也就是游標是向前的 如果不做特殊處理的話 輸入的驗證,只能...

控制台輸入驗證

vs 提供了乙個模版 控制台應用程式 這種應用程式主要不是用來與使用者互動的,或做一些後台程式執行的展示,或用來練習 c 語法,如果當做 c 語法學習的平台,在這裡就說一下在控制台下的輸入驗證吧。控制台狀態下,程式的輸入輸出是流的方式進行的,也就是游標是向前的 如果不做特殊處理的話 輸入的驗證,只能...

控制台輸入驗證

vs提供了乙個模版 控制台應用程式 這種應用程式主要不是用來與使用者互動的,或做一些後台程式執行的展示,或用來練習c 語法,如果當做c 語法學習的平台,在這裡就說一下在控制台下的輸入驗證吧。控制台狀態下,程式的輸入輸出是流的方式進行的,也就是游標是向前的 如果不做特殊處理的話 輸入的驗證,只能等使用...