- 论坛徽章:
- 0
|
原帖由 epegasus 于 2008-3-24 14:40 发表
zx_wing 老大可否就这段代码讲解一下?
phymem = pci_resource_start(pdev, 0);
if (!request_mem_region(phymem, pci_resource_len(pdev, 0), "eth")) {
printk(KERN_ERR "eth_pci: cannot ...
这个就是驱动使用PCI bar的方式了。大概是这么一个意思:
request_mem_region()把设备PCI bar占用的的物理地址空间预留出来,pci_resource_start()得到设备PCI bar地址,用ioremap把这个地址映射到虚拟地址空间,然后把基地址返回给mem。
以后操作设备的寄存器,就用mem+offset的方式了,例如:
outb(mem_0x10, 0xff)
通常为了方便,是会根据设备的spec,定义一个结构体来描述这些寄存器的,而不会直接用mem这种得到基地址的方式。例如:
- struct control_reg
- {
- int reg1;
- int reg2;
- int reg3;
- ......
- int reg;
- } csr;
- csr = ioremap( pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
- //然后
- crs.reg1 = 0xff; //就是写设备的寄存器1了
复制代码 |
|