高分求救:inb和outb的用法(阅读dm9000网卡驱动程序时遇到的疑惑)
在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吗?