⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 windml相关知识和图形设备驱动程序开发.txt

📁 WindML相关知识和图形设备驱动程序开发.txt
💻 TXT
字号:
2.5 VxWorks BSP 需要
典型地,必须修改VxWorks BSP来满足能够使用图形和输入设备的需要。 由于Vxworks支持的目标板和处理器比较多,不可能详细说明每个BSP所要修改的东西,下面将描述一些通用的修改:
2.5.1 图形设备内存映射
一个图形设备有两个基本组件:
n 帧缓冲器
n 一个或多个控制器
帧缓冲器是一个内存块,用来存储要显示的图形数据。控制器包括图形处理器、RAMDACs和时钟芯片。取决于图形设备,有的控制器不用或者集成到单个控制器中。
    帧缓冲器和每个控制器对于处理器必须是可见的,访问它们根据不同的处理器结构,可以是内存访问、IO访问或者二者结合来访问。要使得处理器能够访问图形设备,必须修改BSP的两个部分:
n 必须使能设备物理映射
n 必须使能逻辑或虚映射
需要根据处理器、图形设备和总线结构类型来做出准确的修改。

物理映射
物理映射包括使能地址映射器来解码图形设备所驻留的物理地址。图形控制器的映射取决于图形控制器的类型、处理器结构和Vxworks BSP。
WindML 没有限制图形设备所用的总线结构,总线可以是CPU内部总线、ISA、PCI、AGP、VME总线等。
PCI总线
PCI规范允许使用标准方法来使图形设备被映射到PCI内存空间。系统启动时,初始化程序负责分配PCI内存给每个PCI设备,初始化程序可以是厂商的启动代码或者是包含在Vxworks初始化程序中。有的厂商有类似于BIOS功能的固件,它可以把控制权交给Vxworks引导程序。
比如,在X86处理器上,主板上的BIOS来实现内存映射。当BSP支持PCI总线的自动配置时,就可以使用这个功能来映射图形设备到处理器内存。
然而不幸的是,并不是所有的处理器和Vxworks BSP都支持这种PCI设备的映射。当PCI设备不能映射到PCI内存空间时,就必须修改sysLib.c文件来映射PCI图形设备到一个可用的PCI内存空间。当为PCI设备发现一个安全的内存区时,就必须设置PCI配置头的基地址(偏移量为0x10)。
下面这段代码说明了Tvia IGS-5050图形设备该如何分配位置:
/* First the PCI bus must be probed to locate the device */
if (pciFindDevice (UGL_PCI_IGS_ID, UGL_PCI_IGS5050_CHIP_ID, instance,
&busno, &devno, &funcno) == OK)
{
/* Device found, set the base address */
pciConfigOutLong (busno, devno, funcno,
PCI_CFG_BASE_ADDRESS_0, baseAdrs);
/* Enable I/O and memory access */
pciConfigOutWord(busno, devno, funcno, PCI_CFG_COMMAND,
PCI_CMD_IO_ENABLE | PCI_CMD_MEM_ENABLE);
}
else
/* Error device not found */
利用同样的方法可以映射任何PCI图形设备到处理器内存中,只是随处理器和BSP的不同,PCI的管理有点不同而已。

Virtual Mapping(虚拟映射)
虚拟映射使处理器内存管理单元(MMU):
n 执行需要的虚拟到物理的映射
n 指定合适的缓存方法
当系统结构是基于PCI总线且已经通过厂商启动程序(如X86 BIOS)完成了内存映射,那么需要被映射设备的位置。这可以通过执行pciHeaderShow( )函数或者uglGraphicsMapShow( )工具来完成。uglGraphicsMapShow( )工具可以从WindML网站上下载。
下面的shell给出了uglGraphicsMapShow( )输出:
-> uglGraphicsMapShow
Probing PCI bus for graphics devices
Device Number 8
Vendor = ATI (1002)
Device = MACH64 (4354)
Base address = 0xfb000000
Size = 0x1000000
Device Number 14
Vendor = IGS Tech (10ea)
Device = 5050 (5000)
Base address = 0xfe000000
Size = 0x2000000
value = 0 = 0x0
在这个例子中,有两个PCI图形设备:
ATI MACH64
Device Number 8
The device number is the PCI device number, 8 in this case.
Vendor = ATI (1002)
Device = MACH64 (4354)
第一个设备是ATI MACH64.
ATI后面的数字是分配给ATI的PCI厂商号。 
MACH64 后面的数字是被ATI公司分配给MACH 64的设备号。
Base address = 0xfb000000
Size = 0x1000000
它位于地址0xfb000000,并且需要0x1000000 PCI内存映射空间,如果厂商ID或者设备ID未知,那么这个入口就被列为未知。

IGS5050
Device Number 14
The device number is 14.
Vendor = IGS Tech (10ea)
Device = 5050 (5000)
第二个设备是IGS Technologies IGS5050.
Base address = 0xfe000000
Size = 0x2000000
它被映射到PCI地址0xfe000000且需要0x2000000PCI地址空间。
这个映射是通过修改BSP的sysLib.c文件来完成的,这个文件中有一个sysPhysMemDesc[ ]数据结构,它定义了内存映射。这个数据结构是内存块的入口矩阵,每个入口有五个域:物理地址、虚拟地址、内存区的大小、内存管理使能掩码和内存管理状态值。必须修改这个数据结构来包含图形设备所映射的地址入口。
举个例子,假设设备利用uglGraphicsMapShow( )工具检测到它的配置(如前),那么虚拟映射应该是:
/* linear video ram */
{
(void *) 0xFE000000, /* physical mapping */
(void *) 0xFE000000, /* virtual mapping */
0x2000000, /* size of segment */
VM_STATE_MASK_FOR_ALL,
VM_STATE_FOR_IO
}
域大小必须覆盖整个设备,内存管理掩码和状态必须设置成有效、可写,而不是可缓冲。

2.5.2 设备I/O配置
利用sysInByte( )/sysOutByte( )函数来访问I/O端口。
2.6 Configuring a Simulator to use WindML

WindML相关知识和图形设备驱动程序开发《续》
2.5 VxWorks BSP 需要
典型地,必须修改VxWorks BSP来满足能够使用图形和输入设备的需要。 由于Vxworks支持的目标板和处理器比较多,不可能详细说明每个BSP所要修改的东西,下面将描述一些通用的修改:
2.5.1 图形设备内存映射
一个图形设备有两个基本组件:
n 帧缓冲器
n 一个或多个控制器
帧缓冲器是一个内存块,用来存储要显示的图形数据。控制器包括图形处理器、RAMDACs和时钟芯片。取决于图形设备,有的控制器不用或者集成到单个控制器中。
    帧缓冲器和每个控制器对于处理器必须是可见的,访问它们根据不同的处理器结构,可以是内存访问、IO访问或者二者结合来访问。要使得处理器能够访问图形设备,必须修改BSP的两个部分:
n 必须使能设备物理映射
n 必须使能逻辑或虚映射
需要根据处理器、图形设备和总线结构类型来做出准确的修改。

物理映射
物理映射包括使能地址映射器来解码图形设备所驻留的物理地址。图形控制器的映射取决于图形控制器的类型、处理器结构和Vxworks BSP。
WindML 没有限制图形设备所用的总线结构,总线可以是CPU内部总线、ISA、PCI、AGP、VME总线等。
PCI总线
PCI规范允许使用标准方法来使图形设备被映射到PCI内存空间。系统启动时,初始化程序负责分配PCI内存给每个PCI设备,初始化程序可以是厂商的启动代码或者是包含在Vxworks初始化程序中。有的厂商有类似于BIOS功能的固件,它可以把控制权交给Vxworks引导程序。
比如,在X86处理器上,主板上的BIOS来实现内存映射。当BSP支持PCI总线的自动配置时,就可以使用这个功能来映射图形设备到处理器内存。
然而不幸的是,并不是所有的处理器和Vxworks BSP都支持这种PCI设备的映射。当PCI设备不能映射到PCI内存空间时,就必须修改sysLib.c文件来映射PCI图形设备到一个可用的PCI内存空间。当为PCI设备发现一个安全的内存区时,就必须设置PCI配置头的基地址(偏移量为0x10)。
下面这段代码说明了Tvia IGS-5050图形设备该如何分配位置:
/* First the PCI bus must be probed to locate the device */
if (pciFindDevice (UGL_PCI_IGS_ID, UGL_PCI_IGS5050_CHIP_ID, instance,
&busno, &devno, &funcno) == OK)
{
/* Device found, set the base address */
pciConfigOutLong (busno, devno, funcno,
PCI_CFG_BASE_ADDRESS_0, baseAdrs);
/* Enable I/O and memory access */
pciConfigOutWord(busno, devno, funcno, PCI_CFG_COMMAND,
PCI_CMD_IO_ENABLE | PCI_CMD_MEM_ENABLE);
}
else
/* Error device not found */
利用同样的方法可以映射任何PCI图形设备到处理器内存中,只是随处理器和BSP的不同,PCI的管理有点不同而已。

Virtual Mapping(虚拟映射)
虚拟映射使处理器内存管理单元(MMU):
n 执行需要的虚拟到物理的映射
n 指定合适的缓存方法
当系统结构是基于PCI总线且已经通过厂商启动程序(如X86 BIOS)完成了内存映射,那么需要被映射设备的位置。这可以通过执行pciHeaderShow( )函数或者uglGraphicsMapShow( )工具来完成。uglGraphicsMapShow( )工具可以从WindML网站上下载。
下面的shell给出了uglGraphicsMapShow( )输出:
-> uglGraphicsMapShow
Probing PCI bus for graphics devices
Device Number 8
Vendor = ATI (1002)
Device = MACH64 (4354)
Base address = 0xfb000000
Size = 0x1000000
Device Number 14
Vendor = IGS Tech (10ea)
Device = 5050 (5000)
Base address = 0xfe000000
Size = 0x2000000
value = 0 = 0x0
在这个例子中,有两个PCI图形设备:
ATI MACH64
Device Number 8
The device number is the PCI device number, 8 in this case.
Vendor = ATI (1002)
Device = MACH64 (4354)
第一个设备是ATI MACH64.
ATI后面的数字是分配给ATI的PCI厂商号。 
MACH64 后面的数字是被ATI公司分配给MACH 64的设备号。
Base address = 0xfb000000
Size = 0x1000000
它位于地址0xfb000000,并且需要0x1000000 PCI内存映射空间,如果厂商ID或者设备ID未知,那么这个入口就被列为未知。

IGS5050
Device Number 14
The device number is 14.
Vendor = IGS Tech (10ea)
Device = 5050 (5000)
第二个设备是IGS Technologies IGS5050.
Base address = 0xfe000000
Size = 0x2000000
它被映射到PCI地址0xfe000000且需要0x2000000PCI地址空间。
这个映射是通过修改BSP的sysLib.c文件来完成的,这个文件中有一个sysPhysMemDesc[ ]数据结构,它定义了内存映射。这个数据结构是内存块的入口矩阵,每个入口有五个域:物理地址、虚拟地址、内存区的大小、内存管理使能掩码和内存管理状态值。必须修改这个数据结构来包含图形设备所映射的地址入口。
举个例子,假设设备利用uglGraphicsMapShow( )工具检测到它的配置(如前),那么虚拟映射应该是:
/* linear video ram */
{
(void *) 0xFE000000, /* physical mapping */
(void *) 0xFE000000, /* virtual mapping */
0x2000000, /* size of segment */
VM_STATE_MASK_FOR_ALL,
VM_STATE_FOR_IO
}
域大小必须覆盖整个设备,内存管理掩码和状态必须设置成有效、可写,而不是可缓冲。

2.5.2 设备I/O配置
利用sysInByte( )/sysOutByte( )函数来访问I/O端口。
2.6 Configuring a Simulator to use WindML

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -