`
emowuyi
  • 浏览: 1480752 次
文章分类
社区版块
存档分类
最新评论

linux驱动学习(六) 应用中的linux驱动 platform_device

 
阅读更多

一个现实的linux设备和驱动通常要挂接在一种总线上,像pci,usb,iic,spi等都是总线结构,这当然不是问题,但是嵌入式系统中,Soc系统集成的独立外设控制器,挂接在soc内存空间的外设等却不依附于此类总线。


基于这个背景,linux发明了一种虚拟总线:platform总线,相应的设备称为platform_device,而驱动成为platform_driver。
注意,platform_device并不是与自负设备,块设备等平行的概念,而是linux提供的一种附加手段,例如s3c2440处理器中,把内部集成的iic,rtc,spi,lcd,watchdog,等控制器归纳为platform_device,但是他们本身就是字符设备。


platform_device

platform_device成员变量

1、struct device(部分),include<linux/device.h>



2、struct resource


platform_device对应的platform_driver


支持电源管理时,需要实现 shutdown,suspend,resume这三个函数,若不支持,将他们设为null。

platform_driver结构体中的重要成员变量 device_driver



用于向内核注册platform_driver的函数platform_driver_register(platform_driver *)

反之,注销platform_driver的函数platform_drvier_unregister(platform*)


一般实现platform_driver时,除了实现file_operations中的read、write等函数外,还要实现platform_driver中的probe与remove等函数,其余均按正常的linux设备驱动的编写方法编写驱动程序。

例如将mychar移植成platform_driver,简略的如下形式

注意,如果要让这个驱动在开发板上能工作,需要在板文件中添加相应的代码,在板文件例如 arch/arm/mach-s3c2440/mach-mini2440.c,代码如下

这样就表示,开发板上有一个devie,名字叫mychar,因为mychar是内存中虚拟出来的,所以这里并不需要设置别的,只要设置一下与driver相匹配的name:mychar就可以了

通常开发板不会只有这一个设备,所以在platform_device数组中,将上面的mychar_device添加进来,如下:


platform_devece的资源与数据(resource 与platform_data)

还记的在platform_device 中的struct resource *resource吗,


通常只关心struct resource中的以上四个成员变量

start 与end两个字段的值随着flags的改变而改变,当flags 为 IORESOURCE_MEM 时,start,end分别表示该platform_device 占据的内存的开始地址和结束地址,若flags为IORESOURCE_IRQ 时,start end 则表示该platform_device 使用的中断号的开始值和结束值,假如只使用了1个中断号,那么start与end相同。

例如dm9000的resource部分:

所谓的resource,具体来时是与板级硬件密切相关的,比如控制器映射到soc内存的地址范围,外部中断引脚等,

当然,要把定义的这个resources[]赋值给platform_device的.resource 字段,同时要设置.num_resources资源个数。

设备除了可以再bsp中定义资源以外,还可以附加一些数据信息,因为对设备的硬件描述除了中断,内存,DMA通道以外,可能还会有一些配置信息,而这些配置信息也依赖于板,不宜直接放置在设备驱动本身,因此platform也提供了platform_data的支持,platform_data的形式是自定义的,比如对于dm9000网卡来说,platform_data中可以存放mac地址,总线宽度,板上有误eeprom等信息。

然后将这个data赋值给platform_device中.dev的.platform_data数据项,如下:


所以在抑制linux到具体的开发板时,基本都是这么移植的是不是?回答是肯定的,这里注意了,以上与板级硬件密切相关的代码部分,均在bsp板级支持文件中,例如mach-s3c2440.c中,但是你看到了真正的驱动了吗比如字符设备的read write等函数的实现了吗。

真正的驱动代码在内核的driver文件夹下,比如dm9000的驱动在 drviver/net/文件夹下的dm9000.c中,而且这部分的代码是与具体的板级硬件无关的,再比如nandflash的驱动,配置也是在mach-s3c2440.c中,但关键的驱动源码在 drvier/mtd/nand/文件夹下

这样的结构就是linux驱动的分层思想,设备驱动的核心层与例化。



分享到:
评论

相关推荐

    从设备树构建kernel驱动platform_device的流程.pdf

    《Linux与SoC》公众号上下载的资料,写的很好,大家可以参考

    mini6410_2.6.38内核_uart1_platform_device驱动

    原创的友善之臂的mini6410 linux-2.6.38内核的uart1 串口驱动,使用platform_device方式,压缩包里面有驱动源代码、编译好了的ko文件、使用说明文档、用户例程的源代码和可执行程序,但是并没有给出直接编译驱动和...

    linux下驱动模型介绍

    注册字符设备,没有涉及到设备驱动模型,而驱动模型里,device_driver 根本没有涉及到 设备操作的函数、file_operations 等,只有一些电源管理,热插拔相关的函数。 platform_device 里也主要是resource 的管理,...

    platform_device注册例程

    platform_device注册例程

    MLX90614红外温度传感器_linux驱动源码.zip

    MLX90614红外温度传感器_linux驱动源码,已经在产品中使用过。android 6.0 ,内核版本为3.4.39,可以做为你的学习设计参考。 #include &lt;linux/kernel.h&gt; #include &lt;linux/module.h&gt; #include &lt;linux/miscdevice.h&gt; #...

    详解Linux2.6内核中基于platform机制的驱动模型

    本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型。首先介绍了Platform总线的基本概念,接着介绍了platform device和platform driver的定义和加载过程,分析了其与基类device 和driver的派生关系及在...

    嵌入式系统/ARM技术中的Linux内核中的platform机制

    Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform_driver进行注册。  Linux platform. driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一...

    Linux驱动_触摸屏1

    1.1 platform device注册在smdk2440_machine_init函数中,会注册触摸屏设备 1.2 platform driver注册sta

    linux 设备驱动模型platform driver与driver

    根据源码分析整理的linux platfom driver与device driver的关系,对初学者有较大的帮助

    linux platform架构解析资料

    Linux platform driver 机制和传统的 device driver 机制 ( 通 过 driver_register 函数进行注册 ) 相比,一个十分明显的优势在 于 platform 机制将设备本身的资源注册进内核,由内核统一管理,在驱动程 序中使用...

    论文研究-嵌入式Linux系统I2C驱动的研究与应用 .pdf

    嵌入式Linux系统I2C驱动的研究与应用,邱宏宇,余瑾,从Linux2.6内核起引入了一套全新的驱动管理和注册机制Platform_device和Platform_driver,本文将深入分析I2C总线在Linux中实现的体系结构,阐述I2

    详解Linux驱动中,probe函数何时被调用

    以前搞PCI驱动时用pci驱动注册函数就可以调用它,搞s3c2410驱动时只要在mach-smdk2410.c中的struct platform_device *smdk2410_devices {}中加入设备也会调用。但从来就没有想过具体的驱动注册并调用probe的过程。 ...

    Linux设备驱动开发?平台设备驱动

    Linux2.6的内核中引入了一种新的设备驱动模型-平台(platform)设备驱动,平台设备驱动分为平台设备(platform_device)和平台驱动(platform_driver),平台设备的引入使得Linux设备驱动更加便于移植。  一、平台设备 ...

    unix分析关于UNIX的一些浅析

    /*将device_driver中的probe,remove,shutdown函数指针指向platform_driver中的函数,后面进行驱动和设备绑定后会调用probe函数 */ if (drv-&gt;probe) drv-&gt;driver.probe = platform_drv_probe; if (drv-&gt;...

    linux内核4.7版本设备驱动介绍

    linux内核4.7版本设备驱动介绍,包含如下模块:class、pci、platform、pinctrl、kset、kobject、bus、device、device_driver、i2c、tty、regmap、misc、spin_lock、inode、mutex、cdev、gpio_keys、usb

    便携设备中嵌入式Linux电源检测驱动开发

    针对便携设备中的电源使用...采用飞思卡尔半导体的MX27处理器,设计了嵌入式Linux2.6内核下的设备驱动程序,分析了Linux2.6内核中新的驱动管理和注册机制,讨论了platform_device及platform_driver的定义和使用方法。

    Linux操作系统学习资料大全

    包含Linux Device Drivers, Linux信号处理机制,Linux内核(第三版)中文版,Linux系统调用列表,Linux虚拟内存和物理内存精华,Linux设备驱动程序中文版第三版,Proctical Unix & Internet Security,The Linux ...

    pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z

    pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z http://blog.csdn.net/21cnbao/article/details/7919055 在Android源码树中添加userspace I2C读写...

    rkisp的驱动代码

    rkisp的驱动代码首先看一下很设备树匹配用的of_device_id 目录:device/media/platform/rk-cif/cif_cif10_v4l2.c: 博客https://blog.csdn.net/qq_33487044/article/details/82191349

    Linux平台设备驱动模型

    平台总线(Platform bus)是linux2.6内核加入的一种虚拟总线,其优势在于采用了总线的模型对设备与驱动进行了管理,这样提高了程序的可移植性  2.  二、平台设备  1. 平台设备使用structplatform_device来描述:...

Global site tag (gtag.js) - Google Analytics