Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.
Upstream: https://github.com/ARMmbed/DAPLink
Diff: source/usb/bulk/usbd_bulk.c
- Revision:
- 0:01f31e923fe2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/usb/bulk/usbd_bulk.c Tue Apr 07 12:55:42 2020 +0200 @@ -0,0 +1,109 @@ +/** + * @file usbd_bulk.c + * @brief DAPv2 BULK driver + * + * DAPLink Interface Firmware + * Copyright (c) 2019, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <string.h> + +#include "rl_usb.h" +#include "usb_for_lib.h" +#include "util.h" +#include "DAP_queue.h" + +static U8 *ptrDataIn; +static U16 DataInReceLen; +static DAP_queue DAP_Cmd_queue; + +static volatile uint8_t USB_ResponseIdle; + +void usbd_bulk_init(void) +{ + ptrDataIn = USBD_Bulk_BulkOutBuf; + DataInReceLen = 0; + DAP_queue_init(&DAP_Cmd_queue); + USB_ResponseIdle = 1; +} + +/* + * USB Device Bulk In Endpoint Event Callback + * Parameters: event: not used (just for compatibility) + * Return Value: None + */ + +void USBD_BULK_EP_BULKIN_Event(U32 event) +{ + uint8_t * sbuf = 0; + int slen; + if(DAP_queue_get_send_buf(&DAP_Cmd_queue, &sbuf, &slen)){ + USBD_WriteEP(usbd_bulk_ep_bulkin | 0x80, sbuf, slen); + } else { + USB_ResponseIdle = 1; + } +} + + +/* + * USB Device Bulk Out Endpoint Event Callback + * Parameters: event: not used (just for compatibility) + * Return Value: None + */ + +void USBD_BULK_EP_BULKOUT_Event(U32 event) +{ + U16 bytes_rece; + uint8_t * rbuf; + + bytes_rece = USBD_ReadEP(usbd_bulk_ep_bulkout, ptrDataIn, USBD_Bulk_BulkBufSize - DataInReceLen); + ptrDataIn += bytes_rece; + DataInReceLen += bytes_rece; + + if ((DataInReceLen >= USBD_Bulk_BulkBufSize) || + (bytes_rece < usbd_bulk_maxpacketsize[USBD_HighSpeed])) { + if (DAP_queue_execute_buf(&DAP_Cmd_queue, USBD_Bulk_BulkOutBuf, DataInReceLen, &rbuf)) { + //Trigger the BULKIn for the reply + if (USB_ResponseIdle) { + USBD_BULK_EP_BULKIN_Event(0); + USB_ResponseIdle = 0; + } + } + //revert the input pointers + DataInReceLen = 0; + ptrDataIn = USBD_Bulk_BulkOutBuf; + } +} + + +/* + * USB Device Bulk In/Out Endpoint Event Callback + * Parameters: event: USB Device Event + * USBD_EVT_OUT: Output Event + * USBD_EVT_IN: Input Event + * Return Value: None + */ + +void USBD_BULK_EP_BULK_Event(U32 event) +{ + if (event & USBD_EVT_OUT) { + USBD_BULK_EP_BULKOUT_Event(0); + } + + if (event & USBD_EVT_IN) { + USBD_BULK_EP_BULKIN_Event(0); + } +}