nevgep
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2004-12-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2183回复:2

pci ct69000显控芯片vxworks下驱动问题

楼主#
更多 发布于:2003-05-23 09:08
以下内容也发在了drew.nease.net的论坛上。

主板是一个pci104 plus模块,上面集成了一个ct69000显控芯片,为了支持双屏,又插了块69000的104显示模块。现在问题是怎么让vxworks或者说WinML使用这两块显卡。(WindML下有ct69000的驱动,但是只支持一块卡。)。按照如下步骤做完:现象是第一块卡能用,第二块卡能初始化,点亮屏幕但是黑屏,写东西不能显示。

我的思路是这样的:在原来驱动的基础上修改。
根据pci设备驱动开发的一般流程,
1.用pciFindDevice找到两块卡。

2.用pciConfigInLong等函数对其进行配置,根据pci specification,
第一块卡的device control register(配置空间偏移量o4h)设置成:
I/O mapping enabled,
memory mapping enabled,
palette snooping disabled.
第二块卡配置成:
I/O mapping disabled(防止I/0冲突),
memory mapping enabled(以后的寄存器操作通过memory mapped I/O来实现),
palette snooping enabled(见pci to pci bridge specification chapter 12的12.3.1).

3.读pci configuration space的偏移量为10h的memory base address.(两块卡这个值是不一样的,这是操作两块卡的基础)。将这个值赋给driver数据结构(UGL_GENERIC_DRIVER结构,见udgen.h)中的fbAddress.即frame buffer的base address.再将其他相关的函数的指针填到这个driver结构中. 到这里完成WindML框架规定的GRAPHIC_DEVICE_CREAE宏。

4.然后按照uglInitialize()源代码中的实现流程,下一步是mode set.这会调用驱动的相关函数。比如xxx16BitModeSet()。其入口参数之一是刚才得到的那个driver结构的指针。这个函数完成显控芯片寄存器配置工作,即初始化。(不是那些pci registers, 是显控芯片自己的寄存器)。由于两个显卡的I/O是一样的,所以我将原来驱动中的i/o端口操(sysInByte,sysOutByte),改成了memory mapped i/o操作,两块显卡映射到了不同的内存空间,所以这不会有问题。

5.这样初始化完成后(uglInitialize),我就创建了两个图形设备可用。

6.其他的ugl API的可重入问题。由于大都是对frame buffer进行操作,而这两块卡的pGenDriver中的frame buffer base address是不一样的,所以没有问题,不用修改太多。最多将I/O口的操作改成内存操作。

7.最后在sysLib.c中加入了MMU表中加入了一项。这个我用的是uglGraphicsMapShow测到的信息(其实与我自己前面读到的一样).
(这种是静态的,还可以用动态的方法,有什么不同么?)

8.写测试代码。

所有这些做完后buid WindML, buid vxworks,运行测试代码最后结果是第一块屏能用,第二块屏能初始化,但是黑屏,写东西不能显示。换句话说就是所有的寄存器的配置能保证设备的初始化,但写frame buffer有问题。可MMU表中有第二块卡的一项,而第二块卡相关frame buffer寄存器的设置也是没问题的。

那问题出在哪呢,有做过类似项目的指点指点。dos下双显卡,windows下双显卡都应该有人做过的。欢迎交流。(crusor2@sina.com)

参考资料如下:
1.pci specification 2.2
2.pci to pci bridge specification
3. Intel x86 processor structure, programming, interface.
4. WindML programmer\'s guide
5. VxWorks programmer\'s guide
6. ct69000 datasheet

其他信息如下:
bus # device# function# fbAddress
ct690001 0 10 0 0xe0000000
ct690002 0 20 0 0xe2000000
I/O 端口对应的内存映射偏移量见ct69000 datasheet。
BSP:pentium
vendor identifier:ox8086
nevgep
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2004-12-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-23 11:32
你累不累??朋友
!!
vendor identifier:ox8086
nevgep
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2004-12-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-23 16:44
太累了。cao
vendor identifier:ox8086
游客

返回顶部