• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  * Copyright (c) 2022 Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK")
3  * All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************/
18 #ifndef __MYUDB_H__
19 #define __MYUDB_H__
20 #pragma once
21 
22 #include "common/config/user_config.h"
23 #include "log_def_stack.h"
24 
25 /* Trace global enable macro */
26 #ifndef VCD_EN
27 #define VCD_EN 0
28 #endif
29 /* USB print log enable macro */
30 #ifndef DUMP_STR_EN
31 #define DUMP_STR_EN 0
32 #endif
33 
34 #define SL_STACK_EN 0
35 
36 #if (DUMP_STR_EN)
37 #define my_usb_init(id, p_print) myudb_usb_init(id, p_print)
38 #define usb_send_str(s)          usb_send_str_data(s, 0, 0)
39 #define usb_send_data(p, n)      usb_send_str_data(0, p, n)
40 #define my_dump_str_data(en, s, p, n)                                                                                 \
41     if (en) {                                                                                                         \
42         usb_send_str_data(s, (u8 *)(p), n);                                                                           \
43     }
44 #define my_dump_str_u32s(en, s, d0, d1, d2, d3)                                                                       \
45     if (en) {                                                                                                         \
46         usb_send_str_u32s(s, (u32)(d0), (u32)(d1), (u32)(d2), (u32)(d3));                                             \
47     }
48 #define my_uart_send_str_data  usb_send_str_data
49 #define my_uart_send_str_int   usb_send_str_int
50 #define myudb_usb_handle_irq() udb_usb_handle_irq()
51 #else
52 #define my_usb_init(id, p_print)
53 #define usb_send_str(s)
54 #define usb_send_data(p, n)
55 #define my_dump_str_data(en, s, p, n)
56 #define my_dump_str_u32s(en, s, d0, d1, d2, d3)
57 #define my_uart_send_str_data
58 #define my_uart_send_str_int
59 #define myudb_usb_handle_irq()
60 #endif
61 
62 typedef int (*func_myudb_hci_cmd_cb_t)(unsigned char *, int);
63 
64 void myudb_register_hci_cb(void *p);
65 void myudb_register_hci_debug_cb(void *p);
66 
67 void myudb_usb_init(u16 id, void *p_print);
68 
69 void myudb_usb_bulkout_ready(void);
70 
71 void udb_usb_handle_irq(void);
72 
73 void usb_send_status_pkt(u8 status, u8 buffer_num, u8 *pkt, u16 len);
74 
75 void myudb_capture_enable(int en);
76 
77 void usb_send_str_data(char *str, u8 *ph, int n);
78 
79 void usb_send_str_u32s(char *str, u32 d0, u32 d1, u32 d2, u32 d3);
80 
81 void usb_send_upper_tester_result(u8 err);
82 
83 #define my_irq_disable()    u32 rie = core_interrupt_disable()
84 #define my_irq_restore()    core_restore_interrupt(rie)
85 #define LOG_EVENT_TIMESTAMP 0
86 #define LOG_DATA_B1_0       0
87 #define LOG_DATA_B1_1       1
88 
89 #define get_systemtick() stimer_get_tick()
90 
91 #define log_uart(d) reg_usb_ep8_dat = d
92 
93 #define DEBUG_PORT       GPIO_PB2
94 #define log_ref_gpio_h() gpio_set_high_level(DEBUG_PORT)
95 #define log_ref_gpio_l() gpio_set_low_level(DEBUG_PORT)
96 
97 #define log_hw_ref()                                                                                                  \
98     if (VCD_EN) {                                                                                                     \
99         my_irq_disable();                                                                                             \
100         log_ref_gpio_h();                                                                                             \
101         log_uart(0x20);                                                                                               \
102         int t = get_systemtick();                                                                                     \
103         log_uart(t);                                                                                                  \
104         log_uart(t >> 8);                                                                                             \
105         log_uart(t >> 16);                                                                                            \
106         log_ref_gpio_l();                                                                                             \
107         my_irq_restore();                                                                                             \
108     }
109 
110 // 4-byte sync word: 00 00 00 00
111 #define log_sync(en)                                                                                                  \
112     if (VCD_EN && (en)) {                                                                                               \
113         my_irq_disable();                                                                                             \
114         log_uart(0);                                                                                                  \
115         log_uart(0);                                                                                                  \
116         log_uart(0);                                                                                                  \
117         log_uart(0);                                                                                                  \
118         my_irq_restore();                                                                                             \
119     }
120 // 4-byte (001_id-5bits) id0: timestamp align with hardware gpio output; id1-31: user define
121 #define log_tick(en, id)                                                                                              \
122     if (VCD_EN && (en)) {                                                                                               \
123         my_irq_disable();                                                                                             \
124         log_uart(0x20 | ((id) & 31));                                                                                   \
125         int t = get_systemtick();                                                                                     \
126         log_uart(t);                                                                                                  \
127         log_uart(t >> 8);                                                                                             \
128         log_uart(t >> 16);                                                                                            \
129         my_irq_restore();                                                                                             \
130     }
131 
132 // 1-byte (000_id-5bits)
133 #define log_event(en, id)                                                                                             \
134     if (VCD_EN && (en)) {                                                                                               \
135         my_irq_disable();                                                                                             \
136         log_uart(0x00 | ((id) & 31));                                                                                   \
137         my_irq_restore();                                                                                             \
138     }
139 
140 // 1-byte (01x_id-5bits) 1-bit data: id0 & id1 reserved for hardware
141 #define log_task(en, id, b)                                                                                           \
142     if (VCD_EN && (en)) {                                                                                               \
143         my_irq_disable();                                                                                             \
144         log_uart(((b) ? 0x60 : 0x40) | ((id) & 31));                                                                    \
145         int t = get_systemtick();                                                                                     \
146         log_uart(t);                                                                                                  \
147         log_uart(t >> 8);                                                                                             \
148         log_uart(t >> 16);                                                                                            \
149         my_irq_restore();                                                                                             \
150     }
151 
152 // 2-byte (10-id-6bits) 8-bit data
153 #define log_b8(en, id, d)                                                                                             \
154     if (VCD_EN && (en)) {                                                                                               \
155         my_irq_disable();                                                                                             \
156         log_uart(0x80 | ((id) & 63));                                                                                   \
157         log_uart(d);                                                                                                  \
158         my_irq_restore();                                                                                             \
159     }
160 
161 // 3-byte (11-id-6bits) 16-bit data
162 #define log_b16(en, id, d)                                                                                            \
163     if (VCD_EN && (en)) {                                                                                               \
164         my_irq_disable();                                                                                             \
165         log_uart(0xc0 | ((id) & 63));                                                                                   \
166         log_uart(d);                                                                                                  \
167         log_uart((d) >> 8);                                                                                           \
168         my_irq_restore();                                                                                             \
169     }
170 
171 #define log_tick_irq(en, id)                                                                                          \
172     if (VCD_EN && (en)) {                                                                                               \
173         log_uart(0x20 | (id));                                                                                        \
174         int t = get_systemtick();                                                                                     \
175         log_uart(t);                                                                                                  \
176         log_uart(t >> 8);                                                                                             \
177         log_uart(t >> 16);                                                                                            \
178     }
179 #define log_tick_irq_2(en, id, t)                                                                                     \
180     if (VCD_EN && (en)) {                                                                                               \
181         log_uart(0x20 | (id));                                                                                        \
182         log_uart(t);                                                                                                  \
183         log_uart((t) >> 8);                                                                                             \
184         log_uart((t) >> 16);                                                                                            \
185     }
186 
187 #define log_event_irq(en, id)                                                                                         \
188     if (VCD_EN && (en)) {                                                                                               \
189         log_uart(0x00 | (id));                                                                                        \
190     }
191 
192 #define log_task_irq(en, id, b)                                                                                       \
193     if (VCD_EN && (en)) {                                                                                               \
194         log_uart(((b) ? 0x60 : 0x40) | (id));                                                                         \
195         int t = get_systemtick();                                                                                     \
196         log_uart(t);                                                                                                  \
197         log_uart(t >> 8);                                                                                             \
198         log_uart(t >> 16);                                                                                            \
199     }
200 
201 #define log_task_begin_irq(en, id)                                                                                    \
202     if (VCD_EN && (en)) {                                                                                               \
203         log_uart(0x60 | (id));                                                                                        \
204         int t = get_systemtick();                                                                                     \
205         log_uart(t);                                                                                                  \
206         log_uart(t >> 8);                                                                                             \
207         log_uart(t >> 16);                                                                                            \
208     }
209 #define log_task_end_irq(en, id)                                                                                      \
210     if (VCD_EN && (en)) {                                                                                               \
211         log_uart(0x40 | (id));                                                                                        \
212         int t = get_systemtick();                                                                                     \
213         log_uart(t);                                                                                                  \
214         log_uart(t >> 8);                                                                                             \
215         log_uart(t >> 16);                                                                                            \
216     }
217 
218 #define log_task_begin_irq_2(en, id, t)                                                                               \
219     if (VCD_EN && (en)) {                                                                                               \
220         log_uart(0x60 | (id));                                                                                        \
221         log_uart(t);                                                                                                  \
222         log_uart((t) >> 8);                                                                                             \
223         log_uart((t) >> 16);                                                                                            \
224     }
225 #define log_task_end_irq_2(en, id, t)                                                                                 \
226     if (VCD_EN && (en)) {                                                                                               \
227         log_uart(0x40 | (id));                                                                                        \
228         log_uart(t);                                                                                                  \
229         log_uart((t) >> 8);                                                                                             \
230         log_uart((t) >> 16);                                                                                            \
231     }
232 
233 #define log_b8_irq(en, id, d)                                                                                         \
234     if (VCD_EN && (en)) {                                                                                               \
235         log_uart(0x80 | (id));                                                                                        \
236         log_uart(d);                                                                                                  \
237     }
238 
239 #define log_b16_irq(en, id, d)                                                                                        \
240     if (VCD_EN && (en)) {                                                                                               \
241         log_uart(0xc0 | (id));                                                                                        \
242         log_uart(d);                                                                                                  \
243         log_uart((d) >> 8);                                                                                           \
244     }
245 
246 #endif
247