- 博客(683)
- 资源 (1)
- 收藏
- 关注
原创 芯片设计群 ,欢迎 IC领域朋友请加我微信交流:Jdrobots ,加我备注IC。谢谢! 芯片设计资料
https://pan.baidu.com/s/19odKf_wcL8pGVpbT8GBvcQ
2019-01-08 19:36:26 3118
原创 机器人操作系统ROS微信群, 欢迎加我微信: Jdrobots 技术相互学习交流(加我请备注ROS,谢谢!) 。
ROS相关问题新建个微信群, 欢迎加我微信: Jdrobots 技术相互学习交流(加我请备注ROS,谢谢!) 。
2018-08-11 14:56:45 1216
原创 内核驱动中断申请类型及函数分析
具体是否要设定one shot的flag是和硬件系统有关的,我们举一个例子,比如电池驱动,电池里面有一个电量计,是使用HDQ协议进行通信的,电池驱动会注册一个threaded interrupt handler,在这个handler中,会通过HDQ协议和电量计进行通信。对于这个handler,通过HDQ进行通信是需要一个完整的HDQ交互过程,如果中间被打断,整个通信过程会出问题,因此,这个handler就必须是one shot的。对应基本触发类型:高电平触发,低电平触发,下降沿触发,上升沿触发。
2022-11-16 22:05:06 3004
转载 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 3802
转载 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 634
转载 Android系统下通过GPIO硬件中断实现Android程序唤醒
Android系统底层基于Linux内核,所以要实现硬件中断唤醒Android程序,需要编写Linux驱动,注册对应GPIO中断函数,然后通过异步通知方式将中断信号发送到用户空间应用程序,用户空间应用程序需要注册信号,再将进程PID注册为异步通知方式,这样就能够接收驱动程序发过来的中断信号了,然后我们在用户空间注册的信号处理函数中唤醒Android程序。原文链接:https://blog.csdn.net/a499957739/article/details/104425753///设置fasync标记。
2022-11-14 19:26:52 1310
转载 BC1.2中文
Scope包含了规范中一些术语的定义什么是Dead Battery的阈值?通俗的说就是电池的一个电压值,低于这个值系统就肯定启动不了。电压低于这个值的电池叫Dead Battery。DCP就是墙充,即wall adapter。就是平时用的连到220v插座的充电器。不能枚举USB设备,可以供(4.75v< VCHG
2022-11-08 22:19:40 4916
原创 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 1050
转载 Linux libusb
在进行开发之前,建议先通过USB规范文档对USB有一定的了解,如描述符、配置、接口、端点、控制/批量/中断/等时传输等。上一篇博客主要介绍了libusb在linux系统下的详细安装过程,目前新的libusb离线包已经不需要再单独安装libusb-compat资料包了。启用此功能后,libusb 将在声明接口时自动分离接口上的内核驱动程序,并在释放接口时附加它。重新附加接口的内核驱动程序,该驱动程序之前使用 libusb_detach_kernel_driver() 分离。激活接口的备用设置。
2022-11-06 19:24:31 1894
转载 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 4368
原创 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 2998
原创 <linux/power_supply_old.h>
*****//**//**/enum {};enum {};enum {};enum {};enum {};enum {};*/*/*/};};};
2022-10-28 11:23:42 554
原创 #include <hardware/bluetooth.h>
*****//***/*//***//***//***//***//***//**
2022-10-28 10:02:19 1017
转载 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 505
转载 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 632
转载 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 827
转载 BC1.2 PD协议
BC1.2充电端口USB2.0协议规定外设从USB充电器抽取电流的最大值为500mA,500mA的电流限制无法满足日益增长的快充需求。因此,BC1.2引入了充电端口识别机制,主要包括以下几个USB端口类型:1.标准下行端口(SDP)SDP端口支持USB协议,最大电流500mA,可以认为SDP就是普通的USB接口2.专用充电端口(DCP)DCP不支持数据协议,支持快充,可以提供大电流,DCP主要用于墙充等专用充电器3.充电下行端口(CDP)CDP既支持数据协议也支持快充
2022-10-16 18:43:34 3060
转载 细谈Type-C、PD原理(上/下)
接口大小跟Micro USB相近,约为8.3mm x 2.5mm,支持正反插,同时也规范了对应的线材,接口定义如下(线材端只有一对USB2.0 DATA):图2 Type-C端口的PIN定义-1图3 Type-C端口的PIN定义-2在插座定义上,定义了如下两种插座:a)全功能的Type-C插座,可以用于支持USB2.0、USB3.1、等特性的平台和设备。b)USB 2.0 Type-C插座,只可以用在支持USB2.0的平台和设备上。在插头定义上,定义了如下三种插头:
2022-10-16 11:38:01 19844 2
转载 Linux驱动基础:MSM平台AP/CP通信机制
MSM平台AP和CP封装到一个芯片,共享内容。所以之前也说过,高通的MSM解决方案中,CP的代码都是由AP放到指定地址的内存中以供CP运行。那上传完代码,CP开始跑之后,AP/CP之间的通信又是怎么弄的呢?其实也是在内存中开辟一段共享内存进行通信的。高通文档中有介绍以下三种。
2022-10-16 11:37:17 1540
转载 TCPC简介
这个功能块在现实中的位置在哪里呢?详细解读表中信息的工作量会很大,TCPCI 规范和我们的产品如 RT1718S 规格书都用了很大的篇幅来列出寄存器的详细信息,需要做详细设计的人肯定要去仔细研究,作为大概的了解就不必了,但是浏览一下还是能找到一些乐趣,例如我们可以从寄存器的排序上看出它的发展历程,PD 协议是后来才有的,它的发送和接收寄存器也被排在后面,这大概就是先来后到的影响吧,但这也只是我自己的看法,因为我并没有对多个版本的规范进行比较;扩展定义是厂家需要的,它的排序就在最后的 80h…
2022-10-14 14:57:16 2969
转载 快充协议(QC/PD/PE)
按充电协议可分为 高通QC 2.0/3.0/4.0/5.0, 华为FCP/SCP,MTK PE2.0/3/0, Oppo VOOC/Super VOOC, Apple(2.4A)…符合Quick Charge 2.0、3.0、4和5标准的附件需要为所有电压提供至少500mA(负载),但它允许支持不同的I/V曲线,以获得最大的设计灵活性–以下是一些例子。原文链接:https://blog.csdn.net/Johnho130/article/details/115422647。
2022-10-13 20:56:47 10717
转载 poll机制的总结
②如果在在time_out的时间内发生了中断,在中断处理函数中,就会把中断事件标志置1,然后把进程唤醒,同时得到按键的值,中断处理完成后又会回到for死循环中,再次执行驱动程序的forth_drv_poll()函数,此时由于中断事件标志为1,所以会返回一个非零的mask,进而count++,打破break跳出死循环,然后poll()返回一个非零的ret同时在接下来执行read函数,获得键值之后,将键值打印出来。//上述条件不满足下面开始进入休眠,若有等待的事件发生了,超时或收到信号则唤醒。
2022-10-13 17:09:14 804
转载 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 894
转载 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 1590
原创 Linux平台打印资源占用问题及优化方式
当遇到performance导致的各类问题时,例如卡音,冻屏,甚至是modem assert,可以先查看kernel log是否有发现连续大量调用printk打印太多log,此时,很有可能是因为客戶添加printk打印的log过多导致的问题!遇到这种情况时,可先尝试在user版本上看是否复现,如果不复现,一般会采取在ENG版本上开机加入Launcher之后关闭UART Log。进入launcher之后,如果想继续打开UART log该怎么办呢?
2022-10-13 09:19:11 883
转载 【Android休眠】引申之关于系统PM的思考
被动外设:外设的行为完全由kernel控制,典型的就是led。这种情况下的休眠/唤醒比较简单,按照外设支持的方式操作即可,最简单的方式就是断电/上电(比如休眠的时候关闭led)。自带CPU类型的外设:即外设有自己的控制中心,比如4G模组/WiFi模组等。这种情况下,在休眠/唤醒动作发生时,通过通信链路告知外设执行休眠/唤醒。这里,CPU针对硬件,kernel针对运行在CPU中的软件(Linux)。kernel进入休眠时,调用驱动注册的xxx_suspend()函数,唤醒时调用xxx_resume()函数。
2022-10-12 18:01:36 190
转载 Linux电源管理(5)_Hibernate和Sleep功能介绍
1. 前言Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用。本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作。
2022-10-12 17:55:49 642
转载 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 264
原创 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 488
原创 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 95
转载 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 304
转载 regmap简介
Regmap 机制是在 Linux 3.1 加入进来的特性。主要目的是减少慢速 I/O 驱动上的重复逻辑,提供一种通用的接口来操作底层硬件上的寄存器。其实这就是内核做的一次重构。Regmap 除了能做到统一的 I/O 接口,还可以在驱动和硬件 IC 之间做一层缓存,从而能减少底层 I/O 的操作次数。学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。
2022-10-12 11:31:59 2776
转载 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 2150
转载 Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
一:文件系统1. 什么是文件系统?操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问。文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。随着文件种类的增多,扩增了更多的文件系统,为了对各种文件系统进行统一的管理与组织。2. Linux文件系统Linux将文件系统分为了两层:V
2022-10-12 10:48:51 2710
转载 Linux Debugfs 虚拟文件系统
Debugfs 是内核开发人员向用户空间提供信息的一种简单方法。/proc 仅用于提供有关进程的信息,或者 sysfs 具有严格的每个文件一个值的规则,而 debugfs 则完全没有规则。开发人员可以将他们想要的任何信息放在那里。debugfs 文件系统也不能作为用户空间的稳定 ABI;理论上,在那里导出的文件没有稳定性限制。现实世界并不总是那么简单,即使是 debugfs 接口,最好的设计也是考虑到它们需要永远维护。(或等效的 /etc/fstab 行)。
2022-10-12 10:19:43 1038
转载 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 802 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人