[i=s] 本帖最后由 wucongdonglai 于 2011-1-7 11:58 编辑 [/i]
最近看linux的PCI驱动的编写,说是PCI设备都至少有256字节的地址空间,即用于配置寄存器的,并且前64字节是标准化的,我在
linux源文件目录下的include/linux/pci_regs.h中找到了相关配置,如
* Under PCI, each device has 256 bytes of configuration address space,
* of which the first 64 bytes are standardized as follows:
*/
#define PCI_VENDOR_ID 0x00 /* 16 bits */
#define PCI_DEVICE_ID 0x02 /* 16 bits */ 对于这2个我能看明白,就是配置空间的前4个字节分别是厂商和设备
#define PCI_COMMAND 0x04 /* 16 bits */对于这个我也能看明白,就是命令寄存器
#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */
#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */
#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */
#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */
#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */
#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */
#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */
#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */
#define PCI_COMMAND_SERR 0x100 /* Enable SERR */
#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */
#define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
#define PCI_STATUS 0x06 /* 16 bits */对于这个我也能看明白,就是状态寄存器
……
就是对应《linux设备驱动程序》12章PCI驱动程序里的图12-2
[attach]33333[/attach]
但是对于红色部分是怎么定义的?分别对应哪个我就看不明白了?怎么对应的呢?有的是0x1,难道对应配置空间的第二个字节?不是前2个字节都拿去做厂商ID了么?有的是0x100,对应第256个字节?哪位大大帮忙解释一下啊?
wucongdonglai 于 2011-01-10 13:36:36发表:
9# shenhao0129
数电还真不怎么学单片机,单片机一般都是放在微机原理里面讲的
deepwhite 于 2011-01-10 13:01:37发表:
看代码吧。
wucongdonglai 于 2011-01-10 08:45:45发表:
7# naruto01
这个应用我知道的,位的与或反么!就是具体的对应看不懂啊
wucongdonglai 于 2011-01-10 08:44:05发表:
9# shenhao0129
数电里面没有涉及这个啊,就一些简单的计时器之类的东西啊
wucongdonglai 于 2011-01-10 08:42:51发表:
5# deepwhite
就是看了名字才想不通啊,比如PCI_COMMAND 总共也就16位,冒出这个:
define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */
#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */
#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */
#define PCI_COMMAND_SERR 0x100 /* Enable SERR */
#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */
#define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
怎么对应都对应不上啊?所以就纳闷了
naruto01 于 2011-01-07 17:27:21发表:
5# deepwhite
0x04应该表示命令寄存器大小是4个字节吧
naruto01 于 2011-01-07 17:20:24发表:
[i=s] 本帖最后由 naruto01 于 2011-1-7 19:33 编辑 [/i]
应该是对不同的位置位。 不同的位定义有相关的意义,那个功能就是后面注释给出来的啦
0x01 0x02 0x04 .. 转换成二进制,不就很显然了么? 一种方法,好多地方都用到。
如果要开启好几个功能,位或'|'来实现啦
deepwhite 于 2011-01-07 16:30:39发表:
仔细看看 define 定义的这些常量的名字,从名字中也能猜出来了。
deepwhite 于 2011-01-07 16:29:27发表:
[code]
#define PCI_VENDOR_ID 0x00 /* 16 bits */
#define PCI_DEVICE_ID 0x02 /* 16 bits */
#define PCI_COMMAND 0x04 /* 16 bits */
#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */
#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */
#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */
[/code]后面的 0x1, 0x2, 0x4 等等,是PCI_COMMAND 的 subcode, 也就是详细的解释 PCI_COMMAND 这16个 bit 中的每一个 bit 的定义。
至于后面的 0x200 之类的,应该是一些特定的拓展或者掩码之类的功能。
你没必要完全掌握,用到的时候再查找就可以了。
Linux_zhanzhi 于 2011-01-07 15:19:32发表:
学硬件有啥经典教材不
wucongdonglai 于 2011-01-07 14:53:26发表:
2# shenhao0129
硬件还真没怎么学过,学过数电模电,但是对这个好像没啥用啊