嵌入式Linu访问外设IO资源的方式小结__基于s3c6410.doc

嵌入式Linu访问外设IO资源的方式小结__基于s3c6410.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式Linu访问外设IO资源的方式小结__基于s3c6410

Linux驱动程序中,访问外设I/O资源的方式小结(基于s3c6410) Linux外设I/O资源是不在内核空间中的(如sram或硬件接口寄存器等),若需要访问该外设I/O资源,必须先将其地址映射到内核空间中来,然后才能在内核空间中访问它。 Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc)。 一、动态映射(ioremap)方式 动态映射方式是大家使用了比较多的,也比较简单。即直接通过内核提供的ioremap函数动态创建一段外设I/O内存资源到内核虚拟地址的映射表,从而可以在内核空间中访问这段I/O资源。 Ioremap宏定义在asm/io.h内: #define ioremap(cookie,size)? ?? ?? ???__ioremap(cookie,size,0) __ioremap函数原型为(arm/mm/ioremap.c): void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags); phys_addr:要映射的起始的IO地址 size:要映射的空间的大小 flags:要映射的IO空间和权限有关的标志 该函数返回映射后的内核虚拟地址(3G-4G). 接着便可以通过读写该返回的内核虚拟地址去访问之这段I/O内存资源。 举一个简单的例子: (取自s3c2410的iis音频驱动) 比如我们要访问s3c2410平台上的I2S寄存器, 查看datasheet 知道IIS物理地址为0我们把它定义为宏S3C2410_PA_IIS,如下: #define S3C2410_PA_IIS? ? (0 若要在内核空间(iis驱动)中访问这段I/O寄存器(IIS)资源需要先建立到内核地址空间的映射: our_card-regs = ioremap(S3C2410_PA_IIS, 0x100);? if (our_card-regs == NULL) { ? ?? ?? ?err = -ENXIO; ? ?? ?? ?goto exit_err; } 创建好了之后,我们就可以通过readl(our_card-regs )或writel(value, our_card-regs)等IO接口函数去访问它。 二、静态映射(map_desc)方式 下面重点介绍静态映射方式即通过map_desc结构体静态创建I/O资源映射表。 内核提供了在系统启动时通过map_desc结构体静态创建I/O资源到内核地址空间的线性映射表(即page table)的方式,这种映射表是一种一一映射的关系。程序员可以自己定义该I/O内存资源映射后的虚拟地址。创建好了静态映射表,在内核或驱动中访问该I/O资源时则无需再进行ioreamp动态映射,可以直接通过映射后的I/O虚拟地址去访问它。 下面详细分析这种机制的原理并举例说明如何通过这种静态映射的方式访问外设I/O内存资源。 内核提供了一个重要的结构体struct machine_desc ,这个结构体在内核移植中起到相当重要的作用,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。 machine_desc结构体的成员包含了体系架构相关部分的几个最重要的初始化函数,包括map_io, init_irq, init_machine以及phys_io , timer成员等。 machine_desc结构体定义如下: struct machine_desc { ? ? /* ? ???* Note! The first four elements are used ? ???* by assembler code in head-armv.S ? ???*/ ? ? unsigned int? ?? ???nr;? ?? ???/* architecture number? ? */ ? ? unsigned int? ?? ???phys_io;? ? /* start of physical io? ? */ ? ? unsigned int? ?? ???io_pg_offst;? ? /* byte offset for io? ? ?? ?? ?? ?? ?? ?? ?? ? * page tabe entry? ? */ ? ? const char? ?? ???*name;? ?? ???/* architecture name? ? */ ? ? unsigned long? ?? ???boot_params;? ? /* tagged list? ?? ???*/ ? ? un

文档评论(0)

youshen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档