如何设计平台设备和驱动.docx
《如何设计平台设备和驱动.docx》由会员分享,可在线阅读,更多相关《如何设计平台设备和驱动.docx(17页珍藏版)》请在咨信网上搜索。
1、_如何设计平台设备和驱动2.6内核引入了platform机制,能够实现对设备所占用的资源进行统一管理。Platform机制抽象出了platform_device和platform_driver两个核心概念,与此相关的还有一个重要概念就是资源resource。1.1.1 资源1 描述和类型资源resource是对设备所占用的硬件信息的抽象,目前包括I/O、内存、IRQ、DMA、BUS这5类。在内核中,用resource结构来对资源进行描述。resource结构在文件中定义,如程序清单2.1所示。程序清单Error! No text of specified style in document.1
2、 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、IRQ等,在中定义,各资源类型和定义如下:#define IORESOURC
3、E_TYPE_BITS 0x00001f00 /*资源类型*/#define IORESOURCE_IO 0x00000100#define IORESOURCE_MEM 0x00000200#define IORESOURCE_IRQ 0x00000400#define IORESOURCE_DMA 0x00000800#define IORESOURCE_BUS 0x000010002 资源定义一个设备的资源定义可以同时包含所占用的多种资源。例如,对于一个既占用内存资源,又占用IRQ中断资源的设备,其资源定义可以如程序清单2.2所示。程序清单Error! No text of specif
4、ied 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,/* 资源类型:IORESOURCE_MEM*/ , 1 = /* IRQ资源 */ .start = IRQ_GPIO_04, .end = IR
5、Q_GPIO_04, .flags = IORESOURCE_IRQ,/* 资源类型:IORESOURCE_IRQ*/ ;3 资源获取定义了一个设备的资源后,需通过特定函数获取才能使用,这些函数在文件中定义,一共有3个函数,分别是:platform_get_resource()、platform_get_resource_byname()、platform_get_irq()和platform_get_irq_byname()。platform_get_resource()函数用于获取指定类型的资源,函数原型如下:extern struct resource *platform_get_res
6、ource(struct platform_device *, unsigned int, unsigned int);dev指向包含资源定义的platform_device结构;type表示将要获取的资源类型;num表示获取资源的数量。返回值为0表示获取失败,成功返回申请的资源地址。platform_get_resource_byname()则是根据平台设备的设备名称获取指定类型的资源,函数原型如下:extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, cons
7、t char *);另外,内核还单独提供了获取IRQ的接口函数platform_get_irq(),实际上就是platform_get_resource()获取IORESOURCE_IRQ的封装,方便用户使用。原型如下:int platform_get_irq(struct platform_device *dev, unsigned int num);获取设备的私有数据,可通过宏platform_get_drvdata实现:#define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)-dev)实际上是获取_dev-dev-p-drive
8、r_data,可参考Error! Reference source not found. device结构的定义。platform_get_irq_byname()则可根据平台设备名称获取设备的IRQ资源,函数原型如下:extern int platform_get_irq_byname(struct platform_device *, const char *);在驱动编写中如何实际使用这些函数,下面给出一个代码片段,如程序清单2.3所示。程序清单Error! No text of specified style in document.3平台资源获取和使用范例 if (!mem) res
9、 = 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_get_irq(pdev, 0);/* 获取IRQ资源*/ if (!request_mem_region (mem, AX88796B_IO_EXTENT, ax88796b) /* 申请IO内存*/ PRINTK (ERROR_MSG, PFX req
10、uest_mem_region fail !); return -EBUSY; addr = ioremap_nocache(mem, AX88796B_IO_EXTENT);/* 内存映射ioremap*/ if (!addr) ret = -EBUSY; goto release_region; 该范例演示了内存资源和IRQ资源的获取和使用。特别说明一下内存资源,在定义内存资源的时候,通常使用内存的物理地址,而在驱动中须转换为虚拟地址使用,所以需要进行ioremap操作,而在ioremap之前又需要先申请IO内存,所以在代码中看到的是先使用request_mem_region()函数申请I
11、O内存,然后再通过ioremap_nocache()函数完成内存映射。1.1.2 平台设备并不是任何设备都可以抽象成为platform_device。platform_device是在系统中以独立实体出现的设备,包括传统的基于端口的设备、主机到外设的总线以及大部分片内集成的控制器等。这些设备的一个共同点是CPU都可以通过总线直接对它们进行访问。在极少数情况下,一个platform_device可能会经过一小段其它总线,但是它的寄存器依然可以被CPU直接访问。1 platform_device用于描述平台设备的数据结构是platform_device,在文件中定义,如程序清单2.4所示。程序清单
12、Error! No text of specified style in document.4 platform_device数据结构struct platform_device const char * name;/* 设备名称*/ int id;/* 设备ID*/ struct device dev;/* 设备的device数据结构*/ u32 num_resources;/* 资源的个数*/ struct resource * resource;/* 设备的资源*/ const struct platform_device_id *id_entry;/* 设备ID入口*/ /*体系结构相
13、关的附加项*/ 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 c
14、har *name, int id);3 添加资源通过platform_device_alloc()申请得到的platform_device结构,必须添加相关资源和私有数据才能进行注册。添加资源的函数是platform_device_add_resources:int platform_device_add_resources(struct platform_device *pdev, const struct resource *res, unsigned int num);添加私有数据的函数是platform_device_add_data:int platform_device_add_
15、data(struct platform_device *pdev, const void *data, size_t size);4 注册和注销platform_device申请到platform_device结构后,可以通过platform_device_register()往系统注册,platform_device_register()函数原型如下:int platform_device_register(struct platform_device *pdev);platform_device_register()只能往系统注册一个platform_device,如果有多个platfo
16、rm_device,可以用platform_add_devices()一次性完成注册,platform_add_devices()函数原型如下:int platform_add_devices(struct platform_device *devs, int num);通过platform_device_unregister()可以注销系统的platform_device,platform_device_unregister()函数原型如下:void platform_device_unregister(struct platform_device *pdev);如果已经定义了设备的资源和私
17、有数据,可以用platform_device_register_resndata()一次性完成数据结构申请、资源和私有数据添加以及设备注册:struct platform_device *_init_or_module platform_device_register_resndata( struct device *parent, const char *name, int id, const struct resource *res, unsigned int num, const void *data, size_t size);platform_device_register_simp
18、le()函数是platform_device_register_resndata()函数的简化版,可以一步实现分配和注册设备操作,platform_device_register_simple()函数原型如下:static inline struct platform_device *platform_device_register_simple( const char *name, int id, const struct resource *res, unsigned int num);实际上就是:platform_device_register_resndata(NULL, name,
19、id, res, num, NULL, 0)。在文件还提供了更多的platform_device相关的操作接口函数,在有必要的时候可以查看并使用。5 向系统添加平台设备的流程向系统添加一个平台设备,可以通过两种方式完成:l 方式1:定义资源,然后定义platform_device结构并初始化;最后注册;l 方式2:定义资源,然后动态分配一个platform_device结构,接着往结构添加资源信息,最后注册。两种方式归纳如图2.1所示。图Error! No text of specified style in document.1添加平台设备的方式1.1.3 平台驱动1 platform_dr
20、iverplatform_driver是device_driver的封装,提供了驱动的probe和remove方法,也提供了与电源管理相关的shutdown和suspend等方法,如程序清单2.5所示。程序清单Error! No text of specified style in document.5platform_driver数据结构struct platform_driver int (*probe)(struct platform_device *);/* probe方法*/ int (*remove)(struct platform_device *);/* remove方法*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 设计 平台 设备 驱动
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。