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