当前位置: 首页 > news >正文

linux设备驱动那点事儿之平台设备理论篇

一:Platform总线

 

1.1概述

 

      一个现实的linux设备驱动通常需要挂接在一种总线上,对于本身依附于PCI,USB,IIC,SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,
SOC系统中集成的独立的外设控制器,挂接在SOC内存空间的外设等确不依附于此类总线。基于这一背景,linux发明了一种虚拟的总线,称为platform总线,相应的
设备称为platform_device,而驱动成为platform_driver.Platform总线是linux2.6内核加的一种虚拟总线.


1.2.Platform总线优势


      
     Platform驱动与传统的设备驱动模型相比,优势在于Platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序使用这些资源时使用统一的接口,提高了程序的可移植性。

 


二.平台设备的驱动软件设计流程

 

 

 

三.平台设备:

 

3.1.平台设备使用struct Platform_device来描述


struct platform_device {
 const char * name;  //设备名
 int  id;//设备编号,配合设备名使用
 struct device dev;
 u32 num_resources;//设备所使用各类资源数量
 struct resource * resource;//设备资源
};

3.2.分配一个平台设备结构体

Strcut platform_device的分配使用:
struct platform_device *platform||_device_alloc(const char *name,int id)
参数:
Name:设备名
Id:设备id,一般为-1

3.3.平台设备注册

注册平台设备,使用函数:
Int platform_device_add(struct paltform_device *pdev)

3.4.设备资源

平台设备资源使用struct resource来描述
struct resource {
 resource_size_t start;//资源的起始物理地址
 resource_size_t end;//资源的结束物理地址
 const char *name;//资源的名称
 unsigned long flags;//资源的类型,如MEM,IRQ
 struct resource *parent, *sibling, *child;//资源的链表指针
};

3.5.资源的获取

Struct resource *platform_get_resource(struct platform_device *dev,unsigned int type,unsigned int num)
参数:
Dev:资源所属的设备
Type:获取的资源类型
Num:获取的资源数
Eg:platform_get_resource(pdev,IORESOURCE_IRQ,0)

四:平台驱动

4.1.平台驱动描述

平台驱动使用struct platform_driver描述:

struct platform_driver {
 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 (*resume)(struct platform_device *);
 struct device_driver driver;
 struct platform_device_id *id_table;
};

 

4.2.平台驱动注册

 

平台驱动注册使用函数:
int platform_driver_register(struct platform_driver*)

 

4.3.实现struct platform_driver结构体中某些函数的功能

 

五.平台设备与平台驱动代码分析

 

转载于:https://www.cnblogs.com/Ph-one/p/4676391.html

相关文章:

  • linux多线程驱动中调用udelay()对整个系统造成的影响(by liukun321咕唧咕唧)...
  • udelay、mdelay、ndelay、msleep使用比较说明
  • A8下超级终端调试问题
  • Linux多线程编程(不限Linux)转
  • Linux 线程优先级
  • 男儿当自强
  • JNI编程(一) —— 编写一个最简单的JNI程序
  • JNI编程(二) —— 让C++和Java相互调用(1)
  • JNI编程(二) —— 让C++和Java相互调用(2)
  • char*,const char*和string的相互转换
  • 请问什么是UTF字符串?
  • jni数据问题
  • sprintf
  • 锦上
  • eMMC(KLM8G2FE3B)
  • Google 是如何开发 Web 框架的
  • “大数据应用场景”之隔壁老王(连载四)
  • 4. 路由到控制器 - Laravel从零开始教程
  • FastReport在线报表设计器工作原理
  • flask接收请求并推入栈
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • laravel with 查询列表限制条数
  • 从PHP迁移至Golang - 基础篇
  • 大快搜索数据爬虫技术实例安装教学篇
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 解析 Webpack中import、require、按需加载的执行过程
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 学习笔记TF060:图像语音结合,看图说话
  • 用jquery写贪吃蛇
  • 用简单代码看卷积组块发展
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 大数据全解:定义、价值及挑战
  • ​queue --- 一个同步的队列类​
  • ​ubuntu下安装kvm虚拟机
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)虚拟机的安装与使用,linux系统安装
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (一)SpringBoot3---尚硅谷总结
  • (转)socket Aio demo
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .mysql secret在哪_MySQL如何使用索引
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .Net各种迷惑命名解释
  • .NET连接数据库方式
  • /bin/rm: 参数列表过长"的解决办法
  • /etc/skel 目录作用
  • /var/log/cvslog 太大
  • [20190113]四校联考
  • [AAuto]给百宝箱增加娱乐功能
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件