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_mem.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 u8* EpOutDataPtrTmp;
37 u8* EpInDataPtrTmp;
38 
39 /**
40  * @brief Copy a buffer from user memory area to packet memory area (PMA)
41  * @param pbUsrBuf pointer to user memory area.
42  * @param wPMABufAddr address into PMA.
43  * @param wNBytes no. of bytes to be copied.
44  */
USB_CopyUserToPMABuf(uint8_t * pbUsrBuf,uint16_t wPMABufAddr,uint16_t wNBytes)45 void USB_CopyUserToPMABuf(uint8_t* pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
46 {
47     uint32_t n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */
48     uint32_t i, temp1, temp2;
49     uint16_t* pdwVal;
50     pdwVal = (uint16_t*)(wPMABufAddr * 2 + PMAAddr);
51     for (i = n; i != 0; i--)
52     {
53         temp1 = (uint16_t)*pbUsrBuf;
54         pbUsrBuf++;
55         temp2     = temp1 | (uint16_t)*pbUsrBuf << 8;
56         *pdwVal++ = temp2;
57         pdwVal++;
58         pbUsrBuf++;
59         EpInDataPtrTmp = pbUsrBuf;
60     }
61 }
62 
63 /**
64  * @brief Copy a buffer from user memory area to packet memory area (PMA)
65  * @param pbUsrBuf    pointer to user memory area.
66  * @param wPMABufAddr address into PMA.
67  * @param wNBytes     no. of bytes to be copied.
68  */
USB_CopyPMAToUserBuf(uint8_t * pbUsrBuf,uint16_t wPMABufAddr,uint16_t wNBytes)69 void USB_CopyPMAToUserBuf(uint8_t* pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
70 {
71     uint32_t n = (wNBytes + 1) >> 1; /* /2*/
72     uint32_t i;
73     uint32_t* pdwVal;
74     pdwVal = (uint32_t*)(wPMABufAddr * 2 + PMAAddr);
75     for (i = n; i != 0; i--)
76     {
77         *(uint16_t*)pbUsrBuf++ = *pdwVal++;
78         pbUsrBuf++;
79         EpOutDataPtrTmp = pbUsrBuf;
80     }
81 }
82