Linux驱动开发串口

Posted XXX_UUU_XXX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux驱动开发串口相关的知识,希望对你有一定的参考价值。

UART驱动

串口驱动框架由SOC原厂编写,只需要在设备树中添加使用的串口节点信息,系统启动后,串口设备和驱动匹配成功,生成/dev/ttymxcX(X=0,1,2...)文件。UART驱动程序本质是一个platform驱动

Linux定义uart_driver结构体表示UART驱动,include/linux/serial_core.h。

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;
;

使用uart_register_driver注册uart_driver。

int uart_register_driver(struct uart_driver *drv)
  • drv:要注册的uart_driver。
  • 返回值:0,成功;负值,失败。

使用uart_unregister_driver注销uart_driver。

void uart_unregister_driver(struct uart_driver *drv)
  • drv:要注销的uart_driver。
  • 返回值:无。

uart_port结构体表示一个具体的port端口,include/linux/serial_core.h。其中

struct uart_port 
    /* ... */
    const struct uart_ops *ops;
    /* ... */
;

struct uart_ops 
	unsigned int	(*tx_empty)(struct uart_port *);
	void		(*set_mctrl)(struct uart_port *, unsigned int mctrl);
	unsigned int	(*get_mctrl)(struct uart_port *);
	void		(*stop_tx)(struct uart_port *);
	void		(*start_tx)(struct uart_port *);
	void		(*throttle)(struct uart_port *);
	void		(*unthrottle)(struct uart_port *);
	void		(*send_xchar)(struct uart_port *, char ch);
	void		(*stop_rx)(struct uart_port *);
	void		(*enable_ms)(struct uart_port *);
	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 *, struct ktermios *);
	void		(*pm)(struct uart_port *, unsigned int state,
			      unsigned int oldstate);

	/*
	 * Return a string describing the type of the port
	 */
	const char	*(*type)(struct uart_port *);

	/*
	 * Release IO and memory resources used by the port.
	 * This includes iounmap if necessary.
	 */
	void		(*release_port)(struct uart_port *);

	/*
	 * Request IO and memory resources used by the port.
	 * This includes iomapping the port if necessary.
	 */
	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
	int		(*poll_init)(struct uart_port *);
	void		(*poll_put_char)(struct uart_port *, unsigned char);
	int		(*poll_get_char)(struct uart_port *);
#endif
;

const struct uart_ops *ops;包含UART具体驱动函数,Linux系统收发数据都是调用ops中的函数。uart_ops结构体中函数具体含义在Documentation/serial/driver文档查看。

使用uart_add_one_port将uart_port添加到uart_driver中。

int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
  • drv:uart_driver。
  • uport:要添加到uart_driver中的port。
  • 返回值:0,成功;负值,失败。

使用uart_remove_one_port将uart_port从uart_driver移除。

int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
  • drv:uart_driver。
  • uport:要从uart_driver卸载的port。
  • 返回值:0,成功;负值,失败。

以上是关于Linux驱动开发串口的主要内容,如果未能解决你的问题,请参考以下文章

Linux 串口通讯问题

Ubuntu linux中怎么查看自己的串口连接情况

第四季-专题14-串口驱动程序设计

linux开发笔记

Linux驱动之串口(UART)

linux 驱动设备名在哪个文件夹下