如何设计平台设备和驱动Word格式.docx

上传人:b****0 文档编号:13273617 上传时间:2022-10-09 格式:DOCX 页数:18 大小:83.97KB
下载 相关 举报
如何设计平台设备和驱动Word格式.docx_第1页
第1页 / 共18页
如何设计平台设备和驱动Word格式.docx_第2页
第2页 / 共18页
如何设计平台设备和驱动Word格式.docx_第3页
第3页 / 共18页
如何设计平台设备和驱动Word格式.docx_第4页
第4页 / 共18页
如何设计平台设备和驱动Word格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

如何设计平台设备和驱动Word格式.docx

《如何设计平台设备和驱动Word格式.docx》由会员分享,可在线阅读,更多相关《如何设计平台设备和驱动Word格式.docx(18页珍藏版)》请在冰豆网上搜索。

如何设计平台设备和驱动Word格式.docx

resource_size_tend;

/*资源在CPU上的物理结束地址*/

constchar*name;

/*资源名称*/

unsignedlongflags;

/*资源的标志*/

structresource*parent,*sibling,*child;

/*资源的父亲、兄弟和子资源*/

};

flags通常被用来表示资源的类型,可用的资源类型有IO、MEM、IRQ等,在<

中定义,各资源类型和定义如下:

#defineIORESOURCE_TYPE_BITS0x00001f00/*资源类型*/

#defineIORESOURCE_IO0x00000100

#defineIORESOURCE_MEM0x00000200

#defineIORESOURCE_IRQ0x00000400

#defineIORESOURCE_DMA0x00000800

#defineIORESOURCE_BUS0x00001000

2.资源定义

一个设备的资源定义可以同时包含所占用的多种资源。

例如,对于一个既占用内存资源,又占用IRQ中断资源的设备,其资源定义可以如程序清单2.36所示。

程序清单2.36资源定义实例

#defineEMC_CS2_BASE0x11000000/*总线片选地址*/

staticstructresourceecm_ax88796b_resource[]={

[0]={/*内存资源*/

.start=EMC_CS2_BASE,/*起始地址*/

.end=EMC_CS2_BASE+0xFFF,/*结束地址*/

.flags=IORESOURCE_MEM,/*资源类型:

IORESOURCE_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_byname()。

platform_get_resource()函数用于获取指定类型的资源,函数原型如下:

externstructresource*platform_get_resource(structplatform_device*,unsignedint,unsignedint);

dev指向包含资源定义的platform_device结构;

type表示将要获取的资源类型;

num表示获取资源的数量。

返回值为0表示获取失败,成功返回申请的资源地址。

platform_get_resource_byname()则是根据平台设备的设备名称获取指定类型的资源,函数原型如下:

externstructresource*platform_get_resource_byname(structplatform_device*,unsignedint,constchar*);

另外,内核还单独提供了获取IRQ的接口函数platform_get_irq(),实际上就是platform_get_resource()获取IORESOURCE_IRQ的封装,方便用户使用。

原型如下:

intplatform_get_irq(structplatform_device*dev,unsignedintnum);

获取设备的私有数据,可通过宏platform_get_drvdata实现:

#defineplatform_get_drvdata(_dev)dev_get_drvdata(&

(_dev)->

dev)

实际上是获取_dev->

dev->

p->

driver_data,可参考程序清单2.29device结构的定义。

platform_get_irq_byname()则可根据平台设备名称获取设备的IRQ资源,函数原型如下:

externintplatform_get_irq_byname(structplatform_device*,constchar*);

在驱动编写中如何实际使用这些函数,下面给出一个代码片段,如程序清单2.37所示。

程序清单2.37平台资源获取和使用范例

if(!

mem){

res=platform_get_resource(pdev,IORESOURCE_MEM,0);

/*获取内存资源*/

res){

printk("

%s:

getnoresource!

\n"

DRV_NAME);

return-ENODEV;

mem=res->

start;

if(!

irq)

irq=platform_get_irq(pdev,0);

/*获取IRQ资源*/

request_mem_region(mem,AX88796B_IO_EXTENT,"

ax88796b"

)){/*申请IO内存*/

PRINTK(ERROR_MSG,PFX"

request_mem_regionfail!

"

);

return-EBUSY;

addr=ioremap_nocache(mem,AX88796B_IO_EXTENT);

/*内存映射ioremap*/

addr){

ret=-EBUSY;

gotorelease_region;

该范例演示了内存资源和IRQ资源的获取和使用。

特别说明一下内存资源,在定义内存资源的时候,通常使用内存的物理地址,而在驱动中须转换为虚拟地址使用,所以需要进行ioremap操作,而在ioremap之前又需要先申请IO内存,所以在代码中看到的是先使用request_mem_region()函数申请IO内存,然后再通过ioremap_nocache()函数完成内存映射。

1.1.2平台设备

并不是任何设备都可以抽象成为platform_device。

platform_device是在系统中以独立实体出现的设备,包括传统的基于端口的设备、主机到外设的总线以及大部分片内集成的控制器等。

这些设备的一个共同点是CPU都可以通过总线直接对它们进行访问。

在极少数情况下,一个platform_device可能会经过一小段其它总线,但是它的寄存器依然可以被CPU直接访问。

1.platform_device

用于描述平台设备的数据结构是platform_device,在<

文件中定义,如程序清单2.38所示。

程序清单2.38platform_device数据结构

structplatform_device{

constchar*name;

/*设备名称*/

intid;

/*设备ID*/

structdevicedev;

/*设备的device数据结构*/

u32num_resources;

/*资源的个数*/

structresource*resource;

/*设备的资源*/

conststructplatform_device_id*id_entry;

/*设备ID入口*/

/*体系结构相关的附加项*/

structpdev_archdataarchdata;

/*体系结构相关的数据*/

name是设备的名称,用于与platform_driver进行匹配绑定,resourse用于描述设备的资源如地址、IRQ等。

2.分配platform_device结构

注册一个platform_device之前,必须先定义或者通过platform_device_alloc()函数为设备分配一个platform_device结构,platform_device_alloc()函数原型如下:

structplatform_device*platform_device_alloc(constchar*name,intid);

3.添加资源

通过platform_device_alloc()申请得到的platform_device结构,必须添加相关资源和私有数据才能进行注册。

添加资源的函数是platform_device_add_resources:

intplatform_device_add_resources(structplatform_device*pdev,conststructresource*res,unsignedintnum);

添加私有数据的函数是platform_device_add_data:

intplatform_device_add_data(structplatform_device*pdev,constvoid*data,size_tsize);

4.注册和注销platform_device

申请到platform_device结构后,可以通过platform_device_register()往系统注册,platform_device_register()函数原型如下:

intplatform_device_register(structplatform_device*pdev);

platform_device_register()只能往系统注册一个platform_device,如果有多个platform_device,可以用platform_add_devices()一次性完成注册,platform_add_devices()函数原型如下:

intplatform_add_devices(structplatform_device**de

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1