linux
文章平均质量分 87
bruk_spp
长期从事嵌入式软件开发,对android上中下都很了解。
展开
-
platform总线五级匹配解析
代码来源:开源linux内核linux-6.2.9platform总线设备与驱动的匹配。原创 2023-05-05 15:21:57 · 1695 阅读 · 0 评论 -
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 · 4922 阅读 · 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 · 5448 阅读 · 0 评论 -
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 · 2033 阅读 · 0 评论 -
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 · 947 阅读 · 0 评论 -
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 · 1139 阅读 · 0 评论 -
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 · 630 阅读 · 0 评论 -
__setup和early_param加载逻辑
在读kernel代码时候又一次碰到early_param这个调用,网上查了下大体和__setup函数作用是一样的,都是在驱动起来后很早加载其回调函数,用来作一些早期的初始化。一直没注意其实现的逻辑过程,只知道应该这样用。现在来看看其到底是如何实现的。先来看看一个序列图,比较简单:上面的序列图调用过程会显得比较简单,逻辑并不复杂。由bootloader拉起start_kernel开始进行驱动加载,在加载moudle_init各种驱动之前会处理__setup和early_param这两种结构,如下图:原创 2020-09-03 23:32:49 · 1024 阅读 · 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 · 1192 阅读 · 0 评论 -
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 · 2163 阅读 · 0 评论 -
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 · 305 阅读 · 0 评论 -
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 · 718 阅读 · 0 评论 -
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 · 4871 阅读 · 1 评论