intel 的810芯片组有一些GPIO,一般将这些GPIO用作I2C总线来连接显示设备,以便用来获取DDC数据等,也可用来向显示设备传递数据。
根据Intel i810的programer manual。 810有两组GPIO, GPIOA和GPIOB,每一组GPIO对应两个pin,目前没有945的programer manual,但是从xf86-video-intel的开源驱动来看,945应该至少有8组GPIO, GPIOA-GPIOH。
对于GPIO的访问,首先要获得display controller这个PCI设备映射到系统空间中的memory的基地址,这个可通过读取pci配置空间得到。例如,对于945芯片组中集成的显示控制器, 一般是设备2功能0, 和设备2功能1。至于为什么会有两个,现在还不是很清楚。 在linux下可以很容易从/proc文件系统读到pci设备配置空间的内容,其中MMADR(0x10-0x13)为该pci设备映射到系统的基地址,其中bit19-bit31为基地址, bit0-bit18是其他一些信息(i810 programer manual)。
得到基地址后,从偏移0x5010开始,为GPIO的寄存器:
0x5010-0x5013 -> GPIOA
0x5014-0x5017 -> GPIOB
0x5018-0x501b -> GPIOC
......
每组GPIO(对应两个pin)由一个32为宽的寄存器控制,具体格式可参考i810 programer manual。对这些GPIO编程就可以模拟I2C总线时序,从而能读取DDC数据,代码可以参考xf86-video-intel。
另外,虽然没有945 programer manual,但是945的GPIO的控制方法应该和810是一样的,只不过945会多几组GPIO。还有上面提到会有两个pci设备。我从一个实际的系统来看,发现他们分别映射到0xfde8000 和 0xfdf0000, 读取发现两个地方的内容是一样的,但还没有测试这两个地方是不是重叠的。
根据Intel i810的programer manual。 810有两组GPIO, GPIOA和GPIOB,每一组GPIO对应两个pin,目前没有945的programer manual,但是从xf86-video-intel的开源驱动来看,945应该至少有8组GPIO, GPIOA-GPIOH。
对于GPIO的访问,首先要获得display controller这个PCI设备映射到系统空间中的memory的基地址,这个可通过读取pci配置空间得到。例如,对于945芯片组中集成的显示控制器, 一般是设备2功能0, 和设备2功能1。至于为什么会有两个,现在还不是很清楚。 在linux下可以很容易从/proc文件系统读到pci设备配置空间的内容,其中MMADR(0x10-0x13)为该pci设备映射到系统的基地址,其中bit19-bit31为基地址, bit0-bit18是其他一些信息(i810 programer manual)。
得到基地址后,从偏移0x5010开始,为GPIO的寄存器:
0x5010-0x5013 -> GPIOA
0x5014-0x5017 -> GPIOB
0x5018-0x501b -> GPIOC
......
每组GPIO(对应两个pin)由一个32为宽的寄存器控制,具体格式可参考i810 programer manual。对这些GPIO编程就可以模拟I2C总线时序,从而能读取DDC数据,代码可以参考xf86-video-intel。
另外,虽然没有945 programer manual,但是945的GPIO的控制方法应该和810是一样的,只不过945会多几组GPIO。还有上面提到会有两个pci设备。我从一个实际的系统来看,发现他们分别映射到0xfde8000 和 0xfdf0000, 读取发现两个地方的内容是一样的,但还没有测试这两个地方是不是重叠的。