linux kernel下输入输出console如何实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux kernel下输入输出console如何实现

/skyflying2012/article/details/410783492012最近工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台。利用这个机会,学习下printk如何选择往哪个console输出以及user空间下控制台如何选择,记录与此,与大家共享,也方便自己以后翻阅。Kernel版本号:3.4.55依照我的思路(还是时间顺序)分了4部分,指定kernel调试console ,kernel下printk console的选择,kernel下console的注册,user空间console 的选择。

一指定kernel调试console首先看kernel启动时如何获取和处理指定的console参数。kernel的启动参数cmdline可以指定调试console,如指定‘console=ttyS0,115200’,kernel如何解析cmdline,我之前写了一篇博文如下:

/skyflying2012/article/details/41142801

根据之前的分析,cmdline中有console=xxx,start_kernel中parse_args遍历.init.setup段所有obs_kernel_param。

kernel/printk.c中注册了‘console=’的解析函数console_setup (注册了obs_kernel_param),所以匹配成功,会调用console_setup来解析,如下:[cpp] view plain copy static int

__init console_setup(char *str) { char

buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */

char *s, *options, *brl_options = NULL; int idx;

#ifdef CONFIG_A11Y_BRAILLE_CONSOLE if

(!memcmp(str, "brl,", 4)) { brl_options = "";

str += 4; } else if (!memcmp(str, "brl=", 4))

{ brl_options = str + 4; str =

strchr(brl_options, ','); if (!str)

{ printk(KERN_ERR "need port name after

brl=\n"); return 1; }

*(str++) = 0; } #endif /* * Decode str into name, index, options. */ if (str[0]

>= '0' && str[0] <= '9') { strcpy(buf, "ttyS"); strncpy(buf + 4, str, sizeof(buf) - 5); } else { strncpy(buf, str, sizeof(buf) - 1); }

buf[sizeof(buf) - 1] = 0; if ((options = strchr(str, ',')) != NULL) *(options++) = 0; #ifdef __sparc__

if (!strcmp(str, "ttya")) strcpy(buf, "ttyS0"); if (!strcmp(str, "ttyb")) strcpy(buf, "ttyS1"); #endif

for (s = buf; *s; s++) if ((*s >= '0' && *s <= '9') || *s == ',') break; idx = simple_strtoul(s, NULL, 10); *s = 0;

__add_preferred_console(buf, idx, options, brl_options); console_set_on_cmdline = 1; return 1; }

__setup("console=", console_setup); 参数是console=的值字符串,如“ttyS0,115200”,console_setup对console=参数值做解析,以ttyS0,115200为例,最后buf=“ttyS”,

idx=0,options="115200",brl_options=NULL。调用

__add_preferred_console如下:[cpp] view plain copy /* * If exclusive_console is non-NULL then only this console is to be printed to. */ static struct console *exclusive_console; /* * Array of consoles built from command line options (console=) */ struct console_cmdline

{ char name[8];

/* Name of the driver */ int index;

/* Minor dev. to use */ char *options;

/* Options for the driver */ #ifdef

CONFIG_A11Y_BRAILLE_CONSOLE char

*brl_options; /* Options for braille driver */

#endif }; #define MAX_CMDLINECONSOLES 8

static struct console_cmdline

console_cmdline[MAX_CMDLINECONSOLES]; static int selected_console = -1; static int preferred_console = -1; int console_set_on_cmdline;

相关文档
最新文档