Linux底层驱动
小虾米_2018
专注于C、C++、嵌入式系统、网络、驱动编程~
展开
-
USB驱动程序设计(5)—USB下载线驱动设计
1.模块代码的初始化函数和退出函数static struct usb_driver dnw_driver = { .name = "dnw", /* 驱动名 */ .probe = dnw_probe, /* 捕获函数 */ .disconnect = dnw_disconnect, /* 卸载函数 */ .id_table =...原创 2019-08-22 09:56:19 · 399 阅读 · 0 评论 -
USB驱动程序设计(4)—Linux USB驱动程序设计
1.USB驱动模型 USB设备包括配置(configuration)、接口(interface)和端点(endpoint),一个USB设备驱动程序对应一个USB接口,而非整个USB设备。比如说一个MP4的播放设备,他可以播放视频、也可以播放声音,这2个功能称为一个接口,而每一个驱动只能驱动一个接口,所以如果需要同时播放视频和音频则需要2个驱动程序。 在Linux内核中,使用struct...原创 2019-08-21 16:07:10 · 561 阅读 · 0 评论 -
USB驱动程序设计(3)—Linux USB系统架构
1.软件系统架构软件的系统架构分为2中,一种是主机架构,就是说运行Linux的设备是一个主机,可以插入U盘等设备。 最底部是一个USB主控制器,这是一个硬件,在芯片里面都会带有的。为了让这个主控制器工作起来,Linux需要有一个USB主控制器驱动。 为了方便用户设计USB设备驱动,Linux内核里面实现了一些USB核心,这里面主要是一些Linux协议之类的。USB设备驱动就是针对插入到L...原创 2019-08-21 10:24:07 · 437 阅读 · 0 评论 -
USB驱动程序设计(2)—USB协议分析
1.USB设备逻辑结构在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个 端点。每个USB设备都可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB协议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集。 一个USB播放器带有音频,视...原创 2019-08-20 15:36:48 · 531 阅读 · 0 评论 -
USB驱动程序设计(1)—USB总线介绍
1.USB发展史USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一。 USB1.0出现在1996年的,速度只有1.5Mb/s,1998年升级为USB...原创 2019-08-19 21:27:29 · 612 阅读 · 0 评论 -
SPI驱动程序设计(2)—Linux SPI子系统
1.SPI子系统架构SPI 子系统架构主要有三部分组成 SPI core核心:用于连接SPI客户驱动和SPI主控制器驱动,并且提供了对应的注册和注销的接口。 SPI controller driver主控制器驱动:用来驱动SPI控制器。 SPI protocol drvier客户驱动:用来驱动SPI设备。 2.SPI控制器驱动分析1.SPI控制器驱动对应的内核文件在/dr...原创 2019-08-19 19:51:53 · 380 阅读 · 0 评论 -
SPI驱动程序设计(1)—SPI总线介绍
1.SPI总线结构SPI(Serial Peripheral Interface)串行外设接口,是一种高速的,全双工,同步的通信总线。采用主从模式 (Master Slave)架构,支持多个slave,一般仅支持单Master。SPI接口共有4根信号线,分别是:设备选择线(SS)、 时钟线(SCK)、串行输出数据线(MOSI)、串行输入数据线(MISO)。2.数据传输过程主节点...原创 2019-08-19 18:39:41 · 620 阅读 · 0 评论 -
I2C驱动程序设计(4)—I2C自编设备驱动设计
在分析驱动程序之前我们再来分析一下I2C子系统的模型。I2C的设备驱动中有2中方式,一种是通过通用驱动来编写用户驱动。另一种就是直接在I2C子系统中添加一个I2C的设备驱动,比如说针对AT24C02的驱动程序,接下来我们来学习怎么编写一个I2C设备驱动。1.驱动程序分析我们先在Linux内核代码中打开一个叫做At24.c的文件,只要是属于AT24开头的设备都可以使用这个驱动。我们接下来分析...原创 2019-08-19 15:19:15 · 659 阅读 · 0 评论 -
I2C驱动程序设计(3)—I2C用户态驱动程序设计
之前已经说过,有2种i2c驱动程序的设计,比如说针对EEPROM的驱动程序。我们可以专门编写一个针对EEPROM的驱动程序。另一种方式就是通过i2c-dev,即通过i2c通用通用驱动,来编写一个应用程序,来完成对设备的控制。我们现在就来实现i2c用户态驱动程序的设计。1.通用设备驱动分析首先需要分析i2c-dev,先打开i2c-dev.c这个文件,找到i2c_dev_init函数。 re...原创 2019-08-19 11:01:36 · 1048 阅读 · 0 评论 -
I2C驱动程序设计(2)—Linux下I2C子系统的介绍
1.I2C子系统架构Linux下IIC的架构模型大概可以分为3层: 第一层是I2C的从设备驱动,它包含图中的device driver和i2c-dev。device driver需要用户编写,i2c-dev由内核实现,包含了I2C设备的通用方法,但是用户不能直接使用这个驱动,需要编写一个用户层驱动,它们2个合起来才可以实现一个驱动程序。 第二层总线驱动,它又叫做总线控制器驱动,...原创 2019-08-16 16:35:29 · 362 阅读 · 0 评论 -
I2C驱动程序设计(1)—I2C总线介绍
1.I2C电气特性I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。硬件结构如下:I2C总线只有两根双向信号线: SDA:Serial Data Line—数据线 SCL :Serial Clock—时钟线 2.I2C总线寻址I2C总线协议规定:从设备采用7位的地址。D7~D1:从设备地址...原创 2019-08-16 10:29:51 · 318 阅读 · 0 评论 -
oops信息及栈回溯
oops信息及栈回溯转载 2019-07-09 10:15:12 · 149 阅读 · 0 评论 -
块设备驱动程序设计(3)—简单块设备驱动设计
这节课的内容主要根据上一节课分析出来的块设备的初始化和操作流程,编写出自己的块设备驱动函数。因此这篇博文主要讲一下所用到函数的用法及其他框架。1、编写一个模块框架 2、注册一个块设备major = register_blkdev(major, "blk");它有2个参数,主设备号和设备名字,一般采用内核自动分配,所以这里参数为0,自动分配的设备号会以返回值的形式得到。如果返回值小于等于0,说...原创 2019-06-28 21:48:38 · 818 阅读 · 1 评论 -
块设备驱动程序设计(2)—块设备驱动实例分析
实例代码#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/kernel.h> /* printk() */#include <linu...原创 2019-06-28 10:09:09 · 384 阅读 · 0 评论 -
块设备驱动程序设计(1)—块设备系统架构
1.块设备概念块设备是指只能以块为单位进行访问的设备,块大小一般是512个字节的整数倍。常见的块设备包括硬件,SD卡,光盘等。2.块设备驱动系统架构虚拟文件系统 VFSVFS是对各种具体文件系统的一种封装 ,为用户程序访问文件提供统一的接口。磁盘缓存 Caches当用户发起文件访问请求的时候,首先会到Disk Cache中寻找文件是否被缓存了,如果在cache中,...原创 2019-06-27 22:32:12 · 491 阅读 · 0 评论 -
Linux网卡驱动(4)—DM9000网卡驱动程序完全分析
1.硬件连接mini2440开发板上DM9000的电气连接和mach-mini2440.c文件的关系其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x20000000开始。DM9000的TXD[2:0]作为strap pin在电路图中是空接的,所以IO base是300H。中断使用了EINT7。这些内容在mach文件中有如下体现:#define S3...原创 2019-06-26 13:35:04 · 1416 阅读 · 0 评论 -
Linux网卡驱动(3)-网卡驱动深层分析
之前我们介绍了网卡是怎么把一个数据包发送到网络上的,但是这只是Linux网络系统中的一个非常小的部分。对于内核怎么把用户数据传递给网卡,以及内核怎么把网卡收到的数据传递给用户是一个庞大的知识。 学过计算机网络的都知道,当用户需要发送数据的时候,需要根据路由表找到数据包下一站该发送到哪个路由器,这个路由器叫做这个网卡的邻居。如果邻居的MAC地址不知道,还需要通过ARP协议获取的路由去的MAC地址,...原创 2019-06-17 10:54:24 · 1414 阅读 · 1 评论 -
Linux网卡驱动(2)-回环网卡的设计
1.回环网卡介绍在Linux系统中有一个叫做lo的网卡,它的IP地址是127.0.0.1,当我们ping 127.0.0.1的时候他是可以ping通的。回环网卡和其他网卡最大的区别就是他的数据包不会真正的方式到网络上,而是通过网卡发送端发送到了自己的接收端。就是自己给自己发送数据。它可以用来检查网络协议栈和网卡工作是否正常。 今天我们的目标就是自己实现回环网卡的驱动。2.回环网卡的设计...原创 2019-06-16 17:40:33 · 1411 阅读 · 0 评论 -
Linux网卡驱动(1)-网卡驱动架构分析
1.Linux网络子系统我们这里研究内核空间即可,在内核空间分成5层,分别是: 1、系统调用接口,它面向的客户是应用层序,为应用程序提供访问网络子系统的统一方法,比如说socket,send等函数的系统调用 2、协议无关接口,它提供通用的方法来使用传输层协议,把所有的协议统一起来 3、网络协议,它的作用就是实现具体的网络协议 4、设备无关接口,这个接口是为了屏蔽底层硬件的差异...原创 2019-06-16 15:33:09 · 9147 阅读 · 2 评论 -
Linux串口驱动程序(6)-串口驱动实现
在Linux驱动开发中,一般都不会从0开始写,我们做的更多的是移植和修改,有时候还需要对驱动程序进行优化。当然具备移植、修改驱动能力的基础是能够读懂驱动程序,同时需要对这个驱动程序的核心功能非常了解。接下来开始编写发送中断处理程序和接收中断处理程序的代码。1.发送中断处理程序的设计下面我们就开始对s3c24xx_serial_tx_chars进行重新的编写,编写的依据就是我们之前分析出来的...原创 2019-06-13 11:23:35 · 7682 阅读 · 0 评论 -
Linux串口驱动程序(5)-数据接收
1.tty数据接收流程分析在用户调用read函数来读取设备的文件的数据时,首先得到响应的是tty_fops中的tty_read(tty核心)struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_writ...原创 2019-06-13 09:26:26 · 1819 阅读 · 1 评论 -
Linux串口驱动程序(4)-数据发送
1.tty数据发送调用关系怎么样才能找到发送数据所使用的函数呢?打开uart_register_driver函数,找到里面的tty_register_driver,转到定义,这里调用了tty_fops这个结构,这几结构里就保存了读写串口的函数tty_write:static const struct file_operations tty_fops = { .llseek = no_l...原创 2019-06-12 22:25:00 · 1653 阅读 · 1 评论 -
Linux串口驱动程序(3)-打开设备
先来分析一下串口打开的过程:1、用户调用open函数打开串口设备文件; 2、在内核中通过tty子系统,把open操作层层传递到串口驱动程序中; 3、在串口驱动程序中的xx_open最终实现这个操作。这里主要有2个点需要我们重点分析,一个是open函数的传递过程,而是串口驱动程序XXX_open函数的实现。1.open函数传递打开uart_register_driver函数,里面就...原创 2019-06-12 20:36:30 · 4716 阅读 · 6 评论 -
Linux串口驱动程序(2)-串口驱动程序初始化分析
1.串口驱动程序结构分析对用户来讲,能够正常使用串口肯定是需要实现如下函数的: 1、串口设备文件的打开 2、串口设备文件的初始化 3、串口设备文件的读写 4、串口设备文件的控制 2.串口驱动中重要的数据结构首先分析一下串口读写的流程当用户读写串口设备文件的时候,就会调用到usart_write函数(图中没有),在usart_write函数中会读取uart_state...原创 2019-06-12 16:56:32 · 1155 阅读 · 0 评论 -
Linux串口驱动程序(1)-tty驱动程序架构
1.tty概念分析在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。由于串口也是一种终端,因此这里引入终端这个概念 串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是 /dev/ttySAC0;/dev/ttySAC1…… 控制台...原创 2019-06-12 08:53:02 · 3905 阅读 · 0 评论 -
Linux总线驱动设计(2)-平台设备驱动设计
1.平台总线概述 平台总线(Platform bus)是linux2.6内核加入的一种虚拟总线,其优势在于采用了总线的模型对设备与驱动进行了管理,这样提高了程序的可移植性。 通过平台总线机制开发设备驱动的流程如图:平台总线驱动与设备匹配机制:主要还是设备名 = 驱动名2.平台设备平台设备使用struct platform_device来描述:struct platform_d...原创 2019-06-11 22:29:59 · 288 阅读 · 0 评论 -
Linux总线驱动设计(1)-总线设备驱动模型
1.总线模型概述随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形势的需要,从Linux 2.6内核开始提供了全新的设备模型。 假如说现在有一条USB总线,它支持热插拔,支持鼠标、键盘、网卡。当网卡插入时,USB总线需要感知到新设备的插入,然后根据设备描述符逐个去匹配和它一样的设备驱动程序,可能先找到鼠标驱动程...原创 2019-06-11 17:13:19 · 504 阅读 · 0 评论 -
Linux按键驱动程序设计(7)-阻塞型驱动程序设计
1.阻塞必要性当一个设备无法立刻满足用户的读写请求时应当如何处理? 例如:调用read时,设备没有数据提供, 但以后可能会有;或者一个进程试图向设备写入数据,但是设备暂时没有准备好接收数据。当上述情况发生的时候,驱动程序应当(缺省地)阻塞进程,使它进入等待(睡眠)状态,直到请求可以得到满足。2.内核等待队列在实现阻塞驱动的过程中,需要有一个“候车室”来安排被阻塞的进程“休息”,当唤醒它...原创 2019-06-11 15:25:59 · 285 阅读 · 0 评论 -
Linux按键驱动程序设计(6)-驱动支持多按键优化
在前面的基础上,实现多按键中断,这里实现2个,k1,k3。 通过应用程序,打印出产生中断的key号。 代码如下: key.c #include <linux/module.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <linux/interrupt.h>...原创 2019-06-11 12:50:46 · 483 阅读 · 0 评论 -
Linux按键驱动程序设计(5)-按键去抖
1.按键抖动按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,开关不会马上稳定地接通或断开。因而在闭合及断开的瞬间总是伴随有一连串的抖动。2.去抖方法按键去抖动的方法主要有二种: 一种是硬件电路去抖。 另一种就是软件延时去抖。而延时又一般分为二种,一种是for循环等待,另一种是定时器延时。在操作系统中,由于效率方面的原因,一般不允许使用for循环来等待,只...原创 2019-06-11 10:01:41 · 547 阅读 · 0 评论 -
Linux按键驱动程序设计(4)-中断分层技术
1.中断嵌套首先引入之前提到过的快速中断和慢速中断: 快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。 假如说某个程序在执行快速中断,比如说串口程序,现在网卡收到了一个数...原创 2019-06-10 22:20:31 · 1313 阅读 · 2 评论 -
Linux按键驱动程序设计(3)-按键操作硬件实现
1.复习裸机按键操作驱动#define GPGCON (volatile unsigned long *)0x56000060/** K1,K2,K3,K4对应GPG0、GPG3、GPG5、GPG6*/#define GPG0_int (0x2<<(0*2))#define GPG3_int (0x2<<(3*2))#define...原创 2019-06-10 21:00:22 · 2441 阅读 · 1 评论 -
Linux按键驱动程序设计(2)-Linux中断处理程序
CPU在工作的过程中,经常需要与外设进行交互,交互的方式包括”轮询方式”,”中断方式”。轮询方式:CPU不断地查询设备的状态。该方式实现比较简单,但CPU利用率很低,不适合多任务的系统。 中断方式:CPU在告知硬件开始一项工作后,就去做别的事去了,当硬件完成了该项工作后,向CPU发送一个信号,告知CPU它已经完成了这项工作。写过按键裸机程序的同学都知道按键的读取一般都采用中断的方式,如果采...原创 2019-06-10 19:26:21 · 569 阅读 · 0 评论 -
Linux按键驱动程序设计(1)-混杂设备驱动模型
1.混杂设备概念在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。 混杂设备是字符设备的一种,它们共享一个主设备号(10),但次设备号不同,所有混杂设备形成一个链表,对设备发起访问时,内核根据次设备号查找到相应的miscdevic...原创 2019-06-10 15:40:45 · 348 阅读 · 0 评论 -
Linux字符设备驱动程序开发(4)-LED驱动程序设计
这里编写一个LED内核驱动代码、流程大概如下:1、实现一个内核模块。 2、添加字符设备驱动框架。 3、在字符设备驱动中实现open和ioctl函数。 4、编写应用程序。 led.c#include <linux/init.h>#include <linux/module.h>#include <linux/cdev.h>#include &...原创 2019-06-10 13:00:25 · 680 阅读 · 0 评论 -
Linux字符设备驱动程序开发(3)-字符设备控制
1 设备控制理论1.1 控制理论-作用大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力。比如: 改变波特率。1.2 设备控制-应用函数在用户空间,使用ioctl系统调用来控制设备,原型如下:int ioctl(int fd,unsigned long cmd,...)//fd: 要控制的设备文件描述符//cmd: 发送给设备的控制命令//…: 第3个参数...原创 2019-06-10 09:01:50 · 745 阅读 · 0 评论 -
Linux字符设备驱动程序开发(2)-字符设备驱动模型分析
驱动模型在Linux系统中,设备的类型非常繁多,如:字符设备,块设备,网络接口设备,USB设备,PCI设备,平台设备,混杂设备……,而设备类型不同,也意味着其对应的驱动程序模型不同,这样就导致了我们需要去掌握众多的驱动程序模型。那么能不能从这些众多的驱动模型中提炼出一些具有共性的规则,则是我们能不能学好Linux驱动的关键。1.设备描述结构在任何一种驱动模型中,设备都会用内核中的一种结构...原创 2019-06-08 20:57:56 · 682 阅读 · 0 评论 -
Linux字符设备驱动程序开发(1)-使用字符设备驱动
1.编译/安装驱动在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块。把下面的范例代码拷贝到Linux系统中: memdev.c#include <linux/module.h>#include <linux/fs.h>#include <linux/init.h>#i...原创 2019-06-07 11:38:40 · 6457 阅读 · 0 评论 -
驱动开发准备
Linux驱动开发概述Linux驱动分类,分类有很多分类方法,比如常规分类法、总线分类法,按照常规分类法可分为字符设备、块设备、网络设备。 字符设备:字符设备是一种按字节(最小访问单位)来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常用文件的方式访问,比如open, close, read和write 系统调用。例:串口,LED,按键。 块设备:块设备是一种按块访问的设备(最小访问...原创 2019-06-06 16:52:11 · 295 阅读 · 0 评论 -
Linux系统调用
系统调用基本概念系统调用实质就是函数调用,只是调用的函数是系统函数,处于内核态而已。用户在调用系统调用时会向内核传递一个系统调用号,然后系统调用处理程序通过此号从系统调用表中找到相应的内核函数执行(系统调用服务例程),最后返回,在这个过程中涉及系统调用号、系统调用表以及系统调用处理程序等概念。系统调用号Linux Linux为每一个系统调用定义了一个唯一的编号,此编号称为系统调用号。...原创 2019-06-06 10:35:58 · 493 阅读 · 0 评论