VxWorks6.6 pcPentium BSP 使用說明(三):裝置驅動
阿新 • • 發佈:2019-02-08
本文主要介紹了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.h或pc.h中的一致
。
下面的表格中的驅動以.C的原始碼的最終形式交付。其他驅動都只有目標檔案的形式交付。
下面是關於每個驅動程式的一些簡要說明。欲瞭解更多詳情請參考VxWorks
Reference Manual
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 | 並行埠驅動程式 |
- ns16550
- 用於串列埠。 此驅動程式不支援E7520晶片。詳細請參閱第一節第3部分“建立一個BootROM映象”。
- i8237Dma
- 為ISA DMA控制器驅動。該驅動用在nec765Fd.c,這是一個很好的可用的範例。
- pcConsole,i8042Kbd和i8048Kbd
- 板載英特爾8042和8048鍵盤控制器。為了使用該控制器config.h中的INCLUDE_PC_CONSOLE必須使能。巨集PC_KBD_TYPE在config.h必須和PC_PS2_101_KBD在i8042Kbd.c中,PC_XT_83_KBD在i8048Kbd.c中一樣,被定義。
- m6845Vga
- 摩托羅拉M6845VGA控制器驅動。要使用此控制器,定義config.h中INCLUDE_PC_CONSOLE使能。
- nec765Fd
- nec765軟盤控制器驅動。要使用這個驅動程式,必須使能INCLUDE_FD指令在config.h中。
- ataDrv和ataShow
-
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.h和sysLib.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_BASE和IOAPIC_BASE如果不能在MP配置表中找到地址。掃描記憶體區域由pc.h中的兩對巨集BIOS_ROM_START和BIOS_ROM_END,EBDA_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
- 這個庫包含板卡不包括在任何常用匯流排指令的空指令。
- pcmciaLib和pcmciaShow
- PCMCIA驅動。為了使用PCMCIA卡config.h的INCLUDE_PCMCIA指令必須啟用。該驅動目前支援三張卡。要使用ATA PC卡,使能INCLUDE_ATA;要使用SRAM PC卡,使能INCLUDE_SRAM;要使用3Com Etherlink III PC卡,使能INCLUDE_ELT。預設情況下,當INCLUDE_PCMCIA使能時所有的這三種卡都能夠支援。
- USB支援
- 該BSP提供USB 1.1和2.0的支援。