嵌入式开发里, 首先需要配置一个串口,用于打印printk信息到控制台,以2440为例
这里的/dev/console(设备号 5, 1),就是控制台,用于printk信息输出到的设备, 但是呢,
/dev/console是个虚拟设备, 他需要映射到真正的tty设备, 比如2440,会映射到 ttySAC0
arm335x,会映射到ttyO0,所以内核为了统一方便,就统称命名为/dev/console,之后根据不同的平台在具体的进行映射
还以2440为例子:
2440平台架构定义了默认的串口配置:
static struct console s3c24xx_serial_console =
{
.name = S3C24XX_SERIAL_NAME, //"ttySAC"
.device = uart_console_device,
.flags = CON_PRINTBUFFER,
.index = -1,
.write = s3c24xx_serial_console_write,
.setup = s3c24xx_serial_console_setup
};
在内核初始化,会初始化控制台(console)设备
1.首先分析传入的uboot参数, 即”console=ttySAC0”
之后 分解出 name= ttySAC, index为0
3.对比 uboot传入的”ttySAC”与s3c24xx_serial_console .name是否相等
相等的话,即注册console设备
static struct uart_driver s3c24xx_uart_drv = {
.owner = THIS_MODULE,
.dev_name = "s3c2410_serial", //显示在/dev下的名字
.nr = 3,
.cons = S3C24XX_SERIAL_CONSOLE,
.driver_name = S3C24XX_SERIAL_NAME,
.major = S3C24XX_SERIAL_MAJOR, //204
.minor = S3C24XX_SERIAL_MINOR,//64
};
根据上面的驱动结构体可以看出,要注册的驱动设备号为 204, 64, 即index为0的设备
s3c2410_serial0
即 ttySAC0 对应2440架构的—-> /dev/s3c2410_serial0(204, 64) 设备
其中 ttySAC对应的是2440结构
0对应第1个设备
ttySAC0 —>/dev/s3c2410_serial0
ttySAC1 —>/dev/s3c2410_serial1
ttySAC2 —>/dev/s3c2410_serial2
总结:
1.uboot的传入参数 console=”ttySAC0”, 即ttySAC0不是真正的设备, 通过ttySAC来对应平台(因为不同平台对应的名字 不一样), 0代表第1个设备
2./dev/console指向 (204, 64)的设备, 具体根据平台搜索代码默认的定义