日期:2014-05-16  浏览次数:20703 次

五 linux 串口驱动

一.串口结构体

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