You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.7 KiB
139 lines
3.7 KiB
#include "dap_main.h" |
|
#include "string.h" |
|
|
|
#include "usb_desc.h" |
|
|
|
#include "DAP_config.h" |
|
#include "DAP.h" |
|
|
|
volatile uint8_t DAP_USB_IsBulk = 0; |
|
volatile uint8_t DAP_Is_Active = 0; |
|
volatile uint8_t DIR_IsEN = 0; |
|
|
|
static volatile uint32_t DAP_RequestIndexI = 0; // Request Index In |
|
static volatile uint32_t DAP_RequestIndexO = 0; // Request Index Out |
|
static volatile uint32_t DAP_RequestCountI = 0; // Request Count In |
|
static volatile uint32_t DAP_RequestCountO = 0; // Request Count Out |
|
|
|
static volatile uint32_t DAP_ResponseIndexI = 0; // Response Index In |
|
static volatile uint32_t DAP_ResponseIndexO = 0; // Response Index Out |
|
static volatile uint32_t DAP_ResponseCountI = 0; // Response Count In |
|
static volatile uint32_t DAP_ResponseCountO = 0; // Response Count Out |
|
|
|
static uint8_t DAP_Request[DAP_PACKET_COUNT][DAP_PACKET_SIZE + 2]; // Request Buffer,last 2 is length |
|
static uint8_t DAP_Response[DAP_PACKET_COUNT][DAP_PACKET_SIZE + 2]; // Response Buffer,last 2 is length |
|
|
|
void DAP_RX_CallBack(uint8_t *buf, uint32_t len) |
|
{ |
|
if (DAP_RequestCountI - DAP_RequestCountO == DAP_PACKET_COUNT) |
|
{ |
|
return; |
|
} |
|
|
|
memcpy(DAP_Request[DAP_RequestIndexI], buf, len); |
|
*(uint16_t *)(DAP_Request[DAP_RequestIndexI] + DAP_PACKET_SIZE - 1) = len; |
|
|
|
if (DAP_Request[DAP_RequestIndexI][0] == ID_DAP_TransferAbort) |
|
{ |
|
DAP_TransferAbort = 1U; |
|
return; |
|
} |
|
|
|
DAP_RequestIndexI++; |
|
if (DAP_RequestIndexI == DAP_PACKET_COUNT) |
|
{ |
|
DAP_RequestIndexI = 0U; |
|
} |
|
DAP_RequestCountI++; |
|
} |
|
|
|
void DAP_TX_CallBack(void) |
|
{ |
|
DAP_ResponseIndexO++; |
|
if (DAP_ResponseIndexO == DAP_PACKET_COUNT) |
|
{ |
|
DAP_ResponseIndexO = 0; |
|
} |
|
DAP_ResponseCountO++; |
|
} |
|
|
|
void DAP_Init(void) |
|
{ |
|
DAP_Setup(); |
|
|
|
RCC->APB2PCENR |= RCC_APB2Periph_GPIOA; |
|
GPIOA->CFGLR &= ~(0x0F << (4 * 5)); // DIR,GPIOA5 |
|
GPIOA->CFGLR |= 0x08 << (4 * 5); |
|
GPIOA->BCR = 1 << 5; |
|
|
|
for (volatile uint32_t i = 0; i < 100; i++) |
|
{ |
|
__NOP(); |
|
} |
|
|
|
uint8_t temp = (GPIOA->INDR >> 5) & 0x01; |
|
if (temp == 0) |
|
{ |
|
DIR_IsEN = 1; |
|
} |
|
|
|
if (DIR_IsEN == 0) |
|
{ |
|
GPIOA->CFGLR &= ~(0x0F << (4 * 5)); // DIR,GPIOA5 |
|
} |
|
else |
|
{ |
|
GPIOA->CFGLR &= ~(0x0F << (4 * 5)); // DIR,GPIOA5 |
|
GPIOA->CFGLR |= 0x03 << (4 * 5); |
|
GPIOA->BCR = 1 << 5; |
|
} |
|
} |
|
|
|
void DAP_Task(void) |
|
{ |
|
if (DAP_RequestCountI != DAP_RequestCountO) |
|
{ |
|
// Handle Queue Commands |
|
if (DAP_Request[DAP_RequestIndexO][0] == ID_DAP_QueueCommands) |
|
DAP_Request[DAP_RequestIndexO][0] = ID_DAP_ExecuteCommands; |
|
|
|
uint32_t num = 0; |
|
num = DAP_ExecuteCommand(DAP_Request[DAP_RequestIndexO], DAP_Response[DAP_ResponseIndexI]); |
|
*(uint16_t *)(DAP_Response[DAP_ResponseIndexI] + DAP_PACKET_SIZE - 1) = num & 0x0000FFFF; |
|
|
|
DAP_RequestIndexO++; |
|
if (DAP_RequestIndexO == DAP_PACKET_COUNT) |
|
{ |
|
DAP_RequestIndexO = 0U; |
|
} |
|
DAP_RequestCountO++; |
|
|
|
DAP_ResponseIndexI++; |
|
if (DAP_ResponseIndexI == DAP_PACKET_COUNT) |
|
{ |
|
DAP_ResponseIndexI = 0U; |
|
} |
|
DAP_ResponseCountI++; |
|
|
|
DAP_Is_Active = 1; |
|
} |
|
|
|
if (DAP_USB_IsBulk) |
|
{ |
|
if (DAP_Bulk_IN_IsBusy()) |
|
return; |
|
if (DAP_ResponseCountI != DAP_ResponseCountO) |
|
{ |
|
DAP_Bulk_IN(DAP_Response[DAP_ResponseIndexO], *(uint16_t *)(DAP_Response[DAP_ResponseIndexO] + DAP_PACKET_SIZE - 1)); |
|
} |
|
} |
|
else |
|
{ |
|
if (DAP_HID_IN_IsBusy()) |
|
return; |
|
if (DAP_ResponseCountI != DAP_ResponseCountO) |
|
{ |
|
DAP_HID_IN(DAP_Response[DAP_ResponseIndexO], *(uint16_t *)(DAP_Response[DAP_ResponseIndexO] + DAP_PACKET_SIZE - 1)); |
|
} |
|
} |
|
}
|
|
|