关闭

register_console

300人阅读 评论(0) 收藏 举报
分类:
前面讲过prink中最后会调用call_console_drivers 来将log通过uart 输出。
在这个函数中1458行可见是调用con->write下输出log的
1434 static void call_console_drivers(int level,
1435                                  const char *ext_text, size_t ext_len,
1436                                  const char *text, size_t len)
1437 {
1438         struct console *con;
1439 
1440         trace_console(text, len);
1441 
1442         if (level >= console_loglevel && !ignore_loglevel)
1443                 return;
1444         if (!console_drivers)
1445                 return;
1446 
1447         for_each_console(con) {
1448                 if (exclusive_console && con != exclusive_console)
1449                         continue;
1450                 if (!(con->flags & CON_ENABLED))
1451                         continue;
1452                 if (!con->write)
1453                         continue;
1454                 if (!cpu_online(smp_processor_id()) &&
1455                     !(con->flags & CON_ANYTIME))
1456                         continue;
1457                 if (con->flags & CON_EXTENDED)
1458                         con->write(con, ext_text, ext_len);
1459                 else
1460                         con->write(con, text, len);
1461         }
1462 }

138 #define for_each_console(con) \
139         for (con = console_drivers; con != NULL; con = con->next)
其实就是在在 80 struct console *console_drivers; 这个list中找,那console_drivers 具体是在哪里定义的
,con->write具体是什么呢?
一般的嵌入式系统中只有一个console driver,所以一般情况下2577行的
kernel中的console driver 是通过调用 register_console 来进行的console_drivers == NULL 条件成立
在2578行将新注册进来的newcon保存到console_drivers 中
2472 void register_console(struct console *newcon)
2473 {
2576         console_lock();
2577         if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
2578                 newcon->next = console_drivers;
2579                 console_drivers = newcon;
2580                 if (newcon->next)
2581                         newcon->next->flags &= ~CON_CONSDEV;
2582         } else {
2583                 newcon->next = console_drivers->next;
2584                 console_drivers->next = newcon;
2585         }
2586 


2631 }
2632 EXPORT_SYMBOL(register_console);


我们来看一个实例


http://lxr.free-electrons.com/source/drivers/tty/serial/pic32_uart.c
55 static struct console pic32_console = {
756         .name           = PIC32_SDEV_NAME,
757         .write          = pic32_console_write,
758         .device         = uart_console_device,
759         .setup          = pic32_console_setup,
760         .flags          = CON_PRINTBUFFER,
761         .index          = -1,
762         .data           = &pic32_uart_driver,
763 };
764 #define PIC32_SCONSOLE (&pic32_console)
765 
766 static int __init pic32_console_init(void)
767 {
768         register_console(&pic32_console);
769         return 0;
770 }


这个例子中调用register_console 来注册console,因此console_drivers就等于pic32_console 。而con->write 就是pic32_console_write
而pic32_console_write 教师只掉调用pic32_console_write 来显示log
static void pic32_console_putchar(struct uart_port *port, int ch)
 
712 /* console core request to output given string */
713 static void pic32_console_write(struct console *co, const char *s,
714                                 unsigned int count)
715 {
716         struct pic32_sport *sport = pic32_sports[co->index];
717         struct uart_port *port = pic32_get_port(sport);
718 
719         /* call uart helper to deal with \r\n */
720         uart_console_write(port, s, count, pic32_console_putchar);
721 }
pic32_console_putchar 的实现如下:就是写寄存器
697 {
698         struct pic32_sport *sport = to_pic32_sport(port);
699 
700         if (!(pic32_uart_readl(sport, PIC32_UART_MODE) & PIC32_UART_MODE_ON))
701                 return;
702 
703         if (!(pic32_uart_readl(sport, PIC32_UART_STA) & PIC32_UART_STA_UTXEN))
704                 return;
705 
706         /* wait for tx empty */
707         pic32_wait_deplete_txbuf(sport);
708 
709         pic32_uart_writel(sport, PIC32_UART_TX, ch & 0xff);
710 }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:123431次
    • 积分:8102
    • 等级:
    • 排名:第2603名
    • 原创:742篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    最新评论