唯客微博客

专注于计算机,嵌入式领域的技术

0%

Linux驱动开发杂记(0x07) - I/O端口

## 1 申请I/O 端⼝: 在驱动还没独占设备之前,不应对端⼝进⾏操作。内核提供了⼀个注册接⼝,以允许驱动声明其需要的端⼝:

1
2
3
4
/* request_region告诉内核:要使⽤first开始的n个端⼝。参数name为设备名。
如果分配成功返回值是⾮NULL;否则无法使用需要的端口(/proc/ioports包含了系统当前所有端口的分配信息,
若request_region分配失败时,可以查看该文件,看谁先用了你要的端口) */
struct resource *request_region(unsigned long first, unsigned long n, const char *name);
## 2 访问IO端⼝: 在驱动成功请求到I/O 端⼝后,就可以读写这些端⼝了。⼤部分硬件会将8位、16位和32位端⼝区分开,⽆法像访问内存那样混淆使⽤。驱动程序必须调⽤不同的函数来访问不同⼤⼩的端⼝。 Linux 内核头⽂件(体系依赖的头⽂件<asm/io.h>) 定义了下列内联函数来存取I/O端⼝:
1
2
3
4
5
6
7
8
9
10
/* inb/outb:读/写字节端⼝(8位宽)。有些体系将port参数定义为unsigned long;
⽽有些平台则将它定义为unsigned short。inb的返回类型也是依赖体系的 */
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
/* inw/outw:读/写字端⼝(16位宽) */
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
/* inl/outl:读/写32位端⼝。longword也是依赖体系的,有的体系为unsigned long;⽽有的为unsigned int */
unsigned inl(unsigned port);
void outl(unsigned longword, unsigned port);
## 3 释放IO端⼝:
1
2
3
/* ⽤完I/O端⼝后(可能在模块卸载时),应当调⽤release_region将I/O端⼝返还给系统。
参数start和n应与之前传递给request_region⼀致 */
void release_region(unsigned long start, unsigned long n);

-------------本文结束感谢您的阅读-------------

本文标题:Linux驱动开发杂记(0x07) - I/O端口

文章作者:Vinx

发布时间:2018年11月12日 - 10:06

最后更新:2023年09月18日 - 11:12

原始链接:https://blog.vinkvin.com/post/7/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。