运行环境
CPU:君正M300
运行操作系统:Linux5.10
调试环境:Ubuntu18
调试模块:uart
linux查看串口收发字节统计计数
执行:cat /proc/tty/driver/INGENIC\ serial
serinfo:1.0 driver revision:
1: uart:uart1 mmio:0x10031000 irq:54 tx:5807 rx:179 RTS|DTR
2: uart:uart2 mmio:0x10032000 irq:53 tx:0 rx:0
3: uart:uart3 mmio:0x10033000 irq:52 tx:0 rx:0
4: uart:uart4 mmio:0x10034000 irq:51 tx:0 rx:0
5: uart:uart5 mmio:0x10035000 irq:50 tx:0 rx:0
6: uart:uart6 mmio:0x10036000 irq:49 tx:0 rx:0
7: uart:uart7 mmio:0x10037000 irq:48 tx:0 rx:0
内核代码在 drivers/tty/serial/serial_core.c
static const struct tty_operations uart_ops = {
.install = uart_install,
.open = uart_open,
.close = uart_close,
.write = uart_write,
.put_char = uart_put_char,
.flush_chars = uart_flush_chars,
.write_room = uart_write_room,
.chars_in_buffer= uart_chars_in_buffer,
.flush_buffer = uart_flush_buffer,
.ioctl = uart_ioctl,
.throttle = uart_throttle,
.unthrottle = uart_unthrottle,
.send_xchar = uart_send_xchar,
.set_termios = uart_set_termios,
.set_ldisc = uart_set_ldisc,
.stop = uart_stop,
.start = uart_start,
.hangup = uart_hangup,
.break_ctl = uart_break_ctl,
.wait_until_sent= uart_wait_until_sent,
#ifdef CONFIG_PROC_FS
.proc_show = uart_proc_show,
#endif
.tiocmget = uart_tiocmget,
.tiocmset = uart_tiocmset,
.set_serial = uart_set_info_user,
.get_serial = uart_get_info_user,
.get_icount = uart_get_icount,
#ifdef CONFIG_CONSOLE_POLL
.poll_init = uart_poll_init,
.poll_get_char = uart_poll_get_char,
.poll_put_char = uart_poll_put_char,
#endif
};
ingenic_uart.c
serial_ingenic_init
->uart_register_driver,这里会注册uart_ops,故可执行proc_show
内核函数调用关系
ingenci_uart.c
static struct uart_driver serial_ingenic_reg = {
.owner = THIS_MODULE,
.driver_name = "INGENIC serial",
.dev_name = "ttyS",
.major = TTY_MAJOR,
.minor = 64,
.nr = PORT_NR,
.cons = INGENIC_CONSOLE,
};
ingenic_uart.c
serial_ingenic_init
->uart_register_driver
->tty_register_driver
->proc_tty_register_driver,这里注册了INGENIC serial的节点