您的位置:首页 > 其它

硬件访问

2016-06-14 09:37 197 查看
(一) 内存地址空间和IO地址空间

每种外设都是通过读写寄存器进行控制。大部分外设都有几个寄存器,不管是在内存地址空间还是在IO地址空间,而且这些寄存器的访问地址都是连续的。在硬件层,IO空间和内存空间没有概念上的区别,都是先通过向控制总线和地址总线发送信号进行访问,然后再通过数据总线读写数据。

有些CPU厂商在他们的芯片上使用单一的地址空间,有些除了有内存地址空间外还保留了独立的IO地址空间。目前主流的CPU中,除了x86系列有独立的IO地址空间外,其余的如arm、mips等都没有独立的IO地址空间。IO地址空间一般很小,大约有64kB,而内存空间则有4GB。

(二)IO端口和IO内存

什么是IO端口,什么的IO内存呢?简单的说,当一个reg/mem出现在IO地址空间时我们称之为IO端口;当一个reg/mem出现在内存地址空间时,我们称之为IO内存。操作IO端口和操作IO内存是有一点差别的。

(三)操作IO端口

操作IO端口的一般步骤:申请、访问、释放。
1、申请:      
#include<linux/ioport.h>
struct resource *request_region(ulong first,  ulong n,  const char *name);

这个函数告诉内核,我们要使用起始于first的n个端口,参数name是设备的名称。如果分配成功,则返回非NULL值。

所有的端口分配,都可以从/proc/ioports中查看到。如果我们不能分配到IO端口,可以从这里看到哪些驱动程序使用了这些端口。
2、访问:

#include<linux/io.h>
// 读访问
unsigned inb(unsigned port);
unsigned
inw(unsigned port);

unsigned
inl(unsigned port);

//
写访问
void outb(uchar byte, unsigned port);
void outw(uchar byte, unsigned port);
void outl(uchar byte, unsigned port);
3、释放:
#include<linux/ioport.h>

void *release_region(ulong first, ulong n);

(四)操作IO内存

操作IO内存的一般步骤:申请、映射、访问、释放。

1、申请:
struct resource *request_mem_region(ulong first,  ulong n,  const char *name);
2、映射:
void *ioremap(ulong phys_addr, ulong size);
3、访问:
// 读访问
uint ioread8(void *addr);
uint ioread16(void *addr);

uint
ioread32(void *addr);

//
写访问
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
4、释放:
void *iounremap(ulong phys_addr, ulong size);
void release_mem_region(ulong first, ulong n, const char *name);

相对于IO端口,这里多了一个解除映射的过程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: