1 /*****************************************************************************
2 * Copyright (c) 2019, Nations Technologies Inc.
3 *
4 * All rights reserved.
5 * ****************************************************************************
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the disclaimer below.
12 *
13 * Nations' name may not be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
19 * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
22 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 * ****************************************************************************/
27
28 /**
29 * @file usb_sil.c
30 * @author Nations
31 * @version v1.0.0
32 *
33 * @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
34 */
35 #include "usb_lib.h"
36
37 /**
38 * @brief Initialize the USB Device IP and the Endpoint 0.
39 * @return Status.
40 */
USB_SilInit(void)41 uint32_t USB_SilInit(void)
42 {
43 /* USB interrupts initialization */
44 /* clear pending interrupts */
45 _SetISTR(0);
46 wInterrupt_Mask = IMR_MSK;
47 /* set interrupts mask */
48 _SetCNTR(wInterrupt_Mask);
49 return 0;
50 }
51
52 /**
53 * @brief Write a buffer of data to a selected endpoint.
54 * @param bEpAddr The address of the non control endpoint.
55 * @param pBufferPointer The pointer to the buffer of data to be written to the endpoint.
56 * @param wBufferSize Number of data to be written (in bytes).
57 * @return Status.
58 */
USB_SilWrite(uint8_t bEpAddr,uint8_t * pBufferPointer,uint32_t wBufferSize)59 uint32_t USB_SilWrite(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize)
60 {
61 /* Use the memory interface function to write to the selected endpoint */
62 USB_CopyUserToPMABuf(pBufferPointer, USB_GetEpTxAddr(bEpAddr & 0x7F), wBufferSize);
63 /* Update the data length in the control register */
64 USB_SetEpTxCnt((bEpAddr & 0x7F), wBufferSize);
65 return 0;
66 }
67
68 /**
69 * @brief Write a buffer of data to a selected endpoint.
70 * @param bEpAddr The address of the non control endpoint.
71 * @param pBufferPointer The pointer to which will be saved the received data buffer.
72 * @return Number of received data (in Bytes).
73 */
USB_SilRead(uint8_t bEpAddr,uint8_t * pBufferPointer)74 uint32_t USB_SilRead(uint8_t bEpAddr, uint8_t* pBufferPointer)
75 {
76 uint32_t DataLength = 0;
77 /* Get the number of received data on the selected Endpoint */
78 DataLength = USB_GetEpRxCnt(bEpAddr & 0x7F);
79 /* Use the memory interface function to write to the selected endpoint */
80 USB_CopyPMAToUserBuf(pBufferPointer, USB_GetEpRxAddr(bEpAddr & 0x7F), DataLength);
81 /* Return the number of received data */
82 return DataLength;
83 }
84