linuxRTC\_Framebuffer\_TTY\_MISC

  1. RTC设备驱动
  2. Framebuffer设备驱动
  3. TTY设备驱动
  4. MISC设备驱动

RTC设备驱动

RTC借助电池供电,在系统掉电情况下依然可以正常工作。它通常还具有产生周期性中断以及闹钟中断的能力,是一种典型的字符设备。作为一种字符设备驱动,RTC需要由file_operations中接口函数的实现(包括open、release、read、poll、ioctl),这些对于所有RTC是通用的,只有底层的具体实现是与设备相关的。因此,drivers/rtc/dev.c实现了RTC驱动通用的字符设备驱动层,它还实现了file_opearations的成员函数以及一些通用的关于RTC的控制代码,并向底层提供了RTC设备的注册和注销接口。整个rtc核心层的实现包含drivers/rtc/class.c、drivers/rtc/dev.c、drivers/rtc/hctossys.c、drivers/rtc/interface.c、drivers/rtc/proc.c等。

如下为RTC驱动的分层结构图:

RTC驱动的分层

Framebuffer设备驱动

Framebuffer是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。对于帧缓冲设备而言,只要在显示缓冲区中与显示点对应的区域内写入颜色值,对应的颜色会自动在屏幕上显示。

如下为Framebuffer缓冲设备驱动程序结构:

Framebuffer缓冲设备驱动程序结构

Framebuffer缓冲设备提供给用户的file_operations结构体由drivers/video/fbdev/core/fbmem.c中的file_operations提供,而特定帧缓冲设备fb_info结构体的注册、注销以及其中成员的维护,尤其是fb_ops中成员函数的实现则由对应的xxxfb.c文件实现,fb_ops中的成员函数最终会操作LCD控制器硬件寄存器。

TTY设备驱动

在Linux系统中,终端是一种字符设备,它有多种类型。对于嵌入式系统而言,最普遍采用的是UART串行端口,简称串口。

Linux 内核中tty的层次结构如下所示:

tty设备驱动层次结构

Linux内核中tty的实现包含tty核心tty_io.c、tty线路规程n_tty.c、和tty驱动实例xxx_tty.c。

tty线路规程的工作是以特殊的方式格式化从一个用户或硬件收到的数据,这种格式化常常采用一个协议转换的形式。

tty_io.c本身是一个标准的字符设备驱动,实现了file_operations成员函数。它是tty核心层,对下定义了tty_driver的架构,这样tty设备驱动的主体工作就变成了填充tty_driver结构体中的成员,实现其中的tty_operations的成员函数,而不再是实现file_operations这一级的工作。

对于tty核心层、线路规程与tty驱动的关系,可用下图来表示:

tty设备数据收发流程

尽管一个特定的底层UART设备驱动完全可以遵循上述tty_driver的方法设计,即定义tty_driver并实现tty_operations中的成员函数,但是鉴于串口之间的共性,Linux考虑在文件drivers/tty/serial/serial_core.c中实现了UART设备的通用tty驱动层。这样,UART驱动的主要任务就进一步演变成了实现serial-core.c中定义的一组uart_xxx接口,而不是tty_xxx接口,因此按照面向对象的思想,可以认为tty_driver是字符设备的泛化、serial-core是tty_driver的泛化,而具体的串口驱动则是serial-core的泛化。

串口核心层

MISC设备驱动

由于Linux驱动分层设计的思想,所以各个具体的设备都可以找到它对应的类型,从而套到它相应的架构中去,并且只需要实现最底层的那一部分。但是也有部分无法确定分类的字符设备设备,通常采用miscdevice架构结构。miscdevice本质上也是字符设备,只是在miscdevice核心层的misc_init函数中,通过register_chardev(MISC_MAJOR, “misc”, &misc_fops)注册了字符设备,而具体miscdevice实例调用misc_register的时候又自动完成了device_create、获取动态次设备号的动作。

miscdevice的核心层实现在drivers/char/misc.c,其主要数据结构及接口定义如下(linux/miscdevice.h):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct miscdevice  {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const struct attribute_group **groups;
const char *nodename;
umode_t mode;
};

extern int misc_register(struct miscdevice *misc);
extern void misc_deregister(struct miscdevice *misc);

miscdevice结构体内file_operations中的成员函数实际上是由drivers/char/misc.c中misc驱动核心层的misc_fops成员函数间接调用的。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:linuxRTC\_Framebuffer\_TTY\_MISC

本文作者:红尘追风

发布时间:2016-09-10, 22:42:20

原始链接:http://www.micernel.com/2016/09/10/linuxRTC_Framebuffer_TTY_MISC/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录