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


    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/mao0514/article/details/35545951
      本文主要介绍了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的支持。

  • 相关阅读:
    2018-6-2_《JS操作数组(纯洁方法)》
    Centos7 xfs分区格式化挂载
    centos 常用命令集锦
    docker1.12在cento7里的组建swarm (一)
    centos7线程、文件打开数等调优日志(非优化案例、仅仅是个个人记录、为把相关配置文件记录一下)
    Centos7.2 新镜像、系统到手 更新清理 并且安装docker1.2以后版本 目前内容适合docker 1.7.x ce(社区版)
    程序员新手 0年份等级 指导(一) 开发人员IT架构总览
    docker 土法制作zookeeper镜像 并且搭建集群 基于centos7.2
    centos 删除多余的内核启动项
    docker1.12在cento7里的组件swarm (二)
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10535113.html
  • Copyright © 2020-2023  润新知