linuxserial构架分析及驱动开发(1) | 您所在的位置:网站首页 › serialwrite函数 › linuxserial构架分析及驱动开发(1) |
) 前⾯介绍了tty核⼼分析及tty驱动开发的⽅法,tty设备包括串⼝、终端、伪终端三⼤类,其中终端和伪终端驱动内核都帮我们实现好了,很 少需要改动。 因此我们主要介绍串⼝驱动的开发及其在内核中的构架(其核⼼实现源码主要在/drivers/serial_core.c中),这⼀节中我们 主要分析向内核中加⼊⼀个serial驱动⽤到的数据结构。 serial core是构建在tty core之上的。注册⼀个串⼝驱动即在tty core层注册⼀个tty驱动。下⾯我们看看串⼝驱动中⽤到的两个最重要 的数据机构 struct uart_driver 表⽰⼀个serial驱动,struct uart_port 表⽰⼀个串⼝端⼝。 //在include\linux\serial_core.h的364⾏: struct uart_driver { struct module *owner; const char *driver_name; //驱动名称 const char *dev_name; //设备名基础 int major; //主设备号 int minor; //起始次设备号 int nr; //设备个数 struct console *cons; //关联的控制台 /* * 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; //表征串⼝驱动的tty驱动 };
上⾯结构中struct uart_state *state指向驱动操作的串⼝设备相关数据结构,其中struct uart_port *port就是我们下⾯要介绍的描述 串⼝设备的结构,struct uart_info *info 指向相关联的struct tty_struct 结构和数据发射时环形缓冲区struct circ_buf xmit,即串⼝打 开时的描述信息。uart_info有两个成员在底层串⼝驱动会⽤到:xmit和tty。⽤户空间程序通过串⼝发送数据时,上层驱动将⽤户数据保存 在xmit;⽽串⼝发送中断处理函数就是通过xmit获取到⽤户数据并将它们发送出去。串⼝接收中断处理函数需要通过tty将接收到的数据传 递给⾏规则层。具体的成员分析我们在后⾯介绍具体的操作时再分析。
//在include\linux\serial_core.h的265⾏: struct uart_port { spinlock_t lock; /* port lock */ //串⼝端⼝锁 unsigned int iobase; /* in/out[bwl] */ //io端⼝基地址 unsigned char __iomem *membase; /* read/write[bwl] */ //io内存基地址,虚拟地址 unsigned int irq; /* irq number */ //中断号 unsigned int uartclk; /* base uart clock */ //串⼝时钟 unsigned int fifosize; /* tx fifo size */ //串⼝fifo缓冲⼤⼩ unsigned char x_char; /* xon/xoff char */ //xon/xoff字符 unsigned char regshift; /* reg offset shift */ //j寄存器移位
unsigned char iotype; /* io access style */ //io访问⽅式 unsigned char unused1; #define UPIO_PORT (0) //端⼝ #define UPIO_HUB6 (1) #define UPIO_MEM (2) //内存 #define UPIO_MEM32 (3) #define UPIO_AU (4) /* Au1x00 type IO */ #define UPIO_TSI (5) /* Tsi108/109 type IO */ #define UPIO_DWAPB (6) /* DesignWare APB UART */ #define UPIO_RM9000 (7) /* RM9000 type IO */ |
CopyRight 2018-2019 实验室设备网 版权所有 |