0
0
Fork 0

fix(dap): Fix DAP_SPI_WriteBits issue

In the previous implementation, we assumed that we were running on Keil,
so for tools such as OpenOCD, they would not be able to establish a
connection using the SPI rate.

(cherry picked from commit ef71750678aaddbb4d55eb2b428c44b3af122556)
This commit is contained in:
windowsair 2024-06-09 11:18:05 +08:00 committed by kerms
parent 0d8d7a014f
commit fb32c9bdff
1 changed files with 11 additions and 33 deletions

View File

@ -6,14 +6,16 @@
* 2021-2-11 Support SWD sequence
* 2021-3-10 Support 3-wire SPI
* 2022-9-15 Support ESP32C3
* @version 0.4
* @date 2022-9-15
* 2024-6-9 Fix DAP_SPI_WriteBits issue
* @version 0.5
* @date 2024-6-9
*
* @copyright MIT License
*
*/
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "main/dap_configuration.h"
@ -87,6 +89,9 @@ __STATIC_FORCEINLINE int div_round_up(int A, int B)
*/
void DAP_SPI_WriteBits(const uint8_t count, const uint8_t *buf)
{
uint32_t data[16];
int nbytes, i;
DAP_SPI.user.usr_command = 0;
DAP_SPI.user.usr_addr = 0;
@ -94,39 +99,12 @@ void DAP_SPI_WriteBits(const uint8_t count, const uint8_t *buf)
DAP_SPI.user.usr_mosi = 1;
DAP_SPI.user.usr_miso = 0;
SET_MOSI_BIT_LEN(count - 1);
// copy data to reg
switch (count)
{
case 8:
DAP_SPI.data_buf[0] = (buf[0] << 0) | (0U << 8) | (0U << 16) | (0U << 24);
break;
case 16:
DAP_SPI.data_buf[0] = (buf[0] << 0) | (buf[1] << 8) | (0x000U << 16) | (0x000U << 24);
break;
case 33: // 32bits data & 1 bit parity
DAP_SPI.data_buf[0] = (buf[0] << 0) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
DAP_SPI.data_buf[1] = (buf[4] << 0) | (0x000U << 8) | (0x000U << 16) | (0x000U << 24);
break;
case 51: // for line reset
DAP_SPI.data_buf[0] = (buf[0] << 0) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
DAP_SPI.data_buf[1] = (buf[4] << 0) | (buf[5] << 8) | (buf[2] << 16) | (0x000U << 24);
break;
default:
{
uint32_t data_buf[2];
uint8_t *pData = (uint8_t *)data_buf;
int i;
for (i = 0; i < div_round_up(count, 8); i++)
{
pData[i] = buf[i];
}
// last byte use mask:
pData[i-1] = pData[i-1] & ((2U >> (count % 8)) - 1U);
nbytes = div_round_up(count, 8);
memcpy(data, buf, nbytes);
DAP_SPI.data_buf[0] = data_buf[0];
DAP_SPI.data_buf[1] = data_buf[1];
}
for (i = 0; i < nbytes; i++) {
DAP_SPI.data_buf[i] = data[i];
}
START_AND_WAIT_SPI_TRANSMISSION_DONE();