1、
這段話摘於《設備驅動開發詳解》
在使用串口核心層這個通用串口tty驅動層的接口後,一個串口驅動要完成的主要工作:
(1)、定義uart_driver、uart_ops、uart_port等結構體的實例並在適當的地方根據具體硬件和驅動的情況初始化它們,當然具體設備的驅動可以將這些結構體在新定義的xxx_uart_driver、xxx_uart_ops、xxx_uart_port之內。
(2)、在模塊初始化是調用uart_register_driver和uart_add_port注冊UART驅動並添加端口,在模塊卸載時調用uart_unregister_driver和uart_remove_one_port以注銷UART驅動並移除端口。
(3)、根據具體硬件的datasheet實現uart_ops中的成員函數,這些函數的實現成為UART驅動的主體工作。
2、s3c6410的串口驅動:
這些與上面的(1)相對應。
(1)、serial_core.c文件的作用:主要有如下結構體和實現其中的函數,供上層函數調用:
static const struct tty_operations uart_ops = {
.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
.read_proc = uart_read_proc,
#endif
.tiocmget = uart_tiocmget,
.tiocmset = uart_tiocmset,
#ifdef CONFIG_CONSOLE_POLL
.poll_init = uart_poll_init,
.poll_get_char= uart_poll_get_char,
.poll_put_char= uart_poll_put_char,
#endif
};
並提供uart_register_driver、uart_unregister_driver、uart_add_one_port、uart_remove_one_port函數供底層函數注冊。