使用dmesg打印所有日志( 七 )

< N_TTY || disc >= NR_LDISCS)return -EINVAL;spin_lock_irqsave(&tty_ldisc_lock, flags);tty_ldiscs[disc] = new_ldisc;//tty_ldiscs[0]存放的是N_TTY对应的线路规程操作集new_ldisc->num = disc;//0new_ldisc->refcount = 0;spin_unlock_irqrestore(&tty_ldisc_lock, flags);return ret;}*/tty_ldisc_begin();//这段代码前面是注册了第0个(逻辑上1)线路规程//依次调用从__con_initcall_start到__con_initcall_end之间的函数指针//会调用两个函数就是con_init()和serial8250_console_init()call = __con_initcall_start;while (call < __con_initcall_end) {(*call)();call++;}}static int __init serial8250_console_init(void){if (nr_uarts > UART_NR)//串口数量不能大于3个nr_uarts = UART_NR;serial8250_isa_init_ports();//对三个串口的uart_8250_port结构静态常量serial8250_ports结构进行初始化,主要是将up->port.ops = &serial8250_pops/*static struct console serial8250_console = {.name= "ttyS",.write= serial8250_console_write,//写方法.device= uart_console_device,//tty驱动.setup= serial8250_console_setup,//设置串口波特率,也就是设置串口 。很重要,里面涉及到平台特性,波特率相关 。.early_setup= serial8250_console_early_setup,.flags= CON_PRINTBUFFER | CON_ANYTIME,.index= -1,.data= http://www.kingceram.com/post/&serial8250_reg,};*/register_console(&serial8250_console);//在这里注册serial8250_console真正的console终端return 0;}console_initcall(serial8250_console_init);/*serial8250_console_init()函数会比serial8250_probe()先调用,所以调用register_console的时候,port还没有初始化,所以当register_console调用serial8250_console_setup()设置buad,parity bits的时候,serial8250_console_setup()会检测port->iobase和port->membase是否是有效值,如果不是就返回,放弃初始化console,所以实际上,console不是在serial8250_console_init()里边初始化,如果要在serial8250_console_init初始化,需要将port静态初始化.当serial8250_probe()调用uart_add_one_port->uart_configure_port:if (port->cons && !(port->cons->flags & CON_ENABLED)){printk("%s retister console\n", __FUNCTION__);register_console(port->cons);}该函数会检查console有没有初始化,如果没有初始化,则调用register_console来初始化.所以console放在这里初始化也是比较好一些,可以将console_initcall(serial8250_console_init) comment.*///对三个串口的uart_8250_port结构静态常量serial8250_ports结构进行初始化,主要是将up->port.ops = &serial8250_popsstatic void __init serial8250_isa_init_ports(void){struct uart_8250_port *up;static int first = 1;int i, irqflag = 0;if (!first)//静态变量,serial8250_console_init()第一次进入这个函数,之后serial8250_init()再进入这个函数就会直接返回return;first = 0;//对三个串口的uart_8250_port结构serial8250_ports结构体进行初始化for (i = 0; i < nr_uarts; i++) {struct uart_8250_port *up = &serial8250_ports[i];up->port.line = i;//0代表串口0,1代表串口1spin_lock_init(&up->port.lock);init_timer(&up->timer);//初始化定时器up->timer.function = serial8250_timeout;//初始化定时器的超时函数//ALPHA_KLUDGE_MCR needs to be killed.up->mcr_mask = ~ALPHA_KLUDGE_MCR;up->mcr_force = ALPHA_KLUDGE_MCR;//初始化uart_8250_port指向的uart_port字段port的操作up->port.ops = &serial8250_pops;/*static struct uart_ops serial8250_pops = {.tx_empty= serial8250_tx_empty,.set_mctrl= serial8250_set_mctrl,.get_mctrl= serial8250_get_mctrl,.stop_tx= serial8250_stop_tx,.start_tx= serial8250_start_tx,.stop_rx= serial8250_stop_rx,.enable_ms= serial8250_enable_ms,.break_ctl= serial8250_break_ctl,.startup= serial8250_startup,.shutdown= serial8250_shutdown,.set_termios= serial8250_set_termios,.set_ldisc= serial8250_set_ldisc,.pm= serial8250_pm,.type= serial8250_type,.release_port= serial8250_release_port,.request_port= serial8250_request_port,.config_port= serial8250_config_port,.verify_port= serial8250_verify_port,#ifdef CONFIG_CONSOLE_POLL.poll_get_char = serial8250_get_poll_char,.poll_put_char = serial8250_put_poll_char,#endif};*/}if (share_irqs)//中断是否共享(这里设置成不共享)irqflag = IRQF_SHARED;//条件不满足,不会进来初始化for (i = 0, up = serial8250_ports;i