Linux I/O端口与I/O内存
来源:互联网 发布:海贼王启航 淘宝号 编辑:程序博客网 时间:2024/03/29 02:07
一、IO端口访问
1、直接使用IO端口操作函数
1)在设备打开或驱动模块被加载时申请IO端口区域,之后使用inb(),outb()等进行端口访问,最后在设备关闭或驱动被卸载时释放IO端口范围。流程如下:
2)struct resource *request_region(unsigned long first, unsigned long n, const char *name);
如果这段I/O端口没有被占用,在我们的驱动程序中就可以使用它。在使用之前,必须向系统登记,以防止被其他程序占用。登记后,在/proc/ioports文件中可以 看到你登记的io口。
参数1:io端口的基地址。
参数2:io端口占用的范围。
参数3:使用这段io地址的设备名。
在对I/O口登记后,就可以放心地用inb(), outb()之类的函来访问了。
request_region()用于内核为驱动“分配”端口,这里分配的意思是,记录该端口已经被某个进程使用,要是其它进程试图访问它,就会产生“忙”错误。所以目的在于实现资源的互斥访问。
反之, 如果一个资源只被一个进程访问,不会导致资源的争用,这时request_region()是可选的。
3)void release_region(unsigned long from, unsigned long num)
这个函数用来释放一块输入输出区域。
2、将IO端口重新映射
1)使其看起来像I/O内存,在设备打开或驱动模块被加载时,申请IO端口区域并使用ioport_map()映射到内存,之后使用IO内存的函数进行端口访问,最后,在设备关闭或驱动模块被卸载时释放IO端口并释放映射,流程如下:
2)void *ioport_unmap(void *addr);
ioport_map仅仅是将port加上PIO_OFFSET(64k),而ioport_unmap则什么都不做。这样portio的64k空间就被映射到虚拟地址的64k~128k之间,而ioremap返回的虚拟地址则肯定在3G之上。这样portio和mmio的虚拟地址就被统一起来。
二、IO内存访问
1)首先调用request_mem_region()申请资源,接着将寄存器地址通过ioremap()映射到内核空间的虚拟地址,之后就可以Linux设备访问编程接口访问这些虚拟地址了,访问完成后,使用iounmap()对申请的虚拟地址进行释放,并释放release_mem_region()申请的IO内存资源。流程如下:
2)void *ioremap(unsigned long phys_addr,unsigned long size);
ioremap函数用来将I/O资源的物理地址映射到内核虚拟地址空间(3G-4G),但是由Ioremap返回的地址不应直接引用,而应该使用内核提供的ioread,iowrite函数
- I/O端口 与 I/O内存
- I/O端口 与 I/O内存
- I/O端口与I/O内存
- 详解linux中I/O端口与I/O内存
- Linux I/O端口与I/O内存
- Linux I/O 端口和 I/O 内存
- 设备I/O端口与I/O内存的访问
- I/O 端口和 I/O 内存
- I/O 端口和 I/O 内存
- I/O端口和I/O内存
- I/O 端口和 I/O 内存
- I/O端口和I/O内存
- I-O 端口和 I-O 内存
- I/O端口和I/O内存
- I/O端口和I/O内存
- I/O端口、I/O内存
- I-O 端口和 I-O 内存
- I-O 端口和 I-O 内存
- baidu美化之网页标题问题最新美化规定
- linux 复制多行
- java 中this关键词的使用
- PE详解
- 一个MapReuce作业的从开始到结束--第6章Hadoop以Jar包的方式执行MapReduce任务
- Linux I/O端口与I/O内存
- axure rp教程(三)单选框效果
- UIButton
- 记一次ORA-03113: end-of-file on communication channel错误
- android端asmack获取VCard问题
- Android UI 优化-使用theme 预加载
- 解决vim中文乱码问题
- 嵌入式Linux之我行——Linux-2.6.30.4在2440上的移植之触摸屏驱动
- android 打开各种文件(setDataAndType)