在设备驱动程序中经常会见到和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. linux mysql数据库优化_MySQL_Linux下MySQL数据库性能调优方法,以下的环境具备一定的代表性 - phpStudy...
  2. 视频技术详解:RTMP H5 直播流技术解析
  3. 模板方法源码解析(jdk+servlet+mybatis)
  4. SAP UI5 调试模式标志位的持久化原理 - local storage
  5. java ee项目部署到服务器上405,HTTP状态405 - HTTP POST方法不受此URL支持:采用的GlassFish服务器的NetBeans...
  6. ansible 修改文件变量_Ansible Playbook中的变量与引用
  7. leetcode - 343. 整数拆分
  8. html2canvas在不同设备生成图片大小不一致问题
  9. 网络工程师应该掌握的知识要点 (共45个)
  10. 风景怡人一个生态村子 -国稻种芯-百色:华润谋定希望小镇
  11. ECSHOP二次开发之心得体验
  12. 16S rDNA测序和宏基因组测序区别
  13. Codeforces 1138
  14. 北京邮电大学计算机考研难,北京邮电大学(专业学位)计算机技术考研难吗
  15. 弹跳机器人 桌游_《碰撞机器人 Ricochet Robots 》介绍
  16. 2022P气瓶充装判断题及在线模拟考试
  17. c# wifi串口通信_C#中的串口通信
  18. Python bool布尔类型(解析)
  19. 5款免费国外域名邮箱Mail.ru,Yandex,Zoho ,25Mail.St ,Postale申请和使用教程
  20. 李笑来:“我们不要过度乐观”

热门文章

  1. PHP正则表达式教程
  2. linux 服务器下查看防火墙
  3. OpenStack裸金属使用总结
  4. 可以通过培训“速成速转”
  5. kali Linux的 安装详细步骤
  6. 【总结】背包问题的至多/恰好/至少
  7. winSocket第一步WSAStartup
  8. (3)聚类算法之DBSCAN算法
  9. SQL---In-Exists-Any
  10. 06-图3. 六度空间 (30)