日期:2014-05-16 浏览次数:20831 次
一.串口结构体
1.串口驱动结构体
struct uart_driver { struct module *owner; //模块所有者 const char *driver_name; //驱动名 const char *dev_name; //设备名 int major; //主设备号 int minor; //次设备号 int nr; //支持串口个数 struct console *cons; //控制台设备 struct uart_state *state; //串口状态 struct tty_driver *tty_driver; //tty设备 };
2.串口端口结构体
struct uart_port { spinlock_t lock; unsigned long iobase; //io端口基地址 unsigned char __iomem *membase; //内存端口基地址 unsigned int (*serial_in)(struct uart_port *, int); void (*serial_out)(struct uart_port *, int, int); void (*set_termios)(struct uart_port *,struct ktermios *new,struct ktermios *old); void (*pm)(struct uart_port *, unsigned int state,unsigned int old); unsigned int irq; //中断号 unsigned long irqflags; //中断标志 unsigned int uartclk; unsigned int fifosize; //fifo大小 unsigned char x_char; unsigned char regshift; //寄存器偏移值 unsigned char iotype; //io访问类型 unsigned char unused1; unsigned int read_status_mask; unsigned int ignore_status_mask; struct uart_state *state; //uart_state结构体 struct uart_icount icount; //串口使用计数 struct console *cons; //console控制台 #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ) unsigned long sysrq; #endif upf_t flags; unsigned int mctrl; unsigned int timeout; unsigned int type; const struct uart_ops *ops; //串口操作函数集 unsigned int custom_divisor; unsigned int line; //端口号 resource_size_t mapbase; struct device *dev; //设备文件 unsigned char hub6; unsigned char suspended; unsigned char irq_wake; unsigned char unused[2]; void *private_data; };
3.操作函数集
struct uart_ops { unsigned int (*tx_empty)(struct uart_port *); //发送缓冲区为空 void (*set_mctrl)(struct uart_port *, unsigned int mctrl); //设置串口modem控制模式 unsigned int (*get_mctrl)(struct uart_port *); //获取串口modem控制模式 void (*stop_tx)(struct uart_port *); //停止发送 void (*start_tx)(struct uart_port *); //开始发送 void (*send_xchar)(struct uart_port *, char ch); void (*stop_rx)(struct uart_port *); //停止接收 void (*enable_ms)(struct uart_port *); //使能modem状态信息 void (*break_ctl)(struct uart_port *, int ctl); int (*startup)(struct uart_port *); //打开串口 void (*shutdown)(struct uart_port *); //关闭串口 void (*flush_buffer)(struct uart_port *); void (*set_termios)(struct uart_port *, struct ktermios *new,struct ktermios *old); //设置串口参数 void (*set_ldisc)(struct uart_port *, int new); void (*pm)(struct uart_port *, unsigned int state,unsigned int oldstate); int (*set_wake)(struct uart_port *, unsigned int state); const char *(*type)(struct uart_port *); void (*release_port)(struct uart_port *); //释放端口 int (*request_port)(struct uart_port *); //请求端口 void (*config_port)(struct uart_port *, int); //配置端口 int (*verify_port)(struct uart_port *, struct serial_struct *); //校验端口 int (*ioctl)(struct uart_port *, unsigned int, unsigned long); //控制 #ifdef CONFIG_CONSOLE_POLL void (*poll_put_char)(struct uart_port *, unsigned char); int (*poll_get_char)(struct uart_port *); #endif };
4.uart_state
struct uart_state { struct tty_port port; int pm_state; struct circ_buf xmit; struct tasklet_struct tlet; struct uart_port *uart_port; };
二.串口驱动的注册与注销
注册
int uart_register_driver(struct uart_driver *drv) { struct tty_driver *normal; int i, retval; BUG_ON(drv->state); drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL); //分配uart_state内存 if (!drv->state) goto out; normal = alloc_tty_driver(drv->nr); //分配tty_driver if (!normal) goto out_kfree; drv->tty_driver = normal; //tty_driver和uart_driver捆绑 normal->owner = drv->owner; //模块所有者 normal->driver_name = drv->driver_name; //驱动名 normal->name = drv->dev_name; //设备名 normal->major = drv->major; //主设备号 normal->m