Linux平台设备驱动
在设备驱动程序中经常会见到和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平台设备驱动相关推荐
- linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解
点击(此处)折叠或打开 /* my_bus.c */ #include #include #include #include #include #include "my_bus.h&qu ...
- Linux内核平台设备驱动模型platform_device和platform_driver框架
关于Linux平台设备驱动模型,并不是创建新的设备分类,是在原有的字符设备基础上使用,将设备和驱动分开,生成两个.ko文件. Linux内核维护一个全局设备链表,对应的总线会将驱动和设 ...
- Linux驱动学习-平台设备驱动probe函数-20220410
1.最简单的杂项设备 /* * @Descripttion: 最简单的杂项设备驱动 * @version: * @Author: topeet */ #include <linux/init.h ...
- Linux平台设备框架驱动
Linux平台设备框架驱动 平台设备框架(platform)是将一个驱动分为设备层和驱动层两个部分,通过总线模型将设备和驱动进行绑定.在系统中每注册一个设备,都会与之匹配一个驱动,同样的,每注册一 ...
- Linux Platform平台设备驱动模型
Linux总线设备驱动模型主要包含总线.设备.驱动三个部分. 现实总线:一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI.USB.I2C.SPI等的设备而言,这自然不是问 ...
- 嵌入式Linux设备驱动程序开发指南9(平台设备驱动)——读书笔记
平台设备驱动 九.平台设备驱动 9.1 平台设备驱动概述 9.2 GPIO驱动 9.2.1 简介 9.2.2 硬件名称 9.2.3 引脚控制器 9.2.4 引脚控制子系统 9.2.5 GPIO控制器驱 ...
- linux驱动开发篇(四)—— platform平台设备驱动
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍
文章目录 一.Linux设备模型介绍 (1)设备驱动模型总体介绍 (2)设备驱动模型文件表现 (3)设备驱动模型工作原理 [1]总线 [2]设备 [3]驱动 [4]注册流程 二.平台设备驱动介绍 (1 ...
- linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说
一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...
最新文章
- linux mysql数据库优化_MySQL_Linux下MySQL数据库性能调优方法,以下的环境具备一定的代表性 - phpStudy...
- 视频技术详解:RTMP H5 直播流技术解析
- 模板方法源码解析(jdk+servlet+mybatis)
- SAP UI5 调试模式标志位的持久化原理 - local storage
- java ee项目部署到服务器上405,HTTP状态405 - HTTP POST方法不受此URL支持:采用的GlassFish服务器的NetBeans...
- ansible 修改文件变量_Ansible Playbook中的变量与引用
- leetcode - 343. 整数拆分
- html2canvas在不同设备生成图片大小不一致问题
- 网络工程师应该掌握的知识要点 (共45个)
- 风景怡人一个生态村子 -国稻种芯-百色:华润谋定希望小镇
- ECSHOP二次开发之心得体验
- 16S rDNA测序和宏基因组测序区别
- Codeforces 1138
- 北京邮电大学计算机考研难,北京邮电大学(专业学位)计算机技术考研难吗
- 弹跳机器人 桌游_《碰撞机器人 Ricochet Robots 》介绍
- 2022P气瓶充装判断题及在线模拟考试
- c# wifi串口通信_C#中的串口通信
- Python bool布尔类型(解析)
- 5款免费国外域名邮箱Mail.ru,Yandex,Zoho ,25Mail.St ,Postale申请和使用教程
- 李笑来:“我们不要过度乐观”