Linux-2.6驱动开发 3 I/O

本文详细介绍了Linux环境下I/O操作的多种方法,包括直接通过I/O端口进行操作、通过内存映射进行操作以及同时利用I/O端口和内存映射的方式。提供了具体的API函数和应用场景说明。

I/O操作,可以直接在物理地址上操作,也可以映上到内存后在内存地址上操作,也可同时使用物理地址和内存地址进行操作。

3.1 I/O Ports

#include <linux/ioport.h>

struct resource *request_region(unsigned long first, unsigned long n,

                                const char *name);

void release_region(unsigned long start, unsigned long n);

int check_region(unsigned long first, unsigned long n);

 

#include <asm/io.h>

unsigned inb(unsigned port);

void outb(unsigned char byte, unsigned port);

unsigned inw(unsigned port);

void outw(unsigned short word, unsigned port);

unsigned inl(unsigned port);

void outl(unsigned longword, unsigned port);

void insb(unsigned port, void *addr, unsigned long count);

void outsb(unsigned port, void *addr, unsigned long count);

void insw(unsigned port, void *addr, unsigned long count);

void outsw(unsigned port, void *addr, unsigned long count);

void insl(unsigned port, void *addr, unsigned long count);

void outsl(unsigned port, void *addr, unsigned long count);

3.2 I/O Memory

#include <linux/ioport.h>

struct resource *request_mem_region(unsigned long start, unsigned long len,

                                    char *name);

void release_mem_region(unsigned long start, unsigned long len);

int check_mem_region(unsigned long start, unsigned long len);

 

#include <asm/io.h>

void *ioremap(unsigned long phys_addr, unsigned long size);

void *ioremap_nocache(unsigned long phys_addr, unsigned long size);

void iounmap(void * addr);

unsigned int ioread8(void *addr);

unsigned int ioread16(void *addr);

unsigned int ioread32(void *addr);

void iowrite8(u8 value, void *addr);

void iowrite16(u16 value, void *addr);

void iowrite32(u32 value, void *addr);

void ioread8_rep(void *addr, void *buf, unsigned long count);

void ioread16_rep(void *addr, void *buf, unsigned long count);

void ioread32_rep(void *addr, void *buf, unsigned long count);

void iowrite8_rep(void *addr, const void *buf, unsigned long count);

void iowrite16_rep(void *addr, const void *buf, unsigned long count);

void iowrite32_rep(void *addr, const void *buf, unsigned long count);

void memset_io(void *addr, u8 value, unsigned int count);

void memcpy_fromio(void *dest, void *source, unsigned int count);

void memcpy_toio(void *dest, void *source, unsigned int count);

以下是相同功能,但安全性较低,是比较旧的函数:

unsigned readb(address);

unsigned readw(address);

unsigned readl(address);

void writeb(unsigned value, address);

void writew(unsigned value, address);

void writel(unsigned value, address);

3.3 同时使用I/O Ports 方式和 I/O Memory方式

void *ioport_map(unsigned long port, unsigned int count);

void ioport_unmap(void *addr);

 

先调用I/O Ports方试的request_region,再调用ioport_map,就可以使用两种不同函数进行I/O操作了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值