1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: LOG OAM LOGGER MODULE
15 */
16 #include "log_oam_logger.h"
17
18 #if (USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG == NO)
19 #include <stdarg.h>
20 #include "log_common.h"
21
22 #if defined(CHIP_CAT1) && (CHIP_CAT1 == 1) && (CORE != CORE_LOGGING)
23 #else
24 #include "uart.h"
25 #endif
26
27 #ifdef CONFIG_LOG_USE_DIAG_FRAME
28 #include "diag_ind_src.h"
29 #endif
30
31 #ifdef BTH_LOG_BUG_FIX
32 #define LOG_LEVEL_DEBUG_TO_ERROR 0x40
33 #endif
34
35 /* Module log level defination */
36 om_log_module_lev_t g_module_log_level[MODULEID_BUTT] = {
37 { LOG_WIFIMODULE, LOG_LEVEL_INFO },
38 { LOG_BTMODULE, LOG_LEVEL_INFO },
39 { LOG_BTHMODULE, LOG_LEVEL_INFO },
40 { LOG_NFCMODULE, LOG_LEVEL_INFO },
41 { LOG_PFMODULE, LOG_LEVEL_INFO },
42 };
43
44 #ifdef CONFIG_DFX_SUPPORT_USERS_PRINT
45 static log_other_print_t g_other_print_func = NULL;
46
log_other_print_register(log_other_print_t users_print_func)47 void log_other_print_register(log_other_print_t users_print_func)
48 {
49 if (users_print_func == NULL) {
50 return;
51 }
52 g_other_print_func = users_print_func;
53 }
54
log_other_print0(uint32_t log_header,uint32_t log_level,const char * fmt)55 void log_other_print0(uint32_t log_header, uint32_t log_level, const char *fmt)
56 {
57 if (g_other_print_func == NULL) {
58 return;
59 }
60 g_other_print_func(log_header, log_level, fmt, 0);
61 }
62
log_other_print1(uint32_t log_header,uint32_t log_level,const char * fmt,uint32_t p0)63 void log_other_print1(uint32_t log_header, uint32_t log_level, const char *fmt, uint32_t p0)
64 {
65 if (g_other_print_func == NULL) {
66 return;
67 }
68 g_other_print_func(log_header, log_level, fmt, 1, p0);
69 }
70
log_other_print2(uint32_t log_header,uint32_t log_level,const char * fmt,uint32_t p0,uint32_t p1)71 void log_other_print2(uint32_t log_header, uint32_t log_level, const char *fmt, uint32_t p0, uint32_t p1)
72 {
73 if (g_other_print_func == NULL) {
74 return;
75 }
76 g_other_print_func(log_header, log_level, fmt, LOG_OAM_INDEX_2, p0, p1);
77 }
78
log_other_print3(uint32_t log_header,uint32_t log_level,const char * fmt,uint32_t p0,uint32_t p1,uint32_t p2)79 void log_other_print3(uint32_t log_header, uint32_t log_level, const char *fmt, uint32_t p0, uint32_t p1, uint32_t p2)
80 {
81 if (g_other_print_func == NULL) {
82 return;
83 }
84 g_other_print_func(log_header, log_level, fmt, LOG_OAM_INDEX_3, p0, p1, p2);
85 }
86
log_other_print4(uint32_t log_header,uint32_t log_level,const char * fmt,uint32_t p0,uint32_t p1,uint32_t p2,uint32_t p3)87 void log_other_print4(uint32_t log_header, uint32_t log_level, const char *fmt,
88 uint32_t p0, uint32_t p1, uint32_t p2, uint32_t p3)
89 {
90 if (g_other_print_func == NULL) {
91 return;
92 }
93 g_other_print_func(log_header, log_level, fmt, LOG_OAM_INDEX_4, p0, p1, p2, p3);
94 }
95 #endif
96
log_check(uint32_t * presspara)97 static bool log_check(uint32_t *presspara)
98 {
99 if (get_module_id(*presspara) >= MODULEID_BUTT) {
100 return false;
101 }
102
103 #ifdef BTH_LOG_BUG_FIX
104 if (get_module_id(*presspara) == LOG_BTHMODULE && getlog_level(*presspara) == LOG_LEVEL_NONE) {
105 *presspara |= LOG_LEVEL_DEBUG_TO_ERROR;
106 }
107 #endif
108
109 if (getlog_level(*presspara) > (uint8_t)log_get_local_log_level()) {
110 return false;
111 }
112 return true;
113 }
114
log_event_print0(uint32_t log_header,uint32_t presspara)115 void log_event_print0(uint32_t log_header, uint32_t presspara)
116 {
117 // Module ID is unknown
118 uint32_t presspara_temp = presspara;
119 if (log_check(&presspara_temp) == false) { return; }
120
121 #ifndef CONFIG_LOG_USE_DIAG_FRAME
122 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_ZERO_ARG_SEND + OML_LOG_TAIL_LENTH];
123
124 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
125 log_oam_entry[LOG_OAM_INDEX_1] =
126 (uint32_t)log_lenth_and_sn_press(OML_LOG_ZERO_ARG_SEND, (uint32_t)get_log_sn_number());
127 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
128 log_oam_entry[LOG_OAM_INDEX_3] = OM_FRAME_DELIMITER;
129
130 log_event((uint8_t *)log_oam_entry, oal_log_lenth(OML_LOG_ZERO_ARG_SEND));
131 #else
132 uint32_t module_id = log_header;
133 uint8_t level = getlog_level(presspara_temp);
134 level = sdt_to_diag_log_level(level);
135 uint32_t msg_id = (presspara_temp & ~OAM_LOG_LEVEL_MASK) | level;
136
137 uapi_diag_report_sys_msg_to_buffer(module_id, msg_id, NULL, 0, level);
138 #endif
139 }
140
log_event_print1(uint32_t log_header,uint32_t presspara,uint32_t para1)141 void log_event_print1(uint32_t log_header, uint32_t presspara, uint32_t para1)
142 {
143 // Module ID is unknown
144 uint32_t presspara_temp = presspara;
145 if (log_check(&presspara_temp) == false) { return; }
146
147 #ifndef CONFIG_LOG_USE_DIAG_FRAME
148 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_ONE_ARG_SEND + OML_LOG_TAIL_LENTH];
149
150 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
151 log_oam_entry[LOG_OAM_INDEX_1] =
152 (uint32_t)log_lenth_and_sn_press(OML_LOG_ONE_ARG_SEND, (uint32_t)get_log_sn_number());
153 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
154 log_oam_entry[LOG_OAM_INDEX_3] = para1;
155 log_oam_entry[LOG_OAM_INDEX_4] = OM_FRAME_DELIMITER;
156
157 log_event((uint8_t *)log_oam_entry, oal_log_lenth(OML_LOG_ONE_ARG_SEND));
158 #else
159 uint32_t module_id = log_header;
160 uint8_t level = getlog_level(presspara_temp);
161 level = sdt_to_diag_log_level(level);
162 uint32_t msg_id = (presspara_temp & ~OAM_LOG_LEVEL_MASK) | level;
163 uint32_t log_data[OML_LOG_ONE_ARG_SEND];
164
165 log_data[LOG_OAM_INDEX_0] = para1;
166
167 uapi_diag_report_sys_msg_to_buffer(module_id, msg_id, (uint8_t *)log_data, sizeof(log_data), level);
168 #endif
169 }
170
log_event_print2(uint32_t log_header,uint32_t presspara,uint32_t para1,uint32_t para2)171 void log_event_print2(uint32_t log_header, uint32_t presspara, uint32_t para1, uint32_t para2)
172 {
173 // Module ID is unknown
174 uint32_t presspara_temp = presspara;
175 if (log_check(&presspara_temp) == false) { return; }
176
177 #ifndef CONFIG_LOG_USE_DIAG_FRAME
178 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_TWO_ARG_SEND + OML_LOG_TAIL_LENTH];
179
180 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
181 log_oam_entry[LOG_OAM_INDEX_1] =
182 (uint32_t)log_lenth_and_sn_press(OML_LOG_TWO_ARG_SEND, (uint32_t)get_log_sn_number());
183 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
184 log_oam_entry[LOG_OAM_INDEX_3] = para1;
185 log_oam_entry[LOG_OAM_INDEX_4] = para2;
186 log_oam_entry[LOG_OAM_INDEX_5] = OM_FRAME_DELIMITER;
187
188 log_event((uint8_t *)log_oam_entry, oal_log_lenth(OML_LOG_TWO_ARG_SEND));
189 #else
190 uint32_t module_id = log_header;
191 uint8_t level = getlog_level(presspara_temp);
192 level = sdt_to_diag_log_level(level);
193 uint32_t msg_id = (presspara_temp & ~OAM_LOG_LEVEL_MASK) | level;
194 uint32_t log_data[OML_LOG_TWO_ARG_SEND];
195
196 log_data[LOG_OAM_INDEX_0] = para1;
197 log_data[LOG_OAM_INDEX_1] = para2;
198
199 uapi_diag_report_sys_msg_to_buffer(module_id, msg_id, (uint8_t *)log_data, sizeof(log_data), level);
200 #endif
201 }
202
log_event_print3(uint32_t log_header,uint32_t presspara,uint32_t para1,uint32_t para2,uint32_t para3)203 void log_event_print3(uint32_t log_header, uint32_t presspara, uint32_t para1, uint32_t para2, uint32_t para3)
204 {
205 // Module ID is unknown
206 uint32_t presspara_temp = presspara;
207 if (log_check(&presspara_temp) == false) { return; }
208
209 #ifndef CONFIG_LOG_USE_DIAG_FRAME
210 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_THREE_ARG_SEND + OML_LOG_TAIL_LENTH];
211
212 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
213 log_oam_entry[LOG_OAM_INDEX_1] =
214 (uint32_t)log_lenth_and_sn_press(OML_LOG_THREE_ARG_SEND, (uint32_t)get_log_sn_number());
215 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
216 log_oam_entry[LOG_OAM_INDEX_3] = para1;
217 log_oam_entry[LOG_OAM_INDEX_4] = para2;
218 log_oam_entry[LOG_OAM_INDEX_5] = para3;
219 log_oam_entry[LOG_OAM_INDEX_6] = OM_FRAME_DELIMITER;
220
221 log_event((uint8_t *)log_oam_entry, oal_log_lenth(OML_LOG_THREE_ARG_SEND));
222 #else
223 uint32_t module_id = log_header;
224 uint8_t level = getlog_level(presspara_temp);
225 level = sdt_to_diag_log_level(level);
226 uint32_t msg_id = (presspara_temp & ~OAM_LOG_LEVEL_MASK) | level;
227 uint32_t log_data[OML_LOG_THREE_ARG_SEND];
228
229 log_data[LOG_OAM_INDEX_0] = para1;
230 log_data[LOG_OAM_INDEX_1] = para2;
231 log_data[LOG_OAM_INDEX_2] = para3;
232
233 uapi_diag_report_sys_msg_to_buffer(module_id, msg_id, (uint8_t *)log_data, sizeof(log_data), level);
234 #endif
235 }
236
log_event_print4(uint32_t log_header,uint32_t presspara,uint32_t para1,uint32_t para2,uint32_t para3,uint32_t para4)237 void log_event_print4(uint32_t log_header, uint32_t presspara, uint32_t para1, uint32_t para2,
238 uint32_t para3, uint32_t para4)
239 {
240 // Module ID is unknown
241 uint32_t presspara_temp = presspara;
242 if (log_check(&presspara_temp) == false) { return; }
243
244 #ifndef CONFIG_LOG_USE_DIAG_FRAME
245 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_FOUR_ARG_SEND + OML_LOG_TAIL_LENTH];
246
247 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
248 log_oam_entry[LOG_OAM_INDEX_1] =
249 (uint32_t)log_lenth_and_sn_press(OML_LOG_FOUR_ARG_SEND, (uint32_t)get_log_sn_number());
250 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
251 log_oam_entry[LOG_OAM_INDEX_3] = para1;
252 log_oam_entry[LOG_OAM_INDEX_4] = para2;
253 log_oam_entry[LOG_OAM_INDEX_5] = para3;
254 log_oam_entry[LOG_OAM_INDEX_6] = para4;
255 log_oam_entry[LOG_OAM_INDEX_7] = OM_FRAME_DELIMITER;
256
257 log_event((uint8_t *)log_oam_entry, oal_log_lenth(OML_LOG_FOUR_ARG_SEND));
258 #else
259 uint32_t module_id = log_header;
260 uint8_t level = getlog_level(presspara_temp);
261 level = sdt_to_diag_log_level(level);
262 uint32_t msg_id = (presspara_temp & ~OAM_LOG_LEVEL_MASK) | level;
263 uint32_t log_data[OML_LOG_FOUR_ARG_SEND];
264
265 log_data[LOG_OAM_INDEX_0] = para1;
266 log_data[LOG_OAM_INDEX_1] = para2;
267 log_data[LOG_OAM_INDEX_2] = para3;
268 log_data[LOG_OAM_INDEX_3] = para4;
269
270 uapi_diag_report_sys_msg_to_buffer(module_id, msg_id, (uint8_t *)log_data, sizeof(log_data), level);
271 #endif
272 }
273
log_event_print_alterable_para_press(uint32_t log_header,uint32_t presspara,uint32_t paranum,...)274 void log_event_print_alterable_para_press(uint32_t log_header, uint32_t presspara, uint32_t paranum, ...)
275 {
276 uint8_t uc_para_num;
277 uint8_t uc_loop;
278 va_list args;
279
280 // Module ID is unknown
281 uint32_t presspara_temp = presspara;
282 if (log_check(&presspara_temp) == false) { return; }
283
284 uc_para_num = (uint8_t)((paranum > OML_LOG_ALTER_PARA_MAX_NUM) ? (OML_LOG_ALTER_PARA_MAX_NUM) : paranum);
285
286 #ifndef CONFIG_LOG_USE_DIAG_FRAME
287 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_ALTER_PARA_MAX_NUM + OML_LOG_TAIL_LENTH];
288
289 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
290 log_oam_entry[LOG_OAM_INDEX_1] = (uint32_t)log_lenth_and_sn_press(uc_para_num, (uint32_t)get_log_sn_number());
291 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
292
293 va_start(args, paranum);
294 for (uc_loop = 0; uc_loop < uc_para_num; uc_loop++) {
295 log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + uc_loop] = (uint32_t)va_arg(args, uint32_t);
296 }
297 va_end(args);
298 log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + uc_loop] = OM_FRAME_DELIMITER;
299
300 log_event((uint8_t *)log_oam_entry, oal_log_lenth(uc_para_num));
301 #else
302 uint32_t module_id = log_header;
303 uint8_t level = getlog_level(presspara_temp);
304 level = sdt_to_diag_log_level(level);
305 uint32_t msg_id = (presspara_temp & ~OAM_LOG_LEVEL_MASK) | level;
306 uint32_t log_data[OML_LOG_ALTER_PARA_MAX_NUM];
307
308 va_start(args, paranum);
309 for (uc_loop = 0; uc_loop < uc_para_num; uc_loop++) {
310 log_data[uc_loop] = (uint32_t)va_arg(args, uint32_t);
311 }
312 va_end(args);
313
314 uapi_diag_report_sys_msg_to_buffer(module_id, msg_id, (uint8_t *)log_data, sizeof(uint32_t) * uc_para_num, level);
315 #endif
316 }
317
log_event_wifi_print0(uint32_t presspara)318 void log_event_wifi_print0(uint32_t presspara)
319 {
320 log_event_print0(log_head_press(OM_WIFI), presspara);
321 }
322
log_event_wifi_print1(uint32_t presspara,uint32_t para1)323 void log_event_wifi_print1(uint32_t presspara, uint32_t para1)
324 {
325 log_event_print1(log_head_press(OM_WIFI), presspara, para1);
326 }
327
log_event_wifi_print2(uint32_t presspara,uint32_t para1,uint32_t para2)328 void log_event_wifi_print2(uint32_t presspara, uint32_t para1, uint32_t para2)
329 {
330 log_event_print2(log_head_press(OM_WIFI), presspara, para1, para2);
331 }
332
log_event_wifi_print3(uint32_t presspara,uint32_t para1,uint32_t para2,uint32_t para3)333 void log_event_wifi_print3(uint32_t presspara, uint32_t para1, uint32_t para2, uint32_t para3)
334 {
335 log_event_print3(log_head_press(OM_WIFI), presspara, para1, para2, para3);
336 }
337
log_event_wifi_print4(uint32_t presspara,uint32_t para1,uint32_t para2,uint32_t para3,uint32_t para4)338 void log_event_wifi_print4(uint32_t presspara, uint32_t para1, uint32_t para2, uint32_t para3, uint32_t para4)
339 {
340 log_event_print4(log_head_press(OM_WIFI), presspara, para1, para2, para3, para4);
341 }
342
343 #if CORE == CORE_LOGGING
log_event_print_alterable_para_press_by_write_uart_fifo(uint32_t log_header,uint32_t presspara,uint32_t paranum,...)344 void log_event_print_alterable_para_press_by_write_uart_fifo(uint32_t log_header, uint32_t presspara,
345 uint32_t paranum, ...)
346 {
347 uint8_t uc_para_num;
348 uint8_t uc_loop;
349 uint32_t log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + OML_LOG_ALTER_PARA_MAX_NUM + OML_LOG_TAIL_LENTH];
350 va_list args;
351 uint32_t presspara_temp = presspara;
352 if (log_check(&presspara_temp) == false) { return; }
353
354 uc_para_num = (uint8_t)((paranum > OML_LOG_ALTER_PARA_MAX_NUM) ? (OML_LOG_ALTER_PARA_MAX_NUM) : paranum);
355
356 log_oam_entry[LOG_OAM_INDEX_0] = log_header;
357 log_oam_entry[LOG_OAM_INDEX_1] = (uint32_t)log_lenth_and_sn_press(uc_para_num, (uint32_t)get_log_sn_number());
358 log_oam_entry[LOG_OAM_INDEX_2] = presspara_temp;
359
360 va_start(args, paranum);
361 for (uc_loop = 0; uc_loop < uc_para_num; uc_loop++) {
362 log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + uc_loop] = (uint32_t)va_arg(args, uint32_t);
363 }
364 va_end(args);
365 log_oam_entry[OML_LOG_HEADER_ARRAY_LENTH + uc_loop] = OM_FRAME_DELIMITER;
366 uapi_uart_write(LOG_UART_BUS, (const void *)log_oam_entry, oal_log_lenth(uc_para_num), 0);
367 }
368 #endif
369
370 #endif /* USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG */
371