![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【linux驱动】
文章平均质量分 65
stan_linux
爱linux,爱arm,爱电子,爱创新
展开
-
linux驱动程序设计第一章——驱动程序初识
对于很多的新接触嵌入式开发的工程师来说,一般都会认为在嵌入式linux中最难最核心的部分是linux驱动程序设计,其实并非如此。 通过驱动程序的知识结构不难看出这一点,linux驱动设计规范占据40%的比例,内核相关的知识占据25%,硬件相关的知识占据25%。也就是说在linux驱动程序设计当中,一大部分的内容用来实现驱动程序的设计规范规(PS,规范意外着固定的设计模板)。而对于原创 2014-01-11 13:57:18 · 729 阅读 · 0 评论 -
等待队列(使用篇)
I/O的阻塞操作与等待队列1,基本概念什么是阻塞操作?这个好理解,其实就是对设备的操作没成功,进程进入等待状态,等待系统唤醒。在代码的层面理解: 运行到某代码(如某read()操作), 进程挂在那了,不再往下运行。 下面是我对等待队列的理解:如上图,一个FIFO设备的读写,需要两个wait_q转载 2014-01-12 16:40:05 · 1204 阅读 · 0 评论 -
Poll方法
当应用程序需要进行对多文件读写时,常用到 poll(System V)、select(BSD Unix)、epoll(linux2.5.45开始)(没验证)系统调用配合使用。当poll函数返回时,会给出一个文件是否可读写的标志,应用程序根据不同的标志读写相应的文件,实现阻塞或非阻塞的读写。这些系统调用功能相同: 允许进程来决定它是否可阻塞或非阻塞的读写一个或多个文件。这些调用都需要来自设备驱动转载 2014-01-12 16:53:36 · 984 阅读 · 0 评论 -
自动在/dev/下创建设备文件
转载自:http://blog.csdn.net/xie376450483/article/details/5726128在modprobe或者insmod后,如果不自动创建设备文件,需要mknod手动创建设备文件,然后应用程序才能工作,我们可以在安装了模块后,自动在/dev下创建设备文件 在设备中添加用于创建设备文件的class和每个即将在/dev下创建的设备转载 2014-01-12 17:03:08 · 3093 阅读 · 0 评论 -
linux mmap 详解
一.前言mmap的具体实现以前在学习内核时学习过,但是对于其中的很多函数是一知半解的,有些只能根据其函数名来猜测其具体的功能,在本文中,一起来重新深入理解其具体的实现。二.mmap的用户层应用void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 具体参数含义start :转载 2014-01-12 17:30:58 · 634 阅读 · 0 评论 -
IO端口和IO内存的区别及分别使用的函数接口
IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把CPU分成两大类。一类CPU(如M68K,Power PC等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没转载 2014-01-12 18:59:44 · 1274 阅读 · 0 评论 -
进程上下文和中断上下文
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表硬转载 2014-01-13 11:38:47 · 575 阅读 · 0 评论 -
总线设备驱动模型
文章的例子和实验使用《LDD3》所配的lddbus模块(稍作修改)。提示:在学习这部分内容是一定要分析所有介绍的源代码,知道他们与上一部分内容(kobject、kset、attribute等等)的关系,最好要分析一个实际的“flatform device”设备,不然会只学到表象,到后面会不知所云的。总线总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连转载 2014-01-13 11:12:12 · 677 阅读 · 0 评论 -
Linux中断处理驱动程序编写
中断与定时器:中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行中断的分类:内部中断和外部中断内部中断:中断源来自CPU内部(软件中断指令、溢出、触发错误等)外部中断:中断源来自CPU外部,由外设提出请求屏蔽中断和不可屏蔽中断:可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后,转载 2014-01-13 11:22:13 · 760 阅读 · 0 评论 -
linux驱动头文件说明
#include 是在linux-2.6.29/include/linux下面寻找源文件。#include 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。#include 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。#include 在linux-2.6.31_TX2转载 2014-01-14 22:14:01 · 726 阅读 · 0 评论 -
insmod: error inserting './igb.ko': -1 Unknown symbol in module 的问题所在
编译驱动的时候碰到了 insmod: error inserting './igb.ko': -1 Unknown symbol in module 的问题,在网上看了下,说是查看 dmesg | tail 看输出信息中的Unknown symbol,加载上这些模块就好。我的输出信息是:12345[ 3548.357465] igb转载 2014-01-16 12:04:29 · 1807 阅读 · 0 评论 -
MAJOR、MINOR、MKDEV理解
下面这段话出自linux内核linux/kdev.h中,是关于主次设备号操作的一些宏#ifndef _LINUX_KDEV_T_H#define _LINUX_KDEV_T_H#ifdef __KERNEL__#define MINORBITS 20#define MINORMASK ((1U #define MAJOR(dev) ((unsigned int) ((dev原创 2014-01-16 14:57:28 · 4656 阅读 · 0 评论 -
字符设备驱动1
装载自:点击打开链接1.cdev 结构体Linux2.6内核使用 cdev 结构体描述字符设备struct cdev // cdev 的定义在 { struct kobject kobj; //内嵌的kobject struct module *owner; //所属模块 const struct file_operations *转载 2014-01-16 15:54:44 · 647 阅读 · 0 评论 -
Linux 设备驱动 如何自动创建设备文件
设备文件是APP程序操作的对象,根据设备号匹配驱动程序,下面以简单的字符型设备驱动为例。 myclass = class_create(THIS_MODULE,"test_char"); /*在sys下创建类目录/sys/class/test_char*/ device_create(myclass, NULL, MKDEV(mem_major,0), NULL, "memdev0");转载 2014-01-19 15:22:44 · 1203 阅读 · 0 评论 -
Linux设备控制接口
序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管理和控制设备的接口。我们前面的“Hello World”驱动程序已经可以提供读写功能了,在这里我们将扩展我们的驱动以支持设备控制接口,在Linux中这个接口是通过ioctl函数来实现的。设备控制接口(ioctl 函数)回想一下我们在字符设备驱动中介绍的struct file_operations 结构,这转载 2014-01-12 15:58:07 · 836 阅读 · 0 评论 -
linux 的ioctl()函数
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围。写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑。一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数 。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它转载 2014-01-12 13:08:59 · 868 阅读 · 0 评论 -
Linux驱动程序设计——动态申请主设备号
1函数原型int alloc_chrdev_region(dev_t *dev,unsigned int -firstminor,unsigned int -count,char *name)2头文件3函数功能动态分配设备编号4函数参数说明该函数需要传递给它指定的第一个次设备号firstminor(一般为0)和要分配的转载 2014-01-11 16:39:10 · 1033 阅读 · 0 评论 -
Linux驱动程序设计——struct inode 和 struct file
1、struct inode──字符设备驱动相关的重要结构介绍内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符。Linux2.6.27内核中,inode结构体具体定义如下:struct inode {struct hlist_node i_hash;struct list_head i_list;struct list_head i_转载 2014-01-11 16:45:10 · 874 阅读 · 0 评论 -
Linux驱动程序设计——file_operations
struct file_operations是一个字符设备把驱动的操作和设备号联系在一起的纽带,是一系列指针的集合,每个被打开的文件都对应于一系列的操作,这就是file_operations,用来执行一系列的系统调用。linux-2.6.22/include/linux/fs.hstruct file_operations { struct module *owner转载 2014-01-11 17:12:14 · 826 阅读 · 0 评论 -
struct file_operations及struct file结构体理解转
两个主要数据结构如下:struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t转载 2014-01-11 17:17:53 · 1169 阅读 · 0 评论 -
file_operations中各项解析
linux设备驱动中file_operations结构体分析 struct module *owner第一个 file_operations 成员根本不是一个操作; 它是一个指向拥有这个结构的模块的指针. 这个成员用来在它的操作还在被使用时阻止模块被卸载. 几乎所有时间中, 它被简单初始化为 THIS_MODULE, 一个在 中定义的宏.loff_t (*llseek) (struc转载 2014-01-11 17:55:53 · 812 阅读 · 0 评论 -
file_operation中初始化的理解
结构体file_operations在头文件 linux/fs.h中定义,用来存储驱动内核模块提供的对 设备进行各种操作的函数的指针。该结构体的每个域都对应着驱动内核模块用来处理某个被请求的 事务的函数的地址。举个例子,每个字符设备需要定义一个用来读取设备数据的函数。结构体 file_operations中存储着内核模块中执行这项操作的函数的地址。一下是该结构体 在内核2.6.5中看起来的转载 2014-01-11 18:15:25 · 2225 阅读 · 0 评论 -
struct--cdev
linux-2.6.22/include/linux/cdev.hstruct cdev { struct kobject kobj; struct module *owner; const struct file_operations -*ops; struct list_head转载 2014-01-11 19:15:00 · 609 阅读 · 0 评论 -
驱动之cdev
前面写到如何向系统申请一个设备号,设备号就像我们的身份证号一样,号本身并没有什么特殊的意义,只有把这个号和人对应才有意义,通用设备号也需要和一个特殊的东西对应,这就是cdev, cdev是linux下抽象出来的一个用来描述一个字符设备的结构体,在linux下定义如下:struct cdev { struct kobject kobj;转载 2014-01-11 19:22:35 · 709 阅读 · 0 评论 -
copy_to_user和copy_from_user两个函数的分析
在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成用户空间到内核空间的复制,函数copy_from_user()完成内核空间到用户空间的复制。下面我们来仔细的理一下这两个函转载 2014-01-11 19:55:58 · 542 阅读 · 0 评论 -
信号量、互斥体和自旋锁
一、信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作: (1) 测试控制该资源的信号量。 (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。 (3) 若此转载 2014-01-11 20:22:24 · 638 阅读 · 0 评论 -
Linux驱动程序第二章——驱动分类
目前流行的对于linux驱动进行分类的方法常常把驱动分为字符设备驱动、块设备驱动、网络设备驱动。 字符设备是一种按字节来访问的设备,字符原创 2014-01-11 14:22:37 · 854 阅读 · 0 评论 -
Linux驱动程序设计--字符设备设备号
字符设备通过字符设备文件来存取。字符设备文件由使用ls -l 的输出的第一列的“c”标识。如果使用ls -l命令,会看到在设备文件项中有2个数(由一个逗号分隔)这些数字就是设备文件的主次设备编号。 那么就出现一个问题,这些设备文件的主次设备号主要是起什么作用的呢?首先看看下图的内容: 正如上图所描述的一样,字符设备文件与字符驱动程序如何原创 2014-01-11 15:03:11 · 851 阅读 · 0 评论 -
Linux驱动程序设计——主设备号静态申请详解
内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。其中,register_chrdev_region()是为提前知道设备的主次设备号的设备分配设备编号。alloc_chrdev_region() 是动态分配主次设备号。register_chrdev转载 2014-01-11 15:18:16 · 824 阅读 · 0 评论 -
设备文件自动创建2
驱动程序编写好后,还需要创建设备节点,有两种方式,一是通过mknod命令去手动创建,例如:mknod /dev/hello c 250 0,/dev/hello为设备节点名字,c代表字符设备,250和0代表它的主次设备号。二是使用udev或mdev来实现自动创建设备节点。使用mknod手动创建设备节点不够灵活,如果是动态分配的设备号怎么办,难道每次加载驱动后去查看/proc/devices文件中查转载 2014-01-19 16:43:38 · 691 阅读 · 0 评论