linuxserial构架分析及驱动开发(1) 您所在的位置:网站首页 serialwrite函数 linuxserial构架分析及驱动开发(1)

linuxserial构架分析及驱动开发(1)

2023-03-10 12:11| 来源: 网络整理| 查看: 265

前⾯介绍了tty核⼼分析及tty驱动开发的⽅法,tty设备包括串⼝、终端、伪终端三⼤类,其中终端和伪终端驱动内核都帮我们实现好了,很

少需要改动。

因此我们主要介绍串⼝驱动的开发及其在内核中的构架(其核⼼实现源码主要在/drivers/serial_core.c中),这⼀节中我们

主要分析向内核中加⼊⼀个serial驱动⽤到的数据结构。

      serial core是构建在tty core之上的。注册⼀个串⼝驱动即在tty core层注册⼀个tty驱动。下⾯我们看看串⼝驱动中⽤到的两个最重要

的数据机构 struct uart_driver 表⽰⼀个serial驱动,struct uart_port 表⽰⼀个串⼝端⼝。

//在include\linux\serial_core.h的364⾏:

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;  

//表征串⼝驱动的tty驱动

};

 

      

上⾯结构中struct uart_state *state指向驱动操作的串⼝设备相关数据结构,其中struct uart_port *port就是我们下⾯要介绍的描述

串⼝设备的结构,struct uart_info *info 指向相关联的struct tty_struct 结构和数据发射时环形缓冲区struct circ_buf xmit,即串⼝打

开时的描述信息。uart_info有两个成员在底层串⼝驱动会⽤到:xmit和tty。⽤户空间程序通过串⼝发送数据时,上层驱动将⽤户数据保存

在xmit;⽽串⼝发送中断处理函数就是通过xmit获取到⽤户数据并将它们发送出去。串⼝接收中断处理函数需要通过tty将接收到的数据传

递给⾏规则层。具体的成员分析我们在后⾯介绍具体的操作时再分析。

 

//在include\linux\serial_core.h的265⾏:

struct uart_port {

 spinlock_t  lock;   /* port lock */   

//串⼝端⼝锁

 unsigned int  iobase;   /* in/out[bwl] */   

 //io端⼝基地址

 unsigned char __iomem *membase;  /* read/write[bwl] */  

//io内存基地址,虚拟地址

 unsigned int  irq;   /* irq number */    

  //中断号

 unsigned int  uartclk;  /* base uart clock */  

//串⼝时钟

 unsigned int  fifosize;  /* tx fifo size */      

 //串⼝fifo缓冲⼤⼩

 unsigned char  x_char;   /* xon/xoff char */  

//xon/xoff字符

 unsigned char  regshift;  /* reg offset shift */       

//j寄存器移位

       

 unsigned char  iotype;   /* io access style */    

//io访问⽅式

 unsigned char  unused1;

#define UPIO_PORT  (0)  

 //端⼝

#define UPIO_HUB6  (1)

#define UPIO_MEM  (2)   

 //内存

#define UPIO_MEM32  (3)

#define UPIO_AU   (4)   /* Au1x00 type IO */

#define UPIO_TSI  (5)   /* Tsi108/109 type IO */

#define UPIO_DWAPB  (6)   /* DesignWare APB UART */

#define UPIO_RM9000  (7)   /* RM9000 type IO */



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有