usb_application_service.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "usbapp/usb_application_service.h"
  2. #include "usbapp/usb_application_service_def.h"
  3. #include "usbapp/usb_application_flash.h" // usb_application_flash_fGetWritingFlag
  4. #include "usb/usb_bridge.h"
  5. #include "usb/usb_config.h"
  6. #include "usbd_vendor.h"
  7. #include "app/thermo/tsensor.h"
  8. #include "drivers/flash/base/extmem_flash.h"
  9. #include "app/version/version.h"
  10. #include "app/nfm/nfm_base.h"
  11. #define READ_INFO 0xA4 // ÷òåíèå ñëóæåáíîé èíôîðìàöèè
  12. static int8_t fServiceAppInit();
  13. static int8_t fServiceAppDeInit();
  14. static void fServiceAppReset();
  15. static bool fServiceAppSetup( const tUSBSetupPacket_t * pSetup, bool bFirstStage, bool success );
  16. static size_t fServiceAppControlRx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * rx, size_t idx, size_t bytesRemaining );
  17. static size_t fServiceAppControlTx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * tx, size_t idx, size_t bytesRemaining );
  18. static TServiceRequestBuffer_t sRequestBuffer;
  19. const sUSBAppEntry_Control_t usbapplication_ACM_planarproto_service = {
  20. .fUsbInit = fServiceAppInit,
  21. .fUsbDeInit = fServiceAppDeInit,
  22. .fUsbSetup = fServiceAppSetup,
  23. .fUsbCtlEpRx = fServiceAppControlRx,
  24. .fUsbCtlEpTx = fServiceAppControlTx,
  25. .fResetEvent = fServiceAppReset,
  26. };
  27. static int8_t fServiceAppInit()
  28. {
  29. return 0;
  30. }
  31. static int8_t fServiceAppDeInit()
  32. {
  33. return 0;
  34. }
  35. static void fServiceAppReset()
  36. {
  37. }
  38. static bool fServiceAppSetup( const tUSBSetupPacket_t * pSetup, bool bFirstStage, bool success )
  39. {
  40. switch ( pSetup->bRequest )
  41. {
  42. case READ_INFO:
  43. {
  44. if( 0x8000 == pSetup->wValue )
  45. {
  46. switch( pSetup->wIndex )
  47. {
  48. #if CONFIG_EXTMEM
  49. case 0x001: // get flash info
  50. {
  51. // check the request data stage size
  52. if( sizeof(sRequestBuffer.svcReq_Flash) >= pSetup->wLength )
  53. {
  54. memset( &sRequestBuffer, 0, sizeof(sRequestBuffer) );
  55. sRequestBuffer.svcReq_Flash.dwProtocolVersion = 1;
  56. sRequestBuffer.svcReq_Flash.cReserved0 = 0;
  57. sRequestBuffer.svcReq_Flash.cReserved1 = 0;
  58. sRequestBuffer.svcReq_Flash.wDriverVersion = pProgramVersion->firmware_version;
  59. // Maximum Chip size
  60. sRequestBuffer.svcReq_Flash.dwFlashSize =
  61. ExtMemHandle.pFlashProperties->maxSectors * ExtMemHandle.pFlashProperties->sectorSize;
  62. // Available capacity
  63. sRequestBuffer.svcReq_Flash.dwCapacity =
  64. ExtMemHandle.pBanksProperties->factoryBankSize + ExtMemHandle.pBanksProperties->userBankSize;
  65. bool protectStatus = false;
  66. if( ExtMemHandle.CheckBankProtect( extmem_bank_factory, &protectStatus ) )
  67. sRequestBuffer.svcReq_Flash.bBank0Protection = (protectStatus)?1:0;
  68. else
  69. sRequestBuffer.svcReq_Flash.bBank0Protection = 0;
  70. // Write-Erase-count Resource descriptor: useless, supported only for protocol compatibility
  71. sRequestBuffer.svcReq_Flash.WERInfo.wReserved2 = 0;
  72. sRequestBuffer.svcReq_Flash.WERInfo.wRBSCount = 0;
  73. sRequestBuffer.svcReq_Flash.WERInfo.dwMaxWER = 0;
  74. sRequestBuffer.svcReq_Flash.ChipDescription.cDesc[0] = '\0';
  75. strncpy( sRequestBuffer.svcReq_Flash.ChipDescription.cDesc,
  76. ExtMemHandle.pFlashProperties->pChipDescription,
  77. sizeof(sRequestBuffer.svcReq_Flash.ChipDescription.cDesc) );
  78. sRequestBuffer.svcReq_Flash.ChipDescription.cDescLength =
  79. strlen( sRequestBuffer.svcReq_Flash.ChipDescription.cDesc );
  80. return true;
  81. }
  82. }
  83. break;
  84. case 0x002: // get flash busy flag (char)
  85. {
  86. // check the request data stage size
  87. if( sizeof(sRequestBuffer.svcReq_FlashReady) >= pSetup->wLength )
  88. {
  89. memset( &sRequestBuffer, 0, sizeof(sRequestBuffer) );
  90. sRequestBuffer.svcReq_FlashReady = (usb_application_flash_fGetWritingFlag()?0x01:0x00);
  91. return true;
  92. }
  93. }
  94. break;
  95. #endif
  96. case 0x003: // get model info
  97. {
  98. // check the request data stage size
  99. if( sizeof(sRequestBuffer.svcReq_Model) >= pSetup->wLength )
  100. {
  101. memset( &sRequestBuffer, 0, sizeof(sRequestBuffer) );
  102. sRequestBuffer.svcReq_Model.requestVersion = 0x0001;
  103. sRequestBuffer.svcReq_Model.deviceId = NFMClass->properties.deviceId;
  104. sRequestBuffer.svcReq_Model.firmwareId = pProgramVersion->firmware_version;
  105. NFMClass->methods.getModelName(
  106. (char*)sRequestBuffer.svcReq_Model.modelName, sizeof(sRequestBuffer.svcReq_Model.modelName) );
  107. sRequestBuffer.svcReq_Model.ampStatesCount = 0; //NFMClass->properties.allowedAmpStatesCount;
  108. sRequestBuffer.svcReq_Model.filtStatesCount = 0; //NFMClass->properties.allowedFiltStatesCount;
  109. return true;
  110. }
  111. }
  112. break;
  113. }
  114. }
  115. }
  116. break;
  117. }
  118. return false;
  119. }
  120. static size_t fServiceAppControlRx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * rx, size_t idx, size_t bytesRemaining )
  121. {
  122. return 0;
  123. }
  124. static size_t fServiceAppControlTx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * tx, size_t idx, size_t bytesRemaining )
  125. {
  126. switch ( pSetup->bRequest )
  127. {
  128. case READ_INFO:
  129. {
  130. if( 0x8000 == pSetup->wValue )
  131. {
  132. switch( pSetup->wIndex )
  133. {
  134. case 0x001: // get flash info
  135. {
  136. // try to write the 'svcReq_Flash' structure to the output buffer.
  137. // If the buffer size has insufficient space to store whole structure,
  138. // only part of target structure is written to the buffer, the rest part
  139. // will be transmitted in the next transaction ( @idx pointer is used )
  140. usb_write_transfer( tx, &sRequestBuffer.raw_bytes[ idx ], sizeof( sRequestBuffer.svcReq_Flash ) );
  141. }
  142. break;
  143. case 0x002: // get flash busy flag (char)
  144. {
  145. usb_write_transfer( tx, &sRequestBuffer.raw_bytes[ idx ], sizeof( sRequestBuffer.svcReq_FlashReady ) );
  146. }
  147. break;
  148. case 0x003: // get model info
  149. {
  150. // try to write the 'svcReq_Model' structure to the output buffer.
  151. // If the buffer size has insufficient space to store whole structure,
  152. // only part of target structure is written to the buffer, the rest part
  153. // will be transmitted in the next transaction ( @idx pointer is used )
  154. usb_write_transfer( tx, &sRequestBuffer.raw_bytes[ idx ], sizeof( sRequestBuffer.svcReq_Model ) );
  155. }
  156. break;
  157. }
  158. }
  159. }
  160. break;
  161. }
  162. return usb_count_transfer( tx );
  163. }