PatchworkOS
19e446b
A non-POSIX operating system.
Theme:
Default
Round
Robot
Loading...
Searching...
No Matches
eisa_id.c
Go to the documentation of this file.
1
#include <
kernel/acpi/aml/runtime/eisa_id.h
>
2
3
#include <
errno.h
>
4
#include <
string.h
>
5
6
#define AML_EISA_ID_BYTE(c) ((uint32_t)(((c) - 0x40) & 0x1F))
7
8
uint64_t
aml_eisa_id_from_string
(
const
char
* str)
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
56
uint64_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
}
buffer
EFI_PHYSICAL_ADDRESS buffer
Definition
main.c:237
AML_EISA_ID_BYTE
#define AML_EISA_ID_BYTE(c)
Definition
eisa_id.c:6
AML_EISA_ID_CHAR
#define AML_EISA_ID_CHAR(b)
Definition
eisa_id.c:54
eisa_id.h
errno.h
aml_eisa_id_to_string
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
aml_eisa_id_from_string
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
EINVAL
#define EINVAL
Invalid argument.
Definition
errno.h:142
errno
#define errno
Error number variable.
Definition
errno.h:27
NULL
#define NULL
Pointer error value.
Definition
NULL.h:25
ERR
#define ERR
Integer error value.
Definition
ERR.h:17
uint32_t
__UINT32_TYPE__ uint32_t
Definition
stdint.h:15
uint64_t
__UINT64_TYPE__ uint64_t
Definition
stdint.h:17
uint8_t
__UINT8_TYPE__ uint8_t
Definition
stdint.h:11
string.h
strnlen_s
size_t strnlen_s(const char *s, size_t maxsize)
Definition
strnlen_s.c:4
src
modules
acpi
aml
runtime
eisa_id.c
Generated on Sat Jan 24 2026 10:59:25 for PatchworkOS by
1.9.8