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