对于基于Arm的Linux嵌入式系统,串口设备名称在
drivers/tty/serial/amba-pl011.c定义。实际的串口设备名称在类型struct uart_driver的实例amba_reg和类型struct console的实例amba_console里定义。我们就试着修改这两个实例变量来修改串口设备名。
static struct uart_driver amba_reg = {
.owner = THIS_MODULE,
.driver_name = "ttyAMA",
.dev_name = "ttyAMAhanj", //修改之前是ttyAMA
.major = SERIAL_AMBA_MAJOR,
.minor = SERIAL_AMBA_MINOR,
.nr = UART_NR,
.cons = &amba_console,
};
这个amba_reg变量的dev_name域定义了串口设备名称,是实实在在的设备名称,在/dev目录里会生成具体设备文件的。
static struct console amba_console = {
.name = "ttyAMAconhanj",//修改之前是 ttyAMA
.write = pl011_console_write,
.device = uart_console_device,
.setup = pl011_console_setup,
.match = pl011_console_match,
.flags = CON_PRINTBUFFER | CON_ANYTIME,
.index = -1,
.data = &amba_reg,
};
这个amba_console变量的name域是内核控制台设备名称,它与amba_reg.dev_name定义的设备一一对应。内核控制台设备是内核输出日志的,是虚拟设备,相当于/dev下面的设备文件在内核代码里的别名。可以看到amba_console.data 指向了amba_reg,而amba_reg.cons 指向了amba_console,它们捉对取暖。
代码修改之前,串口设备名和内核控制台设备名都是以ttyAMA开头,后面加上数字作为名称。经过这样修改后,我们再编译并更新内核后者两个名称就会区分不开来,达到我们对内核代码的实践性学习。
由于内核控制台设备名称,启动qemu-arm-system时给的内核命令行参数console的值也需要修改,从 "console=ttyAMA0"修改为 "console=ttyAMAconhanj0"。否则的话,启动就会失败。
下面的演示修改之后的编译和运行模拟器:
cd ~/linuxQemuEvb/linux-work/
./build.sh
cd aqemu
cat cp-kernel.sh
#! /bin/bash
cp ../arch/arm/boot/zImage .
cp ../arch/arm/boot/dts/vexpress-v2p-ca9.dtb .
./run-nolcd.sh
进入模拟器控制台之后,我们看看串口设备名和内核控制台设备名修改了没有。
列出/dev下面以ttyAMA开头的设备:
/ # ls /dev/ttyAMA* -l
crw-rw---- 1 root 0 204, 64 Jul 16 08:58 /dev/ttyAMA0
crw-rw---- 1 root 0 204, 65 Jul 16 08:58 /dev/ttyAMA1
crw-rw---- 1 root 0 204, 66 Jul 16 08:57 /dev/ttyAMA2
crw-rw---- 1 root 0 204, 67 Jul 16 08:58 /dev/ttyAMA3
-rw-r--r-- 1 root 0 3 Aug 1 01:46 /dev/ttyAMA4
crw-rw---- 1 root 0 204, 64 Aug 1 03:30 /dev/ttyAMAhanj0
crw-rw---- 1 root 0 204, 65 Aug 1 03:30 /dev/ttyAMAhanj1
crw-rw---- 1 root 0 204, 66 Aug 1 03:30 /dev/ttyAMAhanj2
crw-rw---- 1 root 0 204, 67 Aug 1 03:30 /dev/ttyAMAhanj3
可以看出来7~10行已经列出来来ttyAMAhanj0~4设备,修改成功。
再看看内核控制台设备名称,从下面的日志看出来名称里也含有hanj,修改成功。
/ # cat /proc/consoles
ttyAMAconhanj0 -W- (EC p a) 204:64
本文使用Qemu模拟Arm处理器,测试修改内核源码的修改效果,这是一个学习linux内核快捷的方法。源码参考:
https://gitee.com/han263012/linux-sty/commit/b177d8d。