• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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