应客户需求,需要将Android系统里面的串口4(/dev/ttyS4)节点名称修改为/dev/ttyS9。
由于设备节点都是在驱动里面注册生成的于是查看串口驱动。根据log信息找到了系统串口驱动\kernel\drivers\tty\serial\8250\8250_dw.c中的注册函数dw8250_probe。该函数中找到serial8250_register_8250_port,这个是注册设备节点的函数。然后查看serial8250_register_8250_port函数定义(kernel\drivers\tty\serial\8250\8250_core.c),找到了后续注册节点的函数uart_add_one_port,继续查看该函数(位于kernel\drivers\tty\serial\serial_core.c)定义,该函数又是调用tty_port_register_device_attr进行注册的,继续跟踪该函数(kernel\drivers\tty\tty_port.c),该函数又是调用了tty_register_device_attr(位于kernel\drivers\tty\tty_io.c)进行注册。添加log分析得知串口节点的名字获取是由tty_line_name产生的。于是查看tty_line_name的实现:
static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)
{
if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
return sprintf(p, "%s", driver->name);
else
return sprintf(p, "%s%d", driver->name,
index + driver->name_base);
}
}
通过打印得知串口节点设备名称是由驱动名称 driver->name和串口序号index 组成的,于是添加判断 driver->name是否为"ttyS",index是否为4,如果是就替换。