問題:輸入字元,沒有回顯,輸入命令沒有輸出
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 語法學習的平台,在這裡就說一下在控制台下的輸入驗證吧。控制台狀態下,程式的輸入輸出是流的方式進行的,也就是游標是向前的 如果不做特殊處理的話 輸入的驗證,只能等使用...