一、核心数据结构
串口驱动有3个核心数据结构,它们都定义在<#include
linux/serial_core.h>
1、uart_driver
uart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver)。
|
struct uart_driver {
struct
module
*owner; //
拥有该uart_driver的模块,一般为THIS_MODULE */
const
char *driver_name;
// 串口驱动名,串口设备文件名以驱动名为基础
*/
const
char *dev_name; //
串口设备名 */
int
major;
// 主设备号
*/
int minor;
//
次设备号 */
int nr;
//
该uart_driver支持的串口个数(最大) */
struct
console *cons; //
其对应的console.若该uart_driver支持serial console,否则为NULL
*/
//
these are private; the low level driver should not
// touch these; they should be initialised to NULL
struct
uart_state *state;
struct
tty_driver *tty_driver;
};
|
2、uart_port
uart_port用于描述串口端口的I/O端口或I/O内存地址、FIFO大小、端口类型、串口时钟等信息。实际上,一个uart_port实例对应一个串口设备
|
struct uart_port {
spinlock_t
lock;
//
串口端口锁
unsigned
int
iobase;
//
IO端口基地址
unsigned
char
__iomem *membase;
// IO内存基地址,经映射(如ioremap)后的IO内存虚拟基地址
*/
unsigned
int
irq;
// 中断号 */
unsigned
int
uartclk; //
串口时钟 */
unsigned
int fifosize; //
串口FIFO缓冲大小 */
unsigned
char
x_char; //
xon/xoff字符 */
unsigned
char
regshift; //
寄存器位移 */
unsigned
char
iotype; //
IO访问方式 */
unsigned
char
unused1;
#define
UPIO_PORT (0)
// IO端口 */
#define
UPIO_HUB6 (1)
#define
UPIO_MEM
|