]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PlatformDxe/LegacySpeaker.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformDxe / LegacySpeaker.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
9dc8036d
MK
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7 \r\r
8\r
9Module Name:\r
10\r
11 LegacySpeaker.c\r
12\r
13Abstract:\r
14\r
15 This file implements DXE for Legacy Speaker.\r
16\r
17--*/\r
18\r
19#include "LegacySpeaker.h"\r
20\r
21/**\r
22\r
23 This function will enable the speaker to generate beep\r
24\r
25 @retval EFI_STATUS\r
26\r
27**/\r
28EFI_STATUS\r
29TurnOnSpeaker (\r
30 )\r
31{\r
32 UINT8 Data;\r
33 Data = IoRead8 (EFI_SPEAKER_CONTROL_PORT);\r
34 Data |= 0x03;\r
35 IoWrite8(EFI_SPEAKER_CONTROL_PORT, Data);\r
36 return EFI_SUCCESS;\r
37}\r
38\r
39/**\r
40\r
41 This function will stop beep from speaker.\r
42\r
43 @retval Status\r
44\r
45**/\r
46EFI_STATUS\r
47TurnOffSpeaker (\r
48 )\r
49{\r
50 UINT8 Data;\r
51\r
52 Data = IoRead8 (EFI_SPEAKER_CONTROL_PORT);\r
53 Data &= 0xFC;\r
54 IoWrite8(EFI_SPEAKER_CONTROL_PORT, Data);\r
55 return EFI_SUCCESS;\r
56}\r
57\r
58/**\r
59 Generate beep sound based upon number of beeps and duration of the beep\r
60\r
61 @param NumberOfBeeps Number of beeps which user want to produce\r
62 @param BeepDuration Duration for speaker gate need to be enabled\r
63 @param TimeInterval Interval between each beep\r
64\r
65 @retval Does not return if the reset takes place.\r
66 EFI_INVALID_PARAMETER If ResetType is invalid.\r
67\r
68**/\r
69EFI_STATUS\r
70OutputBeep (\r
71 IN UINTN NumberOfBeep,\r
72 IN UINTN BeepDuration,\r
73 IN UINTN TimeInterval\r
74 )\r
75{\r
76 UINTN Num;\r
77\r
78 for (Num=0; Num < NumberOfBeep; Num++) {\r
79 TurnOnSpeaker ();\r
80 //\r
81 // wait some time,at least 120us\r
82 //\r
83 gBS->Stall (BeepDuration);\r
84 TurnOffSpeaker();\r
85 gBS->Stall (TimeInterval);\r
86 }\r
87\r
88 return EFI_SUCCESS;\r
89}\r
90\r
91/**\r
92 This function will program the speaker tone frequency. The value should be with 64k\r
93 boundary since it takes only 16 bit value which gets programmed in two step IO opearattion\r
94\r
95 @param Frequency A value which should be 16 bit only.\r
96\r
97 @retval EFI_SUCESS\r
98\r
99**/\r
100EFI_STATUS\r
101EFIAPI \r
102ProgramToneFrequency (\r
103 IN EFI_SPEAKER_IF_PROTOCOL * This,\r
104 IN UINT16 Frequency\r
105 )\r
106{\r
107 UINT8 Data;\r
108\r
109 Data = 0xB6;\r
110 IoWrite8(EFI_TIMER_CONTROL_PORT, Data);\r
111\r
112 Data = (UINT8)(Frequency & 0x00FF);\r
113 IoWrite8(EFI_TIMER_2_PORT, Data);\r
114 Data = (UINT8)((Frequency & 0xFF00) >> 8);\r
115 IoWrite8(EFI_TIMER_2_PORT, Data);\r
116 return EFI_SUCCESS;\r
117}\r
118\r
119/**\r
120 This function will generate the beep for specified duration.\r
121\r
122 @param NumberOfBeeps Number of beeps which user want to produce\r
123 @param BeepDuration Duration for speaker gate need to be enabled\r
124 @param TimeInterval Interval between each beep\r
125\r
126 @retval EFI_STATUS\r
127\r
128**/\r
129EFI_STATUS\r
130EFIAPI\r
131GenerateBeepTone (\r
132 IN EFI_SPEAKER_IF_PROTOCOL * This,\r
133 IN UINTN NumberOfBeeps,\r
134 IN UINTN BeepDuration,\r
135 IN UINTN TimeInterval\r
136 )\r
137{\r
138\r
139 if ((NumberOfBeeps == 1) && (BeepDuration == 0) && (TimeInterval == 0)) {\r
140 TurnOnSpeaker ();\r
141 return EFI_SUCCESS;\r
142 }\r
143\r
144 if ((NumberOfBeeps == 0) && (BeepDuration == 0) && (TimeInterval == 0)) {\r
145 TurnOffSpeaker ();\r
146 return EFI_SUCCESS;\r
147 }\r
148\r
149 if (BeepDuration == 0) {\r
150 BeepDuration = EFI_DEFAULT_SHORT_BEEP_DURATION;\r
151 }\r
152\r
153 if (TimeInterval == 0) {\r
154 TimeInterval = EFI_DEFAULT_BEEP_TIME_INTERVAL;\r
155 }\r
156\r
157 OutputBeep (NumberOfBeeps, BeepDuration, TimeInterval);\r
158 return EFI_SUCCESS;\r
159\r
160\r
161}\r