高分求救:inb和outb的用法(阅读dm9000网卡驱动程序时遇到的疑惑)

沙敦府上帝发誓地方 2006-02-23 11:11:54
在dm9000网卡驱动程序中,有一个IOR函数和一个IOW函数,如下:
/*
Read a byte from I/O port
*/
static u8 ior(board_info_t *db, int reg)
{
outb(reg, db->ioaddr);
return inb(db->io_data);
}

/*
Write a byte to I/O port
*/
static void iow(board_info_t *db, int reg, u8 value)
{
outb(reg, db->ioaddr);
outb(value, db->io_data);
}

其中,board_info_t是一个结构体,如下:
/* Structure/enum declaration ------------------------------- */
typedef struct board_info {
…………
u16 ioaddr; /* Register I/O base address */
u16 io_data; /* Data I/O address */
…… ……
} board_info_t;

ioaddr和io_data是在探测函数中初始化的,如下:
static int dmfe_probe(struct net_device *dev)
{
……
db->ioaddr = iobase;//iobase是网卡的虚拟内存开始地址
db->io_data = iobase + 4;
……
}

请问:
1. ioaddr和io_data字段的含义。
2. inb和outb的用法。
3. IOR函数为什么先调用outb再调用inb?IOW函数为什么调用两次outb?

一个调用iow函数的例子:
iow(db, 0, 3);
我知道这句的意思是把值3写入相对于网卡基地址的偏移地址为0的寄存器(即NCR寄存器),但如果把iow函数展开,就是:
{
outb(0, db->ioaddr);
outb(3, db->io_data);
}

直接用
outb(3, iobase + 0);
能把3写入NCR吗?
...全文
565 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tb01412 2006-02-27
呵呵,谢谢了哈,你换台机子就不会错了,有可能你的IE什么设置没对,还有给分的时候,要输入密码才行
回复
准备把100都给你,但是一点给分那个按钮就显示script error,不知是何原因?
回复
tb01412 2006-02-23
读写8位宽的I/O端口:
unsigned char inb(unsigned port);
void outb(unsigned char value,unsigned port)
至于在某些地方为何要操作几个相应的端口,请参阅你相应的硬件资料

outb(0, db->ioaddr);
outb(3, db->io_data);
意思是先向db->ioaddr写入0,再向db->io_data写入3,跟你的硬件相关,这是由硬件决定的,你一定要仔细读你的芯片资料!!!!
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4152

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2006-02-23 11:11
社区公告
暂无公告