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驱动开发串口的主要内容,如果未能解决你的问题,请参考以下文章