Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158381
  • 博文数量: 40
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 355
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 18:05
文章分类
文章存档

2011年(1)

2010年(9)

2009年(16)

2008年(14)

我的朋友

分类: LINUX

2009-01-20 11:49:26

 
1.概念
I/O 端口:设备通常提供的控制寄存器、数据寄存器、状态寄存器,当它们位于I/O空间时。通过特定的指令来访问
I/O 内存:设备通常提供的控制寄存器、数据寄存器、状态寄存器,当它们位于内存空间时。
 
在硬件级别上, I/O内存区和 I/O 区域没有概念上的区别: 它们都是通过在地址总线和控制总线上发出电信号来存取(即, 读写信号),并且读自或者写到数据总线.
 
大部分嵌入式,微处理器不提供I/O空间,即没有I/O端口。
 
2 I/O 端口使用
方法1:直接用特定指令访问
#include
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);
 
方法2:将I/O端口转化为I/O内存来访问
 
 
void *ioport_map(unsigned long port, unsigned int count);
void ioport_unmap(void *addr);
3 I/O 内存使用
 
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
void *ioremap(unsigned long phys_addr, unsigned long size);
void *ioremap_nocache(unsigned long phys_addr, unsigned long size);
void iounmap(void * addr);
 
4 I/O端口读写函数
     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);
5 I/O内存读写函数
读字节
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
对应的较早版本函数为(2.6仍支持)
unsigned readb(address);
unsigned readw(address);
unsigned readl(address);
写字节
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
对应的较早版本函数为(2.6仍支持)
void writeb(unsigned value, address);
void writew(unsigned value, address);
void writel(unsigned value, address);
 
读一串
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);
复制I/O
void memcpy_fromio(void *dest, void *source, unsigned int count);
void memcpy_toio(void *dest, void *source, unsigned int count);
设置I/O
void memset_io(void *addr, u8 value, unsigned int count);
阅读(1860) | 评论(0) | 转发(0) |
0

上一篇:LDS 资料

下一篇:S3C2440的时钟设定

给主人留下些什么吧!~~