首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux设备驱动程序(一)——设备驱动简介

前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。...一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。...用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。...设备控制 几乎每个系统操作最终都映射到一个物理设备上。除了处理器,内存和非常少的别的实体之外,全部的任何设备控制操作都由特定于要寻址的设备相关的代码来进行。...三、设备和模块的分类 以 Linux 的方式看待设备可区分为 3 种基本设备类型,每个模块常常实现 3 种类型的 1 种,因此可分类成字符模块,块模块,或者一个网络模块。

77441

Linux设备驱动程序(四)——调试技术

CONFIG_DEBUG_DRIVER 在“Device drivers(设备驱动程序)”菜单。该选项打开驱动程序核心中的调试信息,它可以帮助跟踪底层支持代码的问题。...CONFIG_SCSI_CONSTANTS 该选项出现在“Device drivers/SCSI device support (设备驱动程序/SCSI设备支持)”菜单,它将打开详细的 SCSI...6、打印设备编号 有时当从一个驱动程序打印消息时,我们会希望打印与硬件关联的设备编号。...在 Linux 系统对 /proc 的使用很频繁。现代 Linux 发行版的很多工具都是通过 /proc 来获取它们需要的信息,例如 ps、top 和 uptime。...scull 驱动程序将每个设备当作序列的一个项目,这样,传入的 pos 就可以简单作为scull_devices 数组的索引。

47841
您找到你想要的搜索结果了吗?
是的
没有找到

Linux设备驱动程序(三)——字符驱动

例如我们要操作某个设备,首先,我们要知道设备在/dev下的设备文件名。这个设备文件提供主设备号以及次设备号。然后内核通过设备文件提供的主设备找到设备驱动程序(操作设备驱动程序实现)。...最后通过主设备号和次设备构成的设备号找到正确的设备。有了操作的对象(设备)和操作的方法(驱动程序)那就可以完成了我们的要求。 一个驱动程序可以操作多个设备,所以不同的设备可以具有相同的主设备号。...在内核,用 dev_t 类型来保存设备编号,它是一个32位的数,其中前12位用来表示主设备号,后20位用来表示次设备号。这个类型在定义。...//获得dev_t dev的次设备号 这三个宏在定义。 2、分配和释放设备编号 内核是通过设备编号找到设备的,理所当然地要建立一个字符设备那必须要获得字符设备编号。...成功调用申请设备编号的函数后,在系统的 /proc/devices 下就会包含设备以及设备设备号的信息。函数在声明。字符设备不再使用时应该释放它们占用的编号。

39041

Linux设备驱动程序(二)——建立和运行模块

makefile,它注意到 KERNELRELEASE 变量没有设置,它利用这样一个事实来定位内核源码目录,即已安装模块目录的符号连接指回内核建立树,如果你实际上没有运行你在为其而建立的内核,你可以在命令行提供一个...2、内核的并发 常见引起并发原因: linux 系统通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序。...大多数设备能够中断处理器,而中断处理程序异步运行,而且可能在驱动程序正试图处理其他任务时被调用。 linux 可以运行在多处理器上,因此可能同时有多个处理器在使用该进程。...一个精心设计的驱动程序仍然可以,如同内核空间驱动,允许对设备的并行存取。 如果你必须编写一个封闭源码的驱动,用户空间的选项使你容易避免不明朗的许可的情况和改变的内核接口带来的问题。...最重要的设备不能在用户空间处理,包括但不限于网络接口和块设备。 十、快速参考 insmod modprobe rmmod 用户空间工具,加载模块到运行的内核以及去除它们。

51541

linux设备驱动程序注冊过程具体解释

Linux驱动程序注冊过程,大致分为两个步骤: 模块初始化 驱动程序注冊 以下以内核提供的演示样例代码pci-skeleton.c,具体说明一个pci设备驱动程序的注冊过程。...驱动程序注冊 什么是驱动模块的注冊?上面讲到的初始化函数调用的pci_register_driver函数就是注冊驱动程序啦。...在介绍注冊函数之前,必需要具体说明下linux的总线设备驱动模型,否则以下的内容非常难描写叙述清楚。...对照上面的三个结构体,你会发现:总线既定义了设备,也定义了驱动;设备既有总线,也有驱动;驱动既有总线也有设备相关的信息。那这三个的关系究竟是什么呢?...事实上在linux内核,全部设备的驱动的定义,都是以struct device_driver为基类,进行继承与扩展的。你没有看错,内核其中使用了非常多OO的思想。

2.2K20

linux设备驱动第一篇:设备驱动程序简介

设备驱动程序在内核的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。...很明显,根据设备的接口,我们可以知道分为usb设备,串口设备,pci设备,spi设备,i2c设备等等,那么在linux内核又有样的划分呢?...下面所述就是linux对所有设备的一个分类,并描述了相互之间的简单区别。...linux设备和模块的分类: 字符设备:字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性。...因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核,和字符驱动程序相比,块驱动程序具有完全不同的接口。

3.2K100

Linux设备驱动程序(五)——并发和竞态

内核代码是可抢占的;因此,我们的驱动程序代码可能在任何时候丢失对处理器的独占,而拥有处理器的进程可能正在调用我们的驱动程序代码。设备中断是异步事件,也会导致代码的并发执行。...在我们的示例驱动程序,所有的信息都包含在 scull_dev 结构,因此该结构就是我们锁定机构的逻辑范围。...在驱动程序中使用 rwsem 的机会相对较少,但偶尔也比较有用。 使用 rwsem 的代码必须包括 。...循环缓冲区的使用在设备驱动程序相当普遍。特别是网络适配器,经常使用循环缓冲区和处理器交换数据(数据包)。 2、原子变量 有时,共享的资源可能恰好是一个简单的整数值。...seqlock 在 定义。

23731

Linux驱动实践:如何编写【 GPIO 】设备驱动程序

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章,我们一块讨论了:在 Linux 系统,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这两方面触发。...这篇文章,我们就以此为基础,写一个有实际应用功能的驱动程序: 在驱动程序,初始化 GPIO 设备,自动创建设备节点; 在应用程序,打开 GPIO 设备,并发送控制指令设置 GPIO 口的状态; 示例程序目标...编写驱动程序 以下所有操作的工作目录,都是与上一篇文章相同的,即:~/tmp/linux-4.15/drivers/。...从代码可以看出:驱动程序使用 alloc_chrdev_region 函数,来动态注册设备号,并且利用了 Linux 应用层的 udev 服务,自动在 /dev 目录下创建了设备节点。...设备节点 由于在驱动程序的初始化函数,使用 cdev_add 和 device_create 这两个函数,自动创建设备节点。

4.8K30

Linux系统驱动之LCD驱动程序框架_使用设备

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 编程_LCD驱动程序框架_使用设备树 参考资料,GIT仓库里: 基于这个程序修改: IMX6ULL\source\03_LCD\03_lcd_drv_qemu_ok STM32MP157...\source\A7\03_LCD\03_lcd_drv_qemu_ok 参考:内核自带的示例驱动程序 Linux驱动源码:drivers/video/fbdev/simplefb.c 设备树:...说明 Linux驱动程序 = 驱动程序框架 + 硬件编程。 在前面已经基于QEMU编写了LCD驱动程序,对LCD驱动程序的框架已经分析清楚。...核心就是: 分配fb_info 设置fb_info 注册fb_info 硬件相关的设置 本节课程我们基于设备树来编写驱动程序。 2. 入口函数注册platform_driver 3.

2.4K30

PCI设备驱动程序「建议收藏」

Linux下的PCI总线,在系统上电的时候会逐一的扫描系统存在的设备(包括设备和桥),总线号中断号都是这个时候分配给设备的,如果你是初学者,这个过程如果不是很明白,你大可以先略过,去找一个带有PCI总线的开发板...当你加载PCI驱动的时候,驱动程序会把系统已经存在的设备的厂商号和设备号与驱动程序的对比,如果一致,则会注册PCI总线驱动并进行下一步操作。...下面是我写的一个PCI总线的驱动程序,注意是PCI设备识别时的驱动程序,这里并没有实现具体的功能驱动。...PCI设备的驱动分成两个部分,一部分是总线的,就是PCI设备识别、调用驱动程序probe函数的部分,另一部分就是具体的功能驱动,比如网卡。...如果是单功能设备,那么只需要用到INT A,多功能设备可以把INT A, B, C ,D 都用完。 对于多功能设备而言,上的的逻辑设备可以使用A, B, C ,D 的任何一根。

2K21

字符设备驱动程序接口

驱动模块操作命令 # 列出当前内核已经安装的模块(list module) lsmod # 安装模块(install module) insmod xxx.ko # 打印模块的自带信息(module...对内核而言是一种暗示,表示该函数仅在初始化期间使用,内核启动时统一会加载.init.text段的这些模块安装函数,加载完后就会把这个段给释放掉以节省内存。...ubuntu的内核源码树,如果要编译在ubuntu安装的模块就打开这2个 #KERN_VER = $(shell uname -r) #KERN_DIR = /lib/modules/$(KERN_VER...函数来注册字符设备驱动,但是设备号只有major(主设备号),而新接口中提供了minor(次设备号),内核通过dev_t类型描述设备号,其实质是unsigned int类型,其中高12位为设备号,低20.../* linux/kdev_t.h */ // 传入两个参数生成设备号(dev_t),分别为主设备号和次设备号 MKDEV(ma, mi) // 传入设备号(dev_t),返回主设备号 MAJOR(

1.4K30

Linux驱动实践:一步一步编写字符设备驱动程序

目录 API 函数 编写驱动程序 编写应用程序 卸载驱动模块 小结 今天我们继续讨论: Linux 字符设备驱动程序。 在上一篇文章Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?...我们说过:字符设备驱动程序,有两套不同的API函数,并且在文中详细演示了利用旧的API函数来编写驱动程序。 这篇文章,我们继续这个话题,实际演示一下:字符设备驱动程序的另一套API函数的使用方法。...静态注册:由我们的驱动程序来指定主设备号,即参数1:from; 动态注册:由操作系统来分配,驱动程序提供一个变量来接收该设备号,即参数1: dev 指针; 另外,在Linux 2.6后期的内核版本,引入了...再来看一下 dmesg的打印信息: 可以看到:驱动程序的 driver2_exit( ) 被调用执行了! 小结 以上就是利用“新的” API 函数,来编写字符设备驱动程序。...代码结构还是非常清晰的,这得益于Linux良好的驱动程序架构设计!这也是每一名架构师需要学习、努力模仿的地方。

3K30

Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?

大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【字符设备驱动程序】。 在上一篇文章,讨论的是Linux系统,驱动模块的两种编译方式。...旧的 API 函数 在Linux内核代码2.4版本和早期的2.6版本,注册、卸载字符设备驱动程序的经典方式是: 注册设备: int register_chrdev(unsigned int major...当然了,我们需要在驱动程序,提前告诉 udev 如何去创建; 下面会介绍:如何自动创建设备节点。 现在,设备驱动程序已经加载了,设备节点也被创建好了,应用程序就可以来操作(读、写)这个设备了。...根据Linux系统的驱动框架,应用层的 open、read、write 函数被调用的时候,驱动程序对应的函数就会被执行: static const struct file_operations driver1...自动在 /dev 目录下创建设备节点 在上面的操作过程设备节点 /dev/driver1 是手动创建的。 Linux 系统的应用层提供了 udev 这个服务,可以帮助我们自动创建设备节点。

1.8K20

分享:Linux存储设备的表示

那usb 存储设备Linux的另一种表示方法和前面所说的SCSI和SATA的相同; 但目前新版本的内核,想抛弃模拟SCSI,我们通过fdisk 列系统存在的存储设置时会出现 /dev/uba 类似的...;但目前这个驱动并不成熟,比如大数据量表现不稳定;其实USB接口的存储设备,在Linux表现还是比较差; 1394接口存储调备,在Linux也是模拟SCSI,我们通过fdisk -l 后,出现的也是/...1394接口的存储设备; 软驱在Linux,是/dev/fd0设备这是一般情况,另一种表示为fd0 ; CDROM 或DVDROM ,以及COMBO ,一般的情况下是/dev/hdc ;看下面的例子,...root (hd[0-n],y)来指定;这里的root (hd[0-n],y),在GRUB中就/boot所位于的分区;不要搞错了,有时/boot和Linux的根/并不是处于同一个分区的,就看您安装Linux...时怎么安装的了;而我们前面所说的root=/dev/hd[a-z]X来指定的是Linux 根/所位于的分区;虽然有时/boot和/同处一个分区,但两种表示方法在GRUB各有用途;明白了吧; 比如/boot

2.1K20

基于WDM的专用USB设备驱动程序开发

设备插入主机时,由设备上EEPROM存储的相关设备标识按照INF文件的指令,首先安装固件下载驱动程序,将固件下载至EZ-USB芯片的内部RAM。...然后通过重新枚举,由固件包含的设备标识按照INF文件的指令安装通用驱动程序。这样就完成了整个驱动程序安装,主机即可对设备进行读写,实现与USB设备的通信。...l 值得注意的是,EEPROM包含的产品ID(PID)和厂商ID(VID)和固件代码程序中所包含的PID和VID分别对应INF文件的两组ID,由一个INF文件根据这两组ID进行两次枚举,即完成驱动程序安装...5.2 WDM驱动程序安装过程 驱动程序是根据INF文件的指令来进行安装的。首先,Windows使用 Device 或 Interface描述符的值来选择装入哪个驱动程序。...然后,Windows会搜索处理这些兼容ID某一个的安装文件。如果没有找到安装文件,它会提示用户安装新的设备驱动程序。选择的安装文件会指定要装入的设备驱动程序。并在Windows内部的注册表中注册。

1.5K20
领券