wk2xxx_probe //wk2xxx_uart.c
setup_timer(&rx_timer, timer_function, 0);
timer_function //每2s统计一次接收字节数
uart_register_driver //serial_core.c
alloc_tty_driver
tty_set_operations //初始化操作函数为serial_core.c中的uart_ops,设置波特率9600,带ECHO回显属性
tty_register_driver //tty_io.c
tty_cdev_add //向driver添加操作函数为tty_fops的cdev
device_register
uart_add_one_port(&wk2xxx_uart_driver, &s->port); //添加4个tty设备,关联uart_driver和port.ops
tty_open //tty_io.c
tty->ops->open
uart_open //serial_core.c
uart_startup
uart_port_startup
uport->ops->startup
wk2xxx_startup //wk2xxx_uart.c
s->workqueue = create_singlethread_workqueue(b);//创建一条线程,专门处理该port的工作队列
INIT_WORK(&s->work, wk2xxx_work);
request_irq
wk2xxx_irq
disable_irq_nosync //进入中断处理先关闭中断
wk2xxx_dowork
queue_work(s->workqueue, &s->work); //每次中断到来,将前面初始化好的work丢进工作队列待处理
wk2xxx_work
wk2xxxirq_app
wk2xxx_rx_chars
uart_insert_char//把数据放进缓冲
wk2xxx_tx_chars
uart_circ_empty //从缓冲拿到数据
enable_irq(s->port.irq);//重新打开中断
tty_release //tty_io.c
release_tty
tty->ops->shutdown
uart_shutdown //serail_core.c
uart_port_shutdown
uport->ops->shutdown
wk2xxx_shutdown //wk2xxx_uart.c
tty_write //tty_io.c
do_tty_write
ld->ops->write
uart_write //serial_core.c
CIRC_SPACE_TO_END
uart_start
__uart_start
port->ops->start_tx
wk2xxx_start_tx //wk2xxx_uart.c
s->start_tx_flag = 1;
wk2xxx_dowork
wk2xxx_write_reg(s->port.iobase,WK2XXX_SIER,rx);//启动写FIFO空中断
tty_ioctl(TCSBRK) //tty_io.c
tty_wait_until_sent
tty_chars_in_buffer
tty->ops->chars_in_buffer
uart_chars_in_buffer //serial_core.c
uart_circ_chars_pending //等待缓冲区中的数据消耗完毕
tty->ops->wait_until_sent
uart_wait_until_sent //serial_core.c
wk2xxx_tx_empty
tty_io.c(tty_fops)
serial_core.c(tty_operations)
wk2xxx_uart.c(uart_ops)