红联Linux门户
Linux帮助

linux的PCI驱动固件问题

发布时间:2011-01-07 11:08:36来源:红联作者:wucongdonglai
[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个字节?哪位大大帮忙解释一下啊?
文章评论

共有 11 条评论

  1. wucongdonglai 于 2011-01-10 13:36:36发表:

    9# shenhao0129
    数电还真不怎么学单片机,单片机一般都是放在微机原理里面讲的

  2. deepwhite 于 2011-01-10 13:01:37发表:

    看代码吧。

  3. wucongdonglai 于 2011-01-10 08:45:45发表:

    7# naruto01
    这个应用我知道的,位的与或反么!就是具体的对应看不懂啊

  4. wucongdonglai 于 2011-01-10 08:44:05发表:

    9# shenhao0129
    数电里面没有涉及这个啊,就一些简单的计时器之类的东西啊

  5. 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 */
    怎么对应都对应不上啊?所以就纳闷了

  6. naruto01 于 2011-01-07 17:27:21发表:

    5# deepwhite
    0x04应该表示命令寄存器大小是4个字节吧

  7. naruto01 于 2011-01-07 17:20:24发表:

    [i=s] 本帖最后由 naruto01 于 2011-1-7 19:33 编辑 [/i]

    应该是对不同的位置位。 不同的位定义有相关的意义,那个功能就是后面注释给出来的啦
    0x01 0x02 0x04 .. 转换成二进制,不就很显然了么? 一种方法,好多地方都用到。
    如果要开启好几个功能,位或'|'来实现啦

  8. deepwhite 于 2011-01-07 16:30:39发表:

    仔细看看 define 定义的这些常量的名字,从名字中也能猜出来了。

  9. 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 之类的,应该是一些特定的拓展或者掩码之类的功能。

    你没必要完全掌握,用到的时候再查找就可以了。

  10. Linux_zhanzhi 于 2011-01-07 15:19:32发表:

    学硬件有啥经典教材不

  11. wucongdonglai 于 2011-01-07 14:53:26发表:

    2# shenhao0129
    硬件还真没怎么学过,学过数电模电,但是对这个好像没啥用啊