]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.c
32bead9b04d465e349d06507eaf01fd1a21ce7f4
[mirror_edk2.git] / MdePkg / Library / BaseSmbusLibNull / BaseSmbusLibNull.c
1 /** @file
2 Null implementation of SmBusLib class library.
3
4 Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include <Base.h>
16 #include <Library/SmbusLib.h>
17 #include <Library/DebugLib.h>
18
19 /**
20 Executes an SMBUS quick read command.
21
22 Executes an SMBUS quick read command on the SMBUS device specified by SmBusAddress.
23 Only the SMBUS slave address field of SmBusAddress is required.
24 If Status is not NULL, then the status of the executed command is returned in Status.
25 If PEC is set in SmBusAddress, then ASSERT().
26 If Command in SmBusAddress is not zero, then ASSERT().
27 If Length in SmBusAddress is not zero, then ASSERT().
28 If any reserved bits of SmBusAddress are set, then ASSERT().
29
30 @param SmBusAddress Address that encodes the SMBUS Slave Address,
31 SMBUS Command, SMBUS Data Length, and PEC.
32 @param Status Return status for the executed command.
33 This is an optional parameter and may be NULL.
34 RETURN_SUCCESS The SMBUS command was executed.
35 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
36 RETURN_DEVICE_ERROR The request was not completed because a failure
37 reflected in the Host Status Register bit. Device errors are a result
38 of a transaction collision, illegal command field, unclaimed cycle
39 (host initiated), or bus errors (collisions).
40 RETURN_UNSUPPORTED The SMBus operation is not supported.
41
42 **/
43 VOID
44 EFIAPI
45 SmBusQuickRead (
46 IN UINTN SmBusAddress,
47 OUT RETURN_STATUS *Status OPTIONAL
48 )
49 {
50 ASSERT (!SMBUS_LIB_PEC (SmBusAddress));
51 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0);
52 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
53 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
54 if (Status != NULL) {
55 *Status = RETURN_UNSUPPORTED;
56 }
57 }
58
59 /**
60 Executes an SMBUS quick write command.
61
62 Executes an SMBUS quick write command on the SMBUS device specified by SmBusAddress.
63 Only the SMBUS slave address field of SmBusAddress is required.
64 If Status is not NULL, then the status of the executed command is returned in Status.
65 If PEC is set in SmBusAddress, then ASSERT().
66 If Command in SmBusAddress is not zero, then ASSERT().
67 If Length in SmBusAddress is not zero, then ASSERT().
68 If any reserved bits of SmBusAddress are set, then ASSERT().
69
70 @param SmBusAddress Address that encodes the SMBUS Slave Address,
71 SMBUS Command, SMBUS Data Length, and PEC.
72 @param Status Return status for the executed command.
73 This is an optional parameter and may be NULL.
74 RETURN_SUCCESS The SMBUS command was executed.
75 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
76 RETURN_DEVICE_ERROR The request was not completed because a failure
77 reflected in the Host Status Register bit. Device errors are a result
78 of a transaction collision, illegal command field, unclaimed cycle
79 (host initiated), or bus errors (collisions).
80 RETURN_UNSUPPORTED The SMBus operation is not supported.
81
82 **/
83 VOID
84 EFIAPI
85 SmBusQuickWrite (
86 IN UINTN SmBusAddress,
87 OUT RETURN_STATUS *Status OPTIONAL
88 )
89 {
90 ASSERT (!SMBUS_LIB_PEC (SmBusAddress));
91 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0);
92 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
93 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
94 if (Status != NULL) {
95 *Status = RETURN_UNSUPPORTED;
96 }
97 }
98
99 /**
100 Executes an SMBUS receive byte command.
101
102 Executes an SMBUS receive byte command on the SMBUS device specified by SmBusAddress.
103 Only the SMBUS slave address field of SmBusAddress is required.
104 The byte received from the SMBUS is returned.
105 If Status is not NULL, then the status of the executed command is returned in Status.
106 If Command in SmBusAddress is not zero, then ASSERT().
107 If Length in SmBusAddress is not zero, then ASSERT().
108 If any reserved bits of SmBusAddress are set, then ASSERT().
109
110 @param SmBusAddress Address that encodes the SMBUS Slave Address,
111 SMBUS Command, SMBUS Data Length, and PEC.
112 @param Status Return status for the executed command.
113 This is an optional parameter and may be NULL.
114 RETURN_SUCCESS The SMBUS command was executed.
115 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
116 RETURN_DEVICE_ERROR The request was not completed because a failure
117 reflected in the Host Status Register bit. Device errors are a result
118 of a transaction collision, illegal command field, unclaimed cycle
119 (host initiated), or bus errors (collisions).
120 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
121 RETURN_UNSUPPORTED The SMBus operation is not supported.
122
123 @return The byte received from the SMBUS.
124
125 **/
126 UINT8
127 EFIAPI
128 SmBusReceiveByte (
129 IN UINTN SmBusAddress,
130 OUT RETURN_STATUS *Status OPTIONAL
131 )
132 {
133 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0);
134 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
135 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
136 if (Status != NULL) {
137 *Status = RETURN_UNSUPPORTED;
138 }
139 return 0;
140 }
141
142 /**
143 Executes an SMBUS send byte command.
144
145 Executes an SMBUS send byte command on the SMBUS device specified by SmBusAddress.
146 The byte specified by Value is sent.
147 Only the SMBUS slave address field of SmBusAddress is required. Value is returned.
148 If Status is not NULL, then the status of the executed command is returned in Status.
149 If Command in SmBusAddress is not zero, then ASSERT().
150 If Length in SmBusAddress is not zero, then ASSERT().
151 If any reserved bits of SmBusAddress are set, then ASSERT().
152
153 @param SmBusAddress Address that encodes the SMBUS Slave Address,
154 SMBUS Command, SMBUS Data Length, and PEC.
155 @param Value The 8-bit value to send.
156 @param Status Return status for the executed command.
157 This is an optional parameter and may be NULL.
158 RETURN_SUCCESS The SMBUS command was executed.
159 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
160 RETURN_DEVICE_ERROR The request was not completed because a failure
161 reflected in the Host Status Register bit. Device errors are a result
162 of a transaction collision, illegal command field, unclaimed cycle
163 (host initiated), or bus errors (collisions).
164 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
165 RETURN_UNSUPPORTED The SMBus operation is not supported.
166
167 @return The parameter of Value.
168
169 **/
170 UINT8
171 EFIAPI
172 SmBusSendByte (
173 IN UINTN SmBusAddress,
174 IN UINT8 Value,
175 OUT RETURN_STATUS *Status OPTIONAL
176 )
177 {
178 ASSERT (SMBUS_LIB_COMMAND (SmBusAddress) == 0);
179 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
180 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
181 if (Status != NULL) {
182 *Status = RETURN_UNSUPPORTED;
183 }
184 return 0;
185 }
186
187 /**
188 Executes an SMBUS read data byte command.
189
190 Executes an SMBUS read data byte command on the SMBUS device specified by SmBusAddress.
191 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
192 The 8-bit value read from the SMBUS is returned.
193 If Status is not NULL, then the status of the executed command is returned in Status.
194 If Length in SmBusAddress is not zero, then ASSERT().
195 If any reserved bits of SmBusAddress are set, then ASSERT().
196
197 @param SmBusAddress Address that encodes the SMBUS Slave Address,
198 SMBUS Command, SMBUS Data Length, and PEC.
199 @param Status Return status for the executed command.
200 This is an optional parameter and may be NULL.
201 RETURN_SUCCESS The SMBUS command was executed.
202 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
203 RETURN_DEVICE_ERROR The request was not completed because a failure
204 reflected in the Host Status Register bit. Device errors are a result
205 of a transaction collision, illegal command field, unclaimed cycle
206 (host initiated), or bus errors (collisions).
207 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
208 RETURN_UNSUPPORTED The SMBus operation is not supported.
209
210 @return The byte read from the SMBUS.
211
212 **/
213 UINT8
214 EFIAPI
215 SmBusReadDataByte (
216 IN UINTN SmBusAddress,
217 OUT RETURN_STATUS *Status OPTIONAL
218 )
219 {
220 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
221 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
222 if (Status != NULL) {
223 *Status = RETURN_UNSUPPORTED;
224 }
225 return 0;
226 }
227
228 /**
229 Executes an SMBUS write data byte command.
230
231 Executes an SMBUS write data byte command on the SMBUS device specified by SmBusAddress.
232 The 8-bit value specified by Value is written.
233 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
234 Value is returned.
235 If Status is not NULL, then the status of the executed command is returned in Status.
236 If Length in SmBusAddress is not zero, then ASSERT().
237 If any reserved bits of SmBusAddress are set, then ASSERT().
238
239 @param SmBusAddress Address that encodes the SMBUS Slave Address,
240 SMBUS Command, SMBUS Data Length, and PEC.
241 @param Value The 8-bit value to write.
242 @param Status Return status for the executed command.
243 This is an optional parameter and may be NULL.
244 RETURN_SUCCESS The SMBUS command was executed.
245 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
246 RETURN_DEVICE_ERROR The request was not completed because a failure
247 reflected in the Host Status Register bit. Device errors are a result
248 of a transaction collision, illegal command field, unclaimed cycle
249 (host initiated), or bus errors (collisions).
250 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
251 RETURN_UNSUPPORTED The SMBus operation is not supported.
252
253 @return The parameter of Value.
254
255 **/
256 UINT8
257 EFIAPI
258 SmBusWriteDataByte (
259 IN UINTN SmBusAddress,
260 IN UINT8 Value,
261 OUT RETURN_STATUS *Status OPTIONAL
262 )
263 {
264 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
265 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
266 if (Status != NULL) {
267 *Status = RETURN_UNSUPPORTED;
268 }
269 return 0;
270 }
271
272 /**
273 Executes an SMBUS read data word command.
274
275 Executes an SMBUS read data word command on the SMBUS device specified by SmBusAddress.
276 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
277 The 16-bit value read from the SMBUS is returned.
278 If Status is not NULL, then the status of the executed command is returned in Status.
279 If Length in SmBusAddress is not zero, then ASSERT().
280 If any reserved bits of SmBusAddress are set, then ASSERT().
281
282 @param SmBusAddress Address that encodes the SMBUS Slave Address,
283 SMBUS Command, SMBUS Data Length, and PEC.
284 @param Status Return status for the executed command.
285 This is an optional parameter and may be NULL.
286 RETURN_SUCCESS The SMBUS command was executed.
287 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
288 RETURN_DEVICE_ERROR The request was not completed because a failure
289 reflected in the Host Status Register bit. Device errors are a result
290 of a transaction collision, illegal command field, unclaimed cycle
291 (host initiated), or bus errors (collisions).
292 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
293 RETURN_UNSUPPORTED The SMBus operation is not supported.
294
295 @return The byte read from the SMBUS.
296
297 **/
298 UINT16
299 EFIAPI
300 SmBusReadDataWord (
301 IN UINTN SmBusAddress,
302 OUT RETURN_STATUS *Status OPTIONAL
303 )
304 {
305 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
306 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
307 if (Status != NULL) {
308 *Status = RETURN_UNSUPPORTED;
309 }
310 return 0;
311 }
312
313 /**
314 Executes an SMBUS write data word command.
315
316 Executes an SMBUS write data word command on the SMBUS device specified by SmBusAddress.
317 The 16-bit value specified by Value is written.
318 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
319 Value is returned.
320 If Status is not NULL, then the status of the executed command is returned in Status.
321 If Length in SmBusAddress is not zero, then ASSERT().
322 If any reserved bits of SmBusAddress are set, then ASSERT().
323
324 @param SmBusAddress Address that encodes the SMBUS Slave Address,
325 SMBUS Command, SMBUS Data Length, and PEC.
326 @param Value The 16-bit value to write.
327 @param Status Return status for the executed command.
328 This is an optional parameter and may be NULL.
329 RETURN_SUCCESS The SMBUS command was executed.
330 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
331 RETURN_DEVICE_ERROR The request was not completed because a failure
332 reflected in the Host Status Register bit. Device errors are a result
333 of a transaction collision, illegal command field, unclaimed cycle
334 (host initiated), or bus errors (collisions).
335 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
336 RETURN_UNSUPPORTED The SMBus operation is not supported.
337
338 @return The parameter of Value.
339
340 **/
341 UINT16
342 EFIAPI
343 SmBusWriteDataWord (
344 IN UINTN SmBusAddress,
345 IN UINT16 Value,
346 OUT RETURN_STATUS *Status OPTIONAL
347 )
348 {
349 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
350 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
351 if (Status != NULL) {
352 *Status = RETURN_UNSUPPORTED;
353 }
354 return 0;
355 }
356
357 /**
358 Executes an SMBUS process call command.
359
360 Executes an SMBUS process call command on the SMBUS device specified by SmBusAddress.
361 The 16-bit value specified by Value is written.
362 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
363 The 16-bit value returned by the process call command is returned.
364 If Status is not NULL, then the status of the executed command is returned in Status.
365 If Length in SmBusAddress is not zero, then ASSERT().
366 If any reserved bits of SmBusAddress are set, then ASSERT().
367
368 @param SmBusAddress Address that encodes the SMBUS Slave Address,
369 SMBUS Command, SMBUS Data Length, and PEC.
370 @param Value The 16-bit value to write.
371 @param Status Return status for the executed command.
372 This is an optional parameter and may be NULL.
373 RETURN_SUCCESS The SMBUS command was executed.
374 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
375 RETURN_DEVICE_ERROR The request was not completed because a failure
376 reflected in the Host Status Register bit. Device errors are a result
377 of a transaction collision, illegal command field, unclaimed cycle
378 (host initiated), or bus errors (collisions).
379 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
380 RETURN_UNSUPPORTED The SMBus operation is not supported.
381
382 @return The 16-bit value returned by the process call command.
383
384 **/
385 UINT16
386 EFIAPI
387 SmBusProcessCall (
388 IN UINTN SmBusAddress,
389 IN UINT16 Value,
390 OUT RETURN_STATUS *Status OPTIONAL
391 )
392 {
393 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
394 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
395 if (Status != NULL) {
396 *Status = RETURN_UNSUPPORTED;
397 }
398 return 0;
399 }
400
401 /**
402 Executes an SMBUS read block command.
403
404 Executes an SMBUS read block command on the SMBUS device specified by SmBusAddress.
405 Only the SMBUS slave address and SMBUS command fields of SmBusAddress are required.
406 Bytes are read from the SMBUS and stored in Buffer.
407 The number of bytes read is returned, and will never return a value larger than 32-bytes.
408 If Status is not NULL, then the status of the executed command is returned in Status.
409 It is the caller's responsibility to make sure Buffer is large enough for the total number of bytes read.
410 SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
411 If Length in SmBusAddress is not zero, then ASSERT().
412 If Buffer is NULL, then ASSERT().
413 If any reserved bits of SmBusAddress are set, then ASSERT().
414
415 @param SmBusAddress Address that encodes the SMBUS Slave Address,
416 SMBUS Command, SMBUS Data Length, and PEC.
417 @param Buffer Pointer to the buffer to store the bytes read from the SMBUS.
418 @param Status Return status for the executed command.
419 This is an optional parameter and may be NULL.
420 RETURN_SUCCESS The SMBUS command was executed.
421 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
422 RETURN_DEVICE_ERROR The request was not completed because a failure
423 reflected in the Host Status Register bit. Device errors are a result
424 of a transaction collision, illegal command field, unclaimed cycle
425 (host initiated), or bus errors (collisions).
426 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
427 RETURN_UNSUPPORTED The SMBus operation is not supported.
428
429 @return The number of bytes read.
430
431 **/
432 UINTN
433 EFIAPI
434 SmBusReadBlock (
435 IN UINTN SmBusAddress,
436 OUT VOID *Buffer,
437 OUT RETURN_STATUS *Status OPTIONAL
438 )
439 {
440 ASSERT (Buffer != NULL);
441 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) == 0);
442 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
443 if (Status != NULL) {
444 *Status = RETURN_UNSUPPORTED;
445 }
446 return 0;
447 }
448
449 /**
450 Executes an SMBUS write block command.
451
452 Executes an SMBUS write block command on the SMBUS device specified by SmBusAddress.
453 The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
454 Bytes are written to the SMBUS from Buffer.
455 The number of bytes written is returned, and will never return a value larger than 32-bytes.
456 If Status is not NULL, then the status of the executed command is returned in Status.
457 If Length in SmBusAddress is zero or greater than 32, then ASSERT().
458 If Buffer is NULL, then ASSERT().
459 If any reserved bits of SmBusAddress are set, then ASSERT().
460
461 @param SmBusAddress Address that encodes the SMBUS Slave Address,
462 SMBUS Command, SMBUS Data Length, and PEC.
463 @param Buffer Pointer to the buffer to store the bytes read from the SMBUS.
464 @param Status Return status for the executed command.
465 This is an optional parameter and may be NULL.
466 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
467 RETURN_DEVICE_ERROR The request was not completed because a failure
468 reflected in the Host Status Register bit. Device errors are a result
469 of a transaction collision, illegal command field, unclaimed cycle
470 (host initiated), or bus errors (collisions).
471 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
472 RETURN_UNSUPPORTED The SMBus operation is not supported.
473
474 @return The number of bytes written.
475
476 **/
477 UINTN
478 EFIAPI
479 SmBusWriteBlock (
480 IN UINTN SmBusAddress,
481 OUT VOID *Buffer,
482 OUT RETURN_STATUS *Status OPTIONAL
483 )
484 {
485 ASSERT (Buffer != NULL);
486 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1);
487 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32);
488 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
489 if (Status != NULL) {
490 *Status = RETURN_UNSUPPORTED;
491 }
492 return 0;
493 }
494
495 /**
496 Executes an SMBUS block process call command.
497
498 Executes an SMBUS block process call command on the SMBUS device specified by SmBusAddress.
499 The SMBUS slave address, SMBUS command, and SMBUS length fields of SmBusAddress are required.
500 Bytes are written to the SMBUS from WriteBuffer. Bytes are then read from the SMBUS into ReadBuffer.
501 If Status is not NULL, then the status of the executed command is returned in Status.
502 It is the caller's responsibility to make sure ReadBuffer is large enough for the total number of bytes read.
503 SMBUS supports a maximum transfer size of 32 bytes, so Buffer does not need to be any larger than 32 bytes.
504 If Length in SmBusAddress is zero or greater than 32, then ASSERT().
505 If WriteBuffer is NULL, then ASSERT().
506 If ReadBuffer is NULL, then ASSERT().
507 If any reserved bits of SmBusAddress are set, then ASSERT().
508
509 @param SmBusAddress Address that encodes the SMBUS Slave Address,
510 SMBUS Command, SMBUS Data Length, and PEC.
511 @param WriteBuffer Pointer to the buffer of bytes to write to the SMBUS.
512 @param ReadBuffer Pointer to the buffer of bytes to read from the SMBUS.
513 @param Status Return status for the executed command.
514 This is an optional parameter and may be NULL.
515 RETURN_TIMEOUT A timeout occurred while executing the SMBUS command.
516 RETURN_DEVICE_ERROR The request was not completed because a failure
517 reflected in the Host Status Register bit. Device errors are a result
518 of a transaction collision, illegal command field, unclaimed cycle
519 (host initiated), or bus errors (collisions).
520 RETURN_CRC_ERROR The checksum is not correct (PEC is incorrect)
521 RETURN_UNSUPPORTED The SMBus operation is not supported.
522
523 @return The number of bytes written.
524
525 **/
526 UINTN
527 EFIAPI
528 SmBusBlockProcessCall (
529 IN UINTN SmBusAddress,
530 IN VOID *WriteBuffer,
531 OUT VOID *ReadBuffer,
532 OUT RETURN_STATUS *Status OPTIONAL
533 )
534 {
535 ASSERT (WriteBuffer != NULL);
536 ASSERT (ReadBuffer != NULL);
537 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) >= 1);
538 ASSERT (SMBUS_LIB_LENGTH (SmBusAddress) <= 32);
539 ASSERT (SMBUS_LIB_RESERVED (SmBusAddress) == 0);
540 if (Status != NULL) {
541 *Status = RETURN_UNSUPPORTED;
542 }
543 return 0;
544 }