
系统-驱动
文章平均质量分 94
Linux 驱动相关知识;
野火少年
1)8年智能语音、IOT 产品开发经验,熟悉物联网平台、智慧安防、酒店客控系统
2)能够独立完成后端服务器开发、熟悉 Linux 系统、Android 系统
3)3年研发总监管理经验 1年Framework层开发经验 10年Android应用开发经验
4)从事10年智能硬件相关产品开发:基于RK、全志、MTK 平台开发;主导各种类型服务、教育、安防机器人产品、物联网网关中控产品、背景音乐KTV娱乐产品、故事机平板、广告机、微投投影、各种商显、校话机等智能硬件产品。
5)物联网平台熟悉 米家、涂鸦系平台产品;熟悉中控智能家居产品。
展开
-
驱动-传参实验-ioctl
用户如果要对外设进行操作,对应的设备驱动不仅要具备读写的能力,还需要对硬件进行控制。以点亮LED灯驱动实验为例,应用程序通过向内核空间写入1和0从而控制LED灯的亮灭,但是读写操作主要是数据流对数据进行操作,而一些复杂的控制通常需要非数据操作,这时本章节要学习的ioctl函数就闪耀登场了。原创 2025-05-16 11:05:17 · 257 阅读 · 0 评论 -
驱动-定时-秒-字符设备
这个程序实验,用到了原子操作+定时器timer_list+字符设备操作。简要了解即可,加深前面知识印象。原创 2025-05-15 19:03:26 · 440 阅读 · 0 评论 -
驱动-Linux定时-timer_list
硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始的起点, 以未来的某一时刻为计时的终点) , 内核只有在系统定时器的帮助下才能计算和管理时间, 但是内核定时器的精度并不高, 所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性, 到达计时终点后会自动关闭。如果要实现周期性定时, 就要在定时处理函数中重新开启定时器。Linux 内核中使用 timer_list 结构体表示内核定时器, 该结构体定义在“内核源码/include/li。原创 2025-05-15 17:18:24 · 869 阅读 · 0 评论 -
驱动-互斥锁
将信号量量值设置为 1, 最终实现的就是互斥效果, 这里要了解的互斥锁功能相同, 虽然两者功能相同但是具体的实现方式是不同的, 但是使用互斥锁效率更高、更简洁, 所以如果使用到的信号量“量值”为 1,一般将其修改为使用互斥锁实现。当有多个线程几乎同时修改某一个共享数据的时候, 需要进行同步控制。线程同步能够保证多个线程安全访问竞争资源, 最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态: 锁定或者非锁定。某个线程要更改共享数据时, 先将其锁定, 此时资源的状态为“锁定” , 其他线程不能更改;原创 2025-05-09 18:07:11 · 958 阅读 · 0 评论 -
驱动-信号量
信号量是操作系统中最典型的用于同步和互斥的手段, 本质上是一个全局变量, 信号量的值表示控制访问资源的线程数,可以根据实际情况来自行设置, 如果在初始化的时候将信号量量值设置为大于 1, 那么这个信号量就是计数型信号量,允许多个线程同时访问共享资源。如果将信号量量值设置为 1, 那么这个信号量就是二值信号量, 同一时间内只允许一个线程访问共享资源,注意!信号量的值不能小于 0。当信号量的值为 0 时, 想访问共享资源的线程必须等待, 直到信号量大于 0 时,等待的线程才可以访问。原创 2025-05-09 15:56:52 · 755 阅读 · 0 评论 -
驱动-自旋锁死锁
通过程序验证,和自旋锁死锁 有了初步认识为什么会死锁,为什么之前的自旋锁环境没有死锁,这个地方需要思考下。指定了CPU、内核睡眠等待、其它进程重复获得自旋锁等原因造成的自旋锁的实际案例和规避死锁,后面再进一步理解的要。原创 2025-04-19 12:56:11 · 833 阅读 · 0 评论 -
驱动-自旋锁
这里简单介绍了自旋锁的应用场景,需要了解原理和使用api 即可。原创 2025-04-18 00:15:00 · 740 阅读 · 0 评论 -
驱动-原子操作
原子操作可以理解为一个计数器,一个原子变量,更具原子变量的值是否是预设的值来保护程序,防止程序资源竞争。原创 2025-04-17 15:02:12 · 667 阅读 · 0 评论 -
驱动-并发与竞争
并发与竞争这么多年接触下来,操作系统下 不同的编程语言都有对应的 并发、并行、线程、进程、同步、异步一说。这些核心本质其实是操作系>统的机制。那么不同开发语言下面对应的形态不一样而已,表现形式不一样,但是基本概念、实现原理 都是基于操作系统的。在上学课本上面操作系统学科里面 应该是第一次接触进程、线程、这些基本理论的。这里我们在驱动层面 理解 实验。原创 2025-04-17 11:19:06 · 766 阅读 · 0 评论 -
驱动-兼容不同设备-container_of
本篇其实还是对以前技术的总结,这里着重用到了函数 container_of,有点面向对象的意思。这里适配不同的驱动设备只是一个案例而已。原创 2025-04-16 00:15:00 · 643 阅读 · 0 评论 -
驱动-文件私有数据
Linux 中并没有明确规定要使用文件私有数据, 但是在 linux 驱动源码中, 广泛使用了文件私有数据, 这是 Linux 驱动遵循的“潜规则” , 实际上也体现了 Linux 面向对象的思想。structfile 结构体中专门为用户留了一个域用于定义私有数据这里对私有数据 结构体 file,通过它实现了了私有数据的共享,file 在open 、read、write 等文件操作中共享,利用共享的私有数据 定义的又是指针类型,然后封装数据,实现效果的。原创 2025-04-15 01:00:00 · 650 阅读 · 0 评论 -
驱动-内核空间和用户空间数据交换
copy_from_user 和 copy_to_user 是 Linux 内核中用于在用户空间和内核空间之间安全传输数据的两个重要函数。内核和用户态数据传递就是通过两个方法调用来实现,回调到用户态其实就是指针传递。原创 2025-04-12 00:15:00 · 1158 阅读 · 0 评论 -
驱动-杂项设备
看杂项设备还是要和标准字符设备对比来看,主设备号固定为10,次设备号动态分配,简化了字符设备驱动的注册流程,适用于功能简单的设备杂项设备也有自己的结构体miscdevice 、file_operations ,却别与标准字符设备的 设备号结构体dev_t ,注册的字符设备结构体cdev ,文件操作集合结构体file_operations。原创 2025-04-11 09:00:33 · 677 阅读 · 0 评论 -
驱动-字符设备驱动框架
这里是对字符设备的一个总结,前面知识的进一步理解字符设备最终通过 文件结构体 file_operations 来实现,系统和驱动之间文件操作方法的映射。原创 2025-04-11 00:15:00 · 934 阅读 · 0 评论 -
驱动-创建设备节点
字符设备知识点中的 设备节点创建内容熟悉结合以前的知识,字符设备设备号申请,字符设备注册内容进一步熟悉设备注册、类、设备创建后 在驱动卸载的时候记得 卸载。原创 2025-04-09 00:15:00 · 658 阅读 · 0 评论 -
驱动-注册字符设备
字符设备号申请-字符设备注册 基本知识进一步熟悉字符设备注册几个函数要掌握 cdev_init - cdev_add - cdev_del涉及到的结构体 需要理解,后面才能举一反三,接下来还有其它基本知识需要掌握。原创 2025-04-07 17:59:18 · 589 阅读 · 0 评论 -
驱动-申请字符设备号
之前的动态传参实际应用设备号的理解,动态和静态申请设备号熟悉理解,后续必须用到的基础知识字符设备号在系统位置的熟悉。原创 2025-04-07 15:24:41 · 759 阅读 · 0 评论 -
驱动-内核模块开发中的符号导出机制
如何实现模块之间变量和函数的共享传递,用到EXPORT_SYMBOL 导入、extern 导入。原创 2025-04-07 12:20:48 · 841 阅读 · 0 评论 -
驱动模块传参实验
驱动传参,先声明方法,如上是基本数据类型,声明出来 module_param,并给类型和权限【一般就写0644,对于新手而言】传参引入的头文件是 <linux/module.h> ,不要写成了 <linux/moduleparam.h>,或者同时存在时候规避一下,不然引用头文件加载同一个方法导致传参失败boolean 类型传参,实际传递参数是0 和1,如果用true 和 false 就会失败的,系统不认识。如上实验打印信息。原创 2025-04-03 14:28:38 · 939 阅读 · 0 评论 -
RK平台下Buildroot驱动编译环境入门
这里总结下基本的核心步骤VM安装,注意内存设置VM上面安装ubuntu ,提前准备.iso 镜像ubuntu环境准备。install.sh 编译环境准备、设置中文输入法、设置源依赖仓库环境 阿里的、设置VMtools 、设置共享盘 方便共享编译文件准备编译Buildroot, 设置内存13-14G,预留部分。编译过程中不可操作电脑。编译成功后,重设VM内存8G左右不管你编译什么系统,编译脚本不一样,环境配置需求不一样。但是ubuntu 安装基本一致,然后就是搭建编译环境的事情了。原创 2025-03-22 10:59:51 · 727 阅读 · 0 评论 -
RK3568 Android13 源码编译
这里以 RK3568 Android13 编译流程做了一个总结,RK体系356X 系列配置基本这个流程,参数稍微修改。其它平台,如MTK 平台,脚本的应用非常广泛,实际开发中 也是如此。原创 2025-03-14 10:28:20 · 656 阅读 · 0 评论 -
Linux驱动之中断
tasklet 用法同中断基本实验的注意点tasklet 基本的api 注册、使能、调度、停止使能、消除tasklet 用法,就是在中断注册服务中让tasklet 调度。task 调度之前必须先注册并开启使能调度方法执行后,执行的就是tasklet 注册时候关联的tasklet回调方法软中断 用法同中断基本实验的注意点1)软中断 基本的api 注册、触发2)软中断 用法,就是在中断注册服务中让软中断触发。3)软中断 触发之前必须先注册。原创 2024-10-15 23:30:32 · 801 阅读 · 0 评论 -
HelloWorld驱动编写和加载驱动实验
这里涉及到开发环境,比如RK3568的开发板,开发板只是一个硬件环境,在这个硬件环境上面需要跑一个系统来支持驱动的加载。1、我们用RK3568开发版,用Ubuntu电脑编译一个Buildroot 系统跑上去,比如机器开机如下:这只是一个跑驱动的环境而已,也可以开发板上跑ubuntu系统,Buildroot 比较简单,方便测试而已。驱动helloworld.c 文件已经写好了,但是形成驱动文件,还需要配置一个Makefile 文件,再进行编译得到驱动文件,驱动加载才能让驱动跑起来。原创 2024-08-08 01:38:27 · 782 阅读 · 0 评论