
linux设备驱动分析(kernel-4.7)
文章平均质量分 87
linux设备驱动分析
viewsky11
这个作者很懒,什么都没留下…
展开
-
设备驱动中的device(kernel-4.7)
device结构体定义,在kernel-4.7/include/linux/device.h中: /** * struct device - The basic device structure * @driver_data: Private pointer for driver specific info. * @power: For device power management.原创 2016-12-07 15:43:06 · 1088 阅读 · 0 评论 -
设备驱动中的bus(kernel-4.7)
Linux设备驱动模型中的bus,即可以是物理总线(如PCI、I2C总线)的抽象,也可以是出于设备驱动模型架构需要而定义的虚拟的“platform”总线。一个符合Linux设备驱动模型的device或device_driver必须挂靠在一个bus上,无论这个bus是物理的还是虚拟的。 Linux内核使用bus_type结构体来描述bus,该结构体定义在include/linux/device.h文件原创 2016-12-07 21:20:32 · 1083 阅读 · 0 评论 -
设备驱动中的device_driver(kernel-4.7)
device_driver结构体定义在driver/base/base.h中,如下: /** * struct device_driver - The basic device driver structure * @name: Name of the device driver. * @bus: The bus which the device of this driver be原创 2016-12-07 18:56:36 · 2085 阅读 · 0 评论 -
设备驱动中的kobject(kernel-4.7)
kobject是Linux设备模型的最底层数据结构,它代表一个内核对象。 kobject结构体定义在include/linux/kobject.h文件中: struct kobject { const char *name; //这个内核对象的名字,在sysfs文件系统中,name将以一个目录的形式出现 struct list_head entry; //用于将该原创 2016-12-08 14:35:41 · 1046 阅读 · 0 评论 -
设备驱动中的kset(kernel-4.7)
koject分析中绕不开kset结构,kset是kobject扩展,它包含一个kobject的链表,可以方便地表示sysfs中目录与子目录的关系。kset结构体定义在include/linux/kobject.h文件中,其内容如下: struct sock;/** * struct kset - a set of kobjects of a specific type, belonging to原创 2016-12-08 19:28:09 · 630 阅读 · 0 评论 -
linux设备驱动中的completion(kernel-4.7)
completion定义定义的目录:include/linux/completion.h/* * struct completion - structure used to maintain state for a "completion" * * This is the opaque structure used to maintain the state for a "completio原创 2017-02-23 00:42:21 · 4794 阅读 · 0 评论 -
设备驱动中的pinctrl(kernel-4.7)
在查看kernel源码时,很容易忽略大量的英文注释,其实,英文注解很好的提示代码的功用,所以,网上没有好的参考资料,可以参考英文注释来分析。 下面是driver/pinctrl/core.h中关于pinctrl的重要结构体定义: /** * struct pinctrl_dev - pin control class device * @node: node to include th原创 2016-12-12 21:47:16 · 1085 阅读 · 0 评论 -
解析gpio-keys(kernel-4.7)
kernel中的gpio-keys,在input子系统一个重要的功用,可以对gpio口进行input 按键操作,虽然简单,牵连驱动设备的范围,广度却很大,值得详细探讨。 platform设备注册: static int __init gpio_keys_init(void){ return platform_driver_register(&gpio_keys_device_dri原创 2016-12-06 18:17:06 · 3774 阅读 · 0 评论 -
设备驱动中的platform(kernel-4.7)
platform驱动模型搭建platform核心层:为设备层和驱动层提供注册接口、为设备层和驱动层的匹配提供标准。 内核是这样描述它们的(Documentation/driver-model/platform.txt):Platform devices are devices that typically appear as autonomousentities in the system. T原创 2016-12-12 21:45:42 · 1900 阅读 · 0 评论 -
设备驱动中的class(kernel-4.7)
设备驱动中bus代表实际的总线,device代表实际的设备和接口,而device_driver则对应存在的驱动。而class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集合,常见的设备类的有block、tty、input、usb等等。 struct class就是设备驱动模型中通用的设备类结构。 class对应的代码在drivers/base/c原创 2016-12-14 16:30:46 · 1891 阅读 · 0 评论 -
设备驱动中的i2c(kernel-4.7)
必要的概念和已有的总结还是要拷贝来的: I2C架构概述Linux的I2C体系结构分为3个组成部分: I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法(”algorithm”)上层的,与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等。 I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU原创 2016-12-14 22:20:49 · 2190 阅读 · 0 评论 -
设备驱动中的tty(kernel-4.7)
TTY概念解析在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。• 串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是 /dev/ttySAC0;/dev/ttySAC1……• 控制台终端(/dev/console) 在Linux系统中,计算机的原创 2016-12-16 12:05:38 · 1849 阅读 · 0 评论 -
设备驱动中的gadget(kernel-4.7)
Linux USB Gadget Driver功能为了与主机端驱动设备的USB Device Driver概念进行区别,将在外围器件中运行的驱动程序称为USB Gadget Driver。其中,Host端驱动设备的驱动程序是master或者client driver,设备端gadget driver是slave或者function driver。Gadget Driver和USB Host端驱动程序原创 2016-12-20 23:38:51 · 4414 阅读 · 0 评论 -
设备驱动中cdev(kernel-4.7)
linux系统将设备分为3类:字符设备、块设备、网络设备 1、字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。 2、块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。每一个字符设备或块设备都在/dev目录下对应一个设备原创 2016-12-29 16:51:38 · 659 阅读 · 0 评论 -
设备驱动中的mutex(kernel-4.7)
互斥锁主要用于实现内核中的互斥访问功能。内核互斥锁是在原子 API 之上实现的,但这对于内核用户是不可见的。对它的访问必须遵循一些规则:同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。互斥锁不能进行递归锁定或解锁。一个互斥锁对象必须通过其API初始化,而不能使用memset或复制初始化。一个任务在持有互斥锁的时候是不能结束的。互斥锁所使用的内存区域是不能被释放的。使用中的互斥原创 2016-12-29 23:59:28 · 1618 阅读 · 0 评论 -
设备驱动中的inode(kernel-4.7)
文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。文件数据都储存在”块”中,那么很显然,原创 2017-01-03 22:38:17 · 1517 阅读 · 0 评论 -
设备驱动中的spin_lock(kernel-4.7)
在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spin_lock。1、spin lock的特点 总结spin lock的特点如下: (1)spin lock是一原创 2017-01-03 23:24:27 · 1311 阅读 · 0 评论 -
设备驱动中的misc(kernel-4.7)
Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。 miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。 在内核中用s原创 2017-01-05 21:49:17 · 1625 阅读 · 0 评论 -
设备驱动中的iomem(kernel-4.7)
对于外设的访问,最终都是通过读写设备上的寄存器实现的,寄存器不外乎:控制寄存器、状态寄存器和数据寄存器,这些外设寄存器也称为“IO端口”,并且一个外设的寄存器通常是连续编址的。不同的CPU体系对外设IO端口物理地址的编址方式也不同,分为I/O映射方式(I/O-mapped)和内存映射方式(Memory-mapped)。Linux设计了一个通用的数据结构resource来描述各种I/O资源(如:I/O原创 2017-01-06 15:36:59 · 1260 阅读 · 0 评论 -
设备驱动中的regmap
regmap 机制是在 Linux 3.1 加入进来的特性。主要目的是减少慢速 I/O 驱动上的重复逻辑,提供一种通用的接口来操作底层硬件上的寄存器。其实这就是内核做的一次重构。regmap 除了能做到统一的 I/O 接口,还可以在驱动和硬件 IC 之间做一层缓存,从而能减少底层 I/O 的操作次数。 以一个 I2C 设备为例。读写一个寄存器,肯定需要用到i2c_transfer这样的 I2C 函数原创 2017-01-09 23:31:38 · 9187 阅读 · 0 评论 -
设备驱动中的mmc(kernel-4.7)
MMC的体系结构,其分为三层 /dev下设备文件访问MMC/SD/SDIO用户空间 |--------------------|-----------------------------------------------------内核空间 \ / MMC Card层(对应具体的设备驱动,如MMC/SD卡块设备驱原创 2017-01-16 23:09:18 · 1727 阅读 · 0 评论 -
设备驱动中的pci(kernel-4.7)
PCI 总线架构主要被分成三部分: 1.PCI 设备。 符合 PCI 总线标准的设备就被称为 PCI 设备,PCI 总线架构中可以包含多个 PCI 设备。Audio 、LAN 都是一个 PCI 设备。PCI 设备同时也分为主设备和目标设备两种,主设备是一次访问操作的发起者,而目标设备则是被访问者。2.PCI 总线。 PCI 总线在系统中可以有多条,类似于树状结构进行扩展,每条 P原创 2017-01-19 23:45:35 · 2027 阅读 · 0 评论