在设备驱动程序中经常会见到和platform相关的字段,分布在驱动程序的多个角落,这也是2.6内核中比较重要的一种机制,把它原理弄懂,对以后分析驱动程序很有帮助:在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动。相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的。

一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI 等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC 系统中集成的独立的外设控制器、挂接在SoC 内存空间的外设等确不依附于此类总线。基于这一背景,Linux 发明了一种虚拟的总线,称为platform 总线。SOC系统中集成的独立外设单元(LCD,RTC,WDT等)都被当作平台设备来处理,而它们本身是字符型设备。

从Linux2.6内核起,引入一套新的驱动管理和注册机制:platform_device 和 platform_driver 。Linux 中大部分的设备驱动,都可以使用这套机制,设备用 platform_device 表示;驱动用platform_driver 进行注册。

(1)平台设备

在Linux设备驱动中,有一类设备被称为“平台设备”,通常把SoC系统中集成的独立外设单元都当作平台设备来处理。平台设备用platform_device结构体来描述,在2.6.32.2内核中定义在include/linux/platform_devide.h中,其结构体如下:

struct platform_device {const char      * name;int           id;struct device   dev;u32         num_resources;struct resource       * resource;   //设备使用的资源struct platform_device_id      *id_entry;/* arch specific additions */struct pdev_archdata     archdata;
};
struct resource        //位于include/linux/ioport.h
{resource_size_t start;resource_size_t end;const char *name;unsigned long flags;struct resource *parent, *sibling, *child;
};

我们通常关心start、end 和flags 这3 个字段,分别标明资源的开始值、结束值和类型,flags可以为IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA 等。

在Linux中定义了许多平台设备,比如在:arch/arm/plat-s3c24xx/devs.c中,下面贴出WatchDog的平台设备定义:

static struct resource s3c_wdt_resource[] = {[0] = {  //IO端口资源.start = S3C24XX_PA_WATCHDOG,.end   = S3C24XX_PA_WATCHDOG + S3C24XX_SZ_WATCHDOG - 1,.flags = IORESOURCE_MEM,},[1] = {  //中断资源.start = IRQ_WDT,.end   = IRQ_WDT,.flags = IORESOURCE_IRQ,}
};
struct platform_device s3c_device_wdt = {.name               = "s3c2410-wdt",.id             = -1,.num_resources       = ARRAY_SIZE(s3c_wdt_resource),.resource   = s3c_wdt_resource,
};
EXPORT_SYMBOL(s3c_device_wdt);

定义好平台设备后,在系统中怎么使用?在arch/arm/mach-s3c2440/mach-smdk2440.c中,这个ARM2440平台的系统入口文件,系统初始化函数smdk2440_machine_init中使用platform_add_devices函数将一系列的平台设备添加到系统中。

static struct platform_device *smdk2440_devices[] __initdata = {&s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,
};static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_fb_info);s3c_i2c0_set_platdata(NULL);platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));smdk_machine_init();
}

(2)平台驱动

在Linux系统中为平台设备定义了平台驱动platform_driver,平台驱动结构体中定义了probe、remove、suspend、resume等接口函数来实现驱动。定义在include/linux/platform_devide.h中。

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;
};

下面是WatchDog的platform_driverde初始化, 其中driver结构体中初始化了owner、name变量,这里的name要和平台设备的name一致,这样平台设备和平台驱动就关联起来。

static struct platform_driver s3c2410wdt_driver = {.probe            = s3c2410wdt_probe,.remove          = __devexit_p(s3c2410wdt_remove),.shutdown      = s3c2410wdt_shutdown,.suspend  = s3c2410wdt_suspend,.resume          = s3c2410wdt_resume,.driver            = {.owner    = THIS_MODULE,.name      = "s3c2410-wdt",},
};

驱动又是如何实现呢,在驱动初始化module_init()这个宏实现平台驱动注册,module_exit()中实现平台驱动注销。

static int __init watchdog_init(void)
{printk(banner);return platform_driver_register(&s3c2410wdt_driver);
}
static void __exit watchdog_exit(void)
{platform_driver_unregister(&s3c2410wdt_driver);
}module_init(watchdog_init);
module_exit(watchdog_exit);

来源: http://www.linuxidc.com/Linux/2011-08/39773.htm

Linux平台设备驱动相关推荐

  1. linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解

    点击(此处)折叠或打开 /* my_bus.c   */ #include #include #include #include #include #include "my_bus.h&qu ...

  2. Linux内核平台设备驱动模型platform_device和platform_driver框架

    关于Linux平台设备驱动模型,并不是创建新的设备分类,是在原有的字符设备基础上使用,将设备和驱动分开,生成两个.ko文件.         Linux内核维护一个全局设备链表,对应的总线会将驱动和设 ...

  3. Linux驱动学习-平台设备驱动probe函数-20220410

    1.最简单的杂项设备 /* * @Descripttion: 最简单的杂项设备驱动 * @version: * @Author: topeet */ #include <linux/init.h ...

  4. Linux平台设备框架驱动

    Linux平台设备框架驱动   平台设备框架(platform)是将一个驱动分为设备层和驱动层两个部分,通过总线模型将设备和驱动进行绑定.在系统中每注册一个设备,都会与之匹配一个驱动,同样的,每注册一 ...

  5. Linux Platform平台设备驱动模型

    Linux总线设备驱动模型主要包含总线.设备.驱动三个部分. 现实总线:一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI.USB.I2C.SPI等的设备而言,这自然不是问 ...

  6. 嵌入式Linux设备驱动程序开发指南9(平台设备驱动)——读书笔记

    平台设备驱动 九.平台设备驱动 9.1 平台设备驱动概述 9.2 GPIO驱动 9.2.1 简介 9.2.2 硬件名称 9.2.3 引脚控制器 9.2.4 引脚控制子系统 9.2.5 GPIO控制器驱 ...

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

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  8. Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍

    文章目录 一.Linux设备模型介绍 (1)设备驱动模型总体介绍 (2)设备驱动模型文件表现 (3)设备驱动模型工作原理 [1]总线 [2]设备 [3]驱动 [4]注册流程 二.平台设备驱动介绍 (1 ...

  9. linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说

    一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...

最新文章

  1. Vim 80列布局问题
  2. php会话(session)生命周期概念介绍及设置更改和回收
  3. centos 没有可用的网络设备
  4. 【ABAP】CK11N相关Table
  5. 【收藏】SpringBlade开发手册地址
  6. index.html图片弹窗,原生javascript实现图片弹窗交互效果
  7. flink中的WaterMark调研和具体实例
  8. ACE在AIX环境下编译指南
  9. 【渝粤教育】国家开放大学2018年春季 0675-22T中级财务会计(2) 参考试题
  10. JavaScript 霸榜、TypeScript 爆发、开源吞噬世界,GitHub 年度报告正式发布!
  11. C++ 内存分配 学习笔记
  12. 小米id锁状态查询_怎么通过序列号查询苹果手机真伪
  13. 人脸识别数据集-WebFace260M
  14. The command ‘docker‘ could not be found in this WSL 2 distro.
  15. 详解谷歌VR平台Daydream:有手柄就是不一样
  16. 主谓宾定状补......
  17. 仿高德地图首页效果,简单代码实现
  18. pwm的频率和占空比
  19. 【KMP】OKR-Periods of Words
  20. DRL经典论坛网络版 一人一句软件使用经验收集2

热门文章

  1. Python编辑器UliPad安装
  2. Win 98系统启动过程全揭密
  3. Linux进程创建fork、进程退出exit()、进程等待waitpid()
  4. 金立e3t刷android4.4,金立E3T刷机包 基于百度云官方ROM 深度精简 超强权限 省电耐用 安全稳定...
  5. 超微主板升级bios_没法用新CPU给老主板更新BIOS?别着急,AMD借你一块CPU
  6. spoolsv.exe占cpu 99%的解决方法
  7. ③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...
  8. 微软发布免费的文件恢复工具
  9. (论文阅读笔记)OLE:正交低秩嵌入,即插即用的几何损失
  10. Swift如何判断字符串的语言