• uboot传递参数'console=ttyXXX'的作用


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

    __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 设备驱动

  • 相关阅读:
    创建Hive/hbase相关联的表异常
    CDH5.2+CM5.2+impala2+Spark1.1 集群搭建基础环境准备
    【JavaWeb】(10)微信公众号开发进阶
    Ambari-stack介绍
    OSGi中的ServletContext
    笔试面试1 用C实现C库函数itoa, atoi
    SGU 114. Telecasting station 三分or找中位数
    face++实现人脸识别
    磁盘接口与磁盘扫描
    CSDN开源夏令营 百度数据可视化实践 ECharts(4)
  • 原文地址:https://www.cnblogs.com/baiduboy/p/7688319.html
Copyright © 2020-2023  润新知