自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 centos 7.3下安装vsftp(内含有视频教程)

1.说明 1)CSDN上有很多关于centos配置vsftp的教程,但基本上配置出来不能用,不知道为什么。 2)教程为视频教程,请前往www.sharing-iot.com进行观看,课程名称为centos下搭建FTP。 3)搭建环境为阿里云+centos7.3+vsftp. 4)教程从安装VSFTP开始,到最后测试可用,大家跟着一步一步做,10分钟就好了。PS:一定要仔细,一定要仔细,一定...

2018-09-04 20:10:46 638

原创 二十六、IIO子系统 + SPI子系统 + ICM20608

这篇文章记录和学习IIO和SPI子系统,并用它们实现运动和姿态传感器ICM20608的驱动,最后编写应用接入飞控模拟平台进行检测。ICM20608是一款运动和姿态传感器,其内部包含3轴加速度和3轴陀螺仪传感器,还有一个温度传感器,它们都是16位的ADC,转换出来的数据都是16位的。下图为ICM20608的姿态轴的极性:ICM20608通信接口可选SPI或I2C。这里我们使用SPI,因为SPI为全双工传输,速率更快,时序如下:ICM20608会将各个传感器转换出来的数据保存在它们各自的数据寄存器中,我们

2026-02-23 12:03:37 109

原创 二十五、I2C子系统和AP3216C驱动

这篇文章记录和学习I2C子系统,并且使用I2C子系统实现AP3216C芯片的驱动。AP3216C是一款“照度(ALS)/接近(PS)”二合一传感器。AP3216C的ALS传感器用于检测光照强度,但是现实中我们并不会用它来检测实时光照强度,因为这并没有什么意义;更多地,我们使用它来检测光照强度是否超出某个设定的范围,比如通过检测环境的亮度来自动调节手机屏幕,或者开关室内的光控灯,这意味着我们只需要在光照强度超过设定阈值的时候让AP3216C给我们一个中断就行了,我们不需要去轮询实时的光照强度。

2026-01-28 15:42:18 381

原创 二十四、Linux如何处理中断

各种不同架构的CPU都有自己的异常处理机制,并且中断属于异常的一种(中断异常)。那么Linux作为一个通用的操作系统,它是如何用同一套机制来处理这些不同架构处理器的异常和中断的呢?这篇文章就来了解和学习这个问题。下图是一个这几种技术的对比图:这几种中断处理技术没有绝对的优劣判断标准,实际应用中需要根据具体情况选择最合适的方法。比如上半部 + 工作队列技术的系统中断响应实时性稍差,并且下半部需要与普通应用公平竞争CPU,中断任务延迟较大;而。

2026-01-21 16:12:22 371

原创 二十二、同步与互斥

驱动是属于内核模块,运行在内核态,可能会有同一个CPU上的不同进程(线程)或者不同CPU上的进程(线程)同时调用,甚至中断的发生也会要求驱动程序介入处理。这就要求驱动能够协调这些不同的调用者对共享资源的访问,避免并发引起的资源竞争和错误。这节讲了Linux内核中实现同步与互斥的几种方法,其中原子变量用于保护一个整数;自旋锁用于保护一段执行时间很短的临界区代码,它不会休眠等待;信号量用于实现类似生产者-消费者的信号同步机制,它会引起休眠等待;互斥量用于保护一段可能比较耗时的临界区代码,它会引起休眠等待。

2026-01-15 15:54:49 190

原创 二十一、pinctrl子系统

前面我们写的GPIO驱动程序都是自己在驱动里面定义好gpio引脚需要用到的寄存器,然后在驱动程序里面直接去配置这些寄存器。Linux是一个成熟的,跨平台的通用操作系统,对于配置引脚这样的最基本的功能,是已经有一套现成的框架可以用的,这就是pinctrl子系统。需要注意的是pinctrl子系统是用于配置引脚的,包括引脚的复用功能,电气属性等。而当将引脚复用为gpio功能之后,就可以使用另一个叫做gpio的子系统去操作这个gpio引脚,包括将其设置为输入还是输出,输出高电平还是低电平等等。

2026-01-08 16:44:52 237

原创 二十、设备树

前面我们使用struct resource结构体来描述硬件资源,这是以前ARM Linux社区没有引入设备树时的做法,这种方法会在Linux内核源码里面引入大量的板级文件,使得内核源码臃肿。为了改变这种情况,ARM Linux社区后来引入设备树,使用设备树来描述板级硬件资源。

2026-01-05 11:25:34 189

原创 十九、总线与代码分离

之前写的驱动程序都是将硬件信息(比如GPIO引脚的寄存器地址与配置数据)与驱动逻辑(比如设置GIPIO引脚电平)杂糅在同一个内核模块中。这样会导致一个问题就是驱动程序无法复用到其它平台,因为对于不同的芯片,它们的硬件信息是不一样的。考虑到对于相同类型的设备,驱动逻辑这块其实是不变的,所以可以把驱动程序中需要改变或调整的部分(比如硬件信息和数量)以及不需要改变的部分(硬件驱动逻辑)给分离开来形成两个独立的内核模块。

2025-12-27 13:44:36 237

原创 十八、使用class分类管理设备

【代码】十八、使用class分类管理设备。

2025-12-26 11:07:27 438

原创 十七、Linux设备驱动模型

Linux设备驱动模型概述

2025-12-13 14:58:30 179

原创 十六、一个基本的GPIO驱动程序

前面学习和了解了字符设备和文件系统是怎么关联起来的,这篇文章就来实践一下,加深前面的理解。我们写一个基本的GPIO引脚驱动用于驱动板载的LED灯和蜂鸣器,并在文件系统里面创建字符设备文件节点,用于控制GPIO引脚。

2025-12-07 11:37:41 350

原创 十五、设备文件与设备驱动是如何关联的

在Linux下,一切皆文件,这个说法对于字符设备也是成立的。对于字符设备,我们会在/dev目录下创建一个设备文件(也叫做设备节点),然后读写这个文件就可以实现应用程序与字符设备的交互。但是字符设备文件属于文件系统的范畴,而字符设备驱动属于字符设备子系统的范畴,那么它们是如何配合从而实现从文件系统的层面访问到字符设备的呢?这篇笔记要阐明的就是应用程序如何通过/dev目录下的字符设备文件名找到对应的字符设备驱动并实现与字符设备的交互。

2025-12-02 14:53:06 171

原创 十四、内核模块依赖关系

有的时候,一个内核模块会依赖另一个内核模块,比如引用另一个内核模块导出的参数,调用另一个内核模块提供的函数等等。

2025-12-01 10:22:24 223

原创 十三、Linux内核模块开发基础

对于宏内核,由于服务直接在内核态提供,故用户应用程序的数据可以通过系统调用直接交给内核服务处理,数据拷贝少;按照现代操作系统的内核派系,Linux属于宏内核,其所有的核心功能和服务都在内核里面提供;为了解决宏内核服务功能扩展的问题,Linux引入了内核模块,我们实现了模块功能并将其编译为.ko格式的内核模块文件后,就可以进行动态加载和移除,以此实现内核服务的扩展。对于宏内核,由于其服务也集成在内核里面,故内核镜像大,不易扩展,想添加新的功能需要重新编译内核;如果想查看内核输出的所有消息,可以使用。

2025-11-30 16:00:32 239

原创 十二、驱动开发环境准备

由于我的主机电脑没有固定的有线网口,所以用的USB转接网口,其插拔会影响主机的网络状态,故单独组件了一个brige网络,以免其插拔影响到虚拟机上网功能或者主机与虚拟机的连接。1.由于想用clangd实现vscode + clangd的代码精确跳转,所以需要一个较高的linux内核版本,但是又不想系统占用太大的空间,因此选择操作系统镜像选择debian-12服务器版。ens37:Host-Only,用于主机连接虚拟机,实现SSH和Samba共享等功能,IP = 192.168.189.100。

2025-11-29 14:47:54 307

原创 十一、Linux内核的构建和编译

linux的默认配置文件位于arch/arm/configs目录中,而u-boot的默认配置文件位于根目录下的configs中。

2025-11-25 20:30:48 130

原创 十、UBOOT学习笔记

kbuild配置系统中已经有一套默认的配置参数,对于跟默认值不同的参数,或者需要新增的配置参数,就放在xxx_defconfig配置文件中。根据实验的结果,环境变量使用EMMC还是SD卡取决于启动设备,如果是从EMMC里启动的UBOOT,则默认的当前mmc设备为EMMC,并且从EMMC里加载环境变量;的构建都是用./scripts/Makefile.build,所以接下来探索./scripts/Makefile.build。处,也就是说我们需要烧录的是uboot.imx,而不是uboot.bin。

2025-11-20 09:35:39 1011

原创 C++类模板编程练习(从基础到进阶)

C++模板类编程练习

2025-04-25 14:19:46 331

原创 九、异常处理(Exception Handling)

本篇文章是《ARM Cortex-A v7》编程手册第九章—Exception Handling的学习笔记。

2024-03-12 21:31:25 2649

原创 八、访存顺序(Memory Ordering)

这篇文章记录了ARM架构中跟存储系统相关的学习笔记,包括存储类型,存储顺序,内存屏障等内容。

2024-02-02 21:20:00 1583

原创 七、内存管理单元(MMU)

本篇文章讲解了ARMv7里面的MMU知识以及MMU在操作系统里面的使用

2024-01-30 13:45:01 1431

原创 七、使用隐式规则(Using Implicit Rules)

本篇文章是《GNU Make》官方文档的第10章—Using Implicit Rules的学习笔记。

2024-01-26 21:30:45 715

原创 六、文本处理函数

本篇文章是《GNU Make》官方文档的第八章—Functions for Transforming Text的学习笔记

2024-01-17 21:38:04 937

原创 五、使用条件指令

本篇文章是《GNU Make》官方文档的第7章—Conditional Parts of Makefiles的学习笔记。

2024-01-13 11:14:25 1376

原创 四、使用变量

本片文章是《GNU Make》官方文档第六章—How to Use Variables的学习笔记。

2024-01-08 20:50:03 963

原创 三、写配方(Recipes)

本片文章是《GNU Make》官方文档第五章—Writing Recipes in Rules的学习笔记。

2023-12-31 17:42:43 2302 1

原创 二、写规则(Rules)

本篇文章是《GNU Make》官方文档的第四章—Writing Rules的学习笔记。

2023-12-28 17:52:51 2204

原创 一、GNU Make基础

本篇学习笔记主要总结了《GNU make》里面前三章部分的一些重要知识点,引入了一些重要的概念,为方便后续章节的学习打下基础。

2023-12-20 21:37:03 1923

原创 六、Cache — 缓存

本篇笔记为《Cortex-A(armV7)编程手册》第8章 - Caches的学习心得,总结了Cache的基本原理和Cortex-A系列处理器的Cache结构知识。

2023-12-09 18:25:59 1691

原创 五、汇编语言和指令集

本篇笔记记录了指令集部分的学习心得体会

2023-11-09 21:51:21 373 1

原创 四、关于LDR伪指令

该笔记探讨和验证了LDR伪指令的工作原理,PC偏移值的计算方法。

2023-10-24 21:47:50 1539

原创 三、CP15协处理器

本篇笔记大概介绍了协处理器的概念,以及ARMv7-A架构里面的CP15协处理器的使用,寄存器的访问方法。

2023-10-21 17:50:52 642 1

原创 二、Cortex-A系列处理器模式和内核寄存器

本文是对ARM架构的处理器模式和CPU寄存器学习后的详细总结

2023-10-21 15:56:53 785 1

原创 一、烧录代码镜像到IMX6ULL上去运行

本文详细介绍了IMX6ULL启动设备的概念,分析了IMX6ULL的几种启动模式,以及如何生成和烧录代码镜像到启动设备。

2023-10-08 21:52:53 1083 2

原创 八、INPUT子系统和内核自带的GPIO按键驱动

INPUT子系统和Linux内核自带的GPIO按键驱动

2023-04-17 17:35:17 809

原创 七、Linux的几种中断处理技术

总结归纳了Linux的几种中断处理技术

2023-04-17 16:31:53 398

原创 六、Linux的同步与互斥机制

原子操作的原理就是,利用 LDREX / STREX 实现一个完整的“读-修改-写”的过程。如果写回的时候发现被抢占,则应重复“读-修改-写”的过程,直到操作成功为止(STREX的返回值为0)。Linux中的同步和互斥机制,都是基于原子操作来实现的。自旋锁一开始是面向多CPU系统的,获取不到锁就原地打转,会占用CPU资源,所以自旋锁适合用在短暂等待的情况,比如别人可能很快就会释放锁的情况。对于小于ARMv6架构的处理器,因为不支持SMP,所以Linux实现原子操作的方法是直接关中断。三、Linux中的锁。

2023-03-31 16:14:11 209

原创 二十三、应用程序从驱动获取数据的几种方式

这篇文章讨论一下应用程序从驱动读写数据(数据IO)的几种方式,会涉及到驱动部分要做的事情和应用侧该怎么写的问题。总体来说,应用有四种方式同外设交互数据:1)非阻塞(轮询)2)阻塞 (休眠-唤醒)3)POLL机制4)异步通知下面分别讨论和学习这几种方式。以上便是应用程序从驱动获取数据的几种方式的总结。应该注意的是,驱动程序提供IO能力,但是不提供IO策略,应用侧应根据实际的需求使用合适的方式来进行IO操作。//启动消抖定时器int level;//读取按键状态。

2023-03-30 21:26:55 663

原创 四、引入总线设备驱动的概念,基于平台驱动的LED字符设备驱动

基于平台驱动实现的Linux LED字符设备驱动,支持多个LED灯,从基本的字符设备驱动的自定义设备结构体来表示一个LED,过渡到到使用通用的平台设备来表示一个LED灯

2023-03-04 12:16:18 216

原创 三、最终的LED字符设备驱动,体现驱动程序分层和分离的设计思想

经过进一步分层后的Linux LED驱动框架,将最初的LED驱动拆分为通用的系统级LED驱动框架 + 芯片相关的芯片级驱动 + 板级相关的板级驱动,体现了Linux驱动的分层设计思想和面向对象的接口抽象

2023-02-28 18:11:10 226

嵌入式Linux LED字符设备驱动,基于平台驱动实现,使用设备树定义LED灯资源,引入pinctrl和gpio子系统

基于platform总线实现的LED字符设备驱动程序,使用设备树定义LED灯资源,引入pinctrl子系统配置GPIO引脚,引入gpio子系统获取和操作GPIO引脚。

2023-03-15

嵌入式Linux按键驱动,支持短按和长按检测

使用平台驱动框架,基于按键中断和内核定时器实现按键和长按检测,支持休眠-唤醒,POLL机制,异步通知和非阻塞的IO操作。

2023-03-15

Linux LED字符设备驱动,基于平台驱动的LED字符设备驱动,支持多个LED灯,体现Linux驱动的分层设计思想

整个驱动分为三个部分,板级驱动(led_dev.c)定义板级资源,芯片级驱动(led_imx6ull.c)定义了芯片相关的结构和操作,系统级驱动(leddrv.c)定义了字符设备相关的接口。更改硬件只需要替换led_dev.c,更换芯片需要替换led_dev.c和led_imx6ull.c

2023-03-04

Linux LED字符设备驱动,基于平台驱动的LED字符设备驱动,支持多个LED灯,没有体现分层设计思想

基于平台驱动的基本的LED字符设备驱动,支持多个LED灯,整个驱动分为两部分,一部分定义资源led_dev.c,一部分定义操作led_drv.c,未体现Linux驱动分层设计思想

2023-03-04

嵌入式Linux字符设备驱动-分层后的LED字符设备驱动-系统级驱动+芯片级驱动

基于最基本的Linux LED字符设备进行改进,在原来的基础上将驱动进行分层设计,拆分出通用的部分作为系统级驱动,剩余的跟芯片相关的部分作为芯片级驱动,以后系统级驱动和芯片级驱动可单独维护,互不影响。体现Linux驱动分层设计思想,以及面向对象的接口抽象。

2023-03-02

经过进一步分层后的Linux LED字符设备驱动,系统级驱动 + 芯片级驱动 + 板级驱动

经过进一步分层后的Linux LED字符设备驱动,进一步体现Linux驱动的分层设计思想,整个驱动 = 系统级驱动 + 芯片级驱动 + 板级驱动

2023-03-02

一个最基本的Linux LED字符设备驱动,支持多个LED灯

一个最基本的Linux LED字符设备驱动,纯字符设备驱动,不适用任何框架,支持多个LED灯。

2023-03-02

空空如也

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

TA关注的人

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