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子系统类比,列出数据结构名。...spi_message 源码分析 由于子系统架构与I2C等总线类似,所以不会在一些重复部分展开,具体分析可以参考的Linux驱动之I2C子系统剖析中的分析方法。...SPI总线驱动层 SPI的控制器驱动,即总线驱动层位于drivers/spi/spi_s3c24xx. c中,从init函数开始分析。
3、SPI 传输机制 从图可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。...这里的参数,一般 spi 驱动不需要设置,但是半导体厂商提供的 spi 控制器驱动中,可以修改这些参数。我们写 SPI 驱动时候,可以根据从设备的要求来修改这些参数。...快速+ 1MHz 高速 3.4MHz SPI 速率:几十 MHz 甚至上百 MHz,速度取决于 CPU 的 SPI 控制器和时钟 clock STM32F103 的 SPI 最高支持 18MHz,imx6ull...7、扩展 SPI 协议其实是包括:Standard SPI、Dual SPI 和 Queued SPI 三种协议接口。...Dual SPI 还是四线制,只是传输线可以变为同方向,速度是 Standard SPI 的两倍。 Queued SPI 是六线制,多了两根数据线,传输速度是 Standard SPI 的四倍。
二、SPI硬件接口设计 咱们学习SPI首先得SPI本身是什么开始看起,单纯看代码移植代码其实意义不大,咱们还是摆脱工具人的想法,从硬件接口出发探索整个SPI的设计实现的推导逻辑。...所以一个完整的SPI的工作流程应该如下: image.png 三、SPI时序图 在对SPI有了一个基础的硬件接口认知之后,接下来,我们看下SPI的时序图,学习了SPI的时序图有助于我们对这几个信号之间的协同工作更进一步的了解...代码部分均来自于linuxkernel开源代码https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?...h=v4.14.258 1)一条总线 Spi总线,spi总线注册、注销 image.png 2)三个数据结构 a、Spi_driver image.png b、spi_transfer image.png...个人理解现在这个科技发展的风口下,手机、IOT、车机等终端设备齐放异彩的大背景下,新终端生态的搭建、基础智能设备的整合、大健康的趋势下,Sensor的发展是一个非常关键的驱动力,基础驱动软件能力的掌握也是重中之重,linux
一文搞懂 | Linux 时钟子系统 Clock 时钟就是 SoC 中的脉搏,由它来控制各个部件按各自的节奏跳动。比如,CPU主频设置,串口的波特率设置,I2S的采样率设置,I2C的速率设置等等。
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...触发方式,如 heartbeat、mmc0、backlight、gpio delay_off、delay_on:trigger为timer时,LED亮灭的时间,单位ms kernel/include/linux
这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C/SPI 设备的时候,为此引入了 Regmap 子系统。...1、什么是 Regmap Linux 下大部分设备的驱动开发都是操作其内部寄存器,比如 I2C/SPI 设备的本质都是一样的,通过 I2C/SPI 接口读写芯片内部寄存器。...Linux 下使用 i2c_transfer 来读写 I2C 设备中的寄存器,SPI 接口的话使用 spi_write/spi_read等。...I2C/SPI 芯片又非常的多,因此 Linux 内核里面就会充斥了大量的 i2c_transfer 这类的冗余代码,再者,代码的复用性也会降低。...基于代码复用的原则,Linux 内核引入了 regmap 模型,regmap 将寄存器访问的共同逻辑抽象出来,驱动开发人员不需要再去纠结使用 SPI 或者 I2C 接口 API 函数,统一使用 regmapAPI
Linux 内核为了管理这些日益增多的 ADC 类传感器,特地推出了 IIO 子系统,我们学习如何使用 IIO 子系统来编写 ADC 类传感器驱动。...大家一般在搜索 IIO 子系统的时候,会发现大多数讲的都是 ADC,这是因为 IIO 就是为 ADC 类传感器准备的,当然了 DAC 也是可以的。...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 接口的。
rtc 一般负责系统关机后计时、闹钟等,Linux 内核提供了一个 rtc 子系统,来支持所有的 rtc 设备。...rtc 设备本质上是一个字符设备,rtc 子系统在字符设备的基础上抽象与硬件无关的部分,并在这个基础上拓展 sysfs 和 proc 文件系统下的访问。...rx8010_set_alarm rx8010_set_time 软件逻辑就不在这里赘述了,大家可以参考下面链接 https://jasper1024.com/jasper/c089e4b/ 大家多看几个 Linux...子系统就会发现,基本上每个子系统都差不多,Linux 都会封装上中下 3 层,然后给你一些数据结构让你填充,就可以将这个子系统用起来了。
8)底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到。...1、CPUFreq 驱动 CPUFreq 子系统位于 drivers/cpufreq 目录下,负责进行运行过程中 CPU 频率和电压的动态调整,即 DVFS(Dynamic Voltage Frequency...6、Regulator 驱动 Regulator是Linux系统中电源管理的基础设施之一,用于稳压电源的管理,是各种驱动子系统中设置电压的标准接口。...Linux的Regulator子系统提供如下API以用于注册/注销一个稳压器: structregulator_dev * regulator_register(conststructregulator_desc...Linux运行时PM最早是在Linux2.6.32内核中被合并的。
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次的差异...目录 Linux网络子系统的分层 Linux网络子系统实现需要: 支持不同的协议族 ( INET, INET6, UNIX, NETLINK…) 支持不同的网络设备 支持统一的BSD socket API...中TCP,UDP协议包在网络子系统中的实现流程。...创建ksoftirqd内核线程 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用。...网络子系统的分层 Linux网络子系统实现需要: 支持不同的协议族 ( INET, INET6, UNIX, NETLINK…) 支持不同的网络设备 支持统一的BSD socket API 需要屏蔽协议
前言: 上一篇文章我们简单了解了一些关于时间的概念,以及Linux内核中的关于时间的基本理解。而本篇则会简单说明时钟硬件,以及Linux时间子系统相关的一些数据结构。...计算机里的时钟硬件 前文曾经提到过,内核时间子系统的实现也需要有硬件的支持。...由于这些时钟都和时间子系统关系不大,所以本文中就不讨论它们了。...Linux时间子系统的文件汇总 Linux kernel 时间子系统的源文件位于linux/kernel/time/目录下,基本包含如下: 这里面也包含几个重要的数据结构,接下来会分开说说: Clocksource...显然关于Linux时间子系统的内容,还有很多可以深入挖掘,在此篇幅有限,就不做过多赘述了,也希望同样对操作系统感兴趣的小伙伴与我们一起交流。
中断是大家用的最多的功能,不管是单片机还是 Linux 系统,都需要用到中断,对它的深入理解是非常必要的。 为什么需要中断?...在现代的移动设备中,发起中断的设备可以位于soc(system-on-chip)芯片的外部,也可以位于芯片的内部,因为目前大多数 soc 都集成了大量的硬件 IP,例如 I2C、SPI、Display...中断子系统架构 整个中断子系统的架构分为 4 层,最底层(第四层)为硬件,包括 CPU、中断控制器。第三层是 CPU 的驱动和中断控制器的驱动,由芯片原厂负责。...第二层是 Linux 内核提供的通用中断处理模块,这一层存在的意义在于,希望用户在第一层写的驱动在移植的时候更方便,保持接口不变,不让用户直接使用芯片原厂的 API,而是 Linux 的 API。...关于中断子系统,我写了八篇文章,从头到尾讲了一遍,大家可以去我的blog查看: http://www.linuxer.vip/linux-interrupt1/
1.3 适用范围 表 1-1: 适用产品列表 内核版本 驱动文件 Linux-4.9 spi-sunxi.c Linux-5.4 spi-sunxi.c 2 模块介绍 2.1 模块功能介绍 SPI...其中内核版本为 Linux-4.9 的 spi1_pins_a, spi1_pins_b 的配置文件路径为 kernel/linux-4.9/arch/arm64(32 位平台为 arm)/boot/dts...例如,和 MTD 层交互以便把 SPI 接口的存储设备实现为某个文件系统,和TTY 子系统交互把 SPI 设备实现为一个 TTY 设备,和网络子系统交互以便把一个 SPI 设备实现为一个网络设备,等等。...或者使用 Linux 自带的 spi 工具:在 tina/lichee/linux-5.4/tools 目录下, 运行如下命令: make spi 然后在 tina/lichee/linux-5.4/tools...状态为 “okay”,但是启动 Linux 内核却发现 spi控制器未使能。
浅谈 Linux 内核无线子系统 Linux 内核是如何实现无线网络接口呢?数据包是通过怎样的方式被发送和接收呢?...1 全局概览 在开始探索 Linux 无线具体细节之前,让我们先来把握一下 Linux 无线子系统整体结构。如图1,展示了 Linux 无线子系统各个模块之间的抽象关系。 ?...通常我们把 Linux 内核无线子系统看成两大块: cfg80211 和 mac80211 ,它们连通内核其他模块和用户空间的应用程序。...Linux 内核无线子系统统一各种 WiFi 设备,并处理 OSI 模型中最底层的 MAC 、 PHY 两层。 若进一步划分, MAC 层可以分为 MAC 高层和 MAC 底层。...Linux 子系统实现大部分的 MAC 高层回调函数。 2 模块间接口 从图一中我们可以看出,各个模块之间分界线很清晰,并且模块间相互透明不可见。模块之间一般不会相互影响。
Linux input子系统,分为三篇文章,第一篇:Linux input子系统的概念,第二篇:Linux input子系统的代码分析(input core),第三篇:Linux input子系统的驱动程序编写...linux系统输入设备繁多,例如按键、键盘、触摸屏、鼠标。这些输入设备都属于字符设备。不过这些输入设备不同类型,不同原理,不同的输入输出信息。那么是如何统一这些输入设备的呢?...答案:linux中将所有的输入设备抽象出input子系统这套软件体系,提供了统一的接口函数,实现了大统一。 input子系统分为三层: 1.输入子系统设备驱动层。...综上所述:在linux中,输入子系统作为一个内核模块存在,向上为用户层提供接口函数,向下为驱动程序提供统一的接口函数。...这样就能够将输入设备的事件通过输入子系统发送给应用层的应用程序,应用程序也可以通过输入子系统通知驱动程序完成某些任务。 下一篇:Linux input子系统的代码分析(input core)
1.启用子系统功能 需要win系统支持子系统 进入控制面板 -> 程序和功能 -> 启用或关闭windows功能: 勾选适用于Linux的windows子系统,确定,等待后,确认重启设备 2.下载子系统...TLS1.1TLS1.2TLS1.3都勾选上 6.保存 再打开微软商店 [/acc] 搜索ubuntu 进入需要的版本,点击获取 默认安装到C盘(若不想安装到C盘,看本篇最后),点击安装 等待下载完成后,启动即可, 3.子系统相关配置...会提示创建用户和设置密码,根据提示操作即可 [card title="修改root密码" color="info"] 直接输入sudo passwd root修改 [/card] [card title="修改Linux...Esc,再按shift+zz(按住shift再按两下z)保存 更新源sudo apt-get update & apt-get upgrade & apt-get clean [/card] 4.修改子系统位置
上一篇文章写了《input子系统的的概念》。今天这篇文章主要分析input子系统的代码,input子系统作为一个字符设备存在kernel中,我们从input这个模块的入口函数开始讲起。...其中 ① INPUT_MAJOR:主设备号:13(如图1-2,定义在include\linux\major.h下)。 ② &input_fops:file_operations结构体(如图1-3)。...③ 将新的new_fops赋值给file->f_op,此时的input子系统的file_operations为新挂载的input设备的file_operations。...其实input子系统也一样,驱动跟handle的注册也是没有优先顺序的。...图8-1 下一篇:Linux input子系统的驱动开发
安装 以管理员模式打开Windows PowerShell wsl --list -online查看可以安装的Linux发行版 wsl --install -d Ubuntu-20.04(安装后需要重启...) 输入用户名和密码即可,回到开始菜单,找到Ubuntu图标即可打开 wsl子系统,位置在\\wsl$直接在任务管理器搜索即可 查看版本wsl -l -v 定期更新:sudo apt update &&...,等待下载VS Code Server for x64并安装 链接到vs code(左下角出现WSL:Ununtu-20.04) 安装miniconda 参考链接:Python环境搭建:基于Win10子系统...sudo sh cuda_11.6.2_510.47.03_linux.run 配置环境变量: vim ~/.bashrc 输入i进入编辑模式,在文档末尾插入 export...但是,下载目录为windows某一个磁盘,无法复制到wsl子系统中(不知道怎么解决,我目前又用不到,先不弄了) 使用命令行,首先加载到windows下含有cudnn的文夹 sudo
前面两篇文章写了《input子系统的的概念》和《分析input子系统的代码》。这一篇文章来说说input子系统的驱动程序编写。...从这句话中,可以看出input子系统的驱动部分会变得简单。 input子系统的驱动还是比较简单的,因为大部分工作,都在input核心层,input handler做完了。...input驱动代码,我是在之前文章《linux 中断机制》和input子系统的驱动编写要点结合进行修改的。你会发现代码很简单。 上面说到,input设备是使用input_dev结构体来描述。...其它代码含义请参看include/linux/input.h文件。 事件值(value):事件的值。如果事件的类型是EV_KEY,当按键按下时值为1,松开时值为0。...#include #include #include #include #include <linux
领取专属 10元无门槛券
手把手带您无忧上云