HPM APP
HPMicro Application solution
monitor_kconfig.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022-2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef __MONITOR_KCONFIG_H
9 #define __MONITOR_KCONFIG_H
10 
11 #if (__has_include("monitor_config.h"))
12 
13 #include "monitor_config.h"
14 
15 #else
16 
17 #define MONITOR_PID (0xFFFF)
18 #define MONITOR_VID (0x34B7) /* HPMicro VID */
19 
20 #define MONITOR_PROFILE_MAXSIZE (4096)
21 
22 #define MONITOR_MEM_SIZE (40*1024)
23 
24 /*--------monitor log--------*/
25 #define CONFIG_MONITOR_PRINTF(...) printf(__VA_ARGS__)
26 
27 #ifndef CONFIG_MONITOR_DBG_LEVEL
28 #define CONFIG_MONITOR_DBG_LEVEL MONITOR_DBG_INFO
29 #endif
30 
31 /* Enable print with color */
32 #define CONFIG_MONITOR_PRINTF_COLOR_ENABLE
33 /*-----------------------------*/
34 /* attribute data into no cache ram */
35 #define MONITOR_NOCACHE_RAM_SECTION __attribute__((section(".fast_ram")))
36 #define MONITOR_NOCACHE_AHB_SECTION __attribute__((section(".ahb_sram")))
37 #define MONITOR_ATTR_ALIGN(alignment) ATTR_ALIGN(alignment)
38 
39 #define CONFIG_MONITOR_RUNNING_CORE HPM_CORE0
40 
41 #include "board.h"
42 
43 #if defined(CONFIG_UART_CHANNEL) && CONFIG_UART_CHANNEL
44 
45 #define MONITOR_UART_DMA_ENABLE
46 
47 #ifndef CONFIG_USE_CONSOLE_UART
48 #define MONITOR_UART_BASE HPM_UART2
49 #define MONITOR_UART_CLK_NAME clock_uart2
50 #define MONITOR_UART_IRQ IRQn_UART2
51 #define MONITOR_UART_BAUDRATE (2000000UL)//(115200UL)
52 
53 #ifdef MONITOR_UART_DMA_ENABLE
54 #define MONITOR_UART_TX_DMA_REQ HPM_DMA_SRC_UART2_TX
55 #define MONITOR_UART_RX_DMA_REQ HPM_DMA_SRC_UART2_RX
56 #endif
57 
58 #else
59 #define MONITOR_UART_BASE BOARD_CONSOLE_UART_BASE
60 #define MONITOR_UART_CLK_NAME BOARD_CONSOLE_UART_CLK_NAME
61 #define MONITOR_UART_IRQ BOARD_CONSOLE_UART_IRQ
62 #define MONITOR_UART_BAUDRATE BOARD_CONSOLE_UART_BAUDRATE
63 
64 #ifdef MONITOR_UART_DMA_ENABLE
65 #define MONITOR_UART_TX_DMA_REQ BOARD_CONSOLE_UART_TX_DMA_REQ
66 #define MONITOR_UART_RX_DMA_REQ BOARD_CONSOLE_UART_RX_DMA_REQ
67 #endif
68 #endif
69 
70 #ifdef MONITOR_UART_DMA_ENABLE
71 #define MONITOR_UART_DMA_CONTROLLER HPM_HDMA
72 #define MONITOR_UART_DMAMUX_CONTROLLER HPM_DMAMUX
73 #define MONITOR_UART_TX_DMA_CHN (0U)
74 #define MONITOR_UART_RX_DMA_CHN (1U)
75 #define MONITOR_UART_TX_DMAMUX_CHN DMA_SOC_CHN_TO_DMAMUX_CHN(MONITOR_UART_DMA_CONTROLLER, MONITOR_UART_TX_DMA_CHN)
76 #define MONITOR_UART_RX_DMAMUX_CHN DMA_SOC_CHN_TO_DMAMUX_CHN(MONITOR_UART_DMA_CONTROLLER, MONITOR_UART_RX_DMA_CHN)
77 #define MONITOR_UART_DMA_IRQ IRQn_HDMA
78 #endif
79 
80 #endif
81 
82 #if defined(CONFIG_USB_CHANNEL) && CONFIG_USB_CHANNEL
83 
84 #define CONFIG_USB_POLLING_ENABLE
85 
86 #include "usb_config.h"
87 #define MONITOR_USB_BASE CONFIG_HPM_USBD_BASE
88 #define MONITOR_USB_BUSID 0
89 #define MONITOR_USB_IRQ CONFIG_HPM_USBD_IRQn
90 #define MONITOR_USB_PRIORITY 2
91 
92 #endif
93 
94 #if defined(CONFIG_ENET_CHANNEL) && CONFIG_ENET_CHANNEL
95 
96 #define MONITOR_TCP_LOCAL_PORT 5001
97 
98 /* Static IP Address */
99 #define MONITOR_ENET_IP_ADDR0 192
100 #define MONITOR_ENET_IP_ADDR1 168
101 #define MONITOR_ENET_IP_ADDR2 100
102 #define MONITOR_ENET_IP_ADDR3 10
103 
104 #define MONITOR_NETMASK_ADDR0 255
105 #define MONITOR_NETMASK_ADDR1 255
106 #define MONITOR_NETMASK_ADDR2 255
107 #define MONITOR_NETMASK_ADDR3 0
108 /* Gateway Address */
109 #define MONITOR_ENET_GW_ADDR0 192
110 #define MONITOR_ENET_GW_ADDR1 168
111 #define MONITOR_ENET_GW_ADDR2 100
112 #define MONITOR_ENET_GW_ADDR3 1
113 
114 #define MONITOR_ENET_TIMER (HPM_GPTMR2)
115 #define MONITOR_ENET_TIMER_CH 1
116 #define MONITOR_ENET_TIMER_IRQ IRQn_GPTMR2
117 #define MONITOR_ENET_TIMER_CLK_NAME (clock_gptmr2)
118 
119 #endif
120 
121 #define MONITOR_REPORT_MAXCOUNT (16)
122 #define MONITOR_STREAM_BUFFER_MAXCOUNT MONITOR_REPORT_MAXCOUNT
123 #define MONITOR_CHANNEL_MAXCOUNT MONITOR_REPORT_MAXCOUNT
124 #define MONITOR_TRIGGER_MAXCOUNT (16)
125 #define MONITOR_DATA_LIST_MAXCOUNT (20)
126 
127 /*--------monitor timer sample config--------*/
128 #define MONITOR_SAMPLE_GPTMR_1_BASE HPM_GPTMR0
129 #define MONITOR_SAMPLE_GPTMR_1_IRQ IRQn_GPTMR0
130 #define MONITOR_SAMPLE_GPTMR_1_CLOCK clock_gptmr0
131 #if MONITOR_STREAM_BUFFER_MAXCOUNT > 12
132 #define MONITOR_SAMPLE_GPTMR_4_BASE HPM_GPTMR3
133 #define MONITOR_SAMPLE_GPTMR_4_IRQ IRQn_GPTMR3
134 #define MONITOR_SAMPLE_GPTMR_4_CLOCK clock_gptmr3
135 #endif
136 #if MONITOR_STREAM_BUFFER_MAXCOUNT > 8
137 #define MONITOR_SAMPLE_GPTMR_3_BASE HPM_GPTMR2
138 #define MONITOR_SAMPLE_GPTMR_3_IRQ IRQn_GPTMR2
139 #define MONITOR_SAMPLE_GPTMR_3_CLOCK clock_gptmr2
140 #endif
141 #if MONITOR_STREAM_BUFFER_MAXCOUNT > 4
142 #define MONITOR_SAMPLE_GPTMR_2_BASE HPM_GPTMR1
143 #define MONITOR_SAMPLE_GPTMR_2_IRQ IRQn_GPTMR1
144 #define MONITOR_SAMPLE_GPTMR_2_CLOCK clock_gptmr1
145 #endif
146 
147 #ifdef HPM_XDMA
148 #define MONITOR_SAMPLE_DMA_1_BASE HPM_XDMA_BASE
149 #define MONITOR_SAMPLE_DMA_1 HPM_XDMA
150 #else
151 #define MONITOR_SAMPLE_DMA_1_BASE HPM_HDMA_BASE
152 #define MONITOR_SAMPLE_DMA_1 HPM_HDMA
153 #endif
154 
155 #if DMA_SOC_CHANNEL_NUM < MONITOR_STREAM_BUFFER_MAXCOUNT
156 #define MONITOR_SAMPLE_DMA_2_BASE HPM_HDMA_BASE
157 #define MONITOR_SAMPLE_DMA_2 HPM_HDMA
158 #endif
159 
160 #define MONITOR_SAMPLE_DMAMUX_BASE HPM_DMAMUX
161 
162 
163 #endif
164 
165 #define MONITOR_VERSION 0x010000
166 #define MONITOR_VERSION_STR "v1.0.0"
167 
168 #define MONITOR_RINGBUFFSER_SIZE (MONITOR_PROFILE_MAXSIZE*2)
169 
170 #if (MONITOR_STREAM_BUFFER_MAXCOUNT > 16) || (MONITOR_STREAM_BUFFER_MAXCOUNT > MONITOR_REPORT_MAXCOUNT)
171 #error "MONITOR_STREAM_BUFFER_MAXCOUNT max support 16"
172 #endif
173 
174 #if MONITOR_CHANNEL_MAXCOUNT > MONITOR_REPORT_MAXCOUNT
175 #error "MONITOR_CHANNEL_MAXCOUNT max support MONITOR_REPORT_MAXCOUNT"
176 #endif
177 
178 #include <stdint.h>
179 #include <stdbool.h>
180 
181 #define ALIGN_4(x) (((x) + 3) & ~3)
182 
183 #define MONITOR_PRIVATE_VAR_NAME(name) b5e21f8a3d709c4f6a82e1b90c367d2a_##name
184 #define MONITOR_SPECIAL_VAR_NAME(name) d73a1f4e8c02b59e61f807ac45d316ba_##name
185 
186 typedef struct {
187  const char* name_t;
188  uint8_t channel_t;
189  uint8_t type_index_t;
190  uint16_t count_t;
191  uint32_t freq_t;
192  uint64_t encoded_value;
194 
196 extern uint32_t MONITOR_PRIVATE_VAR_NAME(monitor_registry_count);
197 
198 const monitor_var_info_t* find_monitor_by_name(const char* name);
200 
201 // the DATA_TYPE enum
202 #define TYPE_INDEX(type) (_Generic((type){0}, \
203  bool: 0x00, \
204  uint8_t: 0x01, \
205  int8_t: 0x02, \
206  uint16_t: 0x03, \
207  int16_t: 0x04, \
208  uint32_t: 0x05, \
209  int32_t: 0x06, \
210  uint64_t: 0x07, \
211  int64_t: 0x08, \
212  float: 0x09, \
213  double: 0x0A, \
214  default: -1 \
215 ))
216 
217 #define MONITOR_DEFINE_GLOBAL_VAR(name, channel, type, frequency, count) \
218  __attribute__((section(".rodata"), used)) \
219  const uint64_t c1f8a3d2b7e1de45a8f1c4b32e3f0b7d_##name = \
220  (((uint64_t)(frequency) << 32) | \
221  ((uint64_t)(count & 0xFFFF) << 16) | \
222  ((uint64_t)TYPE_INDEX(type) & 0xFF) << 8 | \
223  ((uint64_t)(channel) & 0xFF)); \
224  \
225  __attribute__((constructor, used)) \
226  static void __register_monitor_##name(void) { \
227  extern monitor_var_info_t MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_CHANNEL_MAXCOUNT]; \
228  extern uint32_t MONITOR_PRIVATE_VAR_NAME(monitor_registry_count); \
229  /* Inform the compiler about variables c1f8a3d2b7e1de45a8f1c4b32e3f0b7d_##name is being used, and memory may change */ \
230  __asm__ volatile ("" : : "r"(&c1f8a3d2b7e1de45a8f1c4b32e3f0b7d_##name) : "memory"); \
231  \
232  if (MONITOR_PRIVATE_VAR_NAME(monitor_registry_count) < MONITOR_CHANNEL_MAXCOUNT) { \
233  MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)].name_t = #name; \
234  MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)].channel_t = (channel); \
235  MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)].type_index_t = TYPE_INDEX(type); \
236  MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)].count_t = (count); \
237  MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)].freq_t = (frequency); \
238  MONITOR_PRIVATE_VAR_NAME(monitor_registry)[MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)].encoded_value = c1f8a3d2b7e1de45a8f1c4b32e3f0b7d_##name; \
239  MONITOR_PRIVATE_VAR_NAME(monitor_registry_count)++; \
240  } else { \
241  printf("bad! monitor define global var overflow!"); \
242  while(1); \
243  } \
244  }
245 
246 
247 extern bool monitor_send_is_idle(void);
248 
249 #endif //__MONITOR_KCONFIG_H
#define MONITOR_PRIVATE_VAR_NAME(name)
Definition: monitor_kconfig.h:183
const monitor_var_info_t * find_monitor_by_channel(uint8_t channel)
const monitor_var_info_t * find_monitor_by_name(const char *name)
#define MONITOR_CHANNEL_MAXCOUNT
Definition: monitor_kconfig.h:123
bool monitor_send_is_idle(void)
Definition: monitor.c:445
Definition: monitor_kconfig.h:186
uint16_t count_t
Definition: monitor_kconfig.h:190
const char * name_t
Definition: monitor_kconfig.h:187
uint64_t encoded_value
Definition: monitor_kconfig.h:192
uint8_t type_index_t
Definition: monitor_kconfig.h:189
uint8_t channel_t
Definition: monitor_kconfig.h:188
uint32_t freq_t
Definition: monitor_kconfig.h:191