閱讀398 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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的支持。

最後更新:2017-04-03 06:03:06

  上一篇:go 如何將windows格式的圖標作為os x應用程序的圖標
  下一篇:go C++11的thread代碼分析