如何设计平台设备和驱动

上传人:好** 文档编号:116876505 上传时间:2019-11-17 格式:DOCX 页数:15 大小:167.20KB
返回 下载 相关 举报
如何设计平台设备和驱动_第1页
第1页 / 共15页
如何设计平台设备和驱动_第2页
第2页 / 共15页
如何设计平台设备和驱动_第3页
第3页 / 共15页
如何设计平台设备和驱动_第4页
第4页 / 共15页
如何设计平台设备和驱动_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《如何设计平台设备和驱动》由会员分享,可在线阅读,更多相关《如何设计平台设备和驱动(15页珍藏版)》请在金锄头文库上搜索。

1、嵌入式产品 广州致远电子有限公司如何设计平台设备和驱动2.6内核引入了platform机制,能够实现对设备所占用的资源进行统一管理。Platform机制抽象出了platform_device和platform_driver两个核心概念,与此相关的还有一个重要概念就是资源resource。1.1.1 资源1 描述和类型资源resource是对设备所占用的硬件信息的抽象,目前包括I/O、内存、IRQ、DMA、BUS这5类。在内核中,用resource结构来对资源进行描述。resource结构在<linux/ioport.h>文件中定义,如程序清单2.1所示。程序清单Error! No

2、text of specified style in document.1 resource数据结构struct resource resource_size_t start;/* 资源在CPU上的物理起始地址*/ resource_size_t end;/* 资源在CPU上的物理结束地址*/ const char *name;/* 资源名称*/ unsigned long flags;/* 资源的标志*/ struct resource *parent, *sibling, *child;/* 资源的父亲、兄弟和子资源*/;flags通常被用来表示资源的类型,可用的资源类型有IO、MEM、I

3、RQ等,在<linux/ioport.h>中定义,各资源类型和定义如下:#define IORESOURCE_TYPE_BITS 0x00001f00 /*资源类型*/#define IORESOURCE_IO 0x00000100#define IORESOURCE_MEM 0x00000200#define IORESOURCE_IRQ 0x00000400#define IORESOURCE_DMA 0x00000800#define IORESOURCE_BUS 0x000010002 资源定义一个设备的资源定义可以同时包含所占用的多种资源。例如,对于一个既占用内存资源,又

4、占用IRQ中断资源的设备,其资源定义可以如程序清单2.2所示。程序清单Error! No text of specified style in document.2资源定义实例#define EMC_CS2_BASE0x11000000/* 总线片选地址*/static struct resource ecm_ax88796b_resource = 0 = /* 内存资源 */ .start = EMC_CS2_BASE,/* 起始地址*/ .end = EMC_CS2_BASE + 0xFFF,/* 结束地址*/ .flags = IORESOURCE_MEM,/* 资源类型:IORESOU

5、RCE_MEM*/ , 1 = /* IRQ资源 */ .start = IRQ_GPIO_04, .end = IRQ_GPIO_04, .flags = IORESOURCE_IRQ,/* 资源类型:IORESOURCE_IRQ*/ ;3 资源获取定义了一个设备的资源后,需通过特定函数获取才能使用,这些函数在<linux/platform_device.h>文件中定义,一共有3个函数,分别是:platform_get_resource()、platform_get_resource_byname()、platform_get_irq()和platform_get_irq_byn

6、ame()。platform_get_resource()函数用于获取指定类型的资源,函数原型如下:extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);dev指向包含资源定义的platform_device结构;type表示将要获取的资源类型;num表示获取资源的数量。返回值为0表示获取失败,成功返回申请的资源地址。platform_get_resource_byname()则是根据平台设备的设备名称获取指定类型的资源,函数原型如下:extern

7、struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *);另外,内核还单独提供了获取IRQ的接口函数platform_get_irq(),实际上就是platform_get_resource()获取IORESOURCE_IRQ的封装,方便用户使用。原型如下:int platform_get_irq(struct platform_device *dev, unsigned int num);获取设备的私有数据,可通过宏platform_get_drvda

8、ta实现:#define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)实际上是获取_dev->dev->p->driver_data,可参考Error! Reference source not found. device结构的定义。platform_get_irq_byname()则可根据平台设备名称获取设备的IRQ资源,函数原型如下:extern int platform_get_irq_byname(struct platform_device *, const char *);在驱动编写

9、中如何实际使用这些函数,下面给出一个代码片段,如程序清单2.3所示。程序清单Error! No text of specified style in document.3平台资源获取和使用范例 if (!mem) res = platform_get_resource (pdev, IORESOURCE_MEM, 0);/* 获取内存资源*/ if (!res) printk("%s: get no resource !n", DRV_NAME); return -ENODEV; mem = res->start; if(!irq) irq = platform_ge

10、t_irq(pdev, 0);/* 获取IRQ资源*/ if (!request_mem_region (mem, AX88796B_IO_EXTENT, "ax88796b") /* 申请IO内存*/ PRINTK (ERROR_MSG, PFX " request_mem_region fail !"); return -EBUSY; addr = ioremap_nocache(mem, AX88796B_IO_EXTENT);/* 内存映射ioremap*/ if (!addr) ret = -EBUSY; goto release_region

11、; 该范例演示了内存资源和IRQ资源的获取和使用。特别说明一下内存资源,在定义内存资源的时候,通常使用内存的物理地址,而在驱动中须转换为虚拟地址使用,所以需要进行ioremap操作,而在ioremap之前又需要先申请IO内存,所以在代码中看到的是先使用request_mem_region()函数申请IO内存,然后再通过ioremap_nocache()函数完成内存映射。1.1.2 平台设备并不是任何设备都可以抽象成为platform_device。platform_device是在系统中以独立实体出现的设备,包括传统的基于端口的设备、主机到外设的总线以及大部分片内集成的控制器等。这些设备的一个

12、共同点是CPU都可以通过总线直接对它们进行访问。在极少数情况下,一个platform_device可能会经过一小段其它总线,但是它的寄存器依然可以被CPU直接访问。1 platform_device用于描述平台设备的数据结构是platform_device,在<linux/platform_device.h>文件中定义,如程序清单2.4所示。程序清单Error! No text of specified style in document.4 platform_device数据结构struct platform_device const char * name;/* 设备名称*/

13、int id;/* 设备ID*/ struct device dev;/* 设备的device数据结构*/ u32 num_resources;/* 资源的个数*/ struct resource * resource;/* 设备的资源*/ const struct platform_device_id *id_entry;/* 设备ID入口*/ /*体系结构相关的附加项*/ struct pdev_archdata archdata;/* 体系结构相关的数据*/;name是设备的名称,用于与platform_driver进行匹配绑定,resourse用于描述设备的资源如地址、IRQ等。2 分配platform_device结构注册一个platform_device之前,必须先定义或者通过platform_device_alloc()函数为设备分配一个platform_device结构,platform_device_alloc()函数原型如下:struct platform_device *platform_device_alloc(const char *nam

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号