module_init(s3c24xx_serial_modinit);
uart_register_driver(&s3c24xx_uart_drv);
tty_register_driver(normal);
cdev_init(&driver->cdev, &tty_fops);
**
open
tty_open
uart_open
uart_startup(state, 0);
s3c24xx_serial_startup,
request_irq(ourport->rx_irq, s3c24xx_serial_rx_chars, 0,s3c24xx_serial_portname(port), ourport);
request_irq(ourport->tx_irq, s3c24xx_serial_tx_chars, 0,s3c24xx_serial_portname(port), ourport);
s3c24xx_serial_rx_chars
**
write
tty_write
do_tty_write(ld->ops->write, tty, file, buf, count);
struct tty_ldisc_ops tty_ldisc_N_TTY = {
.write = n_tty_write,
n_tty_write()
uart_write()
uart_start()
__uart_start()
s3c24xx_serial_tx_chars()
**
read
tty_read
struct tty_ldisc_ops tty_ldisc_N_TTY = {
.read = n_tty_read,
n_tty_read
copy_from_read_buf(struct tty_struct *tty, unsigned char __user **b, size_t *nr)
copy_to_user(*b, &tty->read_buf[tty->read_tail], n);
s3c24xx_serial_rx_chars(中断函数)
uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN,ch, flag);
tty_insert_flip_char(tty, ch, flag);
tb->char_buf_ptr[tb->used++] = ch;
tty_flip_buffer_push(tty);
flush_to_ldisc(&tty->buf.work.work);
disc->ops->receive_buf();
进入结构tty_ldisc
struct tty_ldisc {
struct tty_ldisc_ops *ops;
};
进入结构 tty_ldisc_ops
struct tty_ldisc_ops tty_ldisc_N_TTY = {
.receive_buf = n_tty_receive_buf,
n_tty_receive_buf()
n_tty_receive_break()
put_tty_queue()
put_tty_queue_nolock()
tty->read_buf[tty->read_head] = c;
综上,中断函数中获取数据的调用层次为:s3c24xx_serial_rx_chars()--->uart_insert_char()---->tty_insert_flip_char()
-->tty_flip_buffer_push()-->flush_to_ldisc()--->n_tty_receive_buf()--->n_tty_receive_char()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)