usb_mem.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:3k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : usb_mem.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : utility functions for memory transfers
  6. *
  7. ********************************************************************************/
  8. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  9. #include "USB_lib.h"
  10. #include "USB_mem.h"
  11. /*=============================================================================*/
  12. /*=============================================================================*/
  13. /* ----------------------------------------------------------------------------*/
  14. /* UserToPMABufferCopy */
  15. /* copy a buffer from user memory area to packet memory area (PMA) */
  16. /* IN : pbUsrBuf = pointer to user memory area */
  17. /*      wPMABufAddr = address into PMA */
  18. /* wNBytes = no. of bytes to be copied */
  19. /* OUT: none */
  20. /* ----------------------------------------------------------------------------*/
  21. void UserToPMABufferCopy(BYTE *pbUsrBuf,WORD wPMABufAddr, WORD wNBytes)
  22. {
  23.  BYTE *pbVal;
  24.  WORD wVal;
  25.  DWORD *pdwVal;
  26.  int wNTrasf=wNBytes;
  27.  if((wNBytes) == 0) return;
  28.  pdwVal = (DWORD *)(wPMABufAddr*2 + PMAAddr);
  29.  while(TRUE)
  30.  {
  31. wVal = 0;
  32. pbVal = (BYTE *)&wVal;
  33.   if((wNTrasf--) > 0)
  34.   {
  35.   *pbVal++ = *pbUsrBuf++;
  36.     if((wNTrasf--) > 0)
  37.     {
  38.   *pbVal++ = *pbUsrBuf++;
  39.     }
  40.   }
  41. *pdwVal++ = (DWORD)wVal;
  42. if(wNTrasf == 0) return;
  43.  }/* while */
  44. } /* UserToPMABufferCopy */
  45. /* ----------------------------------------------------------------------------*/
  46. /* PMAToUserBufferCopy */
  47. /* copy a buffer from user memory area to packet memory area (PMA) */
  48. /* IN : pbUsrBuf = pointer to user memory area */
  49. /*      wPMABufAddr = address into PMA */
  50. /* wNBytes = no. of bytes to be copied */
  51. /* OUT: none */
  52. /* ----------------------------------------------------------------------------*/
  53. void PMAToUserBufferCopy(BYTE *pbUsrBuf,WORD wPMABufAddr, WORD wNBytes)
  54. {
  55.  BYTE *pbVal;
  56.  WORD wNTrasf=wNBytes;
  57.  if((wNBytes) == 0) return;
  58.  pbVal = (BYTE *)(wPMABufAddr*2 + PMAAddr);
  59.  while(TRUE)
  60.  {
  61.    *pbUsrBuf++ = *pbVal++;
  62.    if((--wNTrasf) == 0) return;
  63.    *pbUsrBuf++ = *pbVal++;
  64.    if((--wNTrasf) == 0) return;
  65.  pbVal++; pbVal++;
  66.  }/* while */
  67. } /* PMAToUserBufferCopy */
  68. /* ----------------------------------------------------------------------------*/
  69. /* AddQPointer */
  70. /* update a circular queue pointer */
  71. /* IN : pwQPnt = pointer to circular queue pointer */
  72. /*      wNBytes = number to be added */
  73. /* wQMaxSize = circular queue size */
  74. /* OUT: none */
  75. /* ----------------------------------------------------------------------------*/
  76. void AddQPointer(WORD *pwQPnt,WORD wNBytes,WORD wQMaxSize)
  77. {
  78.  WORD wResult;
  79.   wResult = *pwQPnt;
  80. wResult += wNBytes;
  81. if(wResult > wQMaxSize-1)
  82.     wResult -= wQMaxSize;
  83. *pwQPnt = wResult;
  84. }/* AddQPointer */