您的位置:首页 > 运维架构 > Linux

第14章 Linux终端设备驱动

2009-03-30 11:22 246 查看
本文摘自(偶有较小改动)《Linux 设备驱动开发详解》(宋宝华 编著;人民邮电出版社;),留作纪念。
——Living Park
 

第14章 Linux终端设备驱动
14.1终端设备
       在Linux系统中,终端是一种字符型设备。包括串行端口终端、伪终端和控制台终端。
14.2终端设备驱动结构
       Linux内核中tty的层次包含tty核心、tty线路和tty驱动。
操作:分配tty驱动 alloc_tty_driver();注册tty驱动 tty_register_driver();注销tty驱动 tty_unregister_driver();注册tty设备 tty_register_device();注销tty设备 tty_unregister_device();设置tty驱动操作 tty_set_operations()。
14.3终端设备驱动的初始化与释放
14.3.1 模块加载与卸载函数
       tty驱动的模块加载函数中通常需要分配、初始化tty_driver结构体并申请必要的硬件资源,卸载函数则相反。
14.3.2 打开与关闭函数
       tty驱动必须设置open()成员,否则,-ENODEV将被返回给调用open()的用户。
       驱动中可以定义一个设备相关的结构体,并在open()函数中将其赋值给tty_struct的driver_data成员。
14.4数据发送和接收
       因为速度和tty硬件缓冲区容量的原因,不是所有的写程序要求的字符都可以在调用写函数时被发送,因此写函数应当返回能够发送给硬件的字节数以便用户程序检查是否所有的数据被真正写入。
14.5 tty线路设置
14.5.1 线路设置用户空间接口
       调用用户空间的termios库函数,需要引用termios.h头文件。
操作:操作模式设置和获取
tcgetattr(),tcsetattr();输入输出波特率的获取和设置
cfgetospeed(),cfgetispeed(),cfsetospeed(),cfsetispeed();完成线路控制 tcdrain(),tcflush(),tcflow(),tcsedbreak()。
       大部分termios库函数会被转化成对tty设备节点的ioctl()调用。
14.5.2 tty驱动的set_termios函数
       大部分termios用户空间函数被库转换为对驱动节点的ioctl()调用,而tty ioctl中的大部分命令会被tty核心转换为对tty驱动的set_termios()函数的调用。set_termios()函数需要根据用户对termios的设置完成实际的硬件设置。
14.5.3 tty驱动的tiocmget和tiocmset函数
       对TIOCMGET、TIOCMSET、TIOCMBIC和TIOCMBIS
IO控制命令的调用将被tty核心转换为对tty驱动tiocmget()函数和tiocmset()函数的调用。
14.5.4 tty驱动的ioctl函数
       当用户在tty设备节点上进行ioctl调用时,tty_opetations中的ioctl()函数会被tty核心调用。
14.6 UART设备驱动
       Linux内核中实现了UART设备的通用tty驱动层。串口核心层提供了如下3个结构体。
1. uart_driver
包含串口设备的驱动名、设备名、设备号等信息。注册/注销uart_driver
uart_register_driver(),uart_unregister_driver()。
2. uart_port
用于描述一个UART端口的I/O端口或I/O内存地址、FIFO大小、端口类型等。添加/移除一个端口 uart_add_one_port(),uart_remove_one_port()。
3. uart_ops
定义了对UART的一系列操作,包括发送、接收及线路设置等。
14.7 S3C2410
UART的驱动实例
14.7.1 S3C2410串口硬件描述
       S3C2410内部具有3个独立的UART控制器,每个控制器都可以工作在Interrupt模式或DMA模式,也就是说UART控制器可以在CPU与UART控制器传送资料的时候产生中断或DMA请求。S3C2410集成的每个UART均具有16字节的FIFO,支持的最高波特率可达到230.4Kbit/s。
14.7.2 S3C2410串口驱动的数据结构
       定义了结构体s3c24xx_uart_port。
14.7.3 S3C2410串口驱动的初始化与释放
14.7.4 S3C2410串口数据收发
       S3C2410串口驱动uart_ops结构体的startup()成员函数s3c24xx_serial_startup()用于启动端口,申请端口的发送、接收中断,使能端口的发送和接收。s3c24xx_serial_shutdown()相反。
       与数据收发关系最密切的是s3c24xx_serial_rx_chars()和s3c24xx_serial_tx_chars()。
14.7.5 S3C2410串口线路设置
       S3C2410串口驱动uart_ops结构体的set_termios()成员函数用于改变端口的参数设置。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息