自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 Linux驱动如何加载

同一级别的初始化函数被放在同一个段(section)中不同级别的段按照优先级顺序(数字从小到大)在内存中连续排列内核启动时,从遍历到按顺序执行所有初始化函数这保证了一定在之前执行。

2026-04-10 10:25:30 64

原创 linux下的pwm子系统

比如,1ms定时器中断一次,周期20ms,就计数20,然后重头开始,高电平时间计数10,到达高电平反转电平,就行了。probe函数里面还是申请设备号,初始化设备cdev并且绑定,然后创建类和device就不写了。rk3568设备树pwm控制器里面已经配置了时钟,所以只需要使能节点就好了。imx6ull里面没配置时钟,所以需要加上时钟。在根节点下面描述硬件信息就是pwm信息。下面给出模拟PWM的关键代码,本质就是定时器计数反转电平,

2026-04-03 17:25:21 255

原创 linux下的串口子系统

1:tcgetattr()函数读取终端设备的当前属性(如波特率、输入输出模式等)并保存到structtermios结构体 中/*功能:读取终端/串口设备的当前属性,保存到 struct termios 结构体中参数:fd :文件描述符(已打开的串口设备)termios_p:保存当前终端属性的 struct termios 结构体指针返回值:成功 - 返回 0失败 - 返回 -1*/

2026-04-03 11:01:10 402

原创 linux下的spi子系统

支持4个SPI控制器 ·1个控制器支持1个片选输出其余3个控制器各支持2个片选输出 ·支持主机模式和从机模式,可通过软件进行配置切换/* 读取 / 写入 SPI 模式(SPI_MODE_0 ~ SPI_MODE_3)(限制为 8 位) */#define SPI_IOC_RD_MODE _IOR(SPI_IOC_MAGIC, 1, __u8) // 读取 SPI 模式#define SPI_IOC_WR_MODE _IOW(SPI_IOC_MAGIC, 1, __u8) // 写入 SPI 模式。

2026-04-02 14:52:11 372

原创 linux下的输入子系统

evdev_handler是一个struct input_handler类型的结构体变量,它的目的是定义和管理输入 处理程序的行为,处理程序可以注册到输入子系统中,以接收和处理特定输入设备产生的事件。在这个例子中,该设备的总线类型为0011,供应商ID为0001, 产品ID为0001,固件版本为ab41。3.设备驱动层(DeviceDriverLayer)负责硬件的初始化,把数据交给上层,设备驱动层的代码通常包括硬件的初始化、中断处理、数据传输。它提供 了一套通用的接口和机制,输入设备包括鼠标,键盘等等。

2026-04-01 19:23:16 455

原创 linux下的i2c子系统

这些个函数负责生成符合I2C协议 的时序和数据帧,并通过对应的I2C适配器驱动程序进行实际的总线操作,第一个函数用的多,后面是他的封装版本,封装成数据包去发送。然后匹配你的i2c控制器,成功后生成设备节点,实现open,write,ioctl,read函数,就可以操作了,本质还是调用i2c_transfer函数。过I2C核心层位于I2C设备驱动层和I2C适配器驱动层中间, 起到了承上启下的作用,负责I2C设备驱动层和I2C适配器驱动层之间数据的传递。具体的时序就不介绍了,资料很多,

2026-04-01 19:20:57 383

原创 linux下的gpio子系统

dev/mem 是 Linux 系统中的一个虚拟设备,通常与mmap结合使用,可以将设备的物理 内存映射到用户态,以实现用户空间对内核态的直接访问。通过打开/dev/mem设备文件,并将其映射到用户空间的内存中,我们可以直接读写物理 内存地址,从而实现对GPIO寄存器的控制。设备树如下,自定义pinctrl-names去初始化,如果你是默认值或者驱动自己带的默认值,比如default,他会自动帮你初始化引脚,如果不是,你需要自己手动初始化引脚。下面这个是宏定义写的,也可以不用宏定义。

2026-03-31 16:03:21 425

原创 linux下的pinctrl子系统

当LED灯的设备树和驱动匹配之后,就会进入驱动中编写的probe 函数,在此之前会执行“drivers/base/dd.c”文件中的 really probe 函数中的子函数 pinctrl_bind_pins,该函数会为给定的设备绑定引脚,并在绑定过程中选择和设置适当的pinctrl 状态。pinctrl子系统的结点在跟节点下面,本身也会转化为一个platform_device设备,然后内核驱动有pinctrl驱动进行匹配,加载,驱动里面就是对gpio进行设置引脚复用关系。pinctrl 驱动。

2026-03-31 10:34:50 368

原创 11-linux设备模型

它以一种层次结构的方式组织数据,并将这些数据表示为文 件和目录,使得用户空间可以通过文件系统接口访问和操作内核对象的属性比如:当使用kobject 时,通常不会单独使用它,而是将其嵌入到一个数据结构中。这样做的目 的是将高级对象接入到设备模型中。比如cdev结构体和platform_device结构体,如下所示: cdev 结构体如下所示,其成员有kobject所以我们也可以把总线,设备,驱动看作是kobject的派生类。

2026-03-30 22:01:48 393

原创 设备树插件

所以 configfs 与 sysfs 恰恰相反,sysfs 导出内核对象给用户空间,configfs 是从用户空间去配置内核对象。设备树插件允许在运行时动态修改设备树的内容,以便添加,修改或删除设备节点和属性,无需重新编译整个设备树。导出到用户空间以后,读这些文件就表示读取设备的信息,写这些文件就表示控制设备。1:首先添加插件头部声明,它指定了插件的名称和版本等信息,并指定了要修改的设备树的路 径。1:首先移植设备树插件的驱动,和让系统支持设备树插件驱动的内核。此时我们可以使用以下命令看到加载的节点。

2026-03-30 16:36:26 358

原创 6-Platform总线

平台总线(Platformbus)是Linux内核中提供的一种虚拟总线,用于管理和组织与特定硬 件平台相关的设备和驱动。它充当了平台设备(platformdevice)和平台驱动(platformdriver) 之间的桥梁,负责将它们进行匹配和绑定。但Linux 驱动开发里,几乎所有 “嵌入式硬件设备” 最终都会挂在某个总线上(平台总线只是其中最常用、最简单的一种)。IIC,SPI等等。

2026-03-29 18:21:22 223

原创 linux设备树

/ 函数功能:从设备树节点中**读取字符串属性**// np : 设备节点指针// propname : 要读取的属性名(如:compatible, status)// out_string : 输出参数,二级指针,保存读取到的字符串地址// 返回值 : 成功返回 0,失败返回负数// 定义一个字符串指针// 读取 compatible 属性。

2026-03-29 14:30:47 511

原创 Linux 中断概念和分析

打开Linux源码/include/linux/interrupt.h,下面是软中断号,enum {*/TEST_SOFTIRQ, //添加的自定义软中断//要在前面之前,最后一个是总的数字和一些API/*初始化nr:软中断的编号action:指向一个函数的指针*//*触发软中断nr: 软中断的编号或优先级。*//*关闭软中断nr: 软中断的编号或优先级。*///// 软中断处理程序//触发软中断。

2026-03-27 07:13:58 406

原创 linux IO模型

(1) 用户空间的应用程序向内核发起IO调用请求(系统调用) (2) 内核操作系统准备数据,把IO设备的数据加载到内核缓冲区 (3) 操作系统拷贝数据,把内核缓冲区的数据拷贝到用户进程缓冲。启动时,为0,此后,每次时钟中断处理程序都会增加该变量的值,定义在/include/linux/jiffies.h文件。应用程序通过向内核空间写入1和0从而控制GPIO引脚 的亮灭,但是读写操作主要是数据流对数据进行操作,而一些复杂的控制通常需要非数据操作,用ioctl函数就可以了,他就是命令函数。

2026-03-27 07:13:19 388

原创 字符设备注册和设备号

分为主设备号(某一类驱动)和次设备号(这个驱动下的各个设备)比如鼠标,键盘都属于USB驱动设备号数据类型dev_t 也即是u32,无符号整型32位数,高12位主设备号,低20位次设备号几个函数解析。

2026-03-26 09:59:41 200

原创 杂项设备和用户空间内核空间

dev/xxxMISC_DYNAMIC_MINOR是动态分配次设备号内核空间:操作系统和驱动程序运行内核态,内核空间负责和硬件打交道用户空间:用户程序运行在用户空间,用户空间数据和内核空间内存一般不能互相访问,需要函数。

2026-03-26 09:59:05 57

原创 linux驱动编译进内核和驱动传递参数

结合上次代码,驱动传递参数有三个函数分别是在上次代码头加上可以在模块加载的时候打印出来看看这样就可以了。

2026-03-25 11:00:59 52

原创 1—Helloworld驱动

驱动让硬件动起来,直接和硬件打交道,操作系统为上层用户提供给接口,通过驱动操作硬件。

2026-03-25 10:22:17 75

嵌入式校招薪资统计!.xlsx

嵌入式校招薪资统计!.xlsx

2025-07-16

空空如也

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

TA关注的人

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