VxWorks6.6 pcPentium BSP 使用说明(三):设备驱动

 
本文主要介绍了pcPentium BSP中包含的驱动程序。包含了官方提供的所有驱动程序,除了aic7888Lib——现在已用得很少的一个AIC-7888 SCSI控制器的驱动介绍。建议重点阅读ataDrv和ataShow部分,其他部分可以略看。

 

BSP通过VxBus的驱动合集和老的非VxBus驱动来支持设备。此版本中,VxBus是默认配置,非VxBus驱动程序支持已被删除。

VxBus驱动遵循VxWorks
6.2中引进的总线模型。在此模型中,VxBus提供大部分功能,这在以前是需要放入BSP文件sysDev.c中的(例如sysFei82557End.c)对于PCI设备,除了确保在sysPhysMemDesc[]中有足够的DUMMY_MMU_ENTRY定义行,BSP的其他支持是不需要的。对于位于处理器总线的设备,BSP的支持通常仅限于进入hwconf.c的条目表。

该BSP中的非VxBus驱动包括主板的板载芯片和独立的适配卡的驱动。对于主板和适配器卡使用请参考供应商的说明文档。板载芯片的官方文档也可能是必要的文件。

请注意,对于所有的ISA驱动程序,I/O基地址,内存地址和中断级别必须与config.hpc.h中的一致

下面的表格中的驱动以.C的源代码的最终形式交付。其他驱动都只有目标文件的形式交付。

i8237Dma.c 8237
DMA驱动程序
pcConsole.c 控制台驱动程序
i8042Kbd.c 英特尔键盘控制器
i8048Kbd.c 英特尔键盘控制器
m6845Vga.c 摩托罗拉M6845
VGA控制器
nec765Fd.c nec765软盘控制器
ataDrv.c IDE
/ ATA的硬盘控制器
ataShow.c IDE
/ ATA的硬盘控制器显示例程
aic7880Lib.o AHA-2940
PCI SCSI适配器卡
vxbI8253Timer.o 英特尔8253定时器驱动程序
vxbLoApicTimer.o 英特尔Pentium/2/3/4
APIC / xAPIC定时器库
vxbIntelTimestamp.o 英特尔时间戳驱动程序
vxbMc146818Rtc.o MC146818
RTC的驱动程序
i8259Intr.c 英特尔8259PIC
loApicIntr.c 英特尔Pentium/2/3/4本地APIC
/ xAPIC驱动
loApicIntrShow.c 英特尔Pentium/2/3/4本地APIC
/ xAPIC显示驱动程序
ioApicIntr.c 英特尔IO
APIC的/ xAPIC驱动
ioApicIntrShow.c 英特尔IO
APIC/xAPIC显示驱动程序
nullNvRam.c 无效的NVRAM库
nullVme.c VME总线空库
pcmciaLib.c PCMCIA驱动
pcmciaShow.c PCMCIA驱动显示程序
elt3c509End.o 3COM的3C509
END驱动程序
ultraEnd.o SMC
Elite Ultra驱动程序
dec21x40End.o DEC
21x4x PCI END驱动程序
ne2000End.o Novell/Eagle
2000 END驱动
lptDrv.c 并行端口驱动程序

下面是关于每个驱动程序的一些简要说明。欲了解更多详情请参考VxWorks
Reference Manual

ns16550

用于串口。

此驱动程序不支持E7520芯片。详细请参阅第一节第3部分“创建一个BootROM镜像”。

i8237Dma

为ISA
DMA控制器驱动。该驱动用在nec765Fd.c,这是一个很好的可用的范例。
pcConsole,i8042Kbd和i8048Kbd

板载英特尔8042和8048键盘控制器。为了使用该控制器config.h中的INCLUDE_PC_CONSOLE必须使能。宏PC_KBD_TYPEconfig.h必须和PC_PS2_101_KBDi8042Kbd.c中,PC_XT_83_KBDi8048Kbd.c中一样,被定义。
m6845Vga

摩托罗拉M6845VGA控制器驱动。要使用此控制器,定义config.hINCLUDE_PC_CONSOLE使能。
nec765Fd

nec765软盘控制器驱动。要使用这个驱动程序,必须使能INCLUDE_FD指令在config.h中。
ataDrvataShow

IDE/ATA硬盘控制器驱动。要使用该驱动程序,必须启用config.h中的INCLUDE_ATA指令。请注意,老的INCLUDE_IDE指令被INCLUDE_ATA取代而且vxsys()被替换为mkbootFd()mkbootAta()

默认情况下,通过设置INCLUDE_ATAVxWorks设置一个ATA硬盘设备在ATA主控制器(ATA控制器0)和一个设备在ATA控制器1。如果一个系统有两个以上的控制器或每个控制器超过一个驱动器,则配置config.h 的参数,而且sysLib.c中的ataResources表也必须进行修改以支持更多的驱动器和控制器。

例如,假设系统的ATA控制器0有两个物理驱动器。修改config.h中ATA0_NUM_DRIVES的定义的默认值1为2:

/*
config.h */ ... ...#define ATA0_NUM_DRIVES (2)...
请注意,BSP的config.hsysLib.c预先确定ATA配置参数的值而ataResources表记录至多允许两个控制器。这样一个受限的配置不是每一个目标系统的代表。

考虑到在一个系统上,可能有一个硬盘挂载在主控制器,一个CD-ROM设备在从控制器,一个PCMCIA设备在第三个控制器上。默认的ataResources表必须修改以使ataDrv可以初始化并使用系统所有的控制器。特别地,应该定义附加的配置参数,在ataResources表中采用如下类似的方式来初始化第三个控制器。


 

...ATA_RESOURCE
ataResources[ATA_MAX_CTRLS] =    {
    /* ATA controller zero resources */    {    /* ATA 0 initializers ... */
    },/* ATA controller one resources */    {    /* ATA 1 initializers ... */
    },    /* ATA controller two resources */    {        /*  PCCARD_RESOURCE */
        {         ATA2_VCC,           /* 3-5 volts Vcc */
        ATA2_VPP,           /* 5-12 volts Vpp */            {
            ATA2_IO_START0, /* start I/O address 0 */
            ATA2_IO_START1  /* start I/O address 1 */            },  
            {            ATA2_IO_STOP0,  /* end I/0 address 0 */
            ATA2_IO_STOP1   /* end I/0 address 1 */            }, 
        ATA2_EXTRA_WAITS,   /* extra wait states 0-2 */
        ATA2_MEM_START,     /* start host mem address */
        ATA2_MEM_STOP,      /* stop host mem address */
        ATA2_MEM_WAITS,     /* mem extra wait states 0-2 */
        ATA2_MEM_OFFSET,    /* mem offset of card address */
        ATA2_MEM_LENGTH     /* length of memory */        },
    ATA2_CTRL_TYPE,         /* IDE_LOCAL or ATA_PCMCIA */
    ATA2_NUM_DRIVES,        /* number of drives on controller */ 
    INT_NUM_ATA2,           /* interrupt number of controller */
    ATA2_INT_LVL,           /* interrupt level of controller */
    ATA2_CONFIG,            /* device configuration settings */
    ATA2_SEM_TIMEOUT,       /* semaphore timeout for controller */
    ATA2_WDG_TIMEOUT,       /* watchdog timeout for controller */
    ATA2_SOCKET_TWIN,       /* socket number for twin card */
    ATA2_POWER_DOWN         /* power down mode for this controller */    }    };
 ... 

 

该表的初始值包含定义在BSP文件config.h中。

ataResources表的大小和ataDrv支持的ATA控制器数量,由$WIND_BASE/target/h/drv/hdisk/ataDrv.h文件中的ATA_MAX_CTRLS定义。默认ATA_MAX_CTRLS的值设置为2的情况下ataDrv将支持最多2个控制器。当ataResources表被修改为指定两个以上的控制器,如上面的例子中ATA_MAX_CTRLS被重新定义$WIND_BASE/target/src/drv/hdisk/ataDrv.c文件应在重新生成vxWorks镜像前被重新编译以使用新的配置。

vxbI8253Timer


这个库包含一个用于操作Intel定时器8253及其兼容定时器芯片的的板级独立接口。

默认情况下在hwconf.c中只有计数器0被配置。如果使用其他定时器,i8253DevResources
[]需要做如下修改。


 

struct
hcfResource i8253DevResources[] = {   
{ "regBase", HCF_RES_INT, {(void *)PIT_BASE_ADR} },

   
{ "clkFreq", HCF_RES_INT, {(void *)PIT_CLOCK} },
   
{ "intr0", HCF_RES_INT, {(void *)INUM_TO_IVEC (INT_NUM_IRQ0)}},
   
{ "intr0Level", HCF_RES_INT, {(void *)PIT0_INT_LVL}},
   
{ "intr1", HCF_RES_INT, ....................................},
   
{ "intr1Level", HCF_RES_INT, ...............................},
   
{ "intr2", HCF_RES_INT, ....................................},
   
{ "intr2Level", HCF_RES_INT, ...............................},
   
{ "clkRateMin", HCF_RES_INT, {(void *)SYS_CLK_RATE_MIN} },
   
{ "clkRateMax", HCF_RES_INT, {(void *)SYS_CLK_RATE_MAX} },
   
{ "regInterval",HCF_RES_INT, {(void *)PIT_REG_ADDR_INTERVAL} }
};

作为为什么考虑一个8253兼容设备如何整合到系统如此重要的一个例子,考虑这些设备在消费者那通常是如何应用的。The
8253的兼容芯片通常包含三个定时器。通常情况下,所有三个定时器通过一个14.31818
MHz的板载晶振除以12,以产生1.19318 MHz的时钟频输入给定时器。桌面系统下每个通道的定时器输出往往如如下方式连接:

                       8253
                 +---------------+
                 |    Timer 2    |
 from bit 0      |         output+------> to speaker circuitry
 of port 61h ----+->gate         |
                 |               |
 1.19318 MHz ----+->clk 2        |
                 |               |
                 +---------------+
                 |    Timer 1    |
 +5 V            |         output+------> DRAM refresh
 (logic 1)--+----+->gate         |
            |    |               |
 1.19318 MHz ----+->clk 1        |
            |    |               |
            |    +---------------+
            |    |    Timer 0    |
            |    |         output+------> to IRQ0 (timer interrupt)
            +----+->gate         |
                 |               |
 1.19318 MHz ----+->clk 0        |
                 |               |
                 +---------------+

正如图所示,定时器通道2的输出直连接到扬声器。定时器2的输出没有连接到8259
PIC(Programable Interrupt Control可编程中断控制器)或其他中断控制器。

从定时器通道1的输出提供给DRAM刷新。因此,该定时器一旦被编程分配给系统DRAM就不可以被操作。

因为上面例子中定时器通道0被连接到中断控制器,而不是作为系统的关键功能时间基准(如DRAM的刷新),所以定时器0是作为系统可编程的辅助时钟的好的候选。

上面的例子只是8253兼容定时器设备整合到系统的一种可能的方式。有些系统板可能将所有的定时器输出通道都连接到了中断控制器。不是每个系统都会将定时器输出通道连接到DRAM刷新或扬声器。再次强调,我们建议用户查阅目标系统的说明文档以了解具体系统的定义需求。

-

这些宏SYS_CLK_RATE_MIN,SYS_CLK_RATE_MAX,AUX_CLK_RATE_MIN,和AUX_CLK_RATE_MAX必须被定义以提供给sys[Aux]ClkRateSet()校验参数。
-

PIT_CLOCK也必须定义为i8253的时钟频率。
vxbMc146818Rtc

这是实时时钟驱动程序(基于摩托罗拉MC146818)。
vxbIntelTimestamp

这是英特尔芯片组时间戳驱动;在使用时间戳功能,必须定义config.h中的宏INCLUDE_TIMESTAMP
vxbLoApicTimer

这个库包含操作英特尔P6(PentiumPro,
II, and III)和P7(Pentium4)系列处理器本地APIC/xAPIC 定时器的规则并提供板级独立的接口。
-

APIC_TIMER_CLOCK_HZ也必须定义为指示本地APIC/xAPIC定时器的时钟频率。
i8259Intr

Intel
8259A可编程中断控制器(PIC)驱动。
loApicIntr

英特尔P6(PentiumPro,
II, and III)和P7(Pentium4)系列处理器本地APIC/xAPIC驱动程序。此驱动程序即用于Virtual Wire Mode(定义在config.h中的VIRTUAL_WIRE_MODE))也用于Symmetric
IO Mode(定义在config.h中的SYMMETRIC_IO_MODE)。 loApicInit()初始化本地APIC/xAPIC,扫描规范指定的特定内存区域以确定基地址。它使用BSP中定义的LOAPIC_BASEIOAPIC_BASE如果不能在MP配置表中找到地址。扫描内存区域由pc.h中的两对宏BIOS_ROM_STARTBIOS_ROM_ENDEBDA_START}和EBDA_END定义。
ioApicIntr

英特尔P6(PentiumPro,
II, and III)和P7(Pentium4)系列处理器本地APIC/xAPIC驱动程序。此驱动程序用于Symmetric IO模式(定义在config.h中的SYMMETRIC_IO_MODE)。ioApicInit初始化IO
APIC/xAPIC存储在redTable[]中的信息。redTable[]有三个部分——lsw、vectorNo和mask。第一个部分,lsw,存储IO
APIC/xAPIC重定向表的低位字符(least significant word)。这包括触发模式,中断输入引脚的极性,目标模式和交付模式。第二个部分,vectorNo,是重定向表的vectorNo。第三部分,mask,应该为0被ioApicIntLock()ioApicIntUnlock()用来保存中断掩码的状态。

nullNvRam

这个库包含了对断电缺乏断电非易失性存储芯片(NvRAM)的系统提供虚拟NvRAM的操作指令。


对于没有NvRAM的系统,宏NV_RAM_SIZE应定义为NONE。
nullVme

这个库包含板卡不包括在任何常用总线指令的空指令。
pcmciaLibpcmciaShow

PCMCIA驱动。为了使用PCMCIA卡config.hINCLUDE_PCMCIA指令必须启用。该驱动目前支持三张卡。要使用ATA
PC卡,使能INCLUDE_ATA;要使用SRAM PC卡,使能INCLUDE_SRAM;要使用3Com
Etherlink III PC卡,使能INCLUDE_ELT。默认情况下,当INCLUDE_PCMCIA使能时所有的这三种卡都能够支持。
USB支持

该BSP提供USB
1.1和2.0的支持。
时间: 2024-11-13 18:07:56

VxWorks6.6 pcPentium BSP 使用说明(三):设备驱动的相关文章

VxWorks6.6 pcPentium BSP 使用说明(一):基本概念

"VxWorks6.6 BSP 使用说明"将发布pcPentium和idp945两个系列的BSP的使用说明.每个系列约5篇文章.之后还将发布由这两个官方提供的BSP的实战移植方法. 本说明适用范围 pcPentium/2/3/4 - 386/486 和 Pentium/2/3/4 引言 该参考文档提供运行pcPentium,pcPentium2,pcPentium3和pcPentium4的VxWorks BSP的板卡特性信息. 在板卡上运行VxWorks之前,核实板卡运行在正确的配置,

VxWorks6.6 pcPentium BSP 使用说明(二):创建启动盘

  本篇介绍从Solaris.Linux.Windows或VxWorks创建VxWorks启动盘的方法. 从Solaris或Linux创建启动盘   使用Solaris或Linux自带的工具/usr/bin/fdformat.它需要一个引导加载程序vxld.bin,位置为安装目录下的$WIND_BASE/host/$WIND_HOST_TYPE/bin/vxld.bin. 插入一张1.44MB的软盘,键入fdformat命令格式化软盘并安装引导. fdformat -U -d -B $WIND_

linux设备驱动归纳总结(三):3面向对象思想和lseek、container_of、write、read 【转】

linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现  转自:http://blog.chinaunix.net/uid-25014876-id-59418.html   一.结构体struct file和struct inode   在之前写的函数,全部是定义了一些零散的全局变量.有没有办法整合成到一个结构体当中?这样的话,看起来和用起来都比较方便.接下来就要说这方面的问题.   不过先要介绍一下除了fops以外的两个比较重要的结构体:   1)struct file

Linux系统platform设备驱动全透析

1.1 platform总线.设备与驱动 在Linux 2.6的设备驱动模型中,关心总线.设备和驱动这3个实体,总线将设备和驱动绑定.在系统每注册一个设备的时候,会寻找与之匹配的驱动:相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成. 一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI.USB.I2C.SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器.挂接在SoC内存空间的外设等确不依附于此类总线.

Win8系统在新界面安装硬件设备驱动图文教程

Windows 8在功能上的最大亮点就是新界面及新界面应用,硬件设备驱动在新界面中也能够顺利的安装和使用.具体方法如下: 第一步:鼠标移动到右上或者右下角,在侧边栏单击"设置". 第二步:在"设置"中,单击最下方的"更改电脑设置". 第三步:在Windows 8新界面的"设备"中,单击"添加设备". 第四步:Windows 8会自动扫描硬件,然后在列表中显示识别记过.首先将会搜索Windows 8自带的硬件

USB设备驱动概述

USB设备驱动 ·  17.1 USB总线协议 ·  17.1.1 USB设备简介 ·  17.1.2 USB连接拓扑结构 ·  17.1.3 USB通信的流程 ·  17.1.4 USB四种传输模式 ·  17.2.1 观察USB设备的工具 ·  17.2.2 USB设备请求 ·  17.2.3 设备描述符 ·  17.2.4 配置描述符 ·  17.2.5 接口描述符 ·  17.2.6 端点描述符 ·  17.3.1 功能驱动与物理总线驱动 ·  17.3.2 构造USB请求包 ·  17

【Linux驱动】字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 2.块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备

总线设备驱动模型---platform篇

  linux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线,是一条虚拟的总线,设备用platform_device表示,驱动用platform_driver进行注册.于传统的bus/device/driver机制相比,platform由内核进行统一管理,在驱动中使用资源,提高了代码的安全性和可移植性. 下面来看看内核时怎么注册platform总线的过程 点击(此处)折叠或打开 int __init platform_bus_init(void) {     int er

Linux字符设备驱动之异步通知

学习到这里到这里我们觉得这下这个驱动应该就很完善了吧,但是不仅然,我们是不是想当有按键按下的时候,这个时候再去通知用户空间的read函数来读,这样是不是更方便的都,免得函数也老是在哪里休眠.在这里说下:我是不会讲代码的,这些代码比较简单,这只是一些基础的字符设备驱动驱动,到以后我也会讲一些高级点的驱动.这些代码已经讲得很清楚了,全是本人自己写的,是没有错误的,只是自己写的时候注意下自己的内核版本就可以了,以免有一些函数是不能被发现. 上一篇文章的链接:http://blog.csdn.net/q