自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

滴水藏海

无知人生,记录点滴

  • 博客(85)
  • 资源 (1)
  • 收藏
  • 关注

原创 线索二叉树和中序非递归遍历线索化后的二叉树

//线索二叉树#include#include#include#define OVERFLOW -2//二叉树的二叉线索存储结构enum PointerTag{Link,Thread}; //枚举类型,Link(0):指针,Thread(1):线索struct BiThrNode{ char data; BiThrNode *lchild,*rchild;//左右孩子指针

2015-10-25 12:19:40 4022

原创 Linux I2C(五) I2C字符设备的注册和使用

I2C字符设备的注册和使用

2024-04-23 22:54:20 839

原创 Linux I2C(四) i2c device_driver注册与数据传输接口

i2c device_driver注册与数据传输接口

2024-04-23 22:29:40 402

原创 Linux I2C(三) i2c bus/adapter/client_device注册

i2c bus/adapter/client_device注册

2024-04-23 22:15:20 419

原创 Linux I2C(二) - I2C软硬件架构

i2c软硬件架构

2024-04-22 23:11:02 542

原创 Linux I2C(一) - I2C电器特性和通信协议

i2c总线的电气特性和通信协议

2024-04-22 22:56:27 634

原创 Device Tree (四) - device_node -> platform_device

device_node -> platform_device

2024-03-18 16:01:22 865

原创 Device Tree (三) - dtb -> device_node

dtb -> device_node 展开过程

2024-03-18 15:46:15 784

原创 Device Tree (二) - dtb格式

dtb的文件格式

2024-03-12 23:19:09 743

原创 Device Tree (一) - dts基本概念和语法

一,ARM设备树起源在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,很多代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。读者若有兴趣,可以统计一下常见的s3c2410、s3c6410等板级目录,代码量在数万行。设备树是一种描述硬件的数据结构,它起源于OpenFir

2024-03-12 23:09:28 982

原创 Linux设备模型(十一) - platform设备

在Linux2.6以后的设备驱动模型中,需关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个设备的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux设备和驱动通常都需要挂接在一种总线上,而对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,在SoC系统中集成的独立外设控制器、挂接在SoC内存空间的外设等却不依附于此类总线。基于这一背景,Linux。

2024-03-03 20:22:41 982

原创 Linux设备模型(十) - bus/device/device_driver/class

在设备模型中,Bus、Device、Device driver等等,都比较好理解,因为它们对应了实实在在的东西,所有的逻辑都是围绕着这些实体展开的。而本文所要描述的Class就有些不同了,因为它是虚拟出来的,只是为了抽象设备的共性。举个例子,一些年龄相仿、需要获取的知识相似的人,聚在一起学习,就构成了一个班级(Class)。这个班级可以有自己的名称(如295),但如果离开构成它的学生(device),它就没有任何存在意义。另外,班级存在的最大意义是什么呢?是由老师讲授的每一个课程!

2024-03-03 19:26:15 1028

原创 Linux设备模型(九) - bus/device/device_driver/class

在Linux设备模型中,Bus(总线)是一类特殊的设备,它是连接处理器和其它设备之间的通道(channel)。当然实际中,同一总线下的设备有很多,驱动也有很多,在总线上管理着两个链表,分别管理着设备和驱动,当我们向系统注册一个驱动时,便会向驱动的管理链表插入我们的新驱动, 同样当我们向系统注册一个设备时,便会向设备的管理链表插入我们的新设备。在插入的同时总线会执行一个匹配方法对新插入的设备/驱动进行匹配,在匹配成功的时候会调用驱动中的初始化方法,在移除设备或驱动时会调用注销方法。那有没有合适的解决方案呢?

2024-03-03 18:39:25 455

原创 Linux设备模型(八) - sysfs

sysfs是一个基于内存的虚拟的文件系统,有kernel提供,挂载到/sys目录下,负责以设备树的形式向user space提供直观的设备和驱动信息。sysfs以不同的视角展示当前系统接入的设备:/sys/block 历史遗留问题,存放块设备,提供一设备名(如sda)到/sys/devices的符号链接;/sys/bus 按总线类型分类,在某个总线目录之下可以找到链接该总线的设备的符号链接,指向/sys/devices. 某个总线目录之下的drivers目录包含了该总线所需的所有驱动的符号链接。

2024-03-01 17:53:56 1027

原创 Linux设备模型(七) - Netlink

Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket,它是 Linux 所特有的。Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。

2024-02-29 20:44:48 1071

原创 Linux设备模型(六) - Android ueventd浅析

在linux2.6之后,udev取代了devfs,但是在android中却没有udev或者mdev[1],而是由ueventd进程实现了类似功能(管理设备节点权限、创建设备节点)。

2024-02-26 22:05:55 1221

原创 Linux设备模型(五) - uevent kernel实现

由此可知,Uevent的机制是比较简单的,设备模型中任何设备有事件需要上报时,会触发Uevent提供的接口。该机制通常是用来支持热拔插设备的,例如U盘插入后,USB相关的驱动软件会动态创建用于表示该U盘的device结构(相应的也包括其中的kobject),并告知用户空间程序,为该U盘动态的创建/dev/目录下的设备节点,更进一步,可以通知其它的应用程序,将该U盘设备mount到系统中,从而动态的支持该设备。用户空间程序收到这样的事件后,会做相应的处理。环境变量的作用是为执行用户空间程序指定运行环境。

2024-02-26 21:49:14 941

原创 Linux设备模型(四) - uevent应用:内核发送uevent,用户空间接收uevent

kobject_uevent默认会发送”ACTION=xxx”,”DEVPATH=xxx”,”SUBSYSTEM=xxx”这三个uevent环境变量。内核发送uevent的API由lib/kobject_event.c文件实现,include/linux/kobject.h是头文件。在driver中可以调用kobject_uevent或者kobject_uevent_env来向用户空间发送uevent。kobject_uevent_env可以发送一些如”xxx=xxx”的自定义的uevent环境变量。

2024-02-26 21:37:49 730

原创 Linux设备模型(三) - kset/kobj/ktype使用示例

【代码】Linux设备模型(三) - kset/kobj/ktype使用示例。

2024-02-26 21:34:50 406

原创 Linux设备模型(二) - kset/kobj/ktype APIs

Kobject的核心功能是:保持一个引用计数,当该计数减为0时,自动释放(由本文所讲的kobject模块负责) Kobject所占用的meomry空间。这就决定了Kobject必须是动态分配的(只有这样才能动态释放)。而Kobject大多数的使用场景,是内嵌在大型的数据结构中(如Kset、device_driver等),因此这些大型的数据结构,也必须是动态分配、动态释放的。那么释放的时机是什么呢?是内嵌的Kobject释放时。

2024-02-23 22:03:18 947 3

转载 Linux设备模型(一) - kset/kobj/ktype结构体之间的关系

kset/kobj/ktype

2024-02-23 21:37:32 29

原创 pinctrl子系统 - pinctrl与gpio之间的耦合(六)

任何一个gpio chip,在使用GPIO的时候(通常是gpio subsystem的consumer申请GPIO资源的时候),都需要向系统的pinctrl subsystem申请管脚,并将管脚配置为GPIO功能。思路是简单、直接的,但实际操作起来,却有点棘手,下面以一个最简单的例子说明:假设某一个gpio chip只包括2个gpio,这两个gpio分别和uart进行功能复用。

2023-10-16 10:30:19 136

原创 pinctrl子系统 - 源码解析(五)

设备节点要么被转换为platform_device,或者其他结构体(比如i2c_client),但是里面都会有一个device结构体,每个device结构体里都有一个dev_pin_info结构体,用来保存设备的pinctrl信息。platform_device匹配driver会执行probe探测函数,执行到驱动中真正的probe函数之前,会进行pinctrl的处理,处理函数为pinctrl_bind_pins。map 到 setting的转化只是将字符串转为整型数表示的形式。

2023-10-16 10:20:32 350

原创 pinctrl子系统 - 架构和结构体关系(四)

每个device结构体里都有一个dev_pin_info结构体,用来保存设备的pinctrl信息,为了方便管理pin control state,我们又提出了一个pin control state holder的概念,用来管理一个设备的所有的pin control状态 -- struct pinctrl ,系统中的每一个需要和pin control subsystem进行交互的设备在进行设定之前都需要首先获取这个句柄。Pin controller节点的格式,没有统一的标准!

2023-10-13 21:44:00 696

原创 GPIO子系统(三)

中间层是 Gpiolib,用于管理系统中的 GPIO。个人理解,因为不知道这个 init 和我们的对接底层的驱动的 init 谁先执行到,所以用了一个变量 gpiolib_initialized 来表示当前的 Gpiolib 是不是已经完成了相关的字符设备的注册,如果是 Gpiolib 先去 init 的话,那么 gpiolib_initialized ture,芯片对接底层的部分错过 gpio_chip setup 的机会,所以需要重新调用这个 gpiochip_setup_dev 接口,反之 OK;

2023-10-13 21:30:28 312

原创 使用gpio子系统实现按键驱动(二)

Linux内核下的drivers/input/keyboard/gpio_keys.c实现了一个体系无关的GPIO按键驱动,使用此按键驱动,只需要在设备树gpio-key节点添加需要的按键子节点即可,适合于实现独立式按键驱动。gpio-keys是基于input架构实现的一个通用gpio按键驱动,该驱动基于platform_driver架构,实现了驱动和设备分离,符合linux设备驱动模型的思想。

2023-10-10 20:18:45 478

原创 gpio内部结构(一)

一般实际运用时,引脚不建议悬空,易受干扰。2) 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。* 将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有 1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。

2023-10-10 19:56:29 1108

原创 uevent应用:内核发送uevent,用户空间接收uevent

linux uevent机制使用

2023-08-19 21:43:14 663

原创 mmap(三) mmap测试程序,user和设备驱动传递大量数据

构造一个ringbuffer,驱动中将产生的数据放入ringbuffer,用户空间将ringbuffer中的数据读走存在文件中。

2023-06-20 21:04:08 191

原创 mmap(二) 内核空间

分析:因为单位物理页面的大小是4096字节,虽然被映射的文件只有5000字节,但是对应到进程虚拟地址区域的大小需要满足整页大小,因此mmap函数执行后,实际映射到虚拟内存区域8192个 字节,5000~8191的字节部分用零填充。5)为映射分配了新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描述符,通过文件描述符,链接到内核“已打开文件集”中该文件的文件结构体(struct file),每个文件结构体维护着和这个已打开文件相关各项信息。映射完成后,驱动程序往这段内。

2023-06-20 20:47:28 265 1

原创 mmap(一) 用户空间

实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

2023-06-20 20:38:00 215

转载 input subsystem (六) getevent源码分析

getevent命令链接到toolbox,那么入口函数就是toolbox的main函数了,就从toolbox的main函数开始讲起。events_buf是inotify_event的数组指针,读取事件的数量取决于数组的长度,BUF_LEN。创建完上面的watch后,当/dev/input/下的设备节点发生创建和删除操作时,都会将相应。它是一个二元组,包括监听目标和事件。码则表示了需要需要监听的事件类型,掩码中的每一位代表一种事件。过回调的方式通知事件,而需要使用者主动从inotify对象中进行事件读取。

2023-06-09 22:56:17 334 1

转载 input subsystem (五) CTP多点触摸协议

如果追踪到的触摸点数量多于当前上报的数量,驱动程序使用 BTN_TOOL_TAP 事件来通知用户空间当前追踪到的触摸点总数量,然后调用 input_mt_report_pointer_emulation 函数将use_count 参数设置为 false,否则的话将 use_count 参数设置为 true。和协议A相比没有SYN_MT_REPORT,那么它用什么来跟踪当前点属于哪一条线呢,用 的就是ABS_MT_TRACKING_ID,当前序列中。

2023-06-08 21:10:25 445

转载 input subsystem (四) 内核中的多点触摸协议文档 Multi-touch (MT) Protocol

zh] [1]通过扩展的 ABS_MT_APPROACH_X 和 ABS_MT_APPROACH_Y 消息,可以传递 触摸工具的坐标位置信息。[zh] 最小的组合是ABS_MT_POSITION_X和ABS_MT_POSITION_Y消息,用于跟踪多个触摸点的位置。[zh] ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR 的比值用来估计压力的大小。[zh] ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR 的值就能反映压力的大小,

2023-06-08 20:56:55 388

转载 input subsystem (三) input子系统事件处理层(evdev)的环形缓冲区

在evdev_open()函数中完成了对evdev_client对象的构造以及初始化,每一个打开input设备节点的用户都在内核中维护了一个evdev_client对象,这些evdev_client对象通过evdev_attach_client()函数注册在evdev1对象的内核链表上。为避免计算代价高昂的“求余”操作,使内核运作更高效,input子系统的环形缓冲区采用了“求与”算法,这要求bufsize必须为2的幂,在后文中可以看到bufsize的值实际上是为64或者8的n倍,符合“求与”运算的要求。

2023-06-08 20:48:16 90

转载 input subsystem (二) input子系统相关流程

input_event_to_user函数是将此事件copy到应用层,input_event_size函数是用来获取一个input_event事件的大小,循环复制client->buffer中的事件到应用层的buffer中。list_for_each_entry(handler, &input_handler_list, node) //通过遍历input_handler_list与所有的input_handler进行匹配。//添加到input_dev_list全局链表。

2023-06-08 20:27:34 79

原创 input subsystem (一) input device, input handler, input handle结构体之间的关系

input子系统

2023-06-01 22:01:03 348

转载 七,USB设备驱动 - 分析USB储存驱动程序

usb设备驱动demo

2023-03-19 12:01:43 1177

原创 六,usb gadget

usb gaget driver

2023-03-11 19:10:04 357

原创 五,usb host/device mode init

usb otg init

2023-03-11 18:43:59 364

计算机源代码

计算机C语言中序遍历顺序二叉树的参考代码

2013-12-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除