dap_config.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. // Copyright (c) 2022, Alex Taradov <alex@taradov.com>. All rights reserved.
  3. #ifndef _DAP_CONFIG_H_
  4. #define _DAP_CONFIG_H_
  5. /*- Includes ----------------------------------------------------------------*/
  6. #include <furi_hal_gpio.h>
  7. /*- Definitions -------------------------------------------------------------*/
  8. #define DAP_CONFIG_ENABLE_JTAG
  9. #define DAP_CONFIG_DEFAULT_PORT DAP_PORT_SWD
  10. #define DAP_CONFIG_DEFAULT_CLOCK 4200000 // Hz
  11. #define DAP_CONFIG_PACKET_SIZE 64
  12. #define DAP_CONFIG_PACKET_COUNT 1
  13. #define DAP_CONFIG_JTAG_DEV_COUNT 8
  14. // DAP_CONFIG_PRODUCT_STR must contain "CMSIS-DAP" to be compatible with the standard
  15. #define DAP_CONFIG_VENDOR_STR "Flipper Zero"
  16. #define DAP_CONFIG_PRODUCT_STR "Generic CMSIS-DAP Adapter"
  17. #define DAP_CONFIG_SER_NUM_STR usb_serial_number
  18. #define DAP_CONFIG_CMSIS_DAP_VER_STR "2.0.0"
  19. #define DAP_CONFIG_RESET_TARGET_FN dap_app_target_reset
  20. #define DAP_CONFIG_VENDOR_FN dap_app_vendor_cmd
  21. // Attribute to use for performance-critical functions
  22. #define DAP_CONFIG_PERFORMANCE_ATTR
  23. // A value at which dap_clock_test() produces 1 kHz output on the SWCLK pin
  24. // #define DAP_CONFIG_DELAY_CONSTANT 19000
  25. #define DAP_CONFIG_DELAY_CONSTANT 6290
  26. // A threshold for switching to fast clock (no added delays)
  27. // This is the frequency produced by dap_clock_test(1) on the SWCLK pin
  28. #define DAP_CONFIG_FAST_CLOCK 2400000 // Hz
  29. /*- Prototypes --------------------------------------------------------------*/
  30. extern char usb_serial_number[16];
  31. /*- Implementations ---------------------------------------------------------*/
  32. extern GpioPin flipper_dap_swclk_pin;
  33. extern GpioPin flipper_dap_swdio_pin;
  34. extern GpioPin flipper_dap_reset_pin;
  35. extern GpioPin flipper_dap_tdo_pin;
  36. extern GpioPin flipper_dap_tdi_pin;
  37. extern void dap_app_vendor_cmd(uint8_t cmd);
  38. extern void dap_app_target_reset();
  39. extern void dap_app_disconnect();
  40. extern void dap_app_connect_swd();
  41. extern void dap_app_connect_jtag();
  42. //-----------------------------------------------------------------------------
  43. static inline void DAP_CONFIG_SWCLK_TCK_write(int value) {
  44. furi_hal_gpio_write(&flipper_dap_swclk_pin, value);
  45. }
  46. //-----------------------------------------------------------------------------
  47. static inline void DAP_CONFIG_SWDIO_TMS_write(int value) {
  48. furi_hal_gpio_write(&flipper_dap_swdio_pin, value);
  49. }
  50. //-----------------------------------------------------------------------------
  51. static inline void DAP_CONFIG_TDI_write(int value) {
  52. #ifdef DAP_CONFIG_ENABLE_JTAG
  53. furi_hal_gpio_write(&flipper_dap_tdi_pin, value);
  54. #else
  55. (void)value;
  56. #endif
  57. }
  58. //-----------------------------------------------------------------------------
  59. static inline void DAP_CONFIG_TDO_write(int value) {
  60. #ifdef DAP_CONFIG_ENABLE_JTAG
  61. furi_hal_gpio_write(&flipper_dap_tdo_pin, value);
  62. #else
  63. (void)value;
  64. #endif
  65. }
  66. //-----------------------------------------------------------------------------
  67. static inline void DAP_CONFIG_nTRST_write(int value) {
  68. (void)value;
  69. }
  70. //-----------------------------------------------------------------------------
  71. static inline void DAP_CONFIG_nRESET_write(int value) {
  72. furi_hal_gpio_write(&flipper_dap_reset_pin, value);
  73. }
  74. //-----------------------------------------------------------------------------
  75. static inline int DAP_CONFIG_SWCLK_TCK_read(void) {
  76. return furi_hal_gpio_read(&flipper_dap_swclk_pin);
  77. }
  78. //-----------------------------------------------------------------------------
  79. static inline int DAP_CONFIG_SWDIO_TMS_read(void) {
  80. return furi_hal_gpio_read(&flipper_dap_swdio_pin);
  81. }
  82. //-----------------------------------------------------------------------------
  83. static inline int DAP_CONFIG_TDO_read(void) {
  84. #ifdef DAP_CONFIG_ENABLE_JTAG
  85. return furi_hal_gpio_read(&flipper_dap_tdo_pin);
  86. #else
  87. return 0;
  88. #endif
  89. }
  90. //-----------------------------------------------------------------------------
  91. static inline int DAP_CONFIG_TDI_read(void) {
  92. #ifdef DAP_CONFIG_ENABLE_JTAG
  93. return furi_hal_gpio_read(&flipper_dap_tdi_pin);
  94. #else
  95. return 0;
  96. #endif
  97. }
  98. //-----------------------------------------------------------------------------
  99. static inline int DAP_CONFIG_nTRST_read(void) {
  100. return 0;
  101. }
  102. //-----------------------------------------------------------------------------
  103. static inline int DAP_CONFIG_nRESET_read(void) {
  104. return furi_hal_gpio_read(&flipper_dap_reset_pin);
  105. }
  106. //-----------------------------------------------------------------------------
  107. static inline void DAP_CONFIG_SWCLK_TCK_set(void) {
  108. LL_GPIO_SetOutputPin(flipper_dap_swclk_pin.port, flipper_dap_swclk_pin.pin);
  109. }
  110. //-----------------------------------------------------------------------------
  111. static inline void DAP_CONFIG_SWCLK_TCK_clr(void) {
  112. LL_GPIO_ResetOutputPin(flipper_dap_swclk_pin.port, flipper_dap_swclk_pin.pin);
  113. }
  114. //-----------------------------------------------------------------------------
  115. static inline void DAP_CONFIG_SWDIO_TMS_in(void) {
  116. LL_GPIO_SetPinMode(flipper_dap_swdio_pin.port, flipper_dap_swdio_pin.pin, LL_GPIO_MODE_INPUT);
  117. }
  118. //-----------------------------------------------------------------------------
  119. static inline void DAP_CONFIG_SWDIO_TMS_out(void) {
  120. LL_GPIO_SetPinMode(flipper_dap_swdio_pin.port, flipper_dap_swdio_pin.pin, LL_GPIO_MODE_OUTPUT);
  121. }
  122. //-----------------------------------------------------------------------------
  123. static inline void DAP_CONFIG_SETUP(void) {
  124. furi_hal_gpio_init(&flipper_dap_swdio_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  125. furi_hal_gpio_init(&flipper_dap_swclk_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  126. furi_hal_gpio_init(&flipper_dap_reset_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  127. #ifdef DAP_CONFIG_ENABLE_JTAG
  128. furi_hal_gpio_init(&flipper_dap_tdo_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  129. furi_hal_gpio_init(&flipper_dap_tdi_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  130. #endif
  131. }
  132. //-----------------------------------------------------------------------------
  133. static inline void DAP_CONFIG_DISCONNECT(void) {
  134. furi_hal_gpio_init(&flipper_dap_swdio_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  135. furi_hal_gpio_init(&flipper_dap_swclk_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  136. furi_hal_gpio_init(&flipper_dap_reset_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  137. #ifdef DAP_CONFIG_ENABLE_JTAG
  138. furi_hal_gpio_init(&flipper_dap_tdo_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  139. furi_hal_gpio_init(&flipper_dap_tdi_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  140. #endif
  141. dap_app_disconnect();
  142. }
  143. //-----------------------------------------------------------------------------
  144. static inline void DAP_CONFIG_CONNECT_SWD(void) {
  145. furi_hal_gpio_init(
  146. &flipper_dap_swdio_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  147. furi_hal_gpio_write(&flipper_dap_swdio_pin, true);
  148. furi_hal_gpio_init(
  149. &flipper_dap_swclk_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  150. furi_hal_gpio_write(&flipper_dap_swclk_pin, true);
  151. furi_hal_gpio_init(
  152. &flipper_dap_reset_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  153. furi_hal_gpio_write(&flipper_dap_reset_pin, true);
  154. #ifdef DAP_CONFIG_ENABLE_JTAG
  155. furi_hal_gpio_init(&flipper_dap_tdo_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  156. furi_hal_gpio_init(&flipper_dap_tdi_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  157. #endif
  158. dap_app_connect_swd();
  159. }
  160. //-----------------------------------------------------------------------------
  161. static inline void DAP_CONFIG_CONNECT_JTAG(void) {
  162. furi_hal_gpio_init(
  163. &flipper_dap_swdio_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  164. furi_hal_gpio_write(&flipper_dap_swdio_pin, true);
  165. furi_hal_gpio_init(
  166. &flipper_dap_swclk_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  167. furi_hal_gpio_write(&flipper_dap_swclk_pin, true);
  168. furi_hal_gpio_init(
  169. &flipper_dap_reset_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  170. furi_hal_gpio_write(&flipper_dap_reset_pin, true);
  171. #ifdef DAP_CONFIG_ENABLE_JTAG
  172. furi_hal_gpio_init(&flipper_dap_tdo_pin, GpioModeInput, GpioPullNo, GpioSpeedVeryHigh);
  173. furi_hal_gpio_init(
  174. &flipper_dap_tdi_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
  175. furi_hal_gpio_write(&flipper_dap_tdi_pin, true);
  176. #endif
  177. dap_app_connect_jtag();
  178. }
  179. //-----------------------------------------------------------------------------
  180. static inline void DAP_CONFIG_LED(int index, int state) {
  181. (void)index;
  182. (void)state;
  183. }
  184. //-----------------------------------------------------------------------------
  185. __attribute__((always_inline)) static inline void DAP_CONFIG_DELAY(uint32_t cycles) {
  186. asm volatile("1: subs %[cycles], %[cycles], #1 \n"
  187. " bne 1b \n"
  188. : [cycles] "+l"(cycles));
  189. }
  190. #endif // _DAP_CONFIG_H_