
Linux内核驱动
文章平均质量分 83
大吉机器人
微信:Jdrobots
QQ: 278588472
Email:
uunubt@yahoo.com.cn
daiwei20032003@yahoo.com.cn
NetName:
uunubt , AD&D, 复杂问题简单化
展开
-
pm_wakeup.h
419-515内核电源管理变更头文件原创 2023-02-09 20:37:16 · 803 阅读 · 1 评论 -
I2C设备注册的4种方法
I2C设备的4种添加方法:1)静态注册2)动态注册3)用户空间注册4)i2c驱动扫描注册。转载 2022-11-21 10:36:20 · 2936 阅读 · 0 评论 -
内核驱动中断申请类型及函数分析
具体是否要设定one shot的flag是和硬件系统有关的,我们举一个例子,比如电池驱动,电池里面有一个电量计,是使用HDQ协议进行通信的,电池驱动会注册一个threaded interrupt handler,在这个handler中,会通过HDQ协议和电量计进行通信。对于这个handler,通过HDQ进行通信是需要一个完整的HDQ交互过程,如果中间被打断,整个通信过程会出问题,因此,这个handler就必须是one shot的。对应基本触发类型:高电平触发,低电平触发,下降沿触发,上升沿触发。原创 2022-11-16 22:05:06 · 3308 阅读 · 0 评论 -
request_threaded_irq
在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务。tasklet和work queue在普通的driver里用的相对较多,主要区别是tasklet是在中断上下文执行,而work queue是在process上下文,因此可以执行可能sleep的操作。当多个设备共享中断时,由于IRQF_ONESHOT会关闭中断线程的中断,而线程一般执行时间会比较长,所以是不允许的。转载 2022-11-16 21:50:45 · 4218 阅读 · 0 评论 -
linux内核中断 X86
按照目前的内核设计,中断有自己的栈,用来执行中断服务程序,这样是为了防止中断嵌套破坏与之共享的中断栈的定义,可以看到与进程上下文的布局相同,thread info + stack58 /*60 */1234567中断栈的初始化:创建percpu变量hardirq_ctx和softirq_ctx,类型为irq_ctx,所以每个cpu的软硬中断有各自的stack123hardirq_ctx和softirq_ctx的初始化方式相同,如下116 /*转载 2022-11-16 21:48:48 · 712 阅读 · 0 评论 -
Android系统下通过GPIO硬件中断实现Android程序唤醒
Android系统底层基于Linux内核,所以要实现硬件中断唤醒Android程序,需要编写Linux驱动,注册对应GPIO中断函数,然后通过异步通知方式将中断信号发送到用户空间应用程序,用户空间应用程序需要注册信号,再将进程PID注册为异步通知方式,这样就能够接收驱动程序发过来的中断信号了,然后我们在用户空间注册的信号处理函数中唤醒Android程序。原文链接:https://blog.youkuaiyun.com/a499957739/article/details/104425753///设置fasync标记。转载 2022-11-14 19:26:52 · 1433 阅读 · 0 评论 -
CH34X linux驱动安装,参考代码例程
之后重新 make 即可;2. 修改/lib/modules/5.11.0-37-generic/build/Makefile文件注释掉KBUILD_CFLAGS += -Werror=date-time。make[2]: *** [scripts/Makefile.build:288:/home/ubuntu/CH36X_LINUX/drv/ch36x.o] 错误 1。make[1]: *** [Makefile:1849:/home/ubuntu/CH36X_LINUX/drv] 错误 2。原创 2022-11-06 22:01:49 · 1094 阅读 · 0 评论 -
VIM简介及命令
vim是Linux环境下一款功能强大、高度可定制的文本编辑工具,类似于Windows下面的source insight、sublime、notepad。VI是visual interface的缩写,即可视化接口。vim 即 vi IMproved,在 vi 的基础上做了很多改进,如:增加了多级撤销、多窗口操作、崩溃后也可以恢复、增加了稳定性、关键字自动补全、上下文自动补全等功能。vim的各种工作模式可以通过不同的键进行切换,用户统一使用ESC键返回到普通模式。vim一般有6种工作模式。转载 2022-10-29 12:12:35 · 4459 阅读 · 0 评论 -
error: variable has incomplete type ‘struct sched_param‘ struct sched_param param = { .sched
4.19内核编译报错 :error: variable has incomplete type 'struct sched_param' struct sched_param param = { .sched_priority。Linux内核版本升级变更给开发者带来诸多不便,安卓建立在内核之上,同样对开发者造成困扰。不断的版本升级更新,让众多开发人员疲于追随,也许这就是普通程序员宿命吧。原创 2022-10-29 09:52:25 · 3243 阅读 · 0 评论 -
<linux/power_supply_old.h>
*****//**//**/enum {};enum {};enum {};enum {};enum {};enum {};*/*/*/};};};原创 2022-10-28 11:23:42 · 580 阅读 · 0 评论 -
old version wakelock.h
****/*/enum {};};{}{}{}{}{}{}#endif。原创 2022-10-28 11:10:31 · 444 阅读 · 0 评论 -
#include <hardware/bluetooth.h>
*****//***/*//***//***//***//***//***//**原创 2022-10-28 10:02:19 · 1086 阅读 · 0 评论 -
if you lost the file /linux/wakelock.h ,use the follow.
****原创 2022-10-28 09:45:08 · 536 阅读 · 0 评论 -
Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数
该宏定义的文件如下:include/linux/device.h};__ATTR定义于文件 include/linux/sysfs.h}说明_name:名称,也就是将在sys fs中生成的文件名称。_mode:上述文件的访问权限,与普通文件相同,UGO的格式,最高权限0644,否则会报错。_show:显示函数,cat该文件时,此函数被调用。_store:写函数,echo内容到该文件时,此函数被调用。转载 2022-10-24 16:59:39 · 578 阅读 · 0 评论 -
sysfs接口函数的建立_DEVICE_ATTR
如 对设备的使用 DEVICE_ATTR ,对总线使用 BUS_ATTR ,对驱动使用 DRIVER_ATTR ,对类 别 (class) 使用 CLASS_ATTR, 这四个高级的宏来自于函数宏DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法,_show表示的是读方法,_stroe表示的是写方法。如果你完成了DEVICE_ATTR函数宏的填充,下面就需要创建接口了。转载 2022-10-24 16:48:05 · 667 阅读 · 0 评论 -
modprobe命令用于智能地向内核中加载模块或者从内核中移除模块
其实modprobe -l读取的模块列表就位于/lib/modules/`uname -r`目录中;模块名是不能带有后缀的,我们通过modprobe -l所看到的模块,都是带有.ko或.o后缀。-r或--remove:模块闲置不用时,即自动卸载模块;-c或--show-conf:显示所有模块的设置信息;-v或--verbose:执行时显示详细的信息;-V或--version:显示版本信息;-l或--list:显示可用的模块;-a或--all:载入全部的模块;-t或--type:指定模块类型;转载 2022-10-24 16:27:44 · 860 阅读 · 0 评论 -
poll机制的总结
②如果在在time_out的时间内发生了中断,在中断处理函数中,就会把中断事件标志置1,然后把进程唤醒,同时得到按键的值,中断处理完成后又会回到for死循环中,再次执行驱动程序的forth_drv_poll()函数,此时由于中断事件标志为1,所以会返回一个非零的mask,进而count++,打破break跳出死循环,然后poll()返回一个非零的ret同时在接下来执行read函数,获得键值之后,将键值打印出来。//上述条件不满足下面开始进入休眠,若有等待的事件发生了,超时或收到信号则唤醒。转载 2022-10-13 17:09:14 · 881 阅读 · 0 评论 -
poll函数_Linux select/poll机制原理分析
在设备驱动程序中实现的 poll()函数,会在 do_select()中被调用,而驱动中的 poll()函数,需要调用 poll_wait()函数, poll_wait函数本身很简单,就是去回调函数 p->_qproc(),这个回调函数正是 poll_initwait()函数中初始化的 __pollwait();这一顿操作,其实就是驱动向select维护的struct poll_wqueue中注册,并将调用select的任务添加到驱动的等待队列中,以便在合适的时机进行唤醒。转载 2022-10-13 17:07:00 · 935 阅读 · 0 评论 -
Linux驱动之poll机制
当应用程序调用poll函数的时候(比如:poll(fds,1,5000),fds是定义的一个poll类型的结构体),poll是一个系统调用,会调用到内核入口函数sys_poll(可在内核中找到该函数),该函数最终会调用do_poll函数,do_poll函数中有一个死循环,在里面又会利用do_pollfd()函数去调用驱动中file_operations里的.poll函数。if(do_pollfd(pfd, pt)) //会调用到内核里file_operations里的.poll函数。转载 2022-10-13 16:16:09 · 1745 阅读 · 0 评论 -
Linux平台打印资源占用问题及优化方式
当遇到performance导致的各类问题时,例如卡音,冻屏,甚至是modem assert,可以先查看kernel log是否有发现连续大量调用printk打印太多log,此时,很有可能是因为客戶添加printk打印的log过多导致的问题!遇到这种情况时,可先尝试在user版本上看是否复现,如果不复现,一般会采取在ENG版本上开机加入Launcher之后关闭UART Log。进入launcher之后,如果想继续打开UART log该怎么办呢?原创 2022-10-13 09:19:11 · 946 阅读 · 0 评论 -
【Android休眠】引申之关于系统PM的思考
被动外设:外设的行为完全由kernel控制,典型的就是led。这种情况下的休眠/唤醒比较简单,按照外设支持的方式操作即可,最简单的方式就是断电/上电(比如休眠的时候关闭led)。自带CPU类型的外设:即外设有自己的控制中心,比如4G模组/WiFi模组等。这种情况下,在休眠/唤醒动作发生时,通过通信链路告知外设执行休眠/唤醒。这里,CPU针对硬件,kernel针对运行在CPU中的软件(Linux)。kernel进入休眠时,调用驱动注册的xxx_suspend()函数,唤醒时调用xxx_resume()函数。转载 2022-10-12 18:01:36 · 210 阅读 · 0 评论 -
Linux电源管理(5)_Hibernate和Sleep功能介绍
1. 前言Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用。本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作。转载 2022-10-12 17:55:49 · 711 阅读 · 0 评论 -
Linux _PM_OPS
从Linux PM Core的角度来说,这些callbacks并不复杂,因为PM Core要做的就是在特定的电源管理阶段,调用相应的callbacks,例如在suspend/resume的过程中,PM Core会依次调用“prepare—>suspend—>suspend_late—>suspend_noirq-------wakeup--------->resume_noirq—>resume_early—>resume-->complete”。由于涉及的内容非常多,我们在具体使用的时候,顺便说明。转载 2022-10-12 17:43:32 · 344 阅读 · 0 评论 -
Linux不同内核版本_LINUX_INIT_H差异
#ifndef _LINUX_INIT_H#define _LINUX_INIT_H#include /* These macros are used to mark some functions or * initialized data (doesn't apply to uninitialized data) * as `initialization' functions. The kernel can take this * as hint that th原创 2022-10-12 16:43:04 · 511 阅读 · 0 评论 -
Linux代码执行入口登记表
/2 #define core_initcall_sync(fn) __define_initcall("1s",fn,1s) 入口1s。//6 #define arch_initcall_sync(fn) __define_initcall("3s",fn,3s) 入口3s。//4 #define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s) 入口2s。原创 2022-10-12 15:51:44 · 108 阅读 · 0 评论 -
linux子系统的初始化_subsys_initcall()
这就告诉我们.initcall.init节又分成了7个子节,而xxx_initcall入口函数指针具体放在哪一个子节里边儿是由xxx_initcall的定义中,__define_initcall宏的参数决定的,比如core_initcall将函数指针放在.initcall1.init子节,device_initcall将函数指针放在了.initcall6.init子节等等。各个子节的顺序是确定的,即先调用.initcall1.init中的函数指针再调用.initcall2.init中的函数指针,等等。转载 2022-10-12 15:16:57 · 356 阅读 · 0 评论 -
regmap简介
Regmap 机制是在 Linux 3.1 加入进来的特性。主要目的是减少慢速 I/O 驱动上的重复逻辑,提供一种通用的接口来操作底层硬件上的寄存器。其实这就是内核做的一次重构。Regmap 除了能做到统一的 I/O 接口,还可以在驱动和硬件 IC 之间做一层缓存,从而能减少底层 I/O 的操作次数。学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。转载 2022-10-12 11:31:59 · 2865 阅读 · 0 评论 -
dentry是一个目录项(Directory entry),相当于一个文件目录,该文件目录里面有很多文件.//vfs dentry cache 模块实现分析/
1. dentry结构体dentry是一个目录项(Directory entry),相当于一个文件目录,该文件目录里面有很多文件。其实本质就是一个dir_entry结构体,重要成员有文件的inode索引号,文件名等,存储着文件的信息。dentry结构体相关信息: struct ext2_dir_entry_2 { __u32 inode; /* 文件的inode号 */ __u16 rec_len; /* 目录项长度 */ __u8 na转载 2022-10-12 10:58:34 · 2353 阅读 · 0 评论 -
Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
一:文件系统1. 什么是文件系统?操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问。文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。随着文件种类的增多,扩增了更多的文件系统,为了对各种文件系统进行统一的管理与组织。2. Linux文件系统Linux将文件系统分为了两层:V转载 2022-10-12 10:48:51 · 2853 阅读 · 0 评论 -
Linux Debugfs 虚拟文件系统
Debugfs 是内核开发人员向用户空间提供信息的一种简单方法。/proc 仅用于提供有关进程的信息,或者 sysfs 具有严格的每个文件一个值的规则,而 debugfs 则完全没有规则。开发人员可以将他们想要的任何信息放在那里。debugfs 文件系统也不能作为用户空间的稳定 ABI;理论上,在那里导出的文件没有稳定性限制。现实世界并不总是那么简单,即使是 debugfs 接口,最好的设计也是考虑到它们需要永远维护。(或等效的 /etc/fstab 行)。转载 2022-10-12 10:19:43 · 1123 阅读 · 0 评论 -
linux内核I2C子系统详解
(2)实际上一般驱动都是没有定义attach_adapter方法的,只有在i2cdev_driver驱动中定义了attach_adapter方法,i2cdev_driver驱动是在i2c-dev.c的i2c_dev_init()函数中定义的,在博客:《I2C子系统之适配器的设备接口分析(i2c-dev.c文件分析)》中有详细介绍;(5)struct i2c_client结构体:描述I2C设备的结构体,当在I2C总线上和I2C驱动匹配上后,会把设备信息传给驱动,这里是驱动设计数据的操作方法分离的思想;转载 2022-10-11 22:05:31 · 829 阅读 · 1 评论 -
Linux电源管理-Runtime PM
1. 什么是Runtime PM?Runtime PM (Runtime Power Management)翻译过来就是运行时电源管理。主要的作用是: 每个设备处理好自己的电源管理,在不需要工作时进入低功耗状态。也就是"各人自扫门前雪"。2. 为什么需要Runtime PM?system suspend需要很长时间完成,其中还可能出现失败。比如freeze task的时候。而suspend设备速度相对system suspend快很对,而且还不需要freeze task。转载 2022-10-11 21:17:42 · 2225 阅读 · 0 评论 -
Linux内核代码中一种特殊的结构体初始化方式---指定初始化
其实这就是前面所说的指定初始化在Linux设备驱动程序中的一个应用,它源自ISO C99标准。以下我摘录了C Primer Plus第五版中相关章节的内容,从而就可以很好的理解2.6版内核采用这种方式的优势就在于由此初始化不必严格按照定义时的顺序。今天一查,原来这个是C99标准,这个目前也是最新的标准,之前我也清楚这件事,但是没意识到这是一个差别。C99支持结构的指定初始化项目,其语法与数组的指定初始化项目近似。正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。转载 2022-10-11 20:36:15 · 181 阅读 · 0 评论 -
linux dpm机制分析
其他的suspend_early()、suspend()、suspend_late()、resume()、resume_early()、resume_late()、complete()等具体函数实现基本大致相同,只不过所操作的链表不同罢了。prepare回调返回后,该设备的下面将不可以注册新的子设备。(3) Suspend_late顾名思义,是在其他设备suspend之后,再进行suspend操作,也就是说如果设备注册了本回调意味着本设备的suspend要晚于其他设备的suspend操作。转载 2022-10-11 20:11:52 · 1321 阅读 · 0 评论 -
Linux驱动之i2c驱动示例
驱动层是设备的IO的驱动程序。一条是时钟线,一条是数据线,两条数据线都要接4.7K的上拉电阻,空闲的时候处于高电平。 其中i2c_client相当于设备数中的i2c结点的信息,i2c_adapter相当于设备树中i2c总线上挂在的设备的信息。 主机发送起始位S信号,发送i2c从机的地址,发送写位,ACK1,写入从机的寄存器的8位数据,然后循环写数据,最后从机ACK2应答,并且主机发送停止位信号。在编写I2C驱动中我们一般是要对寄存器的数据进行读操作,因此就需要首先写入从设备地址,读取寄存器的数据。转载 2022-10-11 18:51:22 · 3754 阅读 · 0 评论 -
linux 中断子系统 - 工作队列
工作队列(workqueue)是在 2.6 版本引用的下半部机制,相对于 tasklet 和软中断而言,工作队列有一个本质上的区别:它运行在内核线程上下文中。而tasklet 和软中断只能在中断上下文中运行(特殊情况下可能运行在内核线程上下文),不支持睡眠和调度,这对某些阻塞式和需要同步执行的任务是不友好的,比如磁盘的访问。尽管工作队列可以运行在进程上下文,但是它并不和任何用户进程相关联,它也不能访问任何用户程序空间,因为工作队列是由内核线程执行的,它只会运行在内核中。转载 2022-10-11 18:20:16 · 1982 阅读 · 0 评论 -
INIT_DELAYED_WORK() 函数剖析
简单使用:(1)定义:(2)初始化(3)实现回调函数{}(4)调用delaywork(5)取消delaywork。转载 2022-10-11 18:09:52 · 4380 阅读 · 1 评论 -
atomic_t原子操作
原子操作通常用于实现资源的引用计数,在TCP/IP协议栈的IP碎片处理中,就使用了引用计数,碎片队列结构struct ipq描述了一个IP碎片,字段refcnt就是引用计数器,它的类型为atomic_t,当创建IP碎片时(在函数ip_frag_create中), 使用atomic_set函数把它设置为1,当引用该IP碎片时,就使用函数atomic_inc把引用计数加1。该函数对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。该函数设置原子类型的变量v的值为i。转载 2022-10-11 16:06:56 · 317 阅读 · 0 评论 -
linux内核里的字符串转换 ,链表操作常用函数(转)
/buf:输入字符串,0:自动识别,也可以是10(10进制)或16(16进制),rate:存放转换后的整形值.//当没有错误时返回值是0;转载 2022-10-11 10:03:30 · 1504 阅读 · 0 评论 -
linux超级好用检索跳转工具hg:hyperlinked_grep (grep+kitty)
说到文本搜索工具,大家一定会知道 grep, 它是 linux 最有用并最常用的工具之一。但如果要再一个大的工程项目中搜索某个关键词,大家也一定知道它比较耗时。所以就有了很多替代工具,之前最出名的是 Ack,Ag而最近又有了新的替代者 Ripgrep, 这个工具和 Ack/Ag 一样都使用了多线程的方法,但 rg 比它们更快。原创 2022-10-10 11:56:13 · 1051 阅读 · 0 评论