altoona.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 378 行

C
378
字号
/*++
 
Copyright (c) 1998  Microsoft Corporation
 
Module Name:
 
    Altoona.c
 
Abstract:
 
    Initialization for Altoona platform
 
Author:
 
    John Cooper (johncoop) 98-Jun-18
 
Environment:
 
    Wince Rom Monitor
 
Revision History:
 
--*/

#include <windows.h>
#include <bootldr.h>
#include "alt_def.h"
#include "vrc5074.h"
#include "alt_io.h"
#include "pciinit.h"

VOID
AltoonaInitVrc5074(
    )
 
/*++
 
Routine Description:
 
    Initialize remaining registers not done in startup.s
 
Arguments:
 
    None.
 
Return Value:
 
    None.
 
--*/

{
    PVRC5074_CONTROL p5074 = (PVRC5074_CONTROL)(KSEG1_BASE + VRC5074_BASE);

    //
    // setup the PDARS
    // SDRAM PDAR already set up in startup.s
    //

    p5074->SDRAM1.Lo = 0;
    p5074->SDRAM1.Hi = 0;

    p5074->PCIW0.Lo = PCI_MEMORY_BASE | PDAR_32BITS | PDAR_128MB;
    p5074->PCIW0.Hi = 0;

    p5074->PCIW1.Lo = PCI_CONFIG_BASE | PDAR_32BITS | PDAR_64MB;
    p5074->PCIW1.Hi = 0;

    p5074->DCS2.Lo = FLASH_BASE1 | PDAR_MEMLOC | PDAR_32BITS | PDAR_16MB;//for 5476 board
    p5074->DCS2.Hi = 0;
    p5074->DCS3.Lo = FLASH_BASE | PDAR_MEMLOC | PDAR_32BITS | PDAR_16MB;//for 5476 board
    p5074->DCS3.Hi = 0;

// program the control register
	p5074->DCS4.Lo = 0x1400002f;
    p5074->DCS4.Hi = 0;
	p5074->LCST4.Lo= 0x000a820a;	

	//program DCS5 for DIP switch

    p5074->DCS5.Lo = 0x1300002f;
    p5074->DCS5.Hi = 0;
	p5074->LCST5.Lo= 0x000a820a;	

// modifications for 5476 board (sudhakar)
    
	p5074->LCST2.Lo = 0x000a863a;
	p5074->LCST3.Lo = 0x000a863a;
	p5074->LCNFG.Lo = 0x0fff0010;
	p5074->DCSFN.Lo = 0x00011111;
	p5074->DCSIO.Lo = 0x00000400; 
//end of modifications


  
#if 0
    p5074->DCSFN.Lo = 1;// open this for 5074
    p5074->DCSFN.Hi = 1;
#endif
    p5074->INTCS.Lo = VRC5074_BASE | PDAR_64BITS | PDAR_2MB;
    p5074->INTCS.Hi = 0;

    //
    // CPUSTAT register and disable interrupts
    //

    p5074->CPUSTAT.Lo = 0x0000001C;
    p5074->CPUSTAT.Hi = 0x00000000;
    p5074->INTCTRL.Lo = 0x00000000;
    p5074->INTCTRL.Hi = 0x00000000;

    //
    // Vrc5074 PCI Config space registers
    // (BARC, BAR0, BAR1 will be written by pci initialization code)
    //

    p5074->PCICMD = 0x06;
    p5074->CLSIZ = 0x04;
    p5074->BAR2.Lo = 0xFFFFFFFC;
    p5074->BAR2.Hi = 0x00000000;
    p5074->BAR3.Lo = 0xFFFFFFFC;
    p5074->BAR3.Hi = 0x00000000;
    p5074->BAR4.Lo = 0xFFFFFFFC;
    p5074->BAR4.Hi = 0x00000000;
    p5074->BAR5.Lo = 0xFFFFFFFC;
    p5074->BAR5.Hi = 0x00000000;
    p5074->BAR6.Lo = 0xFFFFFFFC;
    p5074->BAR6.Hi = 0x00000000;
    p5074->BAR7.Lo = 0xFFFFFFFC;
    p5074->BAR7.Hi = 0x00000000;
    p5074->BAR8.Lo = 0xFFFFFFFC;
    p5074->BAR8.Hi = 0x00000000;
    p5074->BARB.Lo = 0xFFFFFFFC;
    p5074->BARB.Hi = 0x00000000;

    //
    // Configure misc PCI control registers
    //

    p5074->PCIARB.Lo = 0x1100003F;
    p5074->PCIARB.Hi = 0x00500011;


    // The PCI enumerator will assign memory addresses above the non-zero
    // PCI_BUS0_MEM_BASE.  This allows the Vrc5476 BAR0 to map from PCI
    // memory address 0 (for PCI bus master access to system memory) while not
    // overlapping with the already limited device memory range.
    // Setting PCI_BUS0_MEM_BASE in PCIINIT0 adds the same offset to system
    // addresses that hit the PCIW0 range, thus allowing it to reach this
    // shifted range of addresses.
    // 
    p5074->PCIINIT0.Lo = PCI_BUS0_MEM_BASE | PCIINIT_TYPE_MEM | PCIINIT_ACCESS_32;
    p5074->PCIINIT0.Hi = 0;

    p5074->PCIINIT1.Lo = PCIINIT_TYPE_IO | PCIINIT_ACCESS_32;
    p5074->PCIINIT1.Hi = 0;

    p5074->PCICTRL.Lo = 0x80000000;
    p5074->PCICTRL.Hi = 0x20000000;

}

VOID
AltoonaInitM1543(
    )
 
/*++
 
Routine Description:
 
    Initialize M1543 SuperIO/Bridge chip
 
Arguments:
 
    None.
 
Return Value:
 
    None.
 
--*/

{

    PVUCHAR pConfigPort;
    ULONG Reg;

    //
    // Don't know why we do this, but NEC code does it with no comment
    //

    PCIConfig_Write(0,IDSEL_M1543,0,0x40,0xC01C);

    //
    // Define IDE,PMU,USB idsel line
    //

    PCIConfig_Write(0,IDSEL_M1543,0,0x58,0x7D);
    PCIConfig_Write(0,IDSEL_M1543,0,0x70,(0xA << 16));

    //
    // Programmable chips selects
    //

    PCIConfig_Write(0,IDSEL_M1543,0,0x54,((LED_BASE & 0xFF) << 8) |
                                          ((NVRAM_BASE & 0xFF) << 16) |
                                          (0x40 << 24) |
                                          (1 << (22 + 8)) |
                                          (1 << (21 + 8)));

    //
    // don't know why we need to read this back, but the plug/play
    // stuff below doesn't work
    // if we don't
    //

    PCIConfig_Read(0,IDSEL_M1543,0,0x40);

    //
    // Program the config port of Super i/o
    //

    pConfigPort = (PVUCHAR)(CONFIGPORT_BASE + KSEG1_BASE);

    //
    // enter configure mode
    //

    pConfigPort[0] = 0x51;
    FLUSH_WRITE_BUFFER;
    pConfigPort[0] = 0x23;
    FLUSH_WRITE_BUFFER;

    //
    // Configure registers
    //

#define CONFIG_PORT_WRITE(REG,VALUE) \
    pConfigPort[0] = REG; \
    FLUSH_WRITE_BUFFER; \
    pConfigPort[1] = VALUE; \
    FLUSH_WRITE_BUFFER; \
    pConfigPort[1]

    //
    // Select Parallel Port
    // Enable
    // Set base address
    // set irq7
    // set dma
    // set mode
    // set misc
    //

    CONFIG_PORT_WRITE(0x07,0x03);
    CONFIG_PORT_WRITE(0x30,0x01);
    CONFIG_PORT_WRITE(0x60,(PARALLEL_BASE & 0x00000300) >> 8);
    CONFIG_PORT_WRITE(0x61,(PARALLEL_BASE & 0x000000FF));
    CONFIG_PORT_WRITE(0x70,0x07);
    CONFIG_PORT_WRITE(0x74,0x04);
    CONFIG_PORT_WRITE(0xF0,0x00);
    CONFIG_PORT_WRITE(0xF4,0x80);

    //
    // Select Uart1
    // Enable
    // Set base address
    // choose irq3
    // clock select stuff
    //

    CONFIG_PORT_WRITE(0x07,0x04);
    CONFIG_PORT_WRITE(0x30,0x01);
    CONFIG_PORT_WRITE(0x60,(UART1_BASE & 0x00000300) >> 8);
    CONFIG_PORT_WRITE(0x61,(UART1_BASE & 0x000000FF));
    CONFIG_PORT_WRITE(0x70,0x04);
    CONFIG_PORT_WRITE(0xF0,0x00);
    CONFIG_PORT_WRITE(0xF1,0x00);
    CONFIG_PORT_WRITE(0xF2,0x00);

    //
    // Same for Uart2
    // except choose irq4
    //

    CONFIG_PORT_WRITE(0x07,0x05);
    CONFIG_PORT_WRITE(0x30,0x01);
    CONFIG_PORT_WRITE(0x60,(UART2_BASE & 0x00000300) >> 8);
    CONFIG_PORT_WRITE(0x61,(UART2_BASE & 0x000000FF));
    CONFIG_PORT_WRITE(0x70,0x03);
    CONFIG_PORT_WRITE(0xF0,0x00);
    CONFIG_PORT_WRITE(0xF1,0x00);
    CONFIG_PORT_WRITE(0xF2,0x00);

    //
    // Floppy disk controller
    // Enable
    // set base
    // Set IRQ5
    //

#if 0
    CONFIG_PORT_WRITE(0x07,0x00);
    CONFIG_PORT_WRITE(0x30,0x01);
    CONFIG_PORT_WRITE(0x60,(FLOPPY_BASE & 0x00000300) >> 8);
    CONFIG_PORT_WRITE(0x61,(FLOPPY_BASE & 0x000000FF));
    CONFIG_PORT_WRITE(0x70,0x05);
#endif
    
    //
    // Configure kbd/ms
    // Mouse - irq1
    // kbd - irq12
    //

    CONFIG_PORT_WRITE(0x07,0x07);
    CONFIG_PORT_WRITE(0x30,0x01);
    CONFIG_PORT_WRITE(0x70,0x01);
    CONFIG_PORT_WRITE(0x72,0x0C);
    CONFIG_PORT_WRITE(0xF0,0x00);

    //
    // return config port to RUN state
    //

    pConfigPort[0] = 0xBB;
    FLUSH_WRITE_BUFFER;

    //
    // Set IDE to irq14
    //

    Reg = PCIConfig_Read(0,IDSEL_M1543,0,0x44);
    Reg = (Reg & 0xFFFFFFF0) | 0xD;
    PCIConfig_Write(0,IDSEL_M1543,0,0x44,Reg);

    //
    // Set USB to IRQ5.
    // This interrupt stolen from Floppy disk controller
    //

    Reg = PCIConfig_Read(0, IDSEL_M1543, 0, 0x74);
    Reg = (Reg & 0xFFFFFF00) | 0x15;
    PCIConfig_Write(0, IDSEL_M1543, 0, 0x74, Reg);
}



VOID
AltoonaInit(
    )
 
/*++
 
Routine Description:
 
    Routine to initialize altoona hardware
 
Arguments:
 
    None.
 
Return Value:
 
    None.
 
--*/

{

    AltoonaInitVrc5074();
    AltoonaInitM1543();
    //ParalInit();

    WriteLED(0x00);      // display 0 to LED

}

⌨️ 快捷键说明

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