當前位置:編程學習大全網 - 源碼下載 - windows PC 串口控制臺

windows PC 串口控制臺

通用控制臺和串口控制臺 控制臺的思想 過去,計算機是壹個龐然大物,附帶著十幾個終端設備。其中壹個終端具有“系統控制臺”的特殊作用。它是唯壹用於系統恢復的單用戶模式終端,也是唯壹接受系統錯誤消息的終端。當今的計算機都配有鍵盤和顯示設備,不再帶有多個文本終端。於是“系統控制臺”就由本地鍵盤和監視器擔任。而當計算機主機沒有連接顯示硬件設備時,壹般就由串口設備擔任“系統控制臺”。把串口設備的電纜插入就可以得到診斷信息和登陸提示字。把控制臺當作控制終端是合適的。通過它作為輸入輸出通道從而可以啟動壹個根shell並發送內核消息則是完全不同的機制。我們關註的是消息是如何傳送給系統控制臺設備的。系統預設的控制臺 當在計算機中安裝了文本模式的gnu/linux系統時,系統預設的控制臺就是當前的虛擬終端。 傳送消息到控制臺的機制是由printk函數實現的。該函數使用vsprintf(lib/vsprintf.c)產生消息串,把它放入內核消息的環形緩沖區中,然後將消息傳給所有活動的console設備,只要該消息的優先級數字小於console_loglevel。 變量console_loglevel用於選擇何種消息可以輸出到系統控制臺上。預設值是DEFAUL_CONSOLE_LOGLEVEL。系統管理員可以通過寫/proc/sys/kernel/printk 該變其值。 這些優先級數值用宏KERN_ERROR,KERN_DEBUG等定義為0-7級。 if (msg_level < console_loglevel && console_drivers) { struct console *c = console_drivers; while(c) { if ((c->flags & CON_ENABLED) && c->write) c->write(c, msg, p - msg + line_feed); c = c->next; } } 大多數linux配置中只有壹個控制臺註冊,它對應於虛擬終端,代碼在consol.c中。實際的消息打印是由vt_console_print執行的。看壹下它的源碼就會發現它並不總是把消息打印到前臺虛擬終端,但可以配置為打印消息到壹個虛擬終端上。如果變量kmsg_redirect非0,其值就是那個選來接受內核消息的虛擬終端的號。該變量可以通過調用ioctl(TIOCLINUX)(壹個linux定義的tty的ioctl命令)作用到壹個虛擬終端的文件描述符上。 如果正在運行的是帶有串口的標準pc,可以通過傳遞壹個命令行選項console=給內核以選擇壹個串口作為控制臺。文件Documentation/serial-console.txt清楚地描述了所需要的整個設備和操作細節。 聲明和選擇壹個控制臺 為了聲明壹個新的控制臺設備,內核代碼應首先包含,這個頭文件定義了struct console結構和幾個flags.隨後就可以調用register_console把控制臺插入到活動控制臺的數據結構表格中例如以下是串口聲明和註冊過程: static struct console sercons = { name: "ttyS", write: serial_console_write, device: serial_console_device, wait_key: serial_console_wait_key, setup: serial_console_setup, flags: CON_PRINTBUFFER, index: -1, }; void __init serial_console_init(void) { register_console(&sercons); } 寫壹個控制臺驅動程序 console的初始化console結構中有幾個成員只是為了使console的初始化和配置過程簡單.name和setup成員用於命令行解析系統啟動時,為每個"console="內核命令行參數調用console_setup (在kernel/printk.c中).該函數保存所有命令行的命令到壹個數組中.當以後調用register_console註冊壹個console時,如果發現命令數組中的名字和console的名字域匹配,則以命令行中相應的option為參數調用console的setup初始化函數.使得console符合命令行的要求. console標誌CON_ENABLE 指明該控制臺設備是否是默認啟動的,只有啟動的控制臺才接受內核消息,如果內核命令行選中了 這個console,並且console的setup函數調用成功,系統自動為該console設置此標誌. 進壹步,此標誌為首次註冊的console設立.這就是串口或並口控制臺在自己的console結構中默認都沒有 設置這壹標誌的原因.默認情況下串,並口不是作為控制臺使用的.除非用戶在命令行指定串,並口作為 控制臺或者沒有虛擬終端設備作為默認控制臺.CON_PRINTBUFFER 此標誌請求將緩沖的內核消息輸出到這個控制臺上.例如串,並口設置此標誌就可顯示所有內核啟動消息: 當註冊串,並口為console時設置了此標誌,內核隨即把緩存的消息輸出到它們上面.CON_CONSDEV 控制臺請求成為優先的設備,優先的設備總是被放入console表的第壹項. ----------------------------控制臺數據結構表struct console { char name[8]; //設備名用於解析命令行選項console= void (*write)(struct console *,const char *,unsigned); int (*read)(struct console*,const char*,unsigned); struct tty_driver *(*device)(struct console, void (*unblank)(void);int*); //當前作為console的tty設備 int (*setup)(struct console*,char*); 初始化串口函數 short falgs; short index; //設備數組中為console設備的索引號 int cflag; struct console *next; } console_drivers是表頭指針(不是console_driver)

  • 上一篇:飼養追溯
  • 下一篇:求各種進出口貿易專業術語和解釋。
  • copyright 2024編程學習大全網