PatchworkOS  2ca1c69
A non-POSIX operating system.
Loading...
Searching...
No Matches
eisa_id.c
Go to the documentation of this file.
2
3#include <errno.h>
4#include <string.h>
5
6#define AML_EISA_ID_BYTE(c) ((uint32_t)(((c) - 0x40) & 0x1F))
7
9{
10 if (str == NULL || strnlen_s(str, 8) != 7)
11 {
12 errno = EINVAL;
13 return ERR;
14 }
15
16 for (uint64_t i = 0; i < 3; i++)
17 {
18 if (str[i] < 'A' || str[i] > 'Z')
19 {
20 errno = EINVAL;
21 return ERR;
22 }
23 }
24 for (uint64_t i = 3; i < 7; i++)
25 {
26 if ((str[i] < '0' || str[i] > '9') && (str[i] < 'A' || str[i] > 'F'))
27 {
28 errno = EINVAL;
29 return ERR;
30 }
31 }
32
33 uint32_t value = 0;
34 value |= (AML_EISA_ID_BYTE(str[0]) << 2) | ((AML_EISA_ID_BYTE(str[1]) >> 3) & 0x03);
35 value |= ((AML_EISA_ID_BYTE(str[1]) & 0x07) << 13) | (AML_EISA_ID_BYTE(str[2]) << 8);
36
37 const uint32_t shifts[4] = {20, 16, 28, 24};
38 for (uint64_t i = 3; i < 7; i++)
39 {
40 uint32_t shift = shifts[i - 3];
41 if (str[i] >= '0' && str[i] <= '9')
42 {
43 value |= (uint32_t)(str[i] - '0') << shift;
44 }
45 else
46 {
47 value |= (uint32_t)(str[i] - 'A' + 10) << shift;
48 }
49 }
50
51 return value;
52}
53
54#define AML_EISA_ID_CHAR(b) ((char)(((b) & 0x1F) + 0x40))
55
56uint64_t aml_eisa_id_to_string(uint32_t eisaId, char* buffer, size_t bufferSize)
57{
58 if (buffer == NULL || bufferSize < 8)
59 {
60 errno = EINVAL;
61 return ERR;
62 }
63
64 buffer[0] = AML_EISA_ID_CHAR((eisaId >> 2) & 0x1F);
65 buffer[1] = AML_EISA_ID_CHAR(((eisaId >> 13) & 0x07) | ((eisaId & 0x03) << 3));
66 buffer[2] = AML_EISA_ID_CHAR((eisaId >> 8) & 0x1F);
67
68 const uint32_t shifts[4] = {20, 16, 28, 24};
69 for (uint64_t i = 3; i < 7; i++)
70 {
71 uint32_t shift = shifts[i - 3];
72 uint8_t nibble = (eisaId >> shift) & 0x0F;
73 if (nibble < 10)
74 {
75 buffer[i] = (char)('0' + nibble);
76 }
77 else
78 {
79 buffer[i] = (char)('A' + (nibble - 10));
80 }
81 }
82 buffer[7] = '\0';
83
84 return 0;
85}
#define AML_EISA_ID_BYTE(c)
Definition eisa_id.c:6
#define AML_EISA_ID_CHAR(b)
Definition eisa_id.c:54
#define EINVAL
Invalid argument.
Definition errno.h:142
#define errno
Error number variable.
Definition errno.h:27
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
uint64_t aml_eisa_id_to_string(uint32_t eisaId, char *buffer, size_t bufferSize)
Convert a numeric EISA ID to a string EISA ID.
Definition eisa_id.c:56
uint64_t aml_eisa_id_from_string(const char *str)
Convert a string EISA ID to a numeric EISA ID.
Definition eisa_id.c:8
EFI_PHYSICAL_ADDRESS buffer
Definition mem.c:15
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
size_t strnlen_s(const char *s, size_t maxsize)
Definition strnlen_s.c:4