platform平台设备学习

[Linux外设驱动详解]11. 平台设备驱动(Platform Driver) 本文介绍了Linux内核中的平台设备驱动(Platform Driver)框架,主要内容包括: 平台设备驱动概述:用于管理片上外设(SoC内置外设),提供统一的注册和匹配机制。 平台总线(platform_bus):虚拟总线,负责平台设备和驱动的匹配,包含核心数据结构platform_bus_type。 平台设备(platform_device):描述硬件设备的结构体,包含资源定义(内存、中断等)。 平台驱动(platform_driver):设备驱动结构体,包含probe/remove等操作函数。 设备与 阅读详情

 平台设备驱动的使用

1、声明平台设备 struct platform_device  p_dev;

2、注册平台设备   platform_device_add(&p_dev)

3、注销平台设备 platform_device_unregister(&p_dev);

	1、平台设备,通过struct platform_device 来进行描述。
	struct platform_device {
		const char	* name; //平台设备的名称
		int	id;//设备的ID,当ID=-1的时候,表示设备名称只有一个,否则表示设备编号
		struct device	dev;
		u32		num_resources;
		struct resource	* resource;
		struct platform_device_id	*id_entry;
	};
	2、其中platform_device内包含两个重要的结构体,一个是struct device 该结构体描述设备相关的信息设备之间的层次关系以及设备与总线驱动的关系。
	struct device {
		struct device		*parent;//指向父设备节点
	
		struct device_private	*p;//描述的是klist,struct klist是对struct list_head的扩展,在此它的作用是连接设备列表中的孩子列表。Struct klist_node表示它的兄弟节点。
	
		struct kobject kobj;
		const char		*init_name; /* initial name of the device */
		struct device_type	*type; /*device_type结构表示设备的类型。一个设备类或者总线可以包含不同类型的设备,例如“分区”和“磁盘” , “鼠标”和“事件” 。device_type就可以标识某个设备类型和该设备的特有信息,它就等同于kobject结构中的kobj_type一样。如果name数据成员被指定,那么uevent成员函数就会把它包含在DEVTYPE变量中。*/
	
		struct semaphore	sem;	/* 该信号量用于同步其驱动 */
	
		struct bus_type	*bus;	/*设备所在的总线,指向所连接的总线 */
		struct device_driver *driver;	/* 管理该设备的驱动 */
		void		*driver_data;	/* 设备的私有数据指针*/
		void		*platform_data;	/* Platform specific data, device
						   core doesn't touch it */
		struct dev_pm_info	power;
	
	#ifdef CONFIG_NUMA
		int		numa_node;	/* NUMA node this device is close to */
	#endif
		u64		*dma_mask;	/*指向设备DMA屏蔽字。*/
		u64		coherent_dma_mask;/* Like dma_mask, but for
						     alloc_coherent mappings as
						     not all hardware supports
						     64 bit addresses for consistent
						     allocations such descriptors. */
	
		struct device_dma_parameters *dma_parms;
	
		struct list_head	dma_pools;	/* dma pools (if dma'ble)聚集的DMA缓冲池 */
	
		struct dma_coherent_mem	*dma_mem; /* 设备一致性DMA的屏蔽字
						     override */
		/* arch specific additions */
		struct dev_archdata	archdata;
	
		dev_t			devt;	/* dev_t, creates the sysfs "dev" */
	
		spinlock_t		devres_lock; 设备自旋锁,用于互斥访问设备
		struct list_head	devres_head;
	
		struct klist_node	knode_class;
		struct class		*class;
		struct attribute_group	**groups;	/* optional groups */
	
		void	(*release)(struct device *dev);释放设备描述符的回调函数。
	};

3、通过struct resource结构体来描述
	struct resource {
		resource_size_t start;
		resource_size_t end ;//资源起始的和结束的物理地址
		const char *name;//资源的名称
		unsigned long flags;;//资源的类型,比如MEM,IO,IRQ类型
		struct resource *parent, *sibling, *child;;//资源链表的指针
	};
	
4、platform_device的使用
	1)声明该结构体struct platform_device *my_buttons_dev;
	//给该结构体分配空间和初始化。传入的参数为设备名字和设备ID,当ID=-1的时候表明该设备名称唯一
	my_buttons_dev = platform_device_alloc("my_buttons", -1);
	声明平台设备的资源struct resource
	static struct resource key_resource[]=
	{ 	
		[0] = {
			.start = IRQ_EINT1,
			.end = IRQ_EINT1,
			.flags = IORESOURCE_IRQ,
		},
		[1] = {
			.start = IRQ_EINT2,
			.end = IRQ_EINT2,
			.flags = IORESOURCE_IRQ,
		},
	};
	//使用下面函数将该资源添加到平台设备里面去,使用该函数,会为 platform_device 中的resource结构体指针分配空间并且赋值
	//参数为 (struct platform_device *pdev,struct resource *res, unsigned int num)
	platform_device_add_resources(my_buttons_dev,key_resource,6);
	3)//向系统注册该设备
		ret = platform_device_add(my_buttons_dev);
		
		if(ret)
			platform_device_put(my_buttons_dev);
	并且在退出函数里面将该平台设备注销
	void platform_device_unregister(struct platform_device *pdev)


 

平台驱动使用

 

平台设备驱动最重要的是:struct platform_driver 结构体
	1)struct platform_driver {
		//probe函数当找到相对应的硬件设备的时候将会调用
		//相对应的函数进行
		int (*probe)(struct platform_device *);//设备的检测,所以需要先前的设备注册
		int (*remove)(struct platform_device *);//删除该设备
		void (*shutdown)(struct platform_device *);//关闭该设备
		int (*suspend)(struct platform_device *, pm_message_t state);
		int (*suspend_late)(struct platform_device *, pm_message_t state);
		int (*resume_early)(struct platform_device *);
		int (*resume)(struct platform_device *);
		struct device_driver driver; //设备驱动,定义在include/linux/device.h中
		struct platform_device_id *id_table;
	};
	2)声明一个struct platform_driver对象然后对其初始化
	struct platform_driver my_buttons_drv = { 
		.probe = my_plat_probe,//对应设备的探测驱动
		.remove = my_plat_remove,
		.driver = { 
			.owner = THIS_MODULE,
			.name = "my_buttons",//与设备的名字一致和platform_device相关联起来 
		},
	};
	向系统注册这个平台驱动
		ret = platform_driver_register(&my_buttons_drv);
	当模块卸载的时候注销该驱动:
	platform_driver_unregister(&my_buttons_drv);
	
	平台设备驱动中探测设备函数,如果探测成功,向系统注册一个字符设备或者混杂设备,向用户空间提供一个操作设备的接口。
	static int my_plat_probe(struct platform_device *dev)
	{
		int ret,i;
		struct resource *plat_resource;
		struct platform_device *pdev = dev;
		
		printk("my platform dirver find my platfrom device.\n");
	
		for(i=0; i<6; i++){
			plat_resource = platform_get_resource(pdev,IORESOURCE_IRQ,i);
			if(plat_resource == NULL)
				return -ENOENT;	
			buttons_irq[i] = plat_resource->start;
		}
	
		ret = misc_register(&misc);
		if(ret)
			return ret;
	
		
		return 0;
	}
	


 

 

 

 

值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏) 这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。 阅读详情

相关推荐

怀旧党必备!用iPhone4s重温iOS6的保姆级教程(含游戏资源包)

本文提供了一份详细的iPhone4s降级至iOS6.1.3的保姆级教程,包括设备准备、越狱操作、系统降级及资源优化全流程。通过自制固件和越狱工具,用户可以重温经典的拟物化设计和流畅体验,同时获取经典游戏资源包,打造复古游戏神器。

nft7creator的博客 876

驱动——platform驱动ADC

我们再谈一下平台总线。 前面讲平台总线是可以让drv和dev实现分离。主要作用是用于平台升级。 现在结合设备树来看一下 平台总线的好处。(平台总线是虚拟总线,用于一些ADC,PWM这样的没有实体总线连接(iIC spi…)的一些设备,为了管理这些设备统一虚拟出平台总线来管理) 1)首先我们要了解到 当我们在设备树文件上写了应该设备后(属于我们的直接定义的设备,可以有2^20个子设备(前面说可以放无限个是错误的) 它就会把设备树的信息放在/sys/bus/plaoform/device下(那我要是iic设备应

wzf_Cql 596

[Unity_Plastic SCM小技巧] 使用 UnityYAMLMerge 工具合并场景和预制件文件

首先YAMLMerge工具其实并不局限于PlasticSCM,git也可以,它是内置在Editor内的一个更加智能的版本控制工具,只不过正常不会启用,他的目录在C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe(Unity Editor安装目录),MAC上:/Applications/Unity/Unity.app/Content...

unityofficial的博客 1143

四、设备树下的 platform 平台设备驱动

​ Platform 驱动模型是 Linux 内核为了更好地管理设备和驱动而引入的一种机制。它将设备和驱动进行分离,通过平台总线(platform bus)来匹配设备和驱动。在这个模型中,设备和驱动都向平台总线注册自己,总线负责根据设备和驱动的匹配规则,将它们绑定在一起。功能:向平台总线注册一个平台设备。原型参数pdev是一个指向结构体的指针,该结构体包含了设备的名称、ID、资源等信息。返回值:成功返回 0,失败返回负的错误码。功能:从平台总线注销一个平台设备。原型参数pdev。

Jiuri的博客 1755

ABB机器人常见的几大数据类型

ABB机器人数据存储描述了机器人控制器内部的各项属性,ABB机器人控制器数据类型多达100余种,其中常见的数据类型包括基本数据、i/o数据、运动相关数据。 1、基本数据 基本数据: bool 逻辑值:逻辑状态下赋予的真或者假。逻辑值有两种情况:成立和不成立则逻辑值为真使用true或1表示不成立则逻辑值为假使用false或0表示 byte 字节值:用于计量存储容量的一种计量单位,取值范围为(0-255) num 数值:变量、可存储整数或小数整数取值范围(-8388607~8388608) dnum

soinlove36的专栏 1万+

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2192

一张图掌握 Linux platform 平台设备驱动框架!【建议收藏】

嵌入式系统中有很多的物理总线:I2c、SPI、USB、uart、PCIE、APB、AHB。像这样的总线很多,而 Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,于是 Linux从2.6起就加入了 platform 设备驱动,也叫做平台设备驱动。它是一条虚拟的总线, 并不是一个物理的总线。如下图所示:(本文不考虑设备树的情况):

火山上的企鹅 3万+

Petalinux 2021.2 下 Qt组件编译报错?手把手教你修改bb文件搞定qt3d/qtquickcontrols2

本文详细解析了Petalinux 2021.2环境下Qt组件(如qt3d、qtquickcontrols2)编译报错的解决方案。通过修改bb文件或使用bbappend文件覆盖,有效解决`petalinux-build --sdk`命令执行时的源码获取失败或哈希校验不匹配问题,并提供验证与调试技巧,帮助开发者快速修复构建流程中断问题。

weixin_29188997的博客 216

Linux内核中platform设备简介

Linux内核中platform设备简介

wojiaxiaohuang2014的博客 924

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

YOLOv12中的A2C2f模块详解,涉及区域注意力模块(A2)和 R-ELAN 结构详解

区域注意力模块(Area Attention, A2)的设计出发点是为了解决传统注意力机制在计算复杂度和内存访问效率上的问题。传统的自注意力机制(Self-Attention)具有二次方的计算复杂度(O(n²)),尤其是在处理高分辨率图像时,计算成本非常高。此外,注意力机制的内存访问模式不如卷积神经网络高效,导致在实际应用中难以满足实时性要求。区域注意力模块通过将特征图划分为多个区域,并在每个区域内进行注意力计算,从而显著降低了计算复杂度。

Limiiiing的博客 5513

platform平台设备驱动开发基础

什么是设备驱动模型 类,总线,设备,驱动 : 四个结构体 类class : 自动创建设备节点 总线: bus 把设备和驱动挂接起来 设备: device 驱动: driver kobject和对象生命周期 kobject内核高度抽象的一个结构体,总的基类 对象生命周期: 每个对象的存活时间,kobject有机制管理对象的生命周期 sysfs : 是一种虚拟文件系统,内核空间和用户空间一种映射关系,以文件方式展现出来 udev : 用户和内核一种通信机制,在应用层可以获取到内核发生的事

qq_39575672的博客 360

【2022网易雷火】游戏研发笔试-AC代码及题目分享

3个小时,4道题目,雷火的题目不在于难,更在于对细节的把控和写大模拟的耐心,花了一个半小时,AC了3.85,直接交卷退了。第一题AC,第二题AC,第三题85%,第四题AC。下面分享一下大致的题意和对应的代码,就不多说了,最近很累(代码可能会有贴错的情况,如有望指正,感谢~)。 T1-小Y抽奖 题意 n行m列个奖励格子,每次抽奖消耗一个道具。每个格子奖励的数量有限且各不相司。每个格子被抽到一次,剩余的奖励数量-1。剩余的奖励数量为0时,则不会再抽到该格子。小Y抽了好多次,但一直没有抽到最想要的..

米莱虾 9266

LINUX驱动开发学习笔记12:platform平台设备驱动

Linux系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了platform设备驱动,也叫做平台设备驱动。

KKL1224的博客 1368

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux驱动学习-platform平台设备注册(1)-20220407

重要的头文件: <linux/init.h> #初始化头文件 <linux/module.h> #模块注册注销头文件 <linux/patform_device.h> #平台文件注册注销头文件 1.平台总线注册一个device device.c里面写的是硬件资源:寄存器地址,终端号,时钟等硬件资源; struct platform_device 结构体: {const char *name ;#平台总线进行匹配的字符串,/sys/bus/...下生成对应文件

weixin_41564872的博客 915

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux驱动学习-platform平台设备注册(2)-20220408

将驱动模块复制到开发板nfs挂载目录下,insmod beep_device.ko进行安装 报错表示:加载的树外模块污染了内核。从这段描述可以猜到,这是我们没有把此驱动模块加入到Kconfig树导致的,即make menuconfig的配置选项中没有此驱动。此时这个驱动模块仍能正确加载和使用。如果我们只是学习怎么写驱动,不用管他就行;如果我们是正式地写驱动,那么把驱动信息加入到Kconfig树中是必须的,这样我们可以通过配置内核来决定哪些加载驱动,系统也不会再报loading out-of-tree

weixin_41564872的博客 726

正点原子【第四期】Linux之驱动开发学习笔记-14.1 Platform平台设备驱动

本文是根据哔哩哔哩网站上“正点原子【第四期】手把手教你学Linux系列课程之 Linux驱动开发篇”视频的学习笔记,该课程配套开发板为正点原子alpha/mini Linux开发板。在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 430

驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇

                驱动开发读书笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentation/driver-model/platform.txt Device Enumeration 82 ~~~~~~~~~~~~~~~~~~ 83 As ...

weixin_34034670的博客 135

关于平台设备驱动的学习与开发

本文介绍了Linux平台设备驱动的开发框架与实现方法。主要内容包括:1)平台设备驱动的特点,采用驱动与设备分离的设计,便于移植和维护;2)平台设备的三层架构(硬件层、内核层、用户层)及工作流程;3)详细代码实现,硬件层通过platform_device注册设备资源,驱动层实现platform_driver进行设备匹配和资源操作,用户层通过设备节点控制硬件;4)重点讲解了内存映射、字符设备注册、文件操作等关键技术。该设计实现了LED设备的平台驱动开发,展示了Linux驱动模型的核心思想。

m0_55765042的博客 1214

linux (platform_driver)平台设备驱动常用API函数

Table of Contents 1、设备层注册、注销函数 1.1、platform_device_register 1.2、platform_device_unregister 1.3、platform_add_devices 2、驱动层注册注销函数 2.1、platform_driver_register 2.2、platform_driver_ unregister 3、...

shenlong1356的博客 5983

Linux驱动编程 - platform平台设备驱动总线

Linux系统中的platform平台设备驱动

hinewcc的博客 1719

Linux platform平台设备驱动

Linux platform平台设备驱动

opang的博客 2197

Linux Platform devices 平台设备驱动

platform平台设备驱动是基于设备总线驱动模型的,它只不过是将 device 进一步封装成为 platform_device,将 device_driver 进一步封装成为 platform_device_driver,前面已经分析过设备总线驱动模型,关于device 与 device_driver 的注册过程以及它们在sysfs文件系统中的层次关系就不在分析,本文重点分析platform平台

漫不经心 2万+

Linux Platform 平台设备驱动模型简介

内核版本:linux-3.10.61 1、Platform介绍 Platform 平台设备设备驱动模型的作用是将驱动的实现和资源分离,是一个虚拟的总线平台。这其中存在三个成员bus,device,drive。device需要在driver之前装载进内核,因为匹配工作在注册driver时实现。 Bus:由一个链表实现,不对应实际的物理总线。 Device:驱动的资源比如一些 I/O端口,中断号之类的。 Drive:驱动的功能实现比如 注册驱动,实现file_operations 等 2、主要结构体

JJ1116的博客 3061

Linux 平台设备platform

今天学习了platform平台总线,用来对驱动进行管理和注册,平台设备是指处理器上集成的额外功能的附加设备,如Watch Dog,IIC,IIS,RTC,ADC等设备。这些额外功能设备是为了节约硬件成本、减少产品功耗、缩小产品形状而集成到处理器内部的。需要注意的是,平台设备并不是与字符设备、块设备和网络设备并列的概念,而是一种平行的概念,其从另一个角度对设备进行了概括。如果从内核开发者的角度来看,...

lj19990824的博客 496

linux驱动开发篇(四)—— platform平台设备驱动

linux系列目录: linux基础篇(一)——GCC和Makefile编译过程 linux基础篇(二)——静态和动态链接 ARM裸机篇(一)——i.MX6ULL介绍 ARM裸机篇(二)——i.MX6ULL启动过程 ARM裸机篇(三)——i.MX6ULL第一个裸机程序 ARM裸机篇(四)——重定位和地址无关码 ARM裸机篇(五)——异常和中断 linux系统移植篇(一)—— linux系统组成 linux系统移植篇(二)—— Uboot使用介绍 linux系统移植篇(三)—— Linux 内核使用介绍 li

sinat_31039061的博客 6065
上一篇: linux平台设备驱动
下一篇: 设备模型、设备与驱动关联的全过程分析 platform_device platform_driver driver bus关系
ADC0809608
博客等级 码龄17年 44粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值