Linux驱动开发
文章平均质量分 83
dayL_W
热爱编程、热爱生活、热爱运动
展开
-
Linux-Flash驱动(4)-MTD系统架构
1、什么是MTD系统架构MTD(memory technology device 存储 技术设备 ) 是用于访问 memory 设备( ROM 、 flash )的 linux 的子系统。 MTD 的主要目的是为了使新的 memory 设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。 MTD 的所有源代码在 /drivers/mtd 子目录下 。FLASH在嵌入式系统...原创 2017-07-08 11:06:03 · 701 阅读 · 0 评论 -
Linux字符设备驱动程序开发(1)-使用字符设备驱动
1、使用字符设备驱动程序1.1编译/安装驱动在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块。把下面的范例代码拷贝到Linux系统中:#include <linux/module.h>#include <linux/fs.h>#include <linux/init.h&...原创 2017-06-29 22:42:47 · 7057 阅读 · 0 评论 -
Linux驱动开发准备
1、Linux驱动开发概述Linux驱动分类,分类有很多分类方法,比如常规分类法、总线分类法,按照常规分类法可分为字符设备、块设备、网络设备。1.1 字符设备字符设备是一种按字节(最小访问单位)来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常用文件的方式访问,比如open, close, read和write 系统调用。例:串口,LED,按键。1原创 2017-06-29 18:17:09 · 446 阅读 · 0 评论 -
Linux内核链表
1、Linux内核链表介绍对应链表大家应该都不陌生,我们来复习一下1.链表简介链表是一种常用的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。2.传统链表和内核链表对比原创 2017-06-29 16:21:53 · 381 阅读 · 0 评论 -
Linux子系统学习
1、Linux子系统介绍如图所示,Linux有7个子系统,分别为SCI:系统调用PM:进程管理VFS:虚拟文件系统MM:内存管理Network Stack:网络协议栈Arch:体系结构相关DD:设备驱动和Linux驱动开发关系较为紧密的有进程管理系统、内存管理系统、虚拟文件系统,下面将学习进程管理系统和内存管理系统。2、Linux内存原创 2017-06-28 15:18:22 · 473 阅读 · 0 评论 -
Linux内核模块开发
1、内核模块基础1.1什么是内核模块Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢, 方法1:把所有的组件都编译进内核文件,即:zImage或bzImage,但这样会导致一个问题:占用内存过多.因为如果有些组件不需要经常使用,但是它一直存在于内存中,这显然是对内存资源的浪费。有没有一种机制能让内核文件本身并不包含某组件,而是在该组件需要被使用的时原创 2017-06-28 12:11:03 · 306 阅读 · 0 评论 -
10、Linux根文件系统的制作
根文件系统的制作1、建立根文件系统及目录1.1 创建目录#mkdir rootfs#cd rootfs#mkdir bin dev etc lib proc sbin sys usr mnt tmp var#mkdir usr/bin usr/lib usr/sbin lib/modules1.2 创建设备文件Linux系统中...原创 2017-05-22 20:49:08 · 1007 阅读 · 0 评论 -
9、Linux下tftp服务器的安装及配置
在交叉开发环境中tftp是很常见的一种工具,常用来和虚拟机连接下载内核文件安装并启动tftp需要以下流程在红帽的光盘映像中有tftp的安装包,可以挂在光盘获得,运行#mount /dev/cdrom /mnt/在其他Linux的光盘映像文件中应该也有tftp安装包,然后开始安装tftp由于安装tftp依赖于xinetd安装包,先安装xinetd#rpm -ivh /mnt/Packag...原创 2017-05-19 23:34:20 · 4708 阅读 · 2 评论 -
7-Linux内核配置编译及安装
学习了一下Linux内核配置、安装及编译,为了防止忘记,写在博客里1、Linux源代码下载下载源代码最好去官网下载,地址为:https://www.kernel.org/如果需要下载历史版本,点击网页上的https://www.kernel.org/pub/,然后选择Linux,kernel即可,比较简单。2、配置Linux内核把源代码拷到Linux电脑里,解压,这里我下...原创 2017-05-10 16:50:45 · 4453 阅读 · 1 评论 -
Linux-USB驱动(1)-USB总线介绍
USB发展史USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯。USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,成为当今个人电脑和大量智能设备的必配接口之一。•USB 1.0出现在1996年的,速度只有1.5Mb/s1998年升级为U...原创 2017-08-12 11:24:52 · 406 阅读 · 0 评论 -
Linux-USB驱动(3)-USB协议深入分析
0. 基本概念 一个【传输】(控制、批量、中断、等时):由多个【事务】组成; 一个【事务】(IN、OUT、SETUP):由一多个【Packet】组成。 USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。1. 包(Packet)...转载 2017-08-12 15:11:47 · 515 阅读 · 0 评论 -
Linux-USB驱动(4)-LinuxUSB系统架构
Linux下的USB系统架构我们分3小节来学习:1、软件系统架构2、MassStorage驱动体验,mass storage 是USB协议中的一部分, 是大容量存储器或者海量存储器的意思。我们的U盘就是利用的这个协议开发和制作的。3、RNDIS驱动体验,rndis既是RemoteNDIS,既是远程网络驱动接口规范。Remote Network Driver Interface Spec...原创 2017-08-12 20:21:17 · 896 阅读 · 0 评论 -
Linux-USB驱动(5)-USB驱动程序设计
这节内容我们分4个小块来学习,分别是USB驱动模型、URB、HID协议、鼠标驱动程序分析等。USB驱动模型USB设备包括配置(configuration)、接口(interface)和端点(endpoint),一个USB设备驱动程序对应一个USB接口,而非整个USB设备。比如说一个MP4的播放设备,他可以播放视频、也可以播放声音,这2个功能称为一个接口,而每一个驱动只能驱动一个接...原创 2017-08-13 11:11:00 · 542 阅读 · 0 评论 -
Linux-USB驱动(6)-USB下载线驱动设计
在裸机代码中通常需要使用USB来下载u-boot代码。当然下载内核代码使用usb下载也是可以的。接下来我们要完成的就是DNW的USB下载器模块设计。框架首先完成模块代码的初始化函数和退出函数。struct usb_driver dnw_driver = { .name = "dnw", /* 驱动名 */ .probe = dnw_probe, /* 捕获函数 */...原创 2017-08-13 15:18:47 · 448 阅读 · 0 评论 -
Linux-IIC驱动(1)-IIC总线介绍
IIC我在很久之前就接触并使用过了,现在来回顾一下它的硬件结构和时序硬件结构I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。硬件结构如下:I2C总线只有两根双向信号线。SDA: Serial Data Line-数据线SCL :Serial Clock-时钟线I2C总线...原创 2017-08-28 15:45:22 · 418 阅读 · 0 评论 -
Linux-IIC驱动(2)-Linux下IIC子系统的介绍
IIC子系统架构Linux下IIC的架构模型大概可以分为3层:第一层是IIC的从设备驱动,他包含图中的device driver和i2c-dev。device driver需要用户编写,i2c-dev由内核实现,包含了IIC设备的通用方法,但是用户不能直接使用这个驱动,需要编写一个用户层驱动,它们2个合起来才可以实现一个驱动程序。第二层总线驱动,他又叫做控制器驱动...原创 2017-08-29 15:32:52 · 447 阅读 · 0 评论 -
Linux-IIC驱动(3)-IIC用户态驱动程序设计
之前已经说过,有2种i2c驱动程序的设计,比如说针对EEPROM的驱动程序。我们可以专门编写一个针对EEPROM的驱动程序。另一种方式就是通过i2c-dev,即通过i2c通用通用驱动,来编写一个应用程序,来完成对设备的控制。我们现在就来实现i2c用户态驱动程序的设计。通用设备驱动分析首先需要分析i2c-dev,先打开i2c-dev.c这个文件,找到i2c_dev_init函...原创 2017-08-29 21:16:54 · 1751 阅读 · 0 评论 -
Linux字符设备驱动程序开发(2)-字符设备驱动模型分析
1、设备描述结构cdev在Linux系统中,设备的类型非常繁多,如:字符设备,块设备,网络接口设备,USB设备,PCI设备,平台设备,混杂设备……,而设备类型不同,也意味着其对应的驱动程序模型不同,这样就导致了我们需要去掌握众多的驱动程序模型。那么能不能从这些众多的驱动模型中提炼出一些具有共性的规则,则是我们能不能学好Linux驱动的关键。这些规则可以参考第二节的设备驱动模型,在任何一种驱动模原创 2017-06-30 15:47:29 · 466 阅读 · 0 评论 -
Linux字符设备驱动程序开发(3)-LED驱动程序设计
1、设备控制理论控制理论-作用大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力。比如: 改变波特率。设备控制-应用函数在用户空间,使用ioctl系统调用来控制设备,原型如下:int ioctl(int fd,unsigned long cmd,...)fd: 要控制的设备文件描述符cmd: 发送给设备的控制命令…: 第3个参数是可选的参数,存在与否原创 2017-06-30 22:32:00 · 622 阅读 · 0 评论 -
Linux按键驱动程序设计(1)-混杂设备驱动模型
1、混杂设备概念在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。混杂设备是字符设备的一种,它们共享一个主设备号(10),但次设备号不同,所有混杂设备形成一个链表,对设备发给你问时内核根据次设备号查找到相应的miscdevi原创 2017-07-01 12:02:46 · 431 阅读 · 0 评论 -
Linux-Flash驱动(3)-简单块设备驱动设计
这节课的内容主要根据上一节课分析出来的块设备的初始化和操作流程,编写出自己的块设备驱动函数。因此这篇博文主要讲一下所用到函数的用法及其他框架。1、编写一个模块框架2、注册一个块设备major = register_blkdev(major, "blk");它有2个参数,主设备号和设备名字,一般采用内核自动分配,所以这里参数为0,自动分配的设备号会以返回值的形式得到。如果返回值小于等于0,说...原创 2017-07-08 10:27:45 · 547 阅读 · 0 评论 -
Linux-Flash驱动(2)-块设备驱动实例分析
在上一节课中,我们在内存中划分出512kB作为一个块设备,并对它实现读写的操作。现在我们来具体分析这段代码。#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/init.h>#include <linux/sched.h>#inclu...原创 2017-07-08 09:12:51 · 567 阅读 · 0 评论 -
Linux网卡驱动(3)-网卡驱动深层分析
之前我们介绍了网卡是怎么把一个数据包发送到网络上的,但是这只是Linux网络系统中的一个非常小的部分。对于内核怎么把用户数据传递给网卡,以及内核怎么把网卡收到的数据传递给用户是一个庞大的知识。学过计算机网络的都知道,当用户需要发送数据的时候,需要根据路由表找到数据包下一站该发送到哪个路由器,这个路由器叫做这个网卡的邻居。如果邻居的MAC地址不知道,还需要通过ARP协议获取的路由去的MAC地址,...原创 2017-07-05 15:17:12 · 418 阅读 · 0 评论 -
Linux网卡驱动(2)-回环网卡的设计
1、回环网卡介绍在Linux系统中有一个叫做lo的网卡,它的IP地址是127.0.0.1,当我们ping 127.0.0.2的时候他是可以ping通的。回环网卡和其他网卡最大的区别就是他的数据包不会真正的方式到网络上,而是通过网卡发送端发送到了自己的接收端。就是自己给自己发送数据。它可以用来检查网络协议栈和网卡工作是否正常。今天我们的目标就是自己实现回环网卡的驱动。2、回环网卡...原创 2017-07-05 10:26:34 · 533 阅读 · 0 评论 -
Linux网卡驱动(1)-网卡驱动架构分析
1、Linux网络子系统网络子系统采用分层的结构:我们这里研究内核空间即可,在内核空间分成5层,分别是:1、系统调用接口,它面向的客户是应用层序,为应用程序提供访问网络子系统的统一方法,比如说socket,send等函数的系统调用2、协议无关接口,它提供通用的方法来使用传输层协议,把所有的协议统一起来3、网络协议,它的作用就是实现具体的网络协议4、设备无关接口,这个接口......原创 2017-07-04 18:02:34 · 1513 阅读 · 0 评论 -
Linux串口驱动程序(6)-串口驱动实现
在Linux驱动开发中,一般都不会从0开始写,我们做的更多的是移植和修改,有时候还需要对驱动程序进行优化。当然具备移植、修改驱动能力的基础是能够读懂驱动程序,同时需要对这个驱动程序的核心功能非常了解。接下来开始编写发送中断处理程序和接收中断处理程序的代码。1、发送中断处理程序的设计下面我们就开始对s3c24xx_serial_tx_chars进行重新的编写,编写的依据就是我们之前分析...原创 2017-07-03 18:26:34 · 4086 阅读 · 0 评论 -
Linux串口驱动程序(5)-串口接收分析
1、tty数据接收流程分析在用户调用read函数来读取设备的文件的数据时,首先得到响应的是tty_read,这个函数又是由n_tty_read来实现的/** * n_tty_read - read function for tty * @tty: tty device * @file: file object * @buf: userspace buffer point...原创 2017-07-03 17:14:12 · 1562 阅读 · 0 评论 -
Linux串口驱动程序(4)-串口发送分析
1、tty数据发送调用关系怎么样才能找到发送数据所使用的函数呢?打开uart_register_driver函数,找到里面的tty_register_driver,转到定义,这里调用了tty_fops这个结构,这几结构里就保存了读写串口的函数tty_write:static const struct file_operations tty_fops = { .llseek = ...原创 2017-07-03 16:26:33 · 1046 阅读 · 2 评论 -
Linux串口驱动程序(3)-串口打开分析
先来分析一下串口打开的过程:1、用户调用open函数打开串口设备文件2、在内核中通过tty子系统,把open操作层层传递到串口驱动程序中3、在串口驱动程序中的XX_open最终实现这个操作。这里主要有2个点需要我们重点分析,一个是open函数的传递过程,而是串口驱动程序XXX_open函数的实现。1、open函数传递打开uart_register_driver函数,里...原创 2017-07-03 10:37:54 · 962 阅读 · 0 评论 -
Linux串口驱动程序(2)-串口驱动程序初始化分析
1、串口驱动程序结构分析对用户来讲,能够正常使用串口肯定是需要实现如下函数的:1、串口设备文件的打开2、串口设备文件的初始化3、串口设备文件的读写4、串口设备文件的控制2、串口驱动中重要的数据结构首先分析一下串口读写的流程当用户读写串口设备文件的时候,就会调用到usart_write函数(图中没有),在usart_write函数中会读取uart_state数组里...原创 2017-07-03 10:04:10 · 1999 阅读 · 0 评论 -
Linux串口驱动程序(1)-tty架构
1、tty概念分析在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。由于串口也是一种终端,因此这里引入终端这个概念串口终端(/dev/ttyS*)串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是 /dev/ttySAC0;/dev/ttySAC1…...原创 2017-07-02 21:36:54 · 1471 阅读 · 0 评论 -
Linux总线驱动设计(1)-总线驱动模型
1、总线模型概述随着技术的不断进步,系统的拓扑结构也越来越复杂,对热插拔,跨平台移植性的要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形势的需要,从Linux 2.6内核开始提供了全新的设备模型。假如说现在有一条USB总线,它支持热插拔,支持鼠标、键盘、网卡。当网卡插入时,USB总线需要感知到设备的插入,然后根据设备描述符逐个去匹配和它一样的设备驱动程序,可能先找到鼠标驱动程序...原创 2017-07-02 19:05:29 · 632 阅读 · 0 评论 -
Linux按键驱动程序设计(5)-按键去抖
1、按键去抖介绍编写过裸机驱动的同学都知道按键是必需去抖的,这里不再赘述。2、去抖方法按键去抖动的方法主要有二种一种是硬件电路去抖动;另一种就是软件延时去抖。而延时又一般分为二种,一种是for循环等待,另一种是定时器延时。在操作系统中,由于效率方面的原因,一般不允许使用for循环来等待,只能使用定制器。3、内核定时器Linux内核使用struct t原创 2017-07-02 13:09:37 · 716 阅读 · 0 评论 -
Linux按键驱动程序设计(4)-中断分层技术
1.中断嵌套首先引入之前提到过的快速中断和慢速中断:快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。假如说某个程序在执行快速中断,比如说串口程序,现在网卡原创 2017-07-01 20:37:38 · 405 阅读 · 0 评论 -
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 ...原创 2017-07-01 16:34:02 · 964 阅读 · 2 评论 -
Linux按键驱动程序设计(2)-Linux中断处理程序
写过按键裸机程序的同学都知道按键的读取一般都采用中断的方式,如果采用轮询的方式真的是太浪费CPU资源了。下面将介绍Linux中的中断处理程序。1、裸机中断处理流程回顾对所有芯片而言,中断都有一个通用的入口,进入后会保存保存当前的环境把它压栈,然后查询中断向量表,根据中断源去调用对应的中断处理程序。因此总结出以下3点:1、中断统一入口2、事先注册中断处理程序3、根据中原创 2017-07-01 15:19:16 · 374 阅读 · 0 评论 -
Linux-IIC驱动(4)-自编IIC设备驱动程序
在分析驱动程序之前我们再来分析一下IIC子系统的模型。IIC的设备驱动中有2中方式,一种是通过通用驱动来编写用户驱动。另一种就是直接在IIC子系统中添加一个IIC的设备驱动,比如说针对AT24C02的驱动程序。接下来我们来学习怎么编写一个IIC设备驱动。1、驱动程序分析我们先在Linux内核代码中打开一个叫做At24.c的文件,只要是属于AT24开头的设备都可以使用这个驱动。我们接...原创 2017-08-31 11:41:26 · 1457 阅读 · 1 评论