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 26 LegacySpeaker.c 27 28 Abstract: 29 30 This file implements PEIM for Legacy Speaker. This file is valid for platforms both 31 on IA32 and Itanium Product Family 32 33 --*/ 34 35 #include "PlatformEarlyInit.h" 36 37 EFI_STATUS 38 OutputBeep ( 39 IN CONST EFI_PEI_SERVICES **PeiServices, 40 IN UINTN NumberOfBeep, 41 IN UINTN BeepDuration, 42 IN UINTN TimerInterval 43 ); 44 45 /** 46 This function will enable the speaker to generate beep 47 48 @param PeiServices PeiServices to locate PPI 49 50 @retval EFI_STATUS 51 52 **/ 53 EFI_STATUS 54 TurnOnSpeaker ( 55 IN CONST EFI_PEI_SERVICES **PeiServices 56 ) 57 { 58 UINT8 Data; 59 Data = IoRead8 (EFI_SPEAKER_CONTROL_PORT); 60 Data |= 0x03; 61 IoWrite8(EFI_SPEAKER_CONTROL_PORT, Data); 62 return EFI_SUCCESS; 63 } 64 65 /** 66 This function will stop beep from speaker. 67 68 @param PeiServices PeiServices to locate PPI 69 70 @retval Status 71 72 **/ 73 EFI_STATUS 74 TurnOffSpeaker ( 75 IN CONST EFI_PEI_SERVICES **PeiServices 76 ) 77 { 78 UINT8 Data; 79 80 Data = IoRead8 (EFI_SPEAKER_CONTROL_PORT); 81 Data &= 0xFC; 82 IoWrite8(EFI_SPEAKER_CONTROL_PORT, Data); 83 return EFI_SUCCESS; 84 } 85 86 87 EFI_STATUS 88 OutputBeep ( 89 IN CONST EFI_PEI_SERVICES **PeiServices, 90 IN UINTN NumberOfBeep, 91 IN UINTN BeepDuration, 92 IN UINTN TimeInterval 93 ) 94 { 95 UINTN Num; 96 EFI_PEI_STALL_PPI* StallPpi; 97 98 (**PeiServices).LocatePpi (PeiServices, &gEfiPeiStallPpiGuid, 0, NULL, (void **)&StallPpi); 99 100 for (Num=0; Num < NumberOfBeep; Num++) { 101 TurnOnSpeaker (PeiServices); 102 StallPpi->Stall(PeiServices, StallPpi, BeepDuration); 103 TurnOffSpeaker(PeiServices); 104 StallPpi->Stall(PeiServices, StallPpi, TimeInterval); 105 } 106 107 return EFI_SUCCESS; 108 } 109 110 /** 111 This function will program the speaker tone frequency. The value should be with 64k 112 boundary since it takes only 16 bit value which gets programmed in two step IO opearattion 113 114 Frequency - A value which should be 16 bit only. 115 116 EFI_SUCESS 117 118 **/ 119 EFI_STATUS 120 EFIAPI 121 ProgramToneFrequency ( 122 IN CONST EFI_PEI_SERVICES **PeiServices, 123 IN UINT16 Frequency 124 ) 125 { 126 UINT8 Data; 127 128 Data = 0xB6; 129 IoWrite8(EFI_TIMER_CONTROL_PORT, Data); 130 131 Data = (UINT8)(Frequency & 0x00FF); 132 IoWrite8(EFI_TIMER_2_PORT, Data); 133 Data = (UINT8)((Frequency & 0xFF00) >> 8); 134 IoWrite8(EFI_TIMER_2_PORT, Data); 135 return EFI_SUCCESS; 136 } 137 138 /** 139 This function will generate the beep for specified duration. 140 141 @param PeiServices PeiServices to locate various PPIs 142 @param NumberOfBeeps Number of beeps which user want to produce 143 @param BeepDuration Duration for speaker gate need to be enabled 144 @param TimeInterval Interval between each beep 145 146 @retval EFI_STATUS 147 148 **/ 149 EFI_STATUS 150 EFIAPI 151 GenerateBeepTone ( 152 IN CONST EFI_PEI_SERVICES **PeiServices, 153 IN UINTN NumberOfBeeps, 154 IN UINTN BeepDuration, 155 IN UINTN TimeInterval 156 ) 157 { 158 159 if ((NumberOfBeeps == 1) && (BeepDuration == 0) && (TimeInterval == 0)) { 160 TurnOnSpeaker (PeiServices); 161 return EFI_SUCCESS; 162 } 163 164 if ((NumberOfBeeps == 0) && (BeepDuration == 0) && (TimeInterval == 0)) { 165 TurnOffSpeaker (PeiServices); 166 return EFI_SUCCESS; 167 } 168 169 if (BeepDuration == 0) { 170 BeepDuration = EFI_DEFAULT_SHORT_BEEP_DURATION; 171 } 172 173 if (TimeInterval == 0) { 174 TimeInterval = EFI_DEFAULT_BEEP_TIME_INTERVAL; 175 } 176 177 OutputBeep (PeiServices, NumberOfBeeps, BeepDuration, TimeInterval); 178 return EFI_SUCCESS; 179 180 181 } 182 183