|
26 | 26 | #include <zephyr/logging/log.h> |
27 | 27 | LOG_MODULE_REGISTER(swdp, CONFIG_DP_DRIVER_LOG_LEVEL); |
28 | 28 |
|
29 | | -#define CLOCK_DELAY(swclk_freq, port_write_cycles) \ |
30 | | - ((CPU_CLOCK / 2 / swclk_freq) - port_write_cycles) |
| 29 | +#define MAX_SWJ_CLOCK(delay_cycles, port_write_cycles) \ |
| 30 | + ((CPU_CLOCK / 2U) / (port_write_cycles + delay_cycles)) |
31 | 31 |
|
32 | 32 | /* |
33 | 33 | * Default SWCLK frequency in Hz. |
34 | 34 | * sw_clock can be used to overwrite this default value. |
35 | 35 | */ |
36 | 36 | #define SWDP_DEFAULT_SWCLK_FREQUENCY 1000000U |
37 | 37 |
|
| 38 | +#define DELAY_FAST_CYCLES 2U |
38 | 39 | #define DELAY_SLOW_CYCLES 3U |
39 | 40 |
|
40 | 41 | struct sw_config { |
@@ -528,14 +529,19 @@ static int sw_set_clock(const struct device *dev, const uint32_t clock) |
528 | 529 | struct sw_cfg_data *sw_data = dev->data; |
529 | 530 | uint32_t delay; |
530 | 531 |
|
531 | | - sw_data->fast_clock = false; |
532 | | - delay = ((CPU_CLOCK / 2U) + (clock - 1U)) / clock; |
533 | | - |
534 | | - if (delay > config->port_write_cycles) { |
535 | | - delay -= config->port_write_cycles; |
536 | | - delay = (delay + (DELAY_SLOW_CYCLES - 1U)) / DELAY_SLOW_CYCLES; |
537 | | - } else { |
| 532 | + if (clock >= MAX_SWJ_CLOCK(DELAY_FAST_CYCLES, config->port_write_cycles)) { |
| 533 | + sw_data->fast_clock = true; |
538 | 534 | delay = 1U; |
| 535 | + } else { |
| 536 | + sw_data->fast_clock = false; |
| 537 | + |
| 538 | + delay = ((CPU_CLOCK / 2U) + (clock - 1U)) / clock; |
| 539 | + if (delay > config->port_write_cycles) { |
| 540 | + delay -= config->port_write_cycles; |
| 541 | + delay = (delay + (DELAY_SLOW_CYCLES - 1U)) / DELAY_SLOW_CYCLES; |
| 542 | + } else { |
| 543 | + delay = 1U; |
| 544 | + } |
539 | 545 | } |
540 | 546 |
|
541 | 547 | sw_data->clock_delay = delay; |
@@ -684,8 +690,7 @@ static int sw_gpio_init(const struct device *dev) |
684 | 690 | sw_data->turnaround = 1U; |
685 | 691 | sw_data->data_phase = false; |
686 | 692 | sw_data->fast_clock = false; |
687 | | - sw_data->clock_delay = CLOCK_DELAY(SWDP_DEFAULT_SWCLK_FREQUENCY, |
688 | | - config->port_write_cycles); |
| 693 | + sw_set_clock(dev, SWDP_DEFAULT_SWCLK_FREQUENCY); |
689 | 694 |
|
690 | 695 | return 0; |
691 | 696 | } |
|
0 commit comments