0 导读
1)分析printk()函数
2)使用printk()调试驱动
1在驱动调试中,使用printk(),是最简单,最方便的办法
当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上
当uboot的命令行里的“console=ttySA0,115200”时,表示printk()输出在串口UART0上,波特率=115200
当uboot的命令行里的“console=tty1 console=ttySA0,115200”时,表示printk()同时输出在串口上,以及开发板的LCD屏上
显然printk(),还是根据命令行参数来调用不同控制台的硬件处理函数
内核又是怎么根据上面命令行参数来确定printk()的输出设备?
2我们以“console=ttySA0,115200”为例,进入linux-3.4.2\kernel\printk.c
找到以下一段:
__setup("console=", console_setup);
其中__setup()的作用就是:
若uboot传递进来的命令行字符串里含有“console=”,便调用console_setup()函数,并对“console=”后面带的字符串"ttySA0,115200"进行分析。
3 我们以*str= "ttySA0,115200"为例,console_setup()函数如下所示
static int __init console_setup(char *str) //*str="ttySA0,115200"
{
char name[sizeof(console_cmdline[0].name)]; // char name[8]
char *s, *options;
int idx;
/*
* Decode str into name, index, options.
*/
if (str[0] >= '0' && str[0] <= '9') {
strcpy(name, "ttyS");
strncpy(name + 4, str, sizeof(name) - 5);
} else {
strncpy(name, str, sizeof(name) - 1); //*name="ttySA0, "
}
name[sizeof(name) - 1] = 0; //*name="ttySA0"
if ((options = strchr(str, ',')) != NULL) //找到',',返回给options,所以options=",115200"
*(options++) = 0; //*options="115200", *str="ttySA0"
#ifdef __sparc__
if (!strcmp(str, "ttya"))
strcpy(name, "ttyS0");
if (!strcmp(str, "ttyb"))
strcpy(name, "ttyS1");
#endif
for (s = name; *s; s++) //*s="0"
if ((*s >= '0' && *s <= '9') || *s == ',')
break;
idx = simple_strtoul(s, NULL, 10)