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