- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于 MX51 的 TTY 驱动架构
2012-12-28
一、任务目标
以 uart 为实例分析整理 TTY 驱动架构。
二、层次架构
用户空间
tty core 线路规程
serial core
uart驱动
硬件
图 1
在 linux 内核中,串行设备多种多样,内核开发者为了让驱动开发者尽量简
单(可复用的东西多),构建了如图 1 所示的串行设备层次架构。
tty core 里是最基本的字符驱动,经过线路规程处理的数据,通过 tty core 提
供的数据交互机制与用户空间通信。?
图 1 中线路规程表示对上层或下层传过来数据的处理,不同的处理方式对应
不同的协议,如红外、ppp 拨号等等。
serial core 是对 tty 驱动进行了封装,与硬件无关,给底层 uart 驱动开发提供
API,针对具体硬件的操作全在 uart 驱动中实现。
因为 uart 同时涉及到以上三层,所以本文档以 uart 为例,阐述 TTY。
三、数据结构设计
1. 数据结构
uart 驱动中定义了 2 个重要的数据结构,struct uart_driver mxc_reg,和 struct
uart_mxc_port mxc_port[8]。
a. struct uart_driver mxc_reg
uart_driver 是 serial_core 提供的重要结构体,下面是代码定义的 uart_driver 实例,变量的解释见对应注释。具体结构体见数据结构关系图。
static struct uart_driver mxc_reg = {
.driver_name = ttymxc, //驱动名,用于与设备匹配
.dev_name = ttymxc, //设备名,用于与驱动匹配,并会在dev下显示/dev/ttymxcID
.nr = MXC_UART_NR, //最大支持8个uart prot
.cons = MXC_CONSOLE, //serial core中定义的struct console,详见serial core分析 };
b. struct uart_mxr_port mxc_ports[8]
mxc_ports[]数组是自定义的 uart_mxc_port 数组,数组大小为 8,在 mx51 中
只用到前 3 个。
mxc_ports[]中包含的最重要的结构体是 struct uart_port{},它们之间的关系详 见数据结构关系图。
static uart_mxc_port *mxc_ports[MXC_UART_NR]; //MXC_UART_NR=8
2. 数据结构关系图
uart_driver{} uart_state{} tty_driver{}
const char* driver_name; .port; int magic;
const char* dev_name; .xmit; const char* driver_name;
struct console*cons; *uart_port; const char* name;
int nr; …… struct cdev cdev;
*state; struct tty_struct** ttys;
*tty_driver; struct ktermios** termios;
…… const struct tty_operations*ops;
int num;
struct list_head tty_drivers;
……
circ_buf{} tty_struct{}
char * buf; int magic;
int head;
int tail;
*driver;
const struct tty_operations *ops;
tty_port{}
struct tty_struct *tty;
…… int index;
Const struct tty_port_operations
struct tty_ldisc * ldisc;
*ops;
struct tty_bufhead buf;
unsigned char *xmit_buf;
tty_ldisc{}
Struct tty_ldisc_ops *ops;
*port;
void * driver_data;
……
……
char* write_buf
tty_bufhead{}
……
struct tty_buffer *head;
struct tty_buffer *tail;
struct tty_buffer *free;
int memory_used;
……
uart_mxc_port{}
uart_port{} .port;
文档评论(0)