Linux2_6内核下同步串行通信驱动的开发与应用
- 格式:pdf
- 大小:536.53 KB
- 文档页数:4
Linux2.6内核中的Framebuffer驱动程序设计虽然Framebuffer驱动技术在PC上已经逐渐被淘汰,但是在嵌入式等考虑成本的平台下,由于其使用简单,成本低廉的优势,使用相当的广泛。
在Linux2.4和Linux2.6内核之间,Framebuffer的框架结构发生了很大的变化,网络上很多介绍Framebuffer的文档都是基于2.4内核下的,这就使得在2.6内核开发Framebuffer驱动增加了难度,本文介绍2.6内核下如何编写Framebuffer驱动,以适应最新版本的Linux。
Framebuffer是出现在Linux 2.2.xx及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备。
帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。
这样软件无须了解任何涉及硬件底层驱动的东西(如硬件寄存器)。
它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和I/O控制等操作。
通过专门的设备节点可对该设备进行访问,如/dev/fb*。
用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以进行读写操作,而读写操作可以反映到LCD。
二、 Framebuffer驱动的主要数据结构fb_fix_screeninfo记录了帧缓冲设备和指定显示模式的固件信息。
它包含了屏幕缓冲区的物理地址和长度等信息。
fb_var_screeninfo记录了帧缓冲设备和指定显示模式的可修改信息。
它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。
其中变量 xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数。
fb_info info是Linux为帧缓冲设备定义的驱动层接口。
它不仅包含了底层函数,而且还有记录设备状态的数据。
每个帧缓冲设备都与一个fb_info结构相对应。
其中成员变量包含fb_fix_screeninfo、fb_var_screeninfo这两个数据结构,另外还有Framebuffer的回调函数。
Linux kernel 2.6 USB转串口IC驱动程序介绍Version historyIndex Version Author Date Comment1 V1.0.0 Wen Xiaoyong 2011-12-13 Draft,Linux kernel 2.6.31(comefrom Freescale iMX515 BSP), baseon USB 2.0目录Linux kernel 2.6 USB转串口IC驱动程序介绍 (1)Version history (1)目录 (2)1. USB介绍 (3)1.1 USB的发展历史 (3)1.2 USB接口电气规范 (4)1.3 USB协议简介 (8)2. Linux kernel 2.6中,USB框架 (12)2.1 Linux kernel中的USB子系统 (12)2.2 USB转串口IC驱动架构图 (15)3. Linux kernel 2.6内核,USB接口函数 (17)4. USB转串口芯片驱动框架 (19)4.1 USB转串口芯片驱动,关键数据结构 (20)4.2 USB转串口芯片驱动接口 (23)4.3 应用程序访问I2C设备例子程序 (27)5. 参考资料 (28)5.1 参考代码 (28)5.2 参考文档 (28)1. USB介绍1.1 USB的发展历史通用串行总线(英语:Universal Serial Bus,简称“USB”)是连接计算机系统与外部设备的一个串口总线标准,也是一种输入输出接口技术规范,被广泛应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。
多媒体电脑刚问世时,外接式设备的传输接口各不相同,如打印机只能接LPT port、调制解调器只能接RS232、鼠标键盘只能接PS/2等。
繁杂的接口系统,加上需安装驱动程序并重启才能使用的限制,都不免造成用户的困扰。
因此,创造出一个统一且支持热插拔的外接式传输接口,便成为无可避免的趋势。
linux内核SPI总线驱动分析(一)下面有两个大的模块:一个是SPI总线驱动的分析(研究了具体实现的过程)另一个是SPI总线驱动的编写(不用研究具体的实现过程)SPI总线驱动分析1 SPI概述SPI是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是Motorola 首先在其MC68HCXX系列处理器上定义的。
SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要4根线,事实上3根也可以。
也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选)。
MOSI(SDO):主器件数据输出,从器件数据输入。
MISO(SDI):主器件数据输入,从器件数据输出。
SCLK :时钟信号,由主器件产生。
CS:从器件使能信号,由主器件控制。
其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。
需要注意的是,在具体的应用中,当一条SPI总线上连接有多个设备时,SPI本身的CS有可能被其他的GPIO 脚代替,即每个设备的CS脚被连接到处理器端不同的GPIO,通过操作不同的GPIO口来控制具体的需要操作的SPI设备,减少各个SPI设备间的干扰。
SPI是串行通讯协议,也就是说数据是一位一位从MSB或者LSB开始传输的,这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,MISO、MOSI则基于此脉冲完成数据传输。
SPI支持4-32bits的串行数据传输,支持MSB和LSB,每次数据传输时当从设备的大小端发生变化时需要重新设置SPI Master的大小端。
Linux内核同步机制简介1 介绍1)由于现代Linux操作系统是多任务、SMP、抢占式以及中断是异步执行的,导致共享资源容易被并发访问,从而使得访问共享资源的各线程之间互相覆盖共享数据,造成被访问数据处于不一致状态,因此Linux提供了同步机制来防止并发访问。
2)常用的同步机制(如自旋锁)用来保护共享数据使用起来简单有效,但由于CPU的处理速度与访问内存的速度差距越来越大,导致获取锁的开销相对于CPU的速度在不断的增加。
因为这种锁使用了原子操作指令,需要原子地访问内存,即获取锁的开销与访问内存的速度相关。
3)Linux内核根据对不同共享资源的特性,提供多种同步机制:原子操作、自旋锁、读-写自旋锁、信号量、读-写信号量、完成变量、顺序锁、禁止抢占、内存屏障及RCU,本文将对其分别进行简要介绍。
2 原子操作(atomic)2.1 基本原理1)所谓原子操作,就是该操作绝不会在执行完毕前被任何其它任务或事件打断,它是最小的执行单位,不可能有比它更小的执行单位。
2)原子操作通常是内联函数,通过内联汇编指令来实现。
3)原子操作需要硬件的支持,因此不同的体系结构的实现方式不同。
4)内核提供了两组原子操作接口:整数操作和位操作。
2.1.2 原子整数操作1)原子操作主要用于实现资源计数,很多引用计数就是通过原子操作实现的。
2)原子类型定义如下:(参看RHEL6.5GA_x86_64内核文件:/root/include/linux/types.h)3)针对整数的原子操作只能对atomic_t类型的数据进行处理,原因如下:a)让原子函数只接受atomic_t类型的操作数,可以确保原子操作只与这种特殊类型一起使用。
b)使用atomic_t类型确保编译器不对相应的值进行优化,使得原子操作最终接收到正确的内存地址。
c)可以屏蔽不同体系结构上实现原子操作的差异。
2.1.2 原子位操作1)位操作函数是对普通的内存地址进行操作的,对所操作的数据类型没有要求。
Linux下的串口编程(ZT)Linux 操作系统从一开始就对串行口提供了很好的支持,本文就 Linux 下的串行口通讯编程进行简单的介绍。
串口简介串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。
常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换 接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。
传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺。
Linux 操作系统从一开始就对串行口提供了很好的支持,本文就 Linux 下的串行口通讯编程进行简单的介绍,如果要非常深入了解,建议看看本文所参考的《Serial Programming Guide for POSIX Operating Systems》计算机串口的引脚说明序号 信号名称 符号 流向 功能2 发送数据 TXD DTE→DCE DTE发送串行数据3 接收数据 RXD DTE←DCE DTE 接收串行数据4 请求发送 RTS DTE→DCE DTE 请求 DCE 将线路切换到发送方式5 允许发送 CTS DTE←DCE DCE 告诉 DTE 线路已接通可以发送数据6 数据设备准备好 DSR DTE←DCE DCE 准备好7 信号地 信号公共地8 载波检测 DCD DTE←DCE表示 DCE 接收到远程载波20 数据终端准备好 DTR DTE→DCE DTE 准备好22 振铃指示 RI DTE←DCE表示 DCE 与线路接通,出现振铃串口操作串口操作需要的头文件#i nclude <stdio.h> /*标准输入输出定义*/#i nclude <stdlib.h> /*标准函数库定义*/#i nclude <unistd.h> /*Unix 标准函数定义*/#i nclude <sys/types.h>#i nclude <sys/stat.h>#i nclude <fcntl.h> /*文件控制定义*/#i nclude <termios.h> /*PPSIX 终端控制定义*/#i nclude <errno.h> /*错误号定义*/打开串口在 Linux 下串口文件是位于 /dev 下的串口一 为 /dev/ttyS0串口二 为 /dev/ttyS1打开串口是通过使用标准的文件打开函数操作:int fd;/*以读写方式打开串口*/fd = open( "/dev/ttyS0", O_RDWR);if (-1 == fd){/* 不能打开串口一*/perror(" 提示错误!");}设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。
Linux内核架构和工作原理详解作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
Linux 进程采用层次结构,每个进程都依赖于一个父进程。
内核启动init程序作为第一个进程。
该进程负责进一步的系统初始化操作。
init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
virt/ ---- 提供虚拟机技术的支持。
Linux内核预备工作理解Linux内核最好预备的知识点:懂C语言懂一点操作系统的知识熟悉少量相关算法懂计算机体系结构Linux内核的特点:结合了unix操作系统的一些基础概念Linux内核的任务:1.从技术层面讲,内核是硬件与软件之间的一个中间层。
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。
在实际工作中内核抽象了相关细节。
3.内核是一个资源管理程序。
负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
4.内核就像一个库,提供了一组面向系统的命令。
系统调用对于应用程序来说,就像调用普通函数一样。
内核实现策略:1.微内核。
最基本的功能由中央内核(微内核)实现。
所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。
2.宏内核。
内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。
内核中的每一个函数都可以访问到内核中所有其他部分。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
哪些地方用到了内核机制?1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通信,需要使用特定的内核机制。
Linux终端控制台体系及串口驱动分析数据通信的基本方式可分为并行通信与串行通信两种:并行通信:利用多条数据线路将数据的各位同时传送。
它的特点是传输速度快,适用于短距离通信。
串行通信:利用一条数据线将数据一位位顺序传送。
特点是通信线路简单,利用简单的线缆就可实现通信,低成本,适用于远距离通信。
异步通信以一个字符为传输单位,通信中的两个字符间的时间间隔是不固定的,然而同一个字符中的两个相邻位之间的时间间隔是固定的。
通信协议:是指双方约定的一些规则。
在使用异步串口传送一个字符信息时,对数据格式有如下规定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。
起始位:先发一个逻辑“0”信号,表示传输字符的开始数据位:紧接在起始位之后。
数据位的个数可以是4、5、6、7、8,从最低位开始传送,靠时钟定位。
奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此校验数据传送的正确性。
停止位:它是一个字符数据的结束标志。
空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。
波特率:是衡量数据传送速率的指针。
表述每秒钟传送的二进制位数。
注:异步通信是按字符传输的,接收设备在收到起始信号之后在一个字符的传输时间内能和发送设备保持同步就能正确接收。
传送方式:单工方式、半双工方式、全双工方式终端概述:在Linux中,TTY(终端)是一类字符设备的统称,它包括了3种类型:控制台、串口和伪终端。
控制台:供内核使用的终端为控制台。
控制台在Linux启动时,通过命令console=…指定,如果没有指定控制台,系统把第一个注册的终端(tty)作为控制台。
1、控制台是一个虚拟的终端,它必须映射到真正的终端上。
2、控制台可以简单的理解为printk输出的地方3、控制台是个只输出的设备,功能很简单,只能在内核中访问。
伪终端:伪终端设备是一种特殊的终端设备,由主-从两个成对的设备构成,当打开主设备时,对应的从设备随之打开,形成连接状态。