Home | History | Annotate | Download | only in SerialPortLib
      1 /** @file
      2 
      3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials are licensed and made available under
      7   the terms and conditions of the BSD License that accompanies this distribution.
      9   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php.
     13 
     15   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     17   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     21 
     23 Module Name:
     24 
     25     SioInit.c
     26 
     27 Abstract:
     28 
     29     Functions for LpcSio initialization
     30 
     31 --*/
     32 
     33 #include "PlatformSerialPortLib.h"
     34 #include "SioInit.h"
     35 
     36 typedef struct {
     37   UINT8 Register;
     38   UINT8 Value;
     39 } EFI_SIO_TABLE;
     40 
     41 EFI_SIO_TABLE mSioTableWpcn381u[] = {
     42     {0x29, 0x0A0},
     43     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART0},                                       // Select UART0 device
     44     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS >> 8)},       // Set Base Address MSB
     45     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
     46     {WPCN381U_IRQ1_REGISTER, 0x014},                                                      // Set to IRQ4
     47     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     48     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART1},                                       // Select UART1 device
     49     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS >> 8)},       // Set Base Address MSB
     50     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
     51     {WPCN381U_IRQ1_REGISTER, 0x013},                                                      // Set to IRQ3
     52     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     53     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_GPIO},                                        // Select GPIO device
     54     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS >> 8)},               // Set Base Address MSB
     55     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS & 0x00FF)},           // Set Base Address LSB
     56     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     57     {0x21, 0x001},                                                                        // Global Device Enable
     58     {0x26, 0x000}
     59 };
     60 
     61 EFI_SIO_TABLE mSioTableWdcp376[] = {
     62     {0x29, 0x0A0},
     63     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART0},                                       // Select UART0 device
     64     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS >> 8)},       // Set Base Address MSB
     65     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT0_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
     66     {WPCN381U_IRQ1_REGISTER, 0x014},                                                      // Set to IRQ4
     67     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     68     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_UART1},                                       // Select UART1 device
     69     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS >> 8)},       // Set Base Address MSB
     70     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_SERIAL_PORT1_BASE_ADDRESS & 0x00FF)},   // Set Base Address LSB
     71     {WPCN381U_IRQ1_REGISTER, 0x013},                                                      // Set to IRQ3
     72     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     73     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_GPIO},                                        // Select GPIO device
     74     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS >> 8)},               // Set Base Address MSB
     75     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_GPIO_BASE_ADDRESS & 0x00FF)},           // Set Base Address LSB
     76     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     77     {0x21, 0x001},                                                                        // Global Device Enable
     78     {0x26, 0x000},
     79     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_PS2K},                                        // Select PS2 Keyboard
     80     {WPCN381U_BASE1_HI_REGISTER, (UINT8)(WPCN381U_KB_BASE1_ADDRESS >> 8)},                // Set Base Address MSB
     81     {WPCN381U_BASE1_LO_REGISTER, (UINT8)(WPCN381U_KB_BASE1_ADDRESS & 0x00FF)},            // Set Base Address LSB
     82     {WPCN381U_BASE2_HI_REGISTER, (UINT8)(WPCN381U_KB_BASE2_ADDRESS >> 8)},                // Set Base Address MSB
     83     {WPCN381U_BASE2_LO_REGISTER, (UINT8)(WPCN381U_KB_BASE2_ADDRESS & 0x00FF)},            // Set Base Address LSB
     84     {WPCN381U_IRQ1_REGISTER, 0x011},                                                      // Set to IRQ1
     85     {0xF0, (SIO_KBC_CLOCK << 6)},                                                         // Select KBC Clock Source
     86     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE},                                // Enable it with Activation bit
     87     {WPCN381U_LD_SEL_REGISTER, WPCN381U_LDN_PS2M},                                        // Select PS2 Mouse
     88     {WPCN381U_IRQ1_REGISTER, 0x01c},                                                      // Set to IRQ12
     89     {WPCN381U_ACTIVATE_REGISTER, WPCN381U_ACTIVATE_VALUE}                                 // Enable it with Activation bit
     90 };
     91 
     92 /**
     93   Initialization for SIO.
     94 
     95   @param FfsHeader     FV this PEIM was loaded from.
     96   @param PeiServices   General purpose services available to every PEIM.
     97 
     98   None
     99 
    100 **/
    101 VOID
    102 InitializeSio (
    103   VOID
    104   )
    105 {
    106   UINT16          Index;
    107   UINT16          IndexPort;
    108   UINT16          DataPort;
    109 
    110   //
    111   // Super I/O initialization for Winbond WPCN381U
    112   //
    113   IndexPort  = WPCN381U_CONFIG_INDEX;
    114   DataPort   = WPCN381U_CONFIG_DATA;
    115 
    116   //
    117   // Check for Winbond WPCN381U
    118   //
    119   IoWrite8 (IndexPort, WPCN381U_DEV_ID_REGISTER);   // Winbond WPCN381U Device ID register is 0x20
    120 
    121   if (IoRead8 (DataPort) == WPCN381U_CHIP_ID) {   // Winbond WPCN381U Device ID is 0xF4
    122     //
    123     // Configure WPCN381U SIO
    124     //
    125     for (Index = 0; Index < sizeof (mSioTableWpcn381u) / sizeof (EFI_SIO_TABLE); Index++) {
    126       IoWrite8 (IndexPort, mSioTableWpcn381u[Index].Register);
    127       IoWrite8 (DataPort, mSioTableWpcn381u[Index].Value);
    128     }
    129   }
    130 
    131   if (IoRead8 (DataPort) == WDCP376_CHIP_ID) {   // Winbond WDCP376 Device ID is 0xF1
    132     //
    133     // Configure WDCP376 SIO
    134     //
    135     for (Index = 0; Index < sizeof (mSioTableWdcp376) / sizeof (EFI_SIO_TABLE); Index++) {
    136       IoWrite8 (IndexPort, mSioTableWdcp376[Index].Register);
    137       IoWrite8 (DataPort, mSioTableWdcp376[Index].Value);
    138     }
    139   }
    140   return;
    141 }
    142