芯片串口用来做数据通信使用,需要调试串口时则使用usb转串口debug用。
内核需要几个配置的地方:
1)
-> Device Drivers
| -> USB support (USB_SUPPORT [=y])
| -> USB Serial Converter support (USB_SERIAL [=y])
2)usb转串口的driver,选择相应厂商
3) 启动命令加上console=ttyUSB0
文件系统中
4)在/dev/ 下 mknod -m 660 console c 5 1
这样配置之后基本上就ok了。
但是中间遇到问题。
如果配置了上述配置之后,usb识别到设备之后会调用
printk.c中
void register_console(struct console *newcon)
其中有一段:
if (newcon->flags & CON_PRINTBUFFER) {
/*
* release_console_sem() will print out the buffered messages
* for us.
*/
spin_lock_irqsave(&logbuf_lock, flags);
con_start = log_start;
spin_unlock_irqrestore(&logbuf_lock, flags);
}
release_console_sem();
release_console_sem();
就会把之前printk函数缓存在log_buf中的信息全打印出来。
这也解释了为什么printk在串口初始化之前就能使用,实际是缓存在log_buf中。
我使用过程中发现 register_console执行之后就打印信息就停在那里最后打印是:
console [ttyUSB0] enabled
终端没有响应。
原因在/init/main.c static int __init kernel_init(void * unused)中找到的。
/* Open the /dev/console on the rootfs, this should never fail */
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
想正常使用只能添加msleep在 这段代码前面。