07
01

Linux porting on different platform HowTo(4)

修改完我之前講過的irq,timer後,渡過了一段console沒有字的debug時間,從頭到尾都用ICE去trace是很悶的,現下我把console的程式碼加上,讓console跑點字出來吧

Kernel所有的訊息都是印在console上的,所以在kernel用printk其實等於直接把buffer content倒在console

但user space的application可不是這樣,當printf印訊息時,其實是透過tty driver呼叫我們的serial driver然後請serial driver幫忙印字

藉由上面的介紹,大概瞭解console driver會用到serial driver的write函式,而serial driver也必需跟tty driver註冊自己

所以serial driver要幹的事有兩件
(1)寫console api
(2)註冊tty driver

詳細的code我不在這邊介紹,我只大略說一下linux driver的寫法
(1)先找一個小,且架構清楚的driver骨架,像我就是用4510的serial driver來修改成2410可用的serial driver
(2)把函式內的程式碼全部清掉,只剩下函式宣告
(3)根據data sheet和參考程式來填寫我們的程式

底下是qt2410 console程式的部份程式碼,只要完成這個部份,kernel就會吐訊息出來了
  1. #ifdef CONFIG_SERIAL_QT2410_CONSOLE
  2. /************** console driver *****************/
  3.  
  4. static void __qt2410_console_write(struct console *co, const char *s, u_int count)
  5. {
  6.     struct uart_port *port = &__qt2410_ports[co->index];
  7.  
  8.     __xmit_string( port, s, count);
  9. }
  10.  
  11. static int __init __qt2410_console_setup(struct console *co, char *options)
  12. {
  13.     struct uart_port *port;
  14.     int baud = 115200;
  15.     int bits = 8;
  16.     int parity = 'n';
  17.     int flow = 0;
  18.  
  19.     /*
  20.      * Check whether an invalid uart number has been specified, and
  21.      * if so, search for the first available port that does have
  22.      * console support.
  23.      */
  24.     port = uart_get_console(__qt2410_ports, UART_NR, co);
  25.  
  26. //    _DPRINTK("using port = 0x%08x", (unsigned int) port);
  27.  
  28.     if (options)
  29.         uart_parse_options(options, &baud, &parity, &bits, &flow);
  30.  
  31.     __qt2410_init(port, baud);
  32.  
  33.     return uart_set_options(port, co, baud, parity, bits, flow);
  34. }
  35.  
  36. //extern struct uart_driver __qt2410_driver;
  37. static struct console __qt2410_console =
  38. {
  39.     name:           "ttySAC",
  40.     write:        __qt2410_console_write,
  41.     device:        uart_console_device,
  42.     setup:        __qt2410_console_setup,
  43.     flags:        CON_PRINTBUFFER,
  44.     index:        -1,
  45.     data:           &__qt2410_driver,
  46. };
  47.  
  48. static int __init __qt2410_console_init(void)
  49. {
  50.     register_console(&__qt2410_console);
  51.     return 0;
  52. }
  53.  
  54. console_initcall(__qt2410_console_init);
  55.  
  56. #endif
  57.  
  58.  
  59. static struct uart_driver __qt2410_driver =
  60. {
  61.     owner:           THIS_MODULE,
  62.     driver_name:     __DRIVER_NAME,
  63.     dev_name:        "ttySAC",
  64.     major:           TTY_MAJOR,
  65.     minor:           64,
  66.     nr:              UART_NR,
  67. #ifdef CONFIG_SERIAL_QT2410_CONSOLE
  68.     cons:            &__qt2410_console,
  69. #endif
  70. };

下圖是開機的過程
標籤: embedded
評論: 0 | 引用: 0 | 閱讀: 5853
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: