FreeCalypso > hg > freecalypso-citrine
comparison L1/tpudrv/tpudrv.h @ 7:b7d857ebc9ca
L1/tpudrv/tpudrv.h: TCS211 version restored
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 05:38:18 +0000 |
parents | 75a11d740a02 |
children |
comparison
equal
deleted
inserted
replaced
6:ada79372df56 | 7:b7d857ebc9ca |
---|---|
1 /************* Revision Controle System Header ************* | 1 /************* Revision Controle System Header ************* |
2 * GSM Layer 1 software | 2 * GSM Layer 1 software |
3 * | 3 * |
4 * Filename tpudrv.h | 4 * Filename tpudrv.h |
5 * Copyright 2003 (C) Texas Instruments | 5 * Copyright 2003 (C) Texas Instruments |
6 * | 6 * |
7 ************* Revision Controle System Header *************/ | 7 ************* Revision Controle System Header *************/ |
8 | 8 |
9 /* | 9 /* |
10 * Device addresses - GCS000 | 10 * Device addresses - GCS000 |
11 */ | 11 */ |
12 // GSM 1.5 : TPU / TSP addresses | 12 // GSM 1.5 : TPU / TSP addresses |
13 //------------------------------------- | 13 //------------------------------------- |
14 | 14 |
15 #if ((CHIPSET ==2) || (CHIPSET == 3) || (CHIPSET == 4)) | 15 #if ((CHIPSET ==2) || (CHIPSET == 3) || (CHIPSET == 4)) |
16 #define TPU_ADDR 0xFFFE0000L //omaps00090550 // Hercule / Ulysse / Samson | 16 #define TPU_ADDR 0xFFFE0000l // Hercule / Ulysse / Samson |
17 | 17 |
18 #define TPU_RAM (TPU_ADDR + 0x1400) | 18 #define TPU_RAM (TPU_ADDR + 0x1400) |
19 | 19 |
20 #define TPU_REG (TPU_ADDR + 0x1000) | 20 #define TPU_REG (TPU_ADDR + 0x1000) |
21 #define TSP_REG (TPU_ADDR + 0x0800) | 21 #define TSP_REG (TPU_ADDR + 0x0800) |
22 #define TPU_TIM (TPU_ADDR + 0x2000) | 22 #define TPU_TIM (TPU_ADDR + 0x2000) |
23 | 23 |
24 #elif ((CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12)) | 24 #elif ((CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12)) |
25 #define TPU_ADDR 0xFFFF0000L // Strobe 1 address //omaps00090550 | 25 #define TPU_ADDR 0xFFFF0000l // Strobe 1 address |
26 | 26 |
27 #define TPU_RAM 0xFFFF9000L // TPU RAM //omaps00090550 | 27 #define TPU_RAM 0xFFFF9000l // TPU RAM |
28 | 28 |
29 #define TPU_REG (TPU_ADDR + 0x1000) // TPU register | 29 #define TPU_REG (TPU_ADDR + 0x1000) // TPU register |
30 #define TSP_REG 0xFFFE0800L // TSP register //omaps00090550 | 30 #define TSP_REG 0xFFFE0800l // TSP register |
31 #define TPU_TIM 0xFFFE2000L // ULPD register //omaps00090550 | 31 #define TPU_TIM 0xFFFE2000l // ULPD register |
32 | |
33 #elif (CHIPSET == 15) | |
34 #define TPU_ADDR 0xFFFFF000L // Strobe 1 address //omaps00090550 | |
35 | |
36 #define TPU_RAM 0xFFFF9000L // TPU RAM //omaps00090550 | |
37 | |
38 #define TPU_REG (TPU_ADDR) // TPU register | |
39 | |
40 // TSP should be removed for Locosto. Leaving it as such as the TPU drivers are not yet ported. | |
41 #define TSP_REG 0xFFFE0800L // TSP register //omaps00090550 | |
42 #define TPU_TIM 0xFFFE2000L // ULPD register //omaps00090550 | |
43 | 32 |
44 #endif | 33 #endif |
45 | 34 |
46 | 35 |
47 /* | 36 /* |
48 * Macros for defining TPU instructions | 37 * Macros for defining TPU instructions |
49 */ | 38 */ |
50 #define TPU_SLEEP 0 | 39 #define TPU_SLEEP 0 |
51 #define TPU_MOVE(addr,data) (0x8000 | ((data)<<5) | (addr)) | 40 #define TPU_MOVE(addr,data) (0x8000 | ((data)<<5) | (addr)) |
52 #define TPU_AT(time) (0x2000 | (((time + 5000) % 5000))) | 41 #define TPU_AT(time) (0x2000 | (((time + 5000) % 5000))) |
53 #define TPU_FAT(time) (0x2000 | (time)) // Fast version without modulo | 42 #define TPU_FAT(time) (0x2000 | (time)) // Fast version without modulo |
54 #define TPU_SYNC(time) (0x6000 | (time)) | 43 #define TPU_SYNC(time) (0x6000 | (time)) |
57 #define MOD5000(a) (((a) + 5000) % 5000) | 46 #define MOD5000(a) (((a) + 5000) % 5000) |
58 | 47 |
59 | 48 |
60 /* | 49 /* |
61 * TSP registers - defined in GCS004 - Time Serial Port | 50 * TSP registers - defined in GCS004 - Time Serial Port |
62 */ | 51 */ |
63 /* | 52 /* |
64 * in TPU address space | 53 * in TPU address space |
65 */ | 54 */ |
66 // GSM 1.5 : TSP_TX_REG_1/2/3/4 instead of TSP_TX_U/M/L | 55 // GSM 1.5 : TSP_TX_REG_1/2/3/4 instead of TSP_TX_U/M/L |
67 // added TSP_SPI_SET1/2/3 to ctrl up to 5 periph. | 56 // added TSP_SPI_SET1/2/3 to ctrl up to 5 periph. |
68 //----------------------------------------------------- | 57 //----------------------------------------------------- |
69 #define TSP_CTRL1 0x00 | 58 #define TSP_CTRL1 0x00 |
70 #define TSP_CTRL2 0x01 | 59 #define TSP_CTRL2 0x01 |
71 #define TSP_TX_REG_1 0x04 | 60 #define TSP_TX_REG_1 0x04 |
72 #define TSP_TX_REG_2 0x03 | 61 #define TSP_TX_REG_2 0x03 |
74 #define TSP_TX_REG_4 0x05 | 63 #define TSP_TX_REG_4 0x05 |
75 #define TSP_ACT 0x06 | 64 #define TSP_ACT 0x06 |
76 #define TSP_ACTX 0x07 | 65 #define TSP_ACTX 0x07 |
77 #define TSP_GAUGING_EN 0x11 | 66 #define TSP_GAUGING_EN 0x11 |
78 #define TSP_SPI_SET1 0x09 | 67 #define TSP_SPI_SET1 0x09 |
79 #define TSP_SPI_SET2 0x0A | 68 #define TSP_SPI_SET2 0x0A |
80 #define TSP_SPI_SET3 0x0B | 69 #define TSP_SPI_SET3 0x0B |
81 #define TPU_IT_DSP_PG 0x10 | 70 #define TPU_IT_DSP_PG 0x10 |
82 #define TSP_GAUGING_EN 0x11 | 71 #define TSP_GAUGING_EN 0x11 |
83 | 72 |
84 /* | 73 /* |
85 * in ARM address space - defined in HYP004 | 74 * in ARM address space - defined in HYP004 |
86 */ | 75 */ |
87 #define TSP_RX_LSB (TSP_REG + 0x00) | 76 #define TSP_RX_LSB (TSP_REG + 0x00) |
77 | |
88 #define TSP_RX_MSB (TSP_REG + 0x02) | 78 #define TSP_RX_MSB (TSP_REG + 0x02) |
79 | |
89 #define TSP_TX_LSB (TSP_REG + 0x0c) | 80 #define TSP_TX_LSB (TSP_REG + 0x0c) |
81 | |
90 #define TSP_TX_MSB (TSP_REG + 0x0a) | 82 #define TSP_TX_MSB (TSP_REG + 0x0a) |
91 | 83 |
84 | |
92 /* | 85 /* |
93 * TSP registers bit definitions | 86 * TSP registers bit definitions |
94 */ | 87 */ |
95 #define TC1_DEVICE0 0x00 | 88 #define TC1_DEVICE0 0x00 |
96 #define TC1_DEVICE1 0x20 | 89 #define TC1_DEVICE1 0x20 |
97 #define TC1_DEVICE2 0x40 | 90 #define TC1_DEVICE2 0x40 |
98 #define TC1_DEVICE3 0x60 | 91 #define TC1_DEVICE3 0x60 |
99 #define TC1_DEVICE4 0x80 | 92 #define TC1_DEVICE4 0x80 |
110 | 103 |
111 | 104 |
112 | 105 |
113 /* | 106 /* |
114 * TPU registers - defined in HYP002 | 107 * TPU registers - defined in HYP002 |
115 */ | 108 */ |
116 // GSM 1.5 : TPU reg are 16-bit access | 109 // GSM 1.5 : TPU reg are 16-bit access |
117 //--------------------------------------- | 110 //--------------------------------------- |
118 #define TPU_CTRL (TPU_REG + 0x00) | 111 #define TPU_CTRL (TPU_REG + 0x00) |
119 #define TPU_INT_CTRL (TPU_REG + 0x02) | 112 #define TPU_INT_CTRL (TPU_REG + 0x02) |
120 #define TPU_INT_STAT (TPU_REG + 0x04) | 113 #define TPU_INT_STAT (TPU_REG + 0x04) |
122 #define TPU_SYNCHRO_REG (TPU_REG + 0x0E) | 115 #define TPU_SYNCHRO_REG (TPU_REG + 0x0E) |
123 #define TPU_DSP_PG (TPU_REG + 0x20) | 116 #define TPU_DSP_PG (TPU_REG + 0x20) |
124 | 117 |
125 | 118 |
126 | 119 |
127 | 120 |
128 | 121 |
129 /* | 122 /* |
130 * TPU control register bits | 123 * TPU control register bits |
131 */ | 124 */ |
132 // GSM 1.5 : TPU bits changed | 125 // GSM 1.5 : TPU bits changed |
133 //--------------------------------------- | 126 //--------------------------------------- |
134 #define TPU_CTRL_RESET 0x0001 | 127 #define TPU_CTRL_RESET 0x0001 |
135 #define TSP_CTRL_RESET 0x0080 | 128 #define TSP_CTRL_RESET 0x0080 |
136 #define TPU_CTRL_T_PAGE 0x0002 | 129 #define TPU_CTRL_T_PAGE 0x0002 |
137 #define TPU_CTRL_T_ENBL 0x0004 | 130 #define TPU_CTRL_T_ENBL 0x0004 |
138 #define TPU_CTRL_D_ENBL 0x0010 // WARNING THIS BIT DOES NOT EXIST IN HYPERION | 131 #define TPU_CTRL_D_ENBL 0x0010 // WARNING THIS BIT DOES NOT EXIST IN HYPERION |
139 #define TPU_CTRL_SPI_RST 0x0080 | 132 #define TPU_CTRL_SPI_RST 0x0080 |
140 #define TPU_CTRL_WAIT 0x0200 | 133 #define TPU_CTRL_WAIT 0x0200 |
141 #define TPU_CTRL_CLK_EN 0x0400 | 134 #define TPU_CTRL_CLK_EN 0x0400 |
142 #if (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) || (CHIPSET == 15) | 135 #if (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12) |
143 #define TPU_CTRL_FULL_WRITE 0x0800 | 136 #define TPU_CTRL_FULL_WRITE 0x0800 |
144 #endif | 137 #endif |
145 | 138 |
146 | 139 |
147 | 140 |
148 | 141 |
149 /* | 142 /* |
150 * TPU interrupt control register bits | 143 * TPU interrupt control register bits |
151 */ | 144 */ |
152 | 145 |
153 | 146 |
154 /* WARNING BUG IN HYPERION. */ | 147 /* WARNING BUG IN HYPERION. */ |
155 /* READING TPU_INT_CRTL, TPU_INT_ITP_M BIT CONTENTS AFFECTS THE TPU_INT_ITD_M VALUE. */ | 148 /* READING TPU_INT_CRTL, TPU_INT_ITP_M BIT CONTENTS AFFECTS THE TPU_INT_ITD_M VALUE. */ |
156 | 149 |
157 #define TPU_INT_ITF_M 0x0001 | 150 #define TPU_INT_ITF_M 0x0001 |
158 #define TPU_INT_ITP_M 0x0002 | 151 #define TPU_INT_ITP_M 0x0002 |
159 #define TPU_INT_ITD_M 0x0004 | 152 #define TPU_INT_ITD_M 0x0004 |
160 #define TPU_INT_ITD_F 0x0008 // WARNING THIS BIT DOES NOT EXIST IN HYPERION | 153 #define TPU_INT_ITD_F 0x0008 // WARNING THIS BIT DOES NOT EXIST IN HYPERION |
161 | 154 |
162 #define INT_FRAME 4 /* TPU frame interrupt */ | 155 #define INT_FRAME 4 /* TPU frame interrupt */ |
163 #define INT_PAGE 5 /* TPU page interrupt */ | 156 #define INT_PAGE 5 /* TPU page interrupt */ |
164 #define INT_TSP 3 /* TSP interrupt */ | 157 #define INT_TSP 3 /* TSP interrupt */ |
165 | 158 |
166 | 159 |
167 | 160 |
168 #if ((ANALOG == 1) || (ANALOG == 2) || (ANALOG == 3) || (ANALOG==11)) | 161 #if ((ANLG_FAM == 1) || (ANLG_FAM == 2) || (ANLG_FAM == 3)) |
169 // BB signals connected to serial link1 | 162 // BB signals connected to serial link1 |
170 #define BULON 0x80 // bit6 | 163 #define BULON 0x80 // bit6 |
171 #define BULCAL 0x40 // bit5 | 164 #define BULCAL 0x40 // bit5 |
172 #define BULENA 0x20 // bit4 | 165 #define BULENA 0x20 // bit4 |
173 #define BDLON 0x10 // bit3 | 166 #define BDLON 0x10 // bit3 |
174 #define BDLCAL 0x08 // bit2 | 167 #define BDLCAL 0x08 // bit2 |
175 #define BDLENA 0x04 // bit1 | 168 #define BDLENA 0x04 // bit1 |
176 #define STARTADC 0x02 // bit0 | 169 #define STARTADC 0x02 // bit0 |
177 #endif | 170 #endif |
178 | 171 |
179 #if (RF_FAM == 61) | 172 |
180 /* #define START_ADC 0x01 // TSPact 8 omaps00090550*/ | 173 /* |
181 // TSPACT | |
182 #define REG_SPI_ACT_U 0x07 | |
183 #define REG_SPI_ACT_L 0x06 | |
184 | |
185 #endif | |
186 #define TPU_CTRL_TPU_IDLE 0x0100 | |
187 | |
188 /* | |
189 * GSM RF programming times in quarter bits | 174 * GSM RF programming times in quarter bits |
190 */ | 175 */ |
191 /**************************************************************************/ | 176 /**************************************************************************/ |
192 /**************************************************************************/ | 177 /**************************************************************************/ |
193 /****************************** W A R N I N G !!! *************************/ | 178 /****************************** W A R N I N G !!! *************************/ |
202 /**************************************/ | 187 /**************************************/ |
203 // TPU macros. | 188 // TPU macros. |
204 //------------ | 189 //------------ |
205 void l1dmacro_reset_hw (UWORD32 servingCellOffset); | 190 void l1dmacro_reset_hw (UWORD32 servingCellOffset); |
206 void l1dmacro_init_hw (void); | 191 void l1dmacro_init_hw (void); |
207 void l1dmacro_idle (void); | 192 void l1dmacro_init_hw_light (void); |
193 void l1dmacro_idle (void); | |
208 void l1dmacro_rx_synth (SYS_UWORD16 radio_freq); | 194 void l1dmacro_rx_synth (SYS_UWORD16 radio_freq); |
209 void l1dmacro_tx_synth (SYS_UWORD16 radio_freq); | 195 void l1dmacro_tx_synth (SYS_UWORD16 radio_freq); |
210 | |
211 | |
212 #if (RF_FAM == 61) | |
213 void l1dmacro_agc (SYS_UWORD16 radio_freq, WORD8 gain, UWORD8 lna, UWORD8 if_ctl); | |
214 #endif | |
215 #if (RF_FAM != 61) | |
216 void l1dmacro_agc (SYS_UWORD16 radio_freq, WORD8 gain, UWORD8 lna); | 196 void l1dmacro_agc (SYS_UWORD16 radio_freq, WORD8 gain, UWORD8 lna); |
217 #endif | |
218 | |
219 void l1dmacro_afc (SYS_UWORD16 afc_value, UWORD8 win_id); | 197 void l1dmacro_afc (SYS_UWORD16 afc_value, UWORD8 win_id); |
220 #if (L1_MADC_ON == 1) | |
221 #if (RF_FAM == 61) | |
222 void l1dmacro_rx_ms (SYS_UWORD16 radio_freq,UWORD8 adc_active); | |
223 void l1dmacro_rx_fb (SYS_UWORD16 radio_freq,UWORD8 adc_active); | |
224 void l1dmacro_rx_fb26 (SYS_UWORD16 radio_freq,UWORD8 adc_active); | |
225 #endif | |
226 #else | |
227 void l1dmacro_rx_ms (SYS_UWORD16 radio_freq); | 198 void l1dmacro_rx_ms (SYS_UWORD16 radio_freq); |
228 void l1dmacro_rx_fb (SYS_UWORD16 radio_freq); | 199 void l1dmacro_rx_fb (SYS_UWORD16 radio_freq); |
229 void l1dmacro_rx_fb26 (SYS_UWORD16 radio_freq); | 200 void l1dmacro_rx_fb26 (SYS_UWORD16 radio_freq); |
230 #endif | 201 void l1dmacro_offset (UWORD32 offset_value, |
231 | |
232 void l1dmacro_offset (UWORD32 offset_value, | |
233 WORD32 relative_time); | 202 WORD32 relative_time); |
234 void l1dmacro_synchro (UWORD32 when, UWORD32 value); | 203 void l1dmacro_synchro (UWORD32 when, UWORD32 value); |
235 #if (L1_MADC_ON == 1) | |
236 #if (RF_FAM == 61) | |
237 void l1dmacro_rx_sb (SYS_UWORD16 radio_freq,UWORD8 adc_active); | |
238 void l1dmacro_rx_nb (SYS_UWORD16 radio_freq,UWORD8 adc_active, UWORD8 csf_filter_choice | |
239 #if (NEW_SNR_THRESHOLD == 1) | |
240 ,UWORD8 saic_flag | |
241 #endif /* NEW_SNR_THRESHOLD*/ | |
242 ); | |
243 #endif /* RF_FAM == 61*/ | |
244 #else /* L1_MADC_ON == 1*/ | |
245 void l1dmacro_rx_sb (SYS_UWORD16 radio_freq); | 204 void l1dmacro_rx_sb (SYS_UWORD16 radio_freq); |
246 #if (RF_FAM == 61) | |
247 void l1dmacro_rx_nb (SYS_UWORD16 radio_freq, UWORD8 csf_filter_choice); | |
248 #else | |
249 void l1dmacro_rx_nb (SYS_UWORD16 radio_freq); | 205 void l1dmacro_rx_nb (SYS_UWORD16 radio_freq); |
250 #endif // RF_FAM | |
251 #endif // L1_MADC_ON | |
252 | |
253 void l1dmacro_tx_nb (SYS_UWORD16 radio_freq, UWORD8 txpwr, UWORD8 adc_active); | 206 void l1dmacro_tx_nb (SYS_UWORD16 radio_freq, UWORD8 txpwr, UWORD8 adc_active); |
254 void l1dmacro_tx_ra (SYS_UWORD16 radio_freq, UWORD8 txpwr, UWORD8 adc_active); | 207 void l1dmacro_tx_ra (SYS_UWORD16 radio_freq, UWORD8 txpwr, UWORD8 adc_active); |
255 | 208 void l1dmacro_adc_read_tx (UWORD32 when); |
256 #if (L1_MADC_ON == 1) | |
257 #if (RF_FAM == 61) | |
258 void l1dmacro_adc_read_tx (UWORD32 when, UWORD8 tx_up_state); | |
259 #endif | |
260 #endif | |
261 #if (RF_FAM != 61) | |
262 void l1dmacro_adc_read_tx (UWORD32 when); | |
263 #endif | |
264 | |
265 void l1dmacro_adc_read_rx (void); | 209 void l1dmacro_adc_read_rx (void); |
266 | |
267 #if (CODE_VERSION != SIMULATION) | |
268 #if (L1_MADC_ON ==1) | |
269 void l1dmacro_adc_read_rx_cs_mode0(void); | |
270 #endif | |
271 #endif | |
272 | |
273 | |
274 void l1dmacro_set_frame_it (void); | 210 void l1dmacro_set_frame_it (void); |
275 void l1dmacro_init_hw_light (void); | 211 |
212 void l1pdmacro_it_dsp_gen(WORD16 time); | |
276 | 213 |
277 #if TESTMODE | 214 #if TESTMODE |
278 #if (L1_MADC_ON == 1) | |
279 #if (RF_FAM == 61) | |
280 void l1dmacro_rx_cont (SYS_UWORD16 radio_freq, UWORD8 txpwr,UWORD8 adc_active, UWORD8 csf_filter_choice | |
281 #if (NEW_SNR_THRESHOLD == 1) | |
282 ,UWORD8 saic_flag | |
283 #endif /* NEW_SNR_THRESHOLD*/ | |
284 ); | |
285 #endif /* RF_FAM == 1*/ | |
286 #else /* L1_MADC_ON == 1*/ | |
287 #if (RF_RAM == 61) | |
288 void l1dmacro_rx_cont (SYS_UWORD16 radio_freq, UWORD8 txpwr, UWORD8 csf_filter_choice); | |
289 #else | |
290 void l1dmacro_rx_cont (SYS_UWORD16 radio_freq, UWORD8 txpwr); | 215 void l1dmacro_rx_cont (SYS_UWORD16 radio_freq, UWORD8 txpwr); |
291 #endif /* RF_FAM */ | |
292 #endif /* L1_MADC_ON */ | |
293 void l1dmacro_tx_cont (SYS_UWORD16 radio_freq, UWORD8 txpwr); | 216 void l1dmacro_tx_cont (SYS_UWORD16 radio_freq, UWORD8 txpwr); |
294 void l1dmacro_stop_cont (void); | 217 void l1dmacro_stop_cont (void); |
295 #endif /* TESTMODE */ | 218 #endif |
296 | 219 |
297 /* | 220 /* |
298 * TPU prototypes | 221 * TPU prototypes |
299 */ | 222 */ |
300 void TP_PageIntHandler (void); | 223 void TP_PageIntHandler (void); |
301 void TP_FrameIntHandler (void); | 224 void TP_FrameIntHandler (void); |
302 void TP_PageIntHandler (void); | 225 void TP_PageIntHandler (void); |
303 void TP_FrameIntHandler (void); | 226 void TP_FrameIntHandler (void); |
304 void TPU_Reset(SYS_UWORD16 on); | 227 void TPU_Reset(SYS_UWORD16 on); |
309 BOOL TPU_check_IT_DSP(void); | 232 BOOL TPU_check_IT_DSP(void); |
310 | 233 |
311 | 234 |
312 /* | 235 /* |
313 * TPUDRV global variables | 236 * TPUDRV global variables |
314 */ | 237 */ |
315 #ifdef TPUDRV_C | 238 #ifdef TPUDRV_C |
316 #define TP_GLOBAL | 239 #define TP_GLOBAL |
317 #else | 240 #else |
318 #define TP_GLOBAL extern | 241 #define TP_GLOBAL extern |
319 #endif | 242 #endif |
320 | 243 |
321 TP_GLOBAL volatile UWORD32 TP_PageInt; | 244 TP_GLOBAL volatile UWORD32 TP_PageInt; |
322 TP_GLOBAL volatile UWORD32 TP_FrameInt; | 245 TP_GLOBAL volatile UWORD32 TP_FrameInt; |
246 | |
247 |