linux中platformdevice与platformdriver小结_第1页
linux中platformdevice与platformdriver小结_第2页
linux中platformdevice与platformdriver小结_第3页
linux中platformdevice与platformdriver小结_第4页
linux中platformdevice与platformdriver小结_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linux 内核驱动 -Platform Device和 Platform_driver注册过程从 Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Platform_driver 。Linux 中大部分的设备驱动,都可以使用这套机制 , 设备用 Platform_device 表示,驱动用 Platform_driver 进行注册。Linux platform driver 机制和传统的 device driver 机制 ( 通过 driver_register 函数进行注册 相比, 一个十分明显的优势在于 platform 机制将设备本身的资 源

2、注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过 platform device 提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性, 并且拥有较好的可移植性和安全性 ( 这些标准接口是安全的 。Platform 机 制 的 本 身 使 用 并 不 复 杂 , 由 两 部 分 组 成 :platform_device 和 platfrom_driver 。通 过 Platform 机 制 开 发 发 底 层 驱 动 的 大 致 流 程 为 : 定 义 platform_add_devices 注册 platform_device, 定义 platform_add_driv

3、er 注册 platform_driver 。1、 platform_device注册过程:首先要确认的就是设备的资源信息,例如设备的地址,中断号等。在 2.6 内核中 platform 设备用结构体 platform_device 来描述,该结构体定义 在 kernel/include/linux/platform_device.h 中,struct platform_device const char * name;int id;struct device dev;u32 num_resources;struct resource * resource ;struct platform_d

4、evice_id *id_entry;该结构一个重要的元素是 resource ,该元素存入了最为重要的设备资源信息, 定义在 kernel/include/linux/ioport.h 中,struct resource resource_size_t start;resource_size_t end;const char *name;unsigned long flags;struct resource *parent, *sibling, *child;下面举 s3c6410 平台的 i2c 驱动作为例子来说明:static struct platform_device *smdk64

5、10_devices _initdata = #ifdef CONFIG_SMDK6410_SD_CH0&s3c_device_hsmmc0,#endif#ifdef CONFIG_SMDK6410_SD_CH1&s3c_device_hsmmc1,#endif&s3c_device_i2c0 ,&s3c_device_i2c1,&s3c_device_fb,&s3c_device_usb,&s3c_device_usb_hsotg,&smdk6410_lcd_powerdev,&smdk6410_smsc911x,;把一

6、个或几个设备资源放在一起,便于集中管理 , 其中 IIC 设备 platform_device如下:struct platform_device s3c_device_i2c0 = .name = "s3c2410-i2c",#ifdef CONFIG_S3C_DEV_I2C1.id = 0,#else.id = -1,#endif.num_resources = ARRAY_SIZE(s3c_i2c_resource ,.resource = s3c_i2c_resource,;具体 resource 如下:static struct resource s3c_i2c_r

7、esource = 0 = .start = S3C_PA_IIC,.end = S3C_PA_IIC + SZ_4K - 1,.flags = IORESOURCE_MEM,1 = .start = IRQ_IIC,.end = IRQ_IIC,.flags = IORESOURCE_IRQ,;这里定义了两组 resource ,它描述了一个 I2C 设备的资源,第 1 组描述了这 个 I2C 设备所占用的总线地址范围, IORESOURCE_MEM 表示第 1 组描述 的 是 内 存 类 型 的 资 源 信 息 , 第 2 组 描 述 了 这 个 I2C 设 备 的 中 断 号 , IOR

8、ESOURCE_IRQ 表示第 2 组描述的是中断资源信息。 设备驱动会根据 flags 来获取相应的资源信息。定义好了 platform_device 结构体后就可以调用函数 platform_add_devices 向系 统中添加该设备了,之后可以调用 platform_driver_register( 进行设备注册。s3c6410-i2c 的 platform_device是在系统启动时,在 mach-smdk6410.c 里的 smdk6410_machine_init(函数里进行注册的, 这个函数申明为 arch_initcall的函数 调用, arch_initcall的优先级高于

9、 module_init。所以会在 Platform 驱动注册之前 调用。 (详细参考 imach-smdk6410.cstatic void _init smdk6410_machine_init(voids3c_i2c0_set_platdata(NULL;s3c_i2c1_set_platdata(NULL;s3c_fb_set_platdata(&smdk6410_lcd_pdata;gpio_request(S3C64XX_GPN(5, "LCD power"gpio_request(S3C64XX_GPF(13, "LCD power"

10、;gpio_request(S3C64XX_GPF(15, "LCD power"i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0;i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1;platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices; /添加多设备int platform_add_devices(struct platform_device *devs, in

11、t numint i, ret = 0;for (i = 0; i < num; i+ ret = platform_device_register(devsi;if (ret while (-i >= 0platform_device_unregister(devsi;break;return ret;int platform_device_register(struct platform_device *pdevdevice_initialize(&pdev->dev;return platform_device_add(pdev;int platform_dev

12、ice_add(struct platform_device *pdevint i, ret = 0;if (!pdevreturn -EINVAL;if (!pdev->dev.parentpdev->dev.parent = &platform_bus;pdev->dev.bus = &platform_bus_type;if (pdev->id != -1dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id;/如果有 id 表示有多个同类设备用 p

13、dev->name和 pdev->id标识该设备elsedev_set_name(&pdev->dev, "%s", pdev->name;/否则,只用 pdev->name标识该设备for (i = 0; i < pdev->num_resources; i+ struct resource *p, *r = &pdev->resourcei;if (r->name = NULLr->name = dev_name(&pdev->dev;p = r->parent;if (!p

14、 if (resource_type(r = IORESOURCE_MEMp = &iomem_resource; / 作为 IOMEM 资源分配else if (resource_type(r = IORESOURCE_IOp = &ioport_resource; / 作为 IO PORT资源分配if (p && insert_resource(p, r / 将新的 resource 插入内核 resource treeprintk(KERN_ERR"%s: failed to claim resource %d/n",dev_name(&pdev->dev, i;ret = -EBUSY;goto failed;pr_debug("Registering platform device '%s'. Parent at %s/n",dev_name(&pdev->dev, dev_name(pdev->dev.parent;ret = device_add(&am

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论