I2C选择总线上挂接的一个从设备是使用从地址来区分的,而SPI采用的是CS片选线 SPI子系统框架 SPI核心层: drivers/spi/spi.c SPI总线驱动层(主机控制器驱动层):drivers.../spi/spi_s3c24xx. c SPI设备驱动层:drivers/spi/spidev.c (内核提供的SPI通用设备驱动) Linux中的主从模式的总线子系统采用的是同一种分离思想,其分离的具体策略大同小异...,同样分为设备驱动层、核心层、总线驱动层。...具体的分离策略详细分析可参考Linux驱动之I2C子系统剖析中内核对I2C子系统框架的阐述。笔者在这与I2C子系统类比,列出数据结构名。...I2C等总线类似,所以不会在一些重复部分展开,具体分析可以参考的Linux驱动之I2C子系统剖析中的分析方法。
何为Misc设备 Linux驱动分为字符设备驱动、块设备驱动和网络设备驱动,而字符设备又包括很多种,内核使用主设备号来区分各个字符设备驱动,在include/linux/major.h文件中已经预先定义好了各类字符设备的主设备号...使用Misc设备的好处 Misc子系统使用一个统一的主设备号来管理,当需要注册Misc驱动时,内核会为其分配次设备号。...而如果采用普通字符设备驱动的方式,无论主设备号是静态分配还是动态分配,都会消耗掉一个主设备号,而且如果系统存在着大量的无法准确归类的字符设备驱动,那会大量浪费主设备号;当需要开发一个功能较简单的字符设备驱动...(misc_class); fail_remove: remove_proc_entry("misc", NULL); return err; } 先是创建了Misc类,随后将Misc子系统实现为字符设备驱动来注册到内核中...总结 Misc子系统使用同一个驱动来向上提供多个设备文件节点,向下控制多个(相应的)设备。Misc驱动本质上也是字符驱动,只是它借用Misc子系统的框架来更方便的向内核注册而已。
为了对多种不同类型的输入设备进行统一的处理,内核在字符设备驱动上抽象出一层,即输入子系统。...输入子系统由三部分组成: 事件驱动层 输入核心层 设备驱动层 事件驱动层负责处理和应用程序的接口,向应用程序提供简单的、统一的事件接口。 设备驱动层负责与底层输入设备的通信。...三个重要结构体 都定义在include/linux/input.h中。...设备驱动层 以usbmouse.c为例分析鼠标的设备驱动,鼠标是挂载在usb总线下,笔者在这里将usb相关的代码忽略,只关心输入子系统有关的代码。...根据Linux设备模型的原理,直接进入到usb_mouse_probe函数进行分析。
附: 本文默认读者熟悉Linux设备驱动模型,不熟悉的可以先阅读这两篇blog。...Linux驱动之I2C子系统剖析 Linux驱动之SPI子系统剖析 PCI寻址 PCI系统总体布局组织为树状,从CPU连接的Host Bridge引出PCI主桥,主桥连接的是PCI总线0,可以直接连接PCI...Linux内核启动时会从PCI设备的配置寄存器里读取内存/IO起始地址以及irq,并把这些信息赋值给struct pci_dev的相应成员来生成软件描述的PCI设备。...当linux系统启动时,会探测系统中的所有PCI设备,并为探测到的每个PCI设备做如下操作: 1.分配一个struct pci_dev结构体,用来表示相应的PCI设备 2.为这个结构体填充设备vendor...subdevice id以及地址和irq信息(通过读取PIC配置寄存器得到) 3.最后把这个struct pci_dev结构体挂接到pci_bus上 内核中使用struct pci_driver来描述PCI驱动的抽象
gpio 和 pinctrl 子系统在内核里的使用率非常高,和嵌入式产品的关联非常大。从这两个子系统开始学习驱动开发是个不错的入门选择。...pinctrl 子系统和 gpio 子系统的之间关系。...driver consumer.rst 描述 gpio consumer 如何使用 gpio board.rst 描述设备如何申请 gpio drivers-on-gpio.rst 列举一些使用了gpio子系统的常见驱动...完整的接口定义位于 linux/gpio/consumer.h,大约共有 70个 API。...点击查看大图 正常情况下,驱动工程师不需要了解 gpio chip driver 和 gpiolib: 驱动工程师负责编写 gpio consumer drvier; 芯片厂商的 bsp 工程师负责编写
二、LED子系统——硬件驱动层 上篇文章我们了解了子系统的框架,下面我们来分析驱动框架中每层的实现以及作用。...image-20230417084033734 在LED子系统中,硬件驱动层相关文件在包括:kernel/drivers/leds/ 目录下,其主要的函数有:led-gpio.c、led-xxx.c,其中...led-gpio.c为通用的平台驱动程序,led-xxx.c为不同厂家提供的平台驱动程序。...,也是LED子系统中,硬件设备和驱动程序匹配后,第一个执行的函数。...5、总结 上面我们了解了硬件驱动层的实现流程以及相关数据结构,总结来看: 5.1 数据结构之间的关系如下 LED子系统-LED数据结构.drawio 5.2 函数实现流程如下 gpio_led_probe
总线速度有三种模式 标准模式 100kbps 快速模式 400kbps 高速模式 3.4Mbps I2C子系统框架 I2C设备驱动层:drivers/i2c/i2c-dev.c (通用型) 或者为特定设备定制的设备驱动...笔者会大体上对I2C子系统的源码进行分析,如若分析的有出入,还望指出。 I2C核心层 I2C核心层的实现位于drivers/i2c/i2c-core.c中,笔者从i2c_init函数开始分析。...= i2c_device_remove, .shutdown = i2c_device_shutdown, .pm = &i2c_device_pm_ops, }; 根据Linux...I2C设备驱动层 笔者先从内核提供的通用驱动开始分析,最后在文末给出特定驱动的分析。...= i2cdev_detach_adapter, }; 从上可以看到并没有对id_table进行赋值,从上文在I2C核心层分析可知,I2C总线是根据id_table进行匹配,所以这里并不会按照常规的Linux
HarmonyOS驱动子系统开发 1....功能接口: 1.1.2 wifiiot_gpio_ex.h接口简介: 这个.h中包含声明扩展的GPIO接口函数,这些功能用于设置GPIO拉力和驱动器强度 功能接口: 1.2 查看LED对应的GPIO
说明 有些同学想知道我是怎么分析驱动的,我正要研究UART子系统,所以写了这个笔记。 笔记并不是完整的教程,前后可能也没有关联,只是笔记,不要期望太多。 1. 从哪里入手? 思路是怎样的?...我们录制的驱动大全,进入到UART子系统了。我们基于IMX6ULL的内核进行分析,从\Linux-4.9.88\drivers\tty\serial\imx.c开始阅读代码。...我分析驱动时,思路是: 先弄清楚数据流向:APP open/read/write会导致哪些驱动被调用 数据从哪里来?从中断得来,就从中断分析数据流向 2....rx, flg) // 只是存入tty_port->buf.tail里 tty_flip_buffer_push(port); // 通知ldisc处理 // include\linux
外设驱动子系统提供OpenHarmony专有的外部设备操作接口。本模块提供设备操作接口有:FLASH, GPIO, I2C, PWM, UART, WATCHDOG等。...OpenHarmony提供了两种驱动适配方式:使用外设驱动子系统、使用HDF驱动框架。由于轻量级系统的资源有限,这里建议使用IOT子系统方式。...移植指导厂商需要根据OpenHarmony提供的接口定义实现其功能,IOT子系统接口定义的头文件如下:base/iot_hardware/peripheral/├── BUILD.gn└── interfaces...移植实例在“config.json”中添加iot_hardware子系统。...iot子系统所使用到的SDK的头文件路径写在最后如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
linux的时间子系统要求硬件timer提供下面两种能力:一是free running的counter,此外需要能够在指定的counter值上产生中断的能力。...本文主要描述了Generic Timer的相关硬件知识以及在linux kernel中如何驱动该硬件。...(b)输出ARM generic timer的相关信息到控制台 (c)向linux kernel的时间子系统注册clock source、timer counter、shed clock设备。...3、memory mapped Timer初始化代码分析 TODO 四、和linux kernel时间子系统的接口 linux的时间子系统需要两种时间相关的硬件:一个是free running...对于ARM generic timer driver而言,我们需要定义linux kernel时间子系统的clock source和clock event device并注册到系统。
一文搞懂 | Linux 时钟子系统 Clock 时钟就是 SoC 中的脉搏,由它来控制各个部件按各自的节奏跳动。比如,CPU主频设置,串口的波特率设置,I2S的采样率设置,I2C的速率设置等等。...内核中用 CCF 框架来管理 clock,如下所示,右边是 clock 提供者,即 Clock Provider;中间是 CCF;左边是设备驱动的 clock 使用者,即 Clock Consumer。
内核中驱动维护者针对每种驱动设计一套【成熟的、标准的、典型的】驱动实现,并把不同厂家的同类硬件驱动中相同的部分抽出来实现好,再把不同部分留出接口给具体的驱动工程师来实现,这就叫驱动框架。...2、概述 led 子系统驱动框架: 所有 led 共性: 有和用户通信的设备节点 亮和灭 不同点: 有的 led 可能是接在 gpio 管脚上,不同的 led 有不同的 gpio 来控制 有的 led...可能由其他的芯片来控制(节约 cpu 的 pin,或者为了控制 led 的电流等) 可以设置亮度 可以闪烁 所以 Linux led 子系统把所有 led 的共性给实现了,把不同的地方留给驱动工程师去做...led 子系统核心文件: driver/leds/led-class.c driver/leds/led-core.c driver/leds/led-triggers.c include/linux/...led 子系统是一个简单的 Linux 子系统 ,在目录 /sys/class/leds 下展示该子系统设备,每个设备都有自己的属性: brightness:设置 LED 亮度,范围 0 ~ max_brightness
这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C/SPI 设备的时候,为此引入了 Regmap 子系统。...1、什么是 Regmap Linux 下大部分设备的驱动开发都是操作其内部寄存器,比如 I2C/SPI 设备的本质都是一样的,通过 I2C/SPI 接口读写芯片内部寄存器。...基于代码复用的原则,Linux 内核引入了 regmap 模型,regmap 将寄存器访问的共同逻辑抽象出来,驱动开发人员不需要再去纠结使用 SPI 或者 I2C 接口 API 函数,统一使用 regmapAPI...regmap 是 Linux 内核为了减少慢速 I/O 在驱动上的冗余开销,提供了一种通用的接口来操作硬件寄存器。...Linux 内核提供了针对不同接口的 regmap 初始化函数。
rtc 一般负责系统关机后计时、闹钟等,Linux 内核提供了一个 rtc 子系统,来支持所有的 rtc 设备。.../rtc/proc.c kernel-6.1/drivers/rtc/sysfs.c kernel-6.1/drivers/rtc/rtc-xxx.c class.c:向内核注册 RTC 类,为底层驱动提供...时间等 proc.c:管理 RTC 设备的 procfs 属性,提供中断状态和标志查询 lib.c:提供 RTC、Data 和 Time 之间的转换函数 rtc-xxx.c:各平台 RTC 设备的实际驱动...rtc.h:定义与 RTC 有关的数据结构 RK3399 以博主手边的 RK3399 为例,RTC 驱动在 /kernel/drivers/rtc/rtc-rx8010.c,生成的设备节点是 /dev...子系统就会发现,基本上每个子系统都差不多,Linux 都会封装上中下 3 层,然后给你一些数据结构让你填充,就可以将这个子系统用起来了。
Linux 内核为了管理这些日益增多的 ADC 类传感器,特地推出了 IIO 子系统,我们学习如何使用 IIO 子系统来编写 ADC 类传感器驱动。...1、iio_dev 结构体 IIO 子系统使用结构体 iio_dev 来描述一个具体 IIO 设备,此设备结构体定义在include/linux/iio/iio.h 文件中 2、iio_dev 申请与释放...Linux 内核使用 iio_chan_spec 结构体来描述通道,定义在 include/linux/iio/iio.h 文件中。...2、IIO 驱动框架创建 分析 IIO 子系统的时候大家应该看出了,IIO 框架主要用于 ADC 类的传感器,比如陀螺仪、加速度计、磁力计、光强度计等,这些传感器基本都是 IIC 或者 SPI 接口的。...内核默认使能了 IIO 子系统,但是有一些 IIO 模块没有选择上,这样会导致我们编译 驱动的时候会提示某些 API 函数不存在,需要使能的项目如下: -> Device Drivers ->
GPIO(General-purpose input/output)即通用型输入输出。通常,GPIO控制器通过分组的方式管理所有GPIO管脚,每组GPIO有一个...
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次的差异...目录 Linux网络子系统的分层 Linux网络子系统实现需要: 支持不同的协议族 ( INET, INET6, UNIX, NETLINK…) 支持不同的网络设备 支持统一的BSD socket API...Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...创建ksoftirqd内核线程 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用。...netif_receive_skb()将sk_buff上送协议栈 Linux网络子系统的分层 Linux网络子系统实现需要: 支持不同的协议族 ( INET, INET6, UNIX, NETLINK
8)底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到。...1、CPUFreq 驱动 CPUFreq 子系统位于 drivers/cpufreq 目录下,负责进行运行过程中 CPU 频率和电压的动态调整,即 DVFS(Dynamic Voltage Frequency...4、CPUIdle 驱动 目前的 ARM SoC 大多支持几个不同的 Idle 级别,CPUIdle 驱动子系统存在的目的就是对这些Idle状态进行管理,并根据系统的运行情况进入不同的Idle级别。...6、Regulator 驱动 Regulator是Linux系统中电源管理的基础设施之一,用于稳压电源的管理,是各种驱动子系统中设置电压的标准接口。...Linux的Regulator子系统提供如下API以用于注册/注销一个稳压器: structregulator_dev * regulator_register(conststructregulator_desc
领取专属 10元无门槛券
手把手带您无忧上云