Linux 驱动开发
文章平均质量分 88
职业法师头铁
这个作者很懒,什么都没留下…
展开
-
24 Linux PWM 驱动
① 16 位的向上、向下自动加载计数器。② 16 位可编程的预分频器。③ 6 个独立的通道,这些通道的功能如下:— 输入捕获(只有通道 5 和 6 支持)。— 输出比较— PWM 波形生成(边缘和中间对齐模式)。— 单脉冲模式。④ 带有死区的可编程互补输出。⑤ 以下事件可以生成中断或者 DMA:— 更新事件,计数器溢出。— 触发事件,计数器开始、停止、初始化等。— 输入捕获。— 输出比较。原创 2024-03-08 07:00:00 · 1370 阅读 · 0 评论 -
23 Linux INPUT 子系统
INPUT 子系统总体分为三个部分,驱动层、核心层和事件层。简化驱动开发,让代码更加具有可读性。对 input 子系统如何编写代码需要掌握:在使用platform的前提下:① 首先使用 input_allocate_device 来申请一个 input_dev;(一般在 xxx_probe 中)② 初始化 input_dev 事件类型及事件值(三种方式初始化);(一般在 xxx_probe 中)③ 使用 input_register_device 来注册 input_dev;原创 2024-03-07 07:00:00 · 1459 阅读 · 0 评论 -
22 Linux MISC 驱动
其实 MISC设备驱动就是变成了一种函数集合,这个函数集合包含注册字符设备驱动需要的工作。使用 MISC 设备驱动也简单,首先先设置 MISC 设备结构体包括name、minor(次设备号)和 fops。设置完成后向 Linux 注册 MISC 设备,这个注册函数()一般放在 probe 函数,注销函数()放在 remove 中。原创 2024-03-06 07:00:00 · 1132 阅读 · 0 评论 -
21 Linux 自带的LED驱动
* 这里其实和上一章节类似,都是这种结构,除了325行是新的之外 */......204 { .compatible = "gpio-leds", }, // 这里得和设备树的LED节点一样才能匹配成功205 {},206 };207......320 .name = "leds-gpio", // 这里设置为leds-gpio,那么/sys/bus/platform/drivers目录下也会出现一个这个名字322 },323 };......原创 2024-03-05 07:00:00 · 1181 阅读 · 0 评论 -
20.2 设备树中的 platform 驱动编写
这一节是在设备树下使用platform,先是修改了 pinctrl-stm32.c 文件,这个是根据具体的芯片来修改这个的,这里修改了严格模式。之后创建设备的 pinctrl 节点,这里是配置io口和电气设置的。然后在设备树中创建设备节点,这里面需要添加 pinctrl-names 和 pinctrl-0。最后要检查 引脚 pinctrl 的配置和 gpio 占用情况,因为 Linux 下必须严格按照一个引脚对应一个功能设计硬件。原创 2024-03-02 07:00:00 · 1092 阅读 · 0 评论 -
20.1 platform 设备驱动
驱动分离里有 总线(bus)、驱动(driver)和设备(device)模型。有些 SOC 外设没有总线,所有 Linux 提出了 platform 虚拟总线,相应就有 platform_bus、platform_driver 和 platform_device。这章起始不必太过关注没有设备树部分,关注为什么要有 platform 平台,因为需要把设备和驱动分开,一种更好的框架。原创 2024-03-01 07:00:00 · 747 阅读 · 0 评论 -
19 异步通知
概念:其实异步通知就是让驱动设备空出来的时候发送一个信号给用户进程空间,让进程空间知道,哦原来可以使用这个设备了,一般搭配 非阻塞+异步通知使用,效果更佳。异步通知的使用方法需要掌握,他们分为驱动和用户进程空间:在内核空间中:① 定义结构体;② 编写fasync函数;③ 最后当设备空出来的时候指定信号。在用户空间中:① 编写信号处理函数,并且最后把信号处理函数传给signal函数;② 本程序进程号告诉内核;/* 获取当前的进程状态 *//* 开启当前进程异步通知功能 */;原创 2024-02-29 07:00:00 · 768 阅读 · 0 评论 -
18 Linux 阻塞和非阻塞 IO
概念:阻塞和非阻塞,一个是在内核里面,一个是在内核和用户空间反复跳。他们的概念需要知道。阻塞:当一个任务或线程执行某个操作时,如果该操作无法立即完成,任务或线程将会被阻塞(暂停执行)。阻塞式会一直占用 CPU,直到操作完成,这里面有 等待队列头,等待队列项,等待唤醒和等待事件比较重要。非阻塞:当一个任务或线程执行某个操作时,如果该操作无法立即完成,任务或线程不会被阻塞,而是立即返回,继续执行后续的任务或代码。非阻塞式调用不会一直占用 CPU 资源,任务或线程可以在等待操作完成时去处理其他任务或代码。原创 2024-02-28 07:00:00 · 1227 阅读 · 0 评论 -
17 Linux 中断
概念:首先,我们学习了 Linux 中断号,并且了解了中断是如何开启的。每当使用到了中断,必须去申请中断(request_irq),在驱动出口再释放中断(free_irq),如果使用了函数,那么就不用使用使能中断 (enable_irq)。建议在申请成功后先用函数禁止中断,等所有工作完成之后再来使能中断。其次,学习了上半部和下半部,上半部其实就是对哪些时间敏感、执行速度快的操作放在中断处理函数中,也就是上半部,其他的就放在下半部。原创 2024-02-27 07:00:00 · 1235 阅读 · 0 评论 -
16 Linux 内核定时器
一般周期性的工作都是用到了定时器,Linux 内核定时器采用系统时钟来实现。Linux 内核定时器只要给出超时时间(定时值)和定时器处理函数。当超时时间到了,设置的定时函数就会执行。需要注意的是,内核定时器不是周期性的,它是运行完就自动关闭,如果想要周期性运行定时器,那么需要在定时处理函数中重新开启定时器。/**//* 定时器超时时间,单位是节拍数 *//* 定时处理函数*/u32 flags;/* 标志位 */#endif。原创 2024-01-06 07:00:00 · 1119 阅读 · 0 评论 -
15 Linux 按键
其实案件驱动和 LED 驱动很相似,只不过区别在于,一个是读取GPIO高低电平,一个是从GPIO输出高低电平。在驱动程序中使用一个整形变量来表示按键值,应用程序通过 read 函数来读取按键值,判断按键有没有按下。在这里,这个保存按键值的变量就是个共享资源,驱动程序要向其写入按键值,应用程序要读取按键值。所以我们要对其进行保护,对于整形变量而言我们首选的就是原子操作,使用原子操作对变量进行赋值以及读取。原创 2024-01-05 07:00:00 · 584 阅读 · 0 评论 -
14.1 Linux 并发与竞争
原子操作:不能再进一步分割的操作,一般用于变量或位操作。a = 3;但 C 语言要先编译成汇编语言,ARM 架构不支持直接对寄存器(内存)进行读写操作,要借助寄存器 R0、 R1 等来完成赋值操作。ldr r0, =0X30000000 // 将变量a的地址加载到寄存器r0中ldr r1, = 3 // 写入变量a的值加载到寄存器r1中str r1, [r0] // 将寄存器r1中的值3写入到变量a的地址所指向的内存中。原创 2024-01-04 07:00:00 · 812 阅读 · 0 评论 -
14.2 并发与竞争实验
这节使用原子操作来实现对 LED 设备的互斥访问,也就是只有一个应用程序能使用 LED。原创 2024-01-03 07:00:00 · 1101 阅读 · 0 评论 -
12 pinctrl 和 gpio 子系统
gpio 子系统用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO 为输入输出,读取 GPIO 的值等。目的就是方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API 函数来操作 GPIO。...原创 2024-01-02 14:45:00 · 1387 阅读 · 0 评论 -
13 Linux 蜂鸣器
常用蜂鸣器分两种,有源蜂鸣器和无源蜂鸣器。它们俩的区别:有源蜂鸣器具有内置的振荡器和驱动电路,无源蜂鸣器没有;源蜂鸣器只需简单的数字信号来控制,无源蜂鸣器需要外部电路或微控制器来提供特定频率的脉冲信号。在 Linux 下做的工作:①设备树中添加蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息;②编写驱动程序和测试 APP。原创 2023-12-22 07:00:00 · 620 阅读 · 0 评论 -
11.2 设备树下的 LED 驱动
最后可以进入 stm32mp1_led 目录中,查看属性文件。原创 2023-12-21 07:00:00 · 397 阅读 · 0 评论 -
11.1 Linux 设备树
设备树(Device Tree),描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息:树的主干就是系统总线, IIC 控制器、 GPIO 控制器、 SPI 控制器等都是接到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种,其中 IIC1 上接了 FT5206 和 AT24C02这两个 IIC 设备, IIC2 上只接了 MPU6050 这个设备。原创 2023-12-19 07:00:00 · 1285 阅读 · 0 评论 -
10 新字符设备驱动文件
因为 register_chrdev 和 unregister_chrdev 两个函数是老版本驱动文件,现在可以用新字符设备驱动 API 函数。原创 2023-12-17 07:00:00 · 893 阅读 · 0 评论 -
make没有更新最新的uImage
【代码】make没有更新最新的uImage。原创 2023-12-16 07:00:00 · 458 阅读 · 0 评论 -
9.2 Linux LED 驱动开发
Linux 下的任何驱动,最后都是要配置相应的硬件寄存器。原创 2023-12-15 07:00:00 · 931 阅读 · 0 评论 -
9.1 字符设备驱动开发
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。Linux 应用程序对驱动程序的调用:驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。原创 2023-12-14 07:00:00 · 1034 阅读 · 0 评论 -
8 Buildroot 根文件系统构建
根文件系统一般也叫做 rootfs,这个是属于 Linux 内核的一部分。根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。原创 2023-12-13 07:00:00 · 1914 阅读 · 0 评论 -
7 Linux 内核移植
比如板子运行的系统和编译驱动模块所用的系统不一致的时候。打开 arch/arm/boot/dts/Makefile,到“ dtb-$(CONFIG_ARCH_STM32)”配置项,在此配置项中加入“stm32mp157d-atk.dtb”, 表示编译的时候也将 stm32mp157datk.dts 编译为 stm32mp157d-atk.dtb。这里我的理解是:先创建.ext4 磁盘,这个磁盘必须挂在到目录下,把需要放在这个磁盘下的东西放在挂载的目录里,最后再卸载该目录下的挂载。原创 2023-12-12 07:00:00 · 2670 阅读 · 0 评论 -
6.4 U-boot 移植
这里可以看如何下载uboot源码。原创 2023-12-11 07:00:00 · 959 阅读 · 0 评论 -
6.3 U-boot 启动流程详解
通过对 uboot 启动流程的梳理,我们就可以掌握一些外设是在哪里被初始化的,这样当我们需要修改这些外设驱动的时候就会心里有数。原创 2023-12-10 07:00:00 · 1729 阅读 · 0 评论 -
6.2 U-boot 顶层 Makefile
如果要分析uboot源码,首先要将uboot源码进行编译,编译需要在Ubuntu进行,把uboot文件放在一个目录下。编译完成后的文件是这样:我们需要看的文件夹如下。原创 2023-12-09 07:00:00 · 1809 阅读 · 0 评论 -
5 TF-A
TF-A是什么?TF-A 全称是 Arm Trusted Firmware,TF-A是为了保证安全,arm退出的可信固件,简称TF-A。它的作用就是隔离硬件,为硬件提供一个安全环境并提供安全服务。原创 2023-12-07 07:00:00 · 1165 阅读 · 0 评论 -
4 STM32MP1 Linux系统启动过程
ROM代码是上电以后首先执行的程序,它的主要工作就是读取STM32MP1的BOOT引脚电平,然后根据电平来判断当前启动设备,最后从选定的启动设备里面读取FSBL代码,将FSBL代码放在对应的RAM空间。STM32MP1启动Linux内核是链式结构:ROM Code → FSBL → SSBL → Linux kernel → rootfs,系统启动的时候要保证整个链式结构都是安全的。SSBL部分的Uboot就只有一个使命,启动Linux内核,Uboot将Linux内核加载到DDR上并运行。原创 2023-12-06 07:00:00 · 442 阅读 · 0 评论 -
3 开发环境搭建
① 开启Ubuntu的FTP服务:;;确保这两行代码没有被注释:之后重启FTP服务:③ FileZilla软件设置:Ubuntu作为FTP服务器,FileZilla作为FTP客户端。FileZilla->文件->站点管理器,创建新站点。由于这时候是乱码,所以先关闭连接,服务器->断开连接。然后按着以下图设置即可。原创 2023-12-05 07:00:00 · 994 阅读 · 0 评论 -
2.1 Linux C 编程
1、在用户根目录下创建一个C_Program,并在这里面创建3.1文件夹来保存Hellow World程序;2、安装最新版nvim①②③④ 进入neovimcd neovim⑤ 输入下面代码3、安装Nerd Font① 输入② 安装unar,③ 解压文件④之后按照下图操作4、配置nvim.lazy①;②cd nvim进入nvim;③ 输入nvim既可开始安装lazy nvim;5、打出Hellow World6、安装gcc、g++、make① 直接安装 build-essential。原创 2023-12-04 07:00:00 · 1585 阅读 · 0 评论 -
1.3 Linux文件系统
剩下的 9 位以 3 位为一组,分别表示文件拥有者的权限,文件拥有者所在用户组的权限以及其它用户权限。②用户 luoxuesong 所在的用户组也叫做 luoxuesong ,其组内用户对于文件 test.c 的权限是“rw-”,也是拥有读和写这两种权限。①文件 test.c 的拥有者是用户 luoxuesong ,其对文件 test.c 的权限是“rw-”,也就是对该文件拥有读和写两种权限。“*”,“*.c”就表示 test1 下的所有以“.c”结尾的文件,也就是a.c 和 b.c。原创 2023-12-03 07:00:00 · 947 阅读 · 0 评论 -
1.2 Ubauntu 使用
双击 VMwareTool打开 Ubuntu 终端快捷键切换汉语的快捷键是安装tool,输入之前设置的密码。地址默认,按Enter即可。出现上图即安装完成。重启以后就可以直接在虚拟机 Ubuntu 系统和主机 Windows 下进行文字、文件等的复制粘贴。如果以上方法不行,使用下面这个方法。首先卸载然后在这个路径下输入安装完毕即可。原创 2023-12-02 07:00:00 · 984 阅读 · 0 评论 -
26 Linux RTC 驱动
Linux 内核将 RTC 设备抽象为 rtc_device 结构体,所以 RTC 设备驱动就是申请并初始化rtc_device,最后将 rtc_device 注册到 Linux 内核中,最终内核就会有一个 RTC 设备。/* 设备 */int id;/* ID *//* RTC 设备底层操作函数 *//* 字符设备 */......原创 2023-11-30 08:30:00 · 1012 阅读 · 0 评论 -
25 Linux I2C 驱动
STM32MP1 开发板上通过 I2C5 连接了一个三合一环境传感器: AP3216C。支持环境光强度(ALS)、接近距离(PS)和红外线强度(IR)这三个环境参数检测。该芯片可以通过 IIC 接口与主控制相连,并且支持中断。AP3216C 常被用于手机、平板、导航设备等,其内置的接近传感器可以用于检测是否有物体接近,比如手机上用来检测耳朵是否接触听筒,如果检测到的话就表示正在打电话,手机就会关闭手机屏幕以省电。也可以使用环境光传感器检测光照强度,可以实现自动背光亮度调节。原创 2023-11-25 08:00:00 · 1422 阅读 · 0 评论