自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

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

2023-06-24 15:57:22 686

原创 platform总线五级匹配解析

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

2023-05-05 15:21:57 1625

原创 android屏幕下电控制

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

2021-03-06 15:22:57 1007

原创 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 4748 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 5375

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

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

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

原创 __setup和early_param加载逻辑

在读kernel代码时候又一次碰到early_param这个调用,网上查了下大体和__setup函数作用是一样的,都是在驱动起来后很早加载其回调函数,用来作一些早期的初始化。一直没注意其实现的逻辑过程,只知道应该这样用。现在来看看其到底是如何实现的。先来看看一个序列图,比较简单:上面的序列图调用过程会显得比较简单,逻辑并不复杂。由bootloader拉起start_kernel开始进行驱动加载,在加载moudle_init各种驱动之前会处理__setup和early_param这两种结构,如下图:

2020-09-03 23:32:49 987 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 1103

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

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

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

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

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

原创 surface的创建过程

还是首先来看一个序列图:1.ViewRootImpl.mSurfaceViewRootImpl这个类是是处理视图绘画,input输入,调用wms调用窗口的核心类。其成员变量mSurface在申明的时候就初始化了: final Surface mSurface = new Surface();上面干巴巴的创建了Surface实例,进去看Surface这个类的无参构造函数也是个空的,所以还要继续往下分析2.SurfaceSession的创建在wms窗口管理过程中,视图的添加过程View

2020-08-20 18:32:59 1643

原创 surfaceflinger软件刷新事件的处理流程

1.surfaceFlinger.initvoid SurfaceFlinger::init() { ALOGI( "SurfaceFlinger's main thread ready to run. " "Initializing graphics H/W..."); ALOGI("Phase offest NS: %" PRId64 "", vsyncPhaseOffsetNs); { // Autolock scope Mut.

2020-08-18 14:47:24 828

原创 hwc2 surfaceflinger启动流程分析

先还是大体的来看下流程图,这个比hwc1复杂了好多,不是太好理解:1.SurfaceFlinger.init "Starting with vr flinger active is not currently supported."); mRealHwc = new HWComposer(false); mHwc = mRealHwc; mHwc->setEventHandler(static_cast<HWComposer::EventHandler

2020-08-17 21:00:51 2317

原创 hwc1 surfaceflinger启动流程

先来看看大体的流程图:1.SurfaceFlinger作为一个服务被添加到serviceManager上,其服务的添加在main_surfaceflinger.cpp这个文件里面int main(int, char**) { ... sp<SurfaceFlinger> flinger = new SurfaceFlinger(); setpriority(PRIO_PROCESS, 0, PRIORITY_URGENT_DISPLAY); set_sche

2020-08-16 17:13:33 876

原创 activity view显示流程

先来个序列图:1.handleLaunchActivity private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { // If we are getting ready to gc after going to the background, well // we are back active so skip it.

2020-08-14 23:06:08 372

原创 activity启动流程分析

先来个大体流程图:我们一般调用startActivity这个API来启动一个新的activity。实际上差不多所有的APP基本是由launcher 调用这个接口拉起来的。所以我们只要从Activity.java这个类跟踪看其实现过程就可以。1.startActivity @Override public void startActivity(Intent intent) { this.startActivity(intent, null); }

2020-08-07 18:07:56 273

原创 普通二叉树实现C代码

面试华为 od外包,被逼着去刷牛客网试题,看算法。这里是使用递归实现的二叉树,如有问题敬请大家指出#include<stdio.h>#include<memory.h>typedef struct TAG_BTNode{ int value; struct TAG_BTNode *left , *right;}BtNode,*PBtNode;void delBtNode(PBtNode *root , int value){ if((*root) == NUL

2020-08-05 18:36:18 236

原创 selinux源码分析

首先来一幅lsm的逻辑图:上幅图来至:Linux Security Module Framework一文,很清晰的描述了LSM的逻辑,从用户空间到系统调用再到selinux模块接口。selinux驱动模块位置: \linux-4.5-rc1\security1.selinux核心驱动的加载1)selinux文件节点的创建: 在selinuxfs.c文件中,__initcall(init_sel_fs)驱动模块的加载,会注册文件节点。这些节点作为内核与用户空间通信的接口。其核心API调用

2020-07-11 16:17:25 4717 1

原创 android framework层input事件接收和派发

input序列图前面是启动activity时,view的添加过程。在view添加过程中会注册inputchannel,而inputchannel是input事件处理的核心通道。在本篇里所有的介绍都是围绕inputchannel的创建和读取展开的,前面的view添加是窗口管理部分不是本篇关注的内容就不介绍了。本篇从inputchannel的创建开始介绍。1.openInputChannel在Windowstate.java文件里面,来看看这个代码实现...

2020-07-04 13:46:07 1695 1

原创 按键事件inputflinger大体流程

前言:  在android2.3版本的时候,详细的对照代码了解了遍按键事件从驱动到framework的流程。并在高仿机上实现新增按键从驱动到系统的功能。随着时间的不断推进,工作的重点越来越向驱动集中,对HAL和系统的了解停留在之前的理解上。近来看一个windowstate的提交,实现发现对按键流程还有不太明白的地方。现在回过头来详细的再对按键梳理一遍,首先来着个大体的序列图:在这里按照序列图的标号,对照着代码大体的理下思路:InputFlinger1.InputManager.cpp这个类是inpu

2020-06-25 21:47:20 2535 1

原创 doDispatch流程解析

首先来看一个大体的流程图doService是作为springmvc承接Servlet的入口函数,调用doDispatch实现。doDispatch这个函数核心逻辑如下:1.根据request所含有的路径属性查找handlerMapping2.找到handler后,要根据handler 查找adapter,这里的adpter的作用就是屏蔽handler的实现差别,提供一致的invoke调用。3...

2019-12-09 23:12:55 1363

原创 RequestMapping注解实现过程

1.DispatchServlet.java 这个加载的时候,会首先加载配置文件生成属性其配置文件名为 private static final String DEFAULT_STRATEGIES_PATH = “DispatcherServlet.properties”;我们可以看看这个配置里面handlermapping的配置是什么2.requestMapping注解是MVC容器初始...

2019-11-30 23:17:28 1391

原创 kafkaConsumer流程分析

先来看个主要的层次图1.coordinator 字面意思就是协调者是ConsumerCoordinator类的对象。ConsumerCoordinator继续AbstractCoordinator提供心跳服务,心跳超时时间是5S。当我们生成kafkaconsumer对象的时候,如果没有配置groupId coordinator就为null. coordinator这个类我在consumer里面...

2019-10-26 23:11:15 368

原创 Cannot find entry in either framework or device manifest

在android里使用hidl技术,代替了以前的dlopen的方式来加载第三方的so.从android8.0开始使用Android Treble框架来加载service.这里从我在实际开发中遇到的问题说起,在VTS测试服务是否存在时,老是报Cannot find entry XXX服务。各种关键接口找不到,也不知道问题出在哪里。所以只好看其源码实现了。1.各种hal文件都继承胃IBase接口,...

2019-10-12 00:06:33 7860 1

原创 spring Autowired注解

先来看个大体的流程图Autowired是在实例化bean的时候解析的.每个bean在实例化的时候,都会照例检测本类中是否存在Autowired注解的Filed.对此类声明的所有Field一一对比.看是否是存在需要的注解,这个注解条件为Autowired注解是其中之一.如果有满足条件的Field,那么就通过反射实例化这个Field,看实现截图大体过程是这样的,如有错误敬请指出....

2019-10-07 18:12:01 162 1

原创 tomcat server.xml 初始化分析

网上看了很多tomcat的分析资料,分析的很好也很全面.这里我自己写篇作个笔记.1.接口调用的流程大体如下1.首先Bootstrap.java这个final类是程序的入口类.在main函数里面,根据我们传递的参数来确定执行的动作,如果没有任何参数,那么就执行start操作.这里从start操作来看其执行的流程2.先执行init操作,这个操作的主要目地就是通过反射机制来生成一个Catalin...

2019-10-07 18:10:43 252

原创 spring boot application.properties加载

首先说明的是ConfigFileApplicationListener.java是加载解析处理application的地方.上面的图是非常省略的图,只画了个大概的流程.下面来仔细的说明说下1.最开始的起来在SpringApplication里面这里是从spring.factories里面读取配置,而我们所需要的类ConfigFileApplicationListeneryi就是从这里读出来的,也...

2019-10-07 18:10:08 340

原创 spring boot ConfigurationProperties注解

先来看下大体的ConfigurationProperties注解处理函数的注册过程.这里说明一下该注解是在ConfigurationPropertiesBindingPostProcessor对象里,被postProcessBeforeInitialization函数进行处理的.流程图如下这个过程有点复杂,对照着流程图一步一步来说.1.一个springboot的应用由springbootAppl...

2019-10-06 14:34:43 292

原创 @Service @Repository @Controller @Configuration注解类的首次加载

这几个注解全是@Component注解,它们的解析在ClassPathBeanDefinitionScanner.java看其构造函数的初始化这个是默认的扫描过滤filter,其中就有component.来看下过滤规则如代码所以只要该类拥有Component的注解类就算通过.下面来看下如何扫描的这里大体描述下,具体的看代码实现.1.首先package目录下所有文件,找到满足条件的类,就是满足...

2019-10-06 12:20:45 883

原创 EnableDiscoveryClient与EnableEurekaClient

今天看EnableEurekaClient 看了半天,然后搜索这个注解的使用者,根本没找到.结果在网上看别人的用法,对比了下注解实现的不一样,截图下来第一幅图是v1.2.2分支的代码.如上图,而第二幅图是master分支的代码.这个修改是2017年9月分修改的,不知道为什么.commit上面也没说明具体原因看不了EnableEurekaClient实现,就来看EnableDiscoveryC...

2019-09-22 17:10:17 405

原创 spring netflix eureka启动

1.在spring中启动eureka server是由注解EnableEurekaServer来实现的.截图如下在这个注解中启用了import来注册EurekaServerMarkerConfiguration这里注册了一个Marker对象的bean.2.EurekaServerMarkerConfiguration.Marker这个注册bean对象的使用在EurekaServerAutoCo...

2019-09-21 20:44:39 130

原创 spring Lifecycle容器级别的回调

1.其拉起的地方是在context初始化的结尾AbstractApplicationContext.java文件refresh首先初始化生成一个DefaultLifecycleProcessor对象然后将beanFactory注入接着调用onRefresh()函数把所有满足条件的start,看代码实现上面大体意思,就是从Bean中找到所有的Lifecycle接口的类,然后实例化后.进行...

2019-09-21 14:27:56 153

原创 spring Conditional注解源码解析

Conditional.class这个类是选择类的注册Bean.其定义如下:1.就一个value参数.这个参数是默认参数,所以一般直接不用写属性名,直接写属性值就好了.2.要注意的是属性值必须是接口类Condition的实现者,其定义如下主要是实现matches这个抽象接口.通过它来决定要不要加载这个bean其实现源码在AnnotatedBeanDefinitionReader.java中...

2019-09-20 21:59:44 268

原创 spring ModelAttribute属性解析

ModelAttribute这个属性的解析主要是在 RequestMappingHandlerAdapter.java里做的这个属性的解析主要有两次.第一次:在RequestMappingHandlerAdapter这个类被初始化的时候,由于该类继续InitializingBean接口.使用在使用getBean生成该对象时候,会调用.afterPropertiesSetafterProper...

2019-09-19 22:35:23 688

空空如也

空空如也

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

TA关注的人

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