自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 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 1146

原创 verilog spi slave回环模拟

本篇作为学习verilog过程中一个动手编码的尝试,主要从网上找的基础代码再加上自己的一些修改。一来可以加深对verilog语法的了解,二来也有助于有硬件有更深入的了解。上述代码比较简单,主要有两个module。一个spi回环模拟模块,一个激励模块。

2025-12-29 09:25:57 152

原创 linux内存之page的初始化

本文以linux内核6.11版本来研究的,发现不同的版本这部分代码组织都不相同一直在变。

2025-12-28 10:44:20 9

原创 linux内存之vmalloc

本文从以下几个方面来分析vmalloc内存流程。

2025-12-21 11:31:19 9

原创 linux gpio获取

最近在工作中遇到了gpio解析失败的问题,跟踪发现设备树配置的字符串不匹配,在这里再次学习并记录下。

2025-12-14 23:03:08 766

原创 linux 内存之kmalloc

本文主要从两个方面来研究kmalloc内存分配函数,使用slub源码分析1、cache的初始化2、kmalloc函数的实现。

2025-12-14 10:33:44 15

原创 linux usb gadget子系统

gadget主要用途:通过一个真实的USB设备,模拟各种其它设备比如:uart、网卡、声卡等.属于USB 设备控制器 (USB Device Controller, UDC) 与host device controller hdc相区别。本篇从以下几个方面来研究学习其总线文件位置:/kernel/driver/usb/gadget/udc/core.c通过subsys_initcall指定函数数据段,自动加载gadget总线gadget总线的匹配规则匹配规则就两点:gadget设备也就是udc设备,

2025-12-07 11:22:33 21

原创 linux slab内存分配

在上一篇章节里面研究了kmalloc函数的实现,主要着重点是固件缓存的创建。和小内存分配固件缓存的规则,本篇主要研究slab缓存函数的实现。

2025-11-30 10:22:20 351

原创 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 17

原创 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 520

原创 linux sdio总线学习

本文主要从以下几个方向来感觉sdio驱动框架1、sdio总线的加载2、sdio驱动与设备的匹配逻辑3、sdio控制器驱动的加载4、sdio设备驱动的加载。

2025-11-16 16:18:52 196

原创 linux root节点解析

首先来看看root节点解析大体调用流程这里只关注具体的解析函数的实现,中间的调用流程可以看上图自行跟踪。

2025-11-16 16:18:03 890

原创 linux 解析并生成一个platform_device设备具体过程

在之前的文章里有分析plaform总线 、驱动、设备的大体流程。但是没有详细分析如何生成一个具体的platform_device设备。本文使用linux6.4内核,详细分析一个platform_device自动生成的具体过程。文件位置:使用arch_initcall_sync(of_platform_default_populate_init);

2025-11-12 22:57:24 96

原创 linux gpio子系统学习

目前工作中碰到要求在 /sys/class/gpio目录增加几个指定的gpio,通过联动拉高拉低gpio作为spi的片选的要求。对GPIO子系统有了个大概的认识,现在在最新的内核版本上再次学习研究下。先来说说增加在上面目录下增加GPIO有两种操作:一、android里直接在rc资源文件中,写属性节点例如:会自动生成gpio245的节点,如果这个gpio合法的话。

2025-11-10 23:14:41 51

原创 hotspot vm 参数解析

先看下hotspot的参数解析的流程1.首先是Arguments::parse这个函数的初步解析,主要解析XX的标志-XX:Flags= 这个标识后面指向一个具体的文件名,解析里面的各种flag然后动态的申请内存,存放到_jvm_flags_array这个指针数组里面。-XX:+PrintVMOptions : 开启打印,所有以-XX: 开头的参数,都会打印-XX:-PrintVMOpti...

2025-11-09 20:53:44 429

原创 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 312

原创 牛客网华为在线编程题

题目描述王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件 附件电脑 打印机,扫描仪书柜 图书书桌 台灯,文具工作椅 无如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到

2025-11-08 14:07:24 557 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 190

原创 linux iio子系统学习

首先:本文学习所使用的linux内核版本为linux6.4,看另外份4.14的内核版本与此版本差异比较大,而且看起来还有点问题。本文以器件dac3552r驱动为起点来进行学习,大体从两个方向来学习iio子系统。1、dac3552r驱动使用iio函数调用流程2、iio触发器的驱动加载以及属性节点功能。

2025-11-02 09:55:31 872 1

原创 linux ipc之消息队列

在用linux mtk8518平台做sourdbar的时候,发现appmain进程和audio进程使用消息队列进行通信,当高频率发送消息时会无规律的漏掉部分消息。现在就带着这个目地来学习下驱动层是如何实现的。

2025-10-27 20:49:50 327

原创 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 267

原创 linux fair调度器

本文也是人三个方向来研究fair调度器的调度策略实现1、fair权重的设置2、task的入队操作3、task的挑选4、tick定时器的处理。

2025-10-25 16:03:29 933

原创 linux rt任务调度器

首先来看下rt任务调度器的回调函数本篇主要从以下几个方面来研究rt的调度策略1、task的入队2、任务调度挑选task的逻辑3、tick定时器的处理。

2025-10-24 14:03:33 968

原创 deadline调度学习

本篇通过几个方面来看deadline调度器:1、deadline的设置2、deadline的任务的添加3、deadline的任务的调度。

2025-10-22 14:47:58 270

原创 从linux核心进程学习进程创建基本流程

本文主要0、1、2这三个进程来分析创建进程的大体流程。使用的代码是从官网上下载的linux6.4的版本。

2025-10-19 14:36:04 587

原创 从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 365

原创 从pty驱动学习tty设备驱动加载

本文从三个方向研究tty设备1、tty驱动的加载2、tty设备的打开3、tty设备的访问。

2025-10-03 19:00:52 450

原创 linux can子系统学习

从整个流程来看can大体可以分几个层次:1、can子系统驱动核心框架层2、can器件的驱动层3、socket PF_CAN协议家族的注册4、CAN_RAW类型socket的具体实现5、用户空间对can网络设备的开启和使用。

2025-09-30 21:00:52 727

原创 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 898

原创 从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 377

原创 从傅里叶看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 399

原创 从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 598

原创 spi控制器和spi设备的加载过程

spi控制器都是挂在platform总线上的,所以要等platform总线上的设备驱动加载spi控制器完成后才能加载spi设备。

2023-06-24 15:57:22 877

原创 platform总线五级匹配解析

代码来源:开源linux内核linux-6.2.9platform总线设备与驱动的匹配。

2023-05-05 15:21:57 2066

原创 android屏幕下电控制

很久之前android刚兴起时候从事battery ,charge驱动顺带着把PMS差不多也看了一遍,最开始看的很多不理解。后来在各家公司经历不同的角色,对PMS这块了解越来越多,也越来越深。特别是前前面搞fingerprint快速亮屏时,修改指纹服务以为PMS逻辑控制,以达到更快的亮屏速。进一步加深了对PMS的理解,目前的我正从事高通平台LCD驱动开发工作,由于遇到一个LCD下电时序的问题,与surfaceflinger和PMS再次打交道,这里就记录下个人对PMS如何对LCD进行正电控制的,这里大体可以分

2021-03-06 15:22:57 1161

原创 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 5642 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 5826

原创 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 2421

原创 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 1351

原创 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 719

傅里叶fs2105mtk8518平台驱动加载

傅里叶fs2105mtk8518平台驱动加载

2025-11-07

基于开源鸿蒙ohos2.3的的hb编译系统

基于开源鸿蒙ohos2.3的的hb编译系统

2025-11-06

空空如也

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

TA关注的人

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