- 博客(91)
- 收藏
- 关注
原创 platform_driver device_driver dts自动加载platform_device及休眠唤醒的关系
platform总线是我们驱动编程中经常用的一种,之间的大体关系如下:1.platform_bus_init 由start_kernel在加载各自init之前调用。主要就是注册一个bus,最终会添加到bus_kset链表中去,总线本身不会涉及到休眠唤醒,其休眠唤醒函数都是一个中间过程。为各自具体的设备驱动准备的。2.platform_device_register如上图描述所示,主要内部逻辑有下:1):首先将dev添加到devices_kset链表中去2):其次将dev添加到总线的device
2020-09-13 13:12:57
1118
原创 linux input驱动子系统
从事linux input驱动有些年头了。对其子系统多多少少都有一点的认识,现在回过头来对其再梳理一遍,对整个子系统更加了解。本文人以下几个方面来学习:1、input子系统初始化2、input_device的分配3、input_device的注册4、input_handler事件处理者的注册5、input事件的上报处理6、应用层处理input事件。
2025-11-24 10:15:10
1
原创 linux 系统调用
源码路径:bionic/libc/arch-arm64/bionic/syscall.Smov x8, x0mov x0, x1mov x1, x2mov x2, x3mov x3, x4mov x4, x5mov x5, x6svc #0ret路径:bionic/libc/include/bits/glibc-syscalls.h#endif#endif#endif#endif#endif#endif#endif#endif#endif#endif#endif。
2025-11-18 16:15:08
490
原创 linux sdio总线学习
本文主要从以下几个方向来感觉sdio驱动框架1、sdio总线的加载2、sdio驱动与设备的匹配逻辑3、sdio控制器驱动的加载4、sdio设备驱动的加载。
2025-11-16 16:18:52
181
原创 linux 解析并生成一个platform_device设备具体过程
在之前的文章里有分析plaform总线 、驱动、设备的大体流程。但是没有详细分析如何生成一个具体的platform_device设备。本文使用linux6.4内核,详细分析一个platform_device自动生成的具体过程。文件位置:使用arch_initcall_sync(of_platform_default_populate_init);
2025-11-12 22:57:24
76
原创 linux gpio子系统学习
目前工作中碰到要求在 /sys/class/gpio目录增加几个指定的gpio,通过联动拉高拉低gpio作为spi的片选的要求。对GPIO子系统有了个大概的认识,现在在最新的内核版本上再次学习研究下。先来说说增加在上面目录下增加GPIO有两种操作:一、android里直接在rc资源文件中,写属性节点例如:会自动生成gpio245的节点,如果这个gpio合法的话。
2025-11-10 23:14:41
41
原创 hotspot vm 参数解析
先看下hotspot的参数解析的流程1.首先是Arguments::parse这个函数的初步解析,主要解析XX的标志-XX:Flags= 这个标识后面指向一个具体的文件名,解析里面的各种flag然后动态的申请内存,存放到_jvm_flags_array这个指针数组里面。-XX:+PrintVMOptions : 开启打印,所有以-XX: 开头的参数,都会打印-XX:-PrintVMOpti...
2025-11-09 20:53:44
414
原创 linux spi回环测试
spi回环测试是确认spi通讯是否正常的一个常用手段,硬件上将master的输入、输出口短接即可。软件上主要确认以下几步:1、bootloader阶段的spi使用的几个gpio口复用功能是否配置正确,本人就曾经在工作中遇到过spi控制器,spi dev都正常加载。但就是spi无法回环测试成功,原因就是IO口复用给别的功能了2、确认spi控制器是否正常加载,如果spi控制器都没能正常加载。那么spi相关的dev是无法产生的3、设备树上配置spi相关的设备信息,确保相应的spi能够正常加载。
2025-11-09 13:55:13
273
原创 牛客网华为在线编程题
题目描述王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件 附件电脑 打印机,扫描仪书柜 图书书桌 台灯,文具工作椅 无如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到
2025-11-08 14:07:24
538
1
原创 linux usb子系统
本文使用linux6.4内核版本代码,从以下几个方面来学习usb子系统1、usb总线注册与通用驱动注册2、usb总线match回调函数分析3、usb host 控制器HCD驱动加载以ehci_hcd为例4、hub设备驱动(通用设备驱动)的probe5、hub interface驱动的probe6、hub_event的触发。
2025-11-06 23:19:23
159
原创 linux iio子系统学习
首先:本文学习所使用的linux内核版本为linux6.4,看另外份4.14的内核版本与此版本差异比较大,而且看起来还有点问题。本文以器件dac3552r驱动为起点来进行学习,大体从两个方向来学习iio子系统。1、dac3552r驱动使用iio函数调用流程2、iio触发器的驱动加载以及属性节点功能。
2025-11-02 09:55:31
838
1
原创 linux ipc之消息队列
在用linux mtk8518平台做sourdbar的时候,发现appmain进程和audio进程使用消息队列进行通信,当高频率发送消息时会无规律的漏掉部分消息。现在就带着这个目地来学习下驱动层是如何实现的。
2025-10-27 20:49:50
320
原创 linux schedule函数学习
这里最终会调用调度器的回调函数put_prev_task,对于deadline来说这会将当前task进行插入到二叉树当中,因为pick_next_task的时候已经将task从二叉树中删除了,如果没有重新插入二叉树,那么这个task将永远不会运行第二次,对于其它调度器有对应的回调函数。这里需要注意的是对于fair调度器,挑选task是有两个流程的,需要结合fair调度器的相关函数来一起看。本文就schedule函数与各调度器使用逻辑方向来研究学习。TASK_RUNNING状态宏定义为0。
2025-10-25 22:22:25
257
原创 linux fair调度器
本文也是人三个方向来研究fair调度器的调度策略实现1、fair权重的设置2、task的入队操作3、task的挑选4、tick定时器的处理。
2025-10-25 16:03:29
926
原创 linux rt任务调度器
首先来看下rt任务调度器的回调函数本篇主要从以下几个方面来研究rt的调度策略1、task的入队2、任务调度挑选task的逻辑3、tick定时器的处理。
2025-10-24 14:03:33
949
原创 deadline调度学习
本篇通过几个方面来看deadline调度器:1、deadline的设置2、deadline的任务的添加3、deadline的任务的调度。
2025-10-22 14:47:58
249
原创 从linux核心进程学习进程创建基本流程
本文主要0、1、2这三个进程来分析创建进程的大体流程。使用的代码是从官网上下载的linux6.4的版本。
2025-10-19 14:36:04
582
原创 从fat看文件系统的加载流程走读
上述的流程核心就是创建super_block,并各种初始化填充里面的数据成员,另外一个就是生成root inode。mkdir核心内容是创建一个inode并加入到链表,这个inode节点会被赋值对文件和目录操作的回调函数,这里只看下核心代码。->fc->ops->get_tree //这里就会使用到上述的legacy_fs_context_ops。这个是对目录的操作,文件操作也会走到上面的这个函数拿到inode节点并赋值回调函数。do_new_mount_fc创建一个新的挂载点,这里就详细研究了。
2025-10-11 20:06:16
343
原创 linux can子系统学习
从整个流程来看can大体可以分几个层次:1、can子系统驱动核心框架层2、can器件的驱动层3、socket PF_CAN协议家族的注册4、CAN_RAW类型socket的具体实现5、用户空间对can网络设备的开启和使用。
2025-09-30 21:00:52
677
原创 pci总线pci_dev的创建和匹配
到这里基本上pci-dev设备扫描增加的流程基本结束了,所有的pci-device都会保存到 pci-bus上的klist_device链表,后续就坐等各个器件驱动调用pci_register_driver来注册driver到 pci-bus上klist_drivers链表,然后device与driver进行匹配加载驱动了。到这里基本就能够明白这里pci-dev与dts节点的匹配规则,是pci-dev的设备号与节点reg第一值按相关逻辑进行比较。在pci-driver.c文件里会初始化注册pci总线。
2025-09-27 14:43:59
888
原创 从fs2105看alsa库如何控制pa
在card注册的时候,会对已经增加到devices链表上的所有device进行处理,调用其提供的dev_register回调函数。当使用open打开alsa这个字符设备时,会调用上面的open函数,在这里就会把文件操作回调函数替换成snd_ctl_f_ops。到这里就完成了对所有card->devices的处理,实际上会保存到数组中,会后续访问提供支持。看上述代码,这里还有个链表加入的排序动作,根据type来确认的。2、control device的处理。control device的处理。
2025-09-24 14:59:12
372
原创 从傅里叶看codec加载流程
此源文件里面有个函数mt8518_evb_parse_of会解析dts,并根据里面的配置动态的修改源码里面的结构体数组成员dai_link codec和codec_dai的赋值。其中i2c1挂载了四个,i2c2挂载了1个,共五个器件,i2c1上的器件通过slave地址加以区分,fs2105驱动probe函数会重入5次。Codec _driver是同一个,但是Codec_dai的名字需要彼此区别,所以由frsm_codec_init这个函数代码实现字符串拼接.其中下标由dts配置。是否需要进入睡眠模式。
2025-09-18 17:28:39
372
原创 从cx23885采集卡驱动看v4l2框架
上面这段代码主要是生成设备,这里需要注意的是cdev设备号与vdev->dev的设备号是一致的。所以上层通过open ioctl来访问/dev/videox,实际操作的是v4l2_fops这个通过回调函数,这个回调函数会调用对应器件驱动提供的fops结构体的回调函数。上面的代码主要是次设备号的确定,主设备号都是81。一般的v4l2驱动程序都会有上面类型的初始化的动作,核心的是fops和ioctl_ops两个回调函数。上面的这段代码看起来是有问题的,如果video_device足够多,会有内存越界的问题。
2025-09-16 14:03:09
580
原创 spi控制器和spi设备的加载过程
spi控制器都是挂在platform总线上的,所以要等platform总线上的设备驱动加载spi控制器完成后才能加载spi设备。
2023-06-24 15:57:22
866
原创 android屏幕下电控制
很久之前android刚兴起时候从事battery ,charge驱动顺带着把PMS差不多也看了一遍,最开始看的很多不理解。后来在各家公司经历不同的角色,对PMS这块了解越来越多,也越来越深。特别是前前面搞fingerprint快速亮屏时,修改指纹服务以为PMS逻辑控制,以达到更快的亮屏速。进一步加深了对PMS的理解,目前的我正从事高通平台LCD驱动开发工作,由于遇到一个LCD下电时序的问题,与surfaceflinger和PMS再次打交道,这里就记录下个人对PMS如何对LCD进行正电控制的,这里大体可以分
2021-03-06 15:22:57
1154
原创 i2c设备添加、驱动的加载和设备匹配
前言首先:设备树上只要拥有compatible属性的节点,都会自己被添加到platform总线上,保存在device链表中。i2c控制器也是在这个时候被添加的,主板上有几个i2c接口就有几个i2c控制器(adapter)其次:因为控制器device被添加到了platform总线上,所以控制器驱动也需要被注册到platform总线上,使之能匹配到device,驱动很重要的一点就是向i2c总线注册adapter(控制器),调用i2c_add_numbered_adapter接口1.i2c_add_num
2020-09-23 23:13:08
5559
3
原创 中断映射和中断DTS解析
中断映射的大体过程如下:先来看一个比较典型的例子,linux驱动开源源码static int bcm2835_mbox_probe(struct platform_device *pdev){ struct device *dev = &pdev->dev; int ret = 0; struct resource *iomem; struct bcm2835_mbox *mbox; mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_K
2020-09-20 15:52:59
5806
原创 module_param_string
看linux驱动,发现module_param_string的用法module_param_string(path, fw_path_para, sizeof(fw_path_para), 0644);网上查了下,说是为可以在用户空间设置参数。特地的看了下代码实现文件路径:include/linux/moduleparam.h#define module_param_string(name, string, len, perm) \ static const struct kparam_str
2020-09-15 23:39:42
2402
原创 request_threaded_irq与request_irq
request_threaded_irq先来看头文件的申明。文件:include/linux/interrupt.hextern int __must_checkrequest_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long flags, const char *name, void *dev);static inline int
2020-09-05 23:55:54
1335
原创 module_init的加载过程
module_init这个网上讲解的一大堆,这里作个学习记录。首先module_init的定义是在文件:include/linux/module.h下面来看看具体定义#ifndef MODULE#define module_init(x) __initcall(x);#define module_exit(x) __exitcall(x);#else /* MODULE */#define early_initcall(fn) module_init(fn)#define core_
2020-09-05 09:40:40
711
原创 __setup和early_param加载逻辑
在读kernel代码时候又一次碰到early_param这个调用,网上查了下大体和__setup函数作用是一样的,都是在驱动起来后很早加载其回调函数,用来作一些早期的初始化。一直没注意其实现的逻辑过程,只知道应该这样用。现在来看看其到底是如何实现的。先来看看一个序列图,比较简单:上面的序列图调用过程会显得比较简单,逻辑并不复杂。由bootloader拉起start_kernel开始进行驱动加载,在加载moudle_init各种驱动之前会处理__setup和early_param这两种结构,如下图:
2020-09-03 23:32:49
1224
1
原创 kernel保留内存的加载流程
1各个源文件具体位置main.c : linux-4.5-rc1\init\main.csetup.c :linux-4.5-rc1\arch\arm64\kernel\setup.cinit.c :linux-4.5-rc1\arch\arm64\mm\init.cmemblock.c :linux-4.5-rc1\mm\memblock.cfdt.c :linux-4.5-rc1\drivers\of\fdt.cof_reserved_me.
2020-09-02 16:26:43
1389
原创 DTS设备树驱动加载过程解析
1start_kernelstart_kernel是kernel起始的地方,由bootloader拉起来。具体的调用在汇编里面,截取部分代码如下:__mmap_switched: // Clear BSS adr_l x0, __bss_start mov x1, xzr adr_l x2, __bss_stop sub x2, x2, x0 bl __pi_memset adr_l sp, initial_sp, x4 mov x4, sp and x4, x4, #~(THRE.
2020-09-01 21:07:39
2424
原创 V4l2大体介绍
1.video_device的初始化static struct video_device viu_template = { .name = "FSL viu", .fops = &viu_fops, .minor = -1, .ioctl_ops = &viu_ioctl_ops, .release = video_device_release, .tvnorms = V4L2_STD_NTSC_M | V4L2_STD_PAL,};一般我们使用上.
2020-09-01 13:09:04
386
原创 Notifier Chain使用和原理介绍
在内核种,有各种各样的器件。有时候各个器件之间需要通信或者交互,我把它称为模块间通信。实际上在写C的应用代码时候,这种技术经常用到。但是写应用程序一般不会涉及到内存屏障。1.Notifier Chain各种结构介绍来看下结构体定义:struct notifier_block { notifier_fn_t notifier_call; //回调函数 struct notifier_block __rcu *next; //指向下一个结构体 int priority; //优先级别
2020-08-31 23:21:51
825
原创 mediaplayer播放过程及player的选择
还是先来看个序列图:1media.player的加载int main(int argc __unused, char **argv __unused){ signal(SIGPIPE, SIG_IGN); sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm(defaultServiceManager()); ALOGI("ServiceManager: %p"
2020-08-31 15:27:09
956
原创 surfaceflinger刷新动作和client合成
首先来看看,createlayer这个是后面刷新的基本。createsurface生成surface的时候会调用createlayerstatus_t SurfaceFlinger::createLayer( const String8& name, const sp<Client>& client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, .
2020-08-29 22:49:33
1543
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅