1 /*
2  * Copyright (c) 2024 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief USB support message types and structure
10  */
11 
12 #ifndef ZEPHYR_INCLUDE_USBD_MSG_H_
13 #define ZEPHYR_INCLUDE_USBD_MSG_H_
14 
15 #include <stdint.h>
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 /**
22  * @defgroup usbd_msg_api USB device core API
23  * @ingroup usb
24  * @since 3.7
25  * @version 0.1.0
26  * @{
27  */
28 
29 /**
30  * @brief USB device support message types
31  *
32  * The first set of message types map to event types from the UDC driver API.
33  */
34 enum usbd_msg_type {
35 	/** VBUS ready message (optional) */
36 	USBD_MSG_VBUS_READY,
37 	/** VBUS removed message (optional) */
38 	USBD_MSG_VBUS_REMOVED,
39 	/** Device resume message */
40 	USBD_MSG_RESUME,
41 	/** Device suspended message */
42 	USBD_MSG_SUSPEND,
43 	/** Bus reset detected */
44 	USBD_MSG_RESET,
45 	/** Device changed configuration */
46 	USBD_MSG_CONFIGURATION,
47 	/** Non-correctable UDC error message  */
48 	USBD_MSG_UDC_ERROR,
49 	/** Unrecoverable device stack error message  */
50 	USBD_MSG_STACK_ERROR,
51 	/** CDC ACM Line Coding update */
52 	USBD_MSG_CDC_ACM_LINE_CODING,
53 	/** CDC ACM Line State update */
54 	USBD_MSG_CDC_ACM_CONTROL_LINE_STATE,
55 	/** USB DFU class detach request */
56 	USBD_MSG_DFU_APP_DETACH,
57 	/** USB DFU class download completed */
58 	USBD_MSG_DFU_DOWNLOAD_COMPLETED,
59 	/** Maximum number of message types */
60 	USBD_MSG_MAX_NUMBER,
61 };
62 
63 /**
64  * @cond INTERNAL_HIDDEN
65  */
66 static const char *const usbd_msg_type_list[] = {
67 	"VBUS ready",
68 	"VBUS removed",
69 	"Device resumed",
70 	"Device suspended",
71 	"Bus reset",
72 	"New device configuration",
73 	"Controller error",
74 	"Stack error",
75 	"CDC ACM line coding",
76 	"CDC ACM control line state",
77 	"DFU detach request",
78 	"DFU download completed",
79 };
80 
81 BUILD_ASSERT(ARRAY_SIZE(usbd_msg_type_list) == USBD_MSG_MAX_NUMBER,
82 	     "Number of entries in usbd_msg_type_list is not equal to USBD_MSG_MAX_NUMBER");
83 /** @endcond */
84 
85 /**
86  * @brief USB device message
87  */
88 struct usbd_msg {
89 	/** Message type */
90 	enum usbd_msg_type type;
91 	/** Message status, value or data */
92 	union {
93 		int status;
94 		const struct device *dev;
95 	};
96 };
97 
98 /**
99  * @brief Returns the message type as a constant string
100  *
101  * @param[in] type USBD message type
102  *
103  * @return Message type as a constant string
104  */
usbd_msg_type_string(const enum usbd_msg_type type)105 static inline const char *usbd_msg_type_string(const enum usbd_msg_type type)
106 {
107 	if (type >= 0 && type < USBD_MSG_MAX_NUMBER) {
108 		return usbd_msg_type_list[type];
109 	}
110 
111 	return "?";
112 }
113 
114 /**
115  * @}
116  */
117 
118 #ifdef __cplusplus
119 }
120 #endif
121 
122 #endif /* ZEPHYR_INCLUDE_USBD_MSG_H_ */
123