📄 init_platform.c
字号:
MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_BASEHI; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_SMSC_COM2_ADR >> 8; MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_BASELO; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_SMSC_COM2_ADR & 0xFF; /* Select IRQ */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_IRQ; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_INTLINE_TTY1; /* Mode register (Enable High Speed) */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_MODE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_MODE_HIGHSPEED_BIT; /* Activate device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_ACTIVATE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_ACTIVATE_ENABLE_BIT; /**** Serial port com 1 (TTY0) ****/ /* Select device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_DEVNUM; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_DEVNUM_COM1; /* Set base address */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_BASEHI; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_SMSC_COM1_ADR >> 8; MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_BASELO; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_SMSC_COM1_ADR & 0xFF; /* Select IRQ */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_IRQ; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_INTLINE_TTY0; /* Mode register (Enable High Speed) */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_MODE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_MODE_HIGHSPEED_BIT; /* Activate device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_ACTIVATE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_ACTIVATE_ENABLE_BIT; /**** Parallel port (1284) ****/ /* Select device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_DEVNUM; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_DEVNUM_PARALLEL; /* Set base address */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_BASEHI; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_SMSC_1284_ADR >> 8; MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_BASELO; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_SMSC_1284_ADR & 0xFF; /* Select IRQ */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_IRQ; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_INTLINE_1284; /* Activate device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_ACTIVATE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_ACTIVATE_ENABLE_BIT; /**** Floppy Disk ****/ /* Select device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_DEVNUM; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_DEVNUM_FDD; /* Activate device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_ACTIVATE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_ACTIVATE_ENABLE_BIT; /**** Keyboard, Mouse ****/ /* Select device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_DEVNUM; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_DEVNUM_KYBD; /* Select IRQ for keyboard */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_IRQ; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_INTLINE_KYBD; /* Select IRQ for mouse */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_IRQ2; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = MALTA_INTLINE_MOUSE; /* Activate device */ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_ACTIVATE; MALTA_SUPER_IO8( SMSC_DATA_OFS ) = SMSC_CONFIG_ACTIVATE_ENABLE_BIT; /**** Run mode ****/ MALTA_SUPER_IO8( SMSC_CONFIG_OFS ) = SMSC_CONFIG_KEY_EXIT; /* Initialise PIIX4 counter 0 (binary, 16 bit, mode 0) */ MALTA_PIIX4_IO8( PIIX4_TCW_OFS ) = (PIIX4_TCW_CS_0 << PIIX4_TCW_CS_SHF) | (PIIX4_TCW_RW_16 << PIIX4_TCW_RW_SHF) | (PIIX4_TCW_MODE_0 << PIIX4_TCW_MODE_SHF); /* Initial count (0) */ MALTA_PIIX4_IO8( PIIX4_TMRCNT0_OFS ) = 0; MALTA_PIIX4_IO8( PIIX4_TMRCNT0_OFS ) = 0; /* Enable IO access to Power Management device * 8 bit register (PCI always little endian) */ pci_config_write8( PCI_BUS_LOCAL, MALTA_DEVNUM_PIIX4, PIIX4_PCI_FUNCTION_POWER, PIIX4_PCI_PMREGMISC, PIIX4_PMREGMISC_ENABLE_BIT ); /* Disable I2C controller in FPGA */ REG32( KSEG1( MALTA_I2CSEL ) ) &= ~MALTA_I2CSEL_FPGA_BIT; /* Enable SMBus Host Interface and configure it for IRQ9 */ pci_config_write8( PCI_BUS_LOCAL, MALTA_DEVNUM_PIIX4, PIIX4_PCI_FUNCTION_POWER, PIIX4_PCI_SMBHCFG, (PIIX4_SMBHCFG_IS_IRQ9 << PIIX4_SMBHCFG_IS_SHF) | PIIX4_SMBHCFG_EN_BIT ); /* IDE configuration, IDE Decode Enable (Primary IDE) */ pci_config_write16( PCI_BUS_LOCAL, MALTA_DEVNUM_PIIX4, PIIX4_PCI_FUNCTION_IDE, PIIX4_PCI_IDETIM_PRIM, PIIX4_IDETIM_IDE_BIT ); /* IDE configuration, IDE Decode Enable (Secondary IDE) */ pci_config_write16( PCI_BUS_LOCAL, MALTA_DEVNUM_PIIX4, PIIX4_PCI_FUNCTION_IDE, PIIX4_PCI_IDETIM_SEC, PIIX4_IDETIM_IDE_BIT ); break; case PRODUCT_ATLASA_ID : /* Setup North Bridge mapping global variable */ sys_nb_base = KSEG1(ATLAS_CORECTRL_BASE); /* Perform early core specific initialisation */ arch_core_init( TRUE, ATLAS_INTLINE_COREHI, FALSE ); break; default : break; } } else { /* !early */ switch( sys_platform ) { case PRODUCT_ATLASA_ID : /* Perform core specific initialisation */ arch_core_init( FALSE, ATLAS_INTLINE_COREHI, FALSE ); break; case PRODUCT_MALTA_ID : /* Perform core specific initialisation */ arch_core_init( FALSE, MALTA_CPUINT_COREHI, TRUE ); /**** Setup SMI (System Management Interrupt) ****/ SYSCON_read( SYSCON_BOARD_PIIX4_POWER_BASE_ID, (void *)&base, sizeof(UINT32) ); base = KSEG1( (UINT32)base ); /* Set LID, Thermal polarity to active low. * Set Global Standby Timer Initial Count to 0x7F. */ REG32( base + PIIX4_GLBCTL_OFS ) |= ( (0x7F << PIIX4_GLBCTL_GSTBY_CNT_SHF) | PIIX4_GLBCTL_LID_POL_BIT | PIIX4_GLBCTL_THRM_POL_BIT ); /* Disable all SMI sources in Global Enable Register */ R16( base + PIIX4_GLBEN_OFS ) = 0; /* Disable all SMI sources in General Purpose Enable * Register, except GPI (PCI Power Management Event). * This means that the board way be awakened by * e.g. Ethernet Magic(TM) Packets. */ R16( base + PIIX4_GPEN_OFS ) = PIIX4_GPEN_GPIEN_BIT; /* Clear General Purpose Status Register */ R16( base + PIIX4_GPSTS_OFS ) = 0xFFFF; /* Clear Power Management Status Register */ R16( base + PIIX4_PMSTS_OFS ) = 0xFFFF; /* Clear Global Status Register */ R16( base + PIIX4_GLBSTS_OFS ) = 0xFFFF; /* Register ISR for SMI interrupts */ EXCEP_register_cpu_isr( MALTA_CPUINT_SMI, smi_isr, NULL, NULL ); /* Enable SMI (should never be generated) */ REG32( base + PIIX4_GLBCTL_OFS ) |= ( PIIX4_GLBCTL_SMI_EN_BIT | PIIX4_GLBCTL_EOS_BIT ); break; default : break; } } }/************************************************************************ * Implementation : Static functions ************************************************************************/static voidsmi_isr( void *data ){ UINT16 status, gpsts, pmsts, glben, gpen; status = R16( base + PIIX4_GLBSTS_OFS ); gpsts = R16( base + PIIX4_GPSTS_OFS ); pmsts = R16( base + PIIX4_PMSTS_OFS ); glben = R16( base + PIIX4_GLBEN_OFS ); gpen = R16( base + PIIX4_GPEN_OFS ); printf( "\nSMI interrupt." "\nStatus = 0x%04x" "\nGPSTS = 0x%04x" "\nPMSTS = 0x%04x" "\nGLBEN = 0x%04x" "\nGPEN = 0x%04x" "\n", status, gpsts, pmsts, glben, gpen ); while(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -