转载于:http://blog.csdn.net/jgdu1981/article/details/8643057

linux启动时uboot传递进console=ttyS0,115200n8的参数

内核中用__setup()宏声明参数处理的方法

关于__setup宏参考 early_param和__setup宏

  1. __setup("console=", console_setup);

console_setup函数处理

1.console_cmdline结构体

  1. struct console_cmdline
  2. {
  3. char    name[8];        //驱动名
  4. int index;      //次设备号
  5. char    *options;       //选项
  6. #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
  7. char    *brl_options;
  8. #endif
  9. };

2.console_setup

  1. static int __init console_setup(char *str)
  2. {
  3. char buf[sizeof(console_cmdline[0].name) + 4]; //分配驱动名+index的缓冲区
  4. char *s, *options, *brl_options = NULL;
  5. int idx;
  6. #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
  7. if (!memcmp(str, "brl,", 4)) {
  8. brl_options = "";
  9. str += 4;
  10. } else if (!memcmp(str, "brl=", 4)) {
  11. brl_options = str + 4;
  12. str = strchr(brl_options, ',');
  13. if (!str) {
  14. printk(KERN_ERR "need port name after brl=\n");
  15. return 1;
  16. }
  17. *(str++) = 0;
  18. }
  19. #endif
  20. if (str[0] >= '0' && str[0] <= '9') { //第一个参数属于[0,9]
  21. strcpy(buf, "ttyS");    //则将其驱动名设为ttyS
  22. strncpy(buf + 4, str, sizeof(buf) - 5);//将次设备号放其后面
  23. } else {
  24. strncpy(buf, str, sizeof(buf) - 1); //放设备号到其后面
  25. }
  26. buf[sizeof(buf) - 1] = 0;
  27. if ((options = strchr(str, ',')) != NULL)   //获取options
  28. *(options++) = 0;
  29. #ifdef __sparc__
  30. if (!strcmp(str, "ttya"))
  31. strcpy(buf, "ttyS0");
  32. if (!strcmp(str, "ttyb"))
  33. strcpy(buf, "ttyS1");
  34. #endif
  35. for (s = buf; *s; s++)
  36. if ((*s >= '0' && *s <= '9') || *s == ',')
  37. break;
  38. idx = simple_strtoul(s, NULL, 10);  //获取次设备号
  39. *s = 0;
  40. __add_preferred_console(buf, idx, options, brl_options);
  41. console_set_on_cmdline = 1;
  42. return 1;
  43. }

__add_preferred_console函数

  1. static int __add_preferred_console(char *name, int idx, char *options,char *brl_options)
  2. {
  3. struct console_cmdline *c;
  4. int i;
  5. for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)  //可以最多8个console
  6. if (strcmp(console_cmdline[i].name, name) == 0 && console_cmdline[i].index == idx) {
  7. //比较已注册的console_cmdline数组中的项的名字及次设备号,若console_cmdline已经存在
  8. if (!brl_options)
  9. selected_console = i;   //设置全局selected_console索引号
  10. return 0;       //则返回
  11. }
  12. if (i == MAX_CMDLINECONSOLES)   //判断console_cmdline数组是否满了
  13. return -E2BIG;
  14. if (!brl_options)
  15. selected_console = i;   //设置全局selected_console索引号
  16. c = &console_cmdline[i];    //获取全局console_cmdline数组的第i项地址
  17. strlcpy(c->name, name, sizeof(c->name));  //填充全局console_cmdline的驱动名
  18. c->options = options;    //填充配置选项115200n8
  19. #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
  20. c->brl_options = brl_options;
  21. #endif
  22. c->index = idx;  //填充索引号0
  23. return 0;
  24. }

整体的作用是根据uboot传递的参数设置全局console_cmdline数组 该数组及全局selected_console,在register_console中会使用到 二 console 设备驱动

uboot传递参数'console=ttyXXX'的作用的更多相关文章

  1. uboot向内核模块传递参数的方法

    1 模块参数 定义模块参数 1 module_param(name, type, perm); 定义一个模块参数, name 变量名 type 数据类型 bool:布尔型 invbool:一个布尔型( ...

  2. uboot 如何向内核传递参数

    a.uboot 向内核传递的参数有两种类型 1.一个是bootargs 2.一个是环境参数, 而环境参数的设置靠的是 Y:\junda\JdLinuxApp\A1801_uboot\source\u- ...

  3. C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习

    1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...

  4. 【openresty】向lua代码中传递参数

    前面介绍FormInputNginxModule模块时,明白了openresty如何获取post提交的数据. 然后,如果需要通过lua处理这些数据,需要把数据作为参数传递到lua中,lua获取了这些数 ...

  5. Vue系列:通过vue-router如何传递参数

    使用vue-router 来实现webapp的页面跳转,有时候需要传递参数,做法如下: 参考文献:http://router.vuejs.org/en/named.html  主要有以下几个步骤: ( ...

  6. 利用call与apply向函数传递参数

    Js中函数对象都有call与apply两个方法属性,二者使用方法和功能一样,只是传递参数的格式不同,call逐个传递单个参数,apply一次性传递一个参数数组. 这两个方法可以改变函数的调用对象,并且 ...

  7. .net中常用的几种页面间传递参数的方法

    转自:http://www.cnblogs.com/lxshanye/archive/2013/04/11/3014207.html 参考:http://www.cnblogs.com/zhangka ...

  8. ref和out 传递参数(C#)

    1.参数传递默认都是传递栈空间里面存储的内容 2.如果添加了ref那么传递的都是栈空间地址,而不再是栈空间里面的内容 3.如果添加了out,那么传递的也是栈空间的地址 //写一个方法计算一个int类型 ...

  9. C#传递参数

    与函数交换数据的最好方式就是传递参数,在C#中有四种方法来控制参数如何传递给目标方法 C#中的参数修饰符 无修饰 如果一个参数没有用参数修饰符,则认为它将按值传递 out 输出参数由被调用的方法赋值. ...

随机推荐

  1. 编码问题2 utf-8和Unicode的区别

    utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念 要想先讲清楚他们的区别,首先应该讲讲Unicode的来由. 众所周知 ...

  2. iosselect插件

    好用的时间选择器/地址选择器插件 iosselect.js

  3. 1250 Fibonacci数列(矩阵乘法)

    1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn ...

  4. ubuntu彻底卸载mysql并且重新安装

    环境: root@ubuntu:/usr/local/mysql/data# uname -a Linux ubuntu 4.4.0-87-generic #110-Ubuntu SMP Tue Ju ...

  5. matlab 计算灰度图像的一阶矩、二阶矩、三阶矩

    ​   一阶矩,定义了每个颜色分量的平均强度 ​  二阶矩,反映待测区域颜色方差,即不均匀性 ​  三阶矩,定义了颜色分量的偏斜度,即颜色的不对称性 close all;clear all;clc; ...

  6. Leetcode题目160.相交链表(简单)

    题目描述 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = ...

  7. OUC_Summer Training_ DIV2_#14 724

    又落下好多题解啊...先把今天的写上好了. A - Snow Footprints Time Limit:1000MS     Memory Limit:262144KB     64bit IO F ...

  8. JS基础_数组的遍历

    遍历:将数组中所有的元素都取出来 1.for循环 var arr = ["1","2","3"]; for(let i=0;i<arr ...

  9. 在windows系统搭建并运行一个Flutter项目

    搭建Flutter之前需要已经安装好相应的Flutter开发环境,如果没安装好相应环境的可以查看在windows系统搭建Flutter开发环境 搭建Flutter项目可以通过命令行搭建,或者通过and ...

  10. requests和BeautifulSoup模块的使用

    用python写爬虫时,有两个很好用第三方模块requests库和beautifulsoup库,简单学习了下模块用法: 1,requests模块 Python标准库中提供了:urllib.urllib ...