core_usb_app.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. enum
  23. {
  24. DEVICE_INTERFACE_HID_SN,
  25. DEVICE_INTERFACE_MSC_SN,
  26. DEVICE_INTERFACE_SERIAL_SN,
  27. DEVICE_INTERFACE_MAX,
  28. USB_HW_ACTION = USB_APP_EVENT_ID_START + 1,
  29. USBD_MSC_CB,
  30. };
  31. #define DEVICE_HID_KEYBOARD_EP_IN (0x01)
  32. #define DEVICE_HID_KEYBOARD_EP_OUT (0x01)
  33. #define DEVICE_MASS_STORAGE_EP_IN (0x02)
  34. #define DEVICE_MASS_STORAGE_EP_OUT (0x02)
  35. #define DEVICE_GENERIC_SERIAL_EP_IN (0x03)
  36. #define DEVICE_GENERIC_SERIAL_EP_OUT (0x03)
  37. #define VIRTUAL_SERIAL_BUFFER_LEN (8192)
  38. #define VIRTUAL_VHID_BUFFER_LEN (2048)
  39. #define VIRTUAL_UDISK_BLOCKS_LEN (512)
  40. #define VIRTUAL_UDISK_BLOCKS_NUMS (32)
  41. #define VIRTUAL_UDISK_LEN (VIRTUAL_UDISK_BLOCKS_NUMS * VIRTUAL_UDISK_BLOCKS_LEN)
  42. //#define TEST_SPEED
  43. typedef struct
  44. {
  45. uint32_t CurAddress;
  46. uint32_t BlockNums;
  47. uint32_t BlockSize;
  48. uint32_t BlockTotalNums;
  49. uint8_t *VirtualData;
  50. }Virtual_UDiskCtrlStruct;
  51. typedef struct
  52. {
  53. Buffer_Struct TxBuf;
  54. Buffer_Struct TxCacheBuf; // 缓存下次发送的数据
  55. CBFuncEx_t CB;
  56. uint8_t USB_ID;
  57. uint8_t IsReady;
  58. uint8_t ToHostEpIndex;
  59. }Virtual_HIDCtrlStruct;
  60. typedef struct
  61. {
  62. Buffer_Struct TxBuf;
  63. Buffer_Struct TxCacheBuf; // 缓存下次发送的数据
  64. Buffer_Struct RxBuf;
  65. CBFuncEx_t CB;
  66. Timer_t *RxTimer;
  67. uint32_t RxTimeoutUS;
  68. uint8_t *TxData;
  69. uint8_t USBOnOff;
  70. uint8_t UartOnOff;
  71. uint8_t USB_ID;
  72. uint8_t ToHostEpIndex;
  73. uint8_t ToDeviceEpIndex;
  74. }Virtual_UartCtrlStruct;
  75. typedef struct
  76. {
  77. MSC_SCSICtrlStruct tSCSI;
  78. Virtual_UDiskCtrlStruct tUDisk;
  79. DBuffer_Struct DataBuf;
  80. SDHC_SPICtrlStruct *pSDHC;
  81. HANDLE hTaskHandle;
  82. uint8_t *pHIDReport;
  83. uint16_t HIDReportLen;
  84. }USB_AppCtrlStruct;
  85. static const uint8_t prvCore_StandardInquiryData[STANDARD_INQUIRY_DATA_LEN] =
  86. {
  87. 0x00, //磁盘设备
  88. 0x00, //其中最高位D7为RMB。RMB=0,表示不可移除设备。如果RMB=1,则为可移除设备。
  89. 0x02, //各种版本号
  90. 0x02, //数据响应格式 0x02
  91. 0x1F, //附加数据长度,为31字节
  92. 0x00, //保留
  93. 0x00, //保留
  94. 0x00, //保留
  95. 'A','I','R','M','2','M',' ',' ',
  96. 'L','U','A','T','O','S','-','S','O','C',' ','U','S','B',' ',' ',
  97. '1','.','0','0'
  98. };
  99. const uint8_t prvCore_MSCPage00InquiryData[LENGTH_INQUIRY_PAGE00] =
  100. {
  101. 0x00,
  102. 0x00,
  103. 0x00,
  104. (LENGTH_INQUIRY_PAGE00 - 4U),
  105. 0x00,
  106. 0x80
  107. };
  108. /* USB Mass storage VPD Page 0x80 Inquiry Data for Unit Serial Number */
  109. const uint8_t prvCore_MSCPage80InquiryData[LENGTH_INQUIRY_PAGE80] =
  110. {
  111. 0x00,
  112. 0x80,
  113. 0x00,
  114. LENGTH_INQUIRY_PAGE80,
  115. 0x20, /* Put Product Serial number */
  116. 0x20,
  117. 0x20,
  118. 0x20
  119. };
  120. /* USB Mass storage sense 6 Data */
  121. const uint8_t prvCore_MSCModeSense6data[MODE_SENSE6_LEN] =
  122. {
  123. 0x22,
  124. 0x00,
  125. 0x00,
  126. 0x00,
  127. 0x08,
  128. 0x12,
  129. 0x00,
  130. 0x00,
  131. 0x00,
  132. 0x00,
  133. 0x00,
  134. 0x00,
  135. 0x00,
  136. 0x00,
  137. 0x00,
  138. 0x00,
  139. 0x00,
  140. 0x00,
  141. 0x00,
  142. 0x00,
  143. 0x00,
  144. 0x00,
  145. 0x00
  146. };
  147. /* USB Mass storage sense 10 Data */
  148. const uint8_t prvCore_MSCModeSense10data[MODE_SENSE10_LEN] =
  149. {
  150. 0x00,
  151. 0x26,
  152. 0x00,
  153. 0x00,
  154. 0x00,
  155. 0x00,
  156. 0x00,
  157. 0x00,
  158. 0x08,
  159. 0x12,
  160. 0x00,
  161. 0x00,
  162. 0x00,
  163. 0x00,
  164. 0x00,
  165. 0x00,
  166. 0x00,
  167. 0x00,
  168. 0x00,
  169. 0x00,
  170. 0x00,
  171. 0x00,
  172. 0x00,
  173. 0x00,
  174. 0x00,
  175. 0x00,
  176. 0x00
  177. };
  178. static USB_AppCtrlStruct prvUSBApp;
  179. static Virtual_HIDCtrlStruct prvLuatOS_VirtualHID;
  180. static Virtual_UartCtrlStruct prvLuatOS_VirtualUart[VIRTUAL_UART_MAX];
  181. /* LangID = 0x0409: U.S. English */
  182. static const char prvCore_StringManufacturer[] = "airm2m";
  183. static const char prvCore_StringProduct[] = "air105 usb device";
  184. static const char prvCore_StringSerial[] = "00001";
  185. static const char prvCore_StringConfig[] = "luatos";
  186. static const char *prvCore_StringInterface[3] = {
  187. "virtual Mass Storage Device",
  188. "virtual HID Keyboard",
  189. "virtual Serial"
  190. };
  191. static const usb_device_descriptor_t prvCore_DeviceDesc =
  192. {
  193. .bLength = USB_LEN_DEV_DESC,
  194. .bDescriptorType = UDESC_DEVICE,
  195. .bcdUSB = {0x00, 0x02},
  196. .bDeviceClass = UDCLASS_IN_INTERFACE,
  197. .bDeviceSubClass = 0,
  198. .bDeviceProtocol = 0,
  199. .bMaxPacketSize = 0x40,
  200. .idVendor = {0x82, 0x17},
  201. .idProduct = {0x00, 0x4e},
  202. // .idVendor = {0x83, 0x04},
  203. // .idProduct = {0x20, 0x57},
  204. .bcdDevice = {0x00, 0x02},
  205. .iManufacturer = USBD_IDX_MANUFACTURER_STR,
  206. .iProduct = USBD_IDX_PRODUCT_STR,
  207. .iSerialNumber = 0,
  208. .bNumConfigurations = 1,
  209. };
  210. static const usb_device_qualifier_t prvCore_QualifierDesc =
  211. {
  212. .bLength = USB_LEN_DEV_QUALIFIER_DESC, /* bLength */
  213. .bDescriptorType = UDESC_DEVICE_QUALIFIER, /* bDescriptorType */
  214. .bcdUSB = {0x00, 0x02},
  215. .bDeviceClass = UDCLASS_IN_INTERFACE,
  216. .bDeviceSubClass = 0,
  217. .bDeviceProtocol = 0,
  218. .bMaxPacketSize0 = 0x40,
  219. .bNumConfigurations = 1,
  220. .bReserved = 0
  221. };
  222. static const usb_config_descriptor_t prvCore_ConfigDesc =
  223. {
  224. .bLength = USB_LEN_CFG_DESC,
  225. .bDescriptorType = UDESC_CONFIG,
  226. .wTotalLength = {0x00, 0x00},
  227. .bNumInterface = DEVICE_INTERFACE_MAX,
  228. .bConfigurationValue = 1,
  229. .iConfiguration = USBD_IDX_CONFIG_STR,
  230. .bmAttributes = UC_SELF_POWERED|UC_BUS_POWERED,
  231. .bMaxPower = (USB_MIN_POWER >> 1),
  232. };
  233. static const usb_interface_assoc_descriptor_t prvCore_AssocInterfaceDesc =
  234. {
  235. .bLength = USB_LEN_ASSOC_IF_DESC,
  236. .bDescriptorType = UDESC_IFACE_ASSOC,
  237. .bFirstInterface = 0,
  238. .bInterfaceCount = 1,
  239. // .bFunctionClass = UICLASS_MASS,
  240. // .bFunctionSubClass = UISUBCLASS_SCSI,
  241. // .bFunctionProtocol = UIPROTO_MASS_BBB,
  242. // .bFunctionClass = 0,
  243. // .bFunctionSubClass = 0,
  244. // .bFunctionProtocol = 0,
  245. .bFunctionClass = UICLASS_HID,
  246. .bFunctionSubClass = 0,
  247. .bFunctionProtocol = UIPROTO_BOOT_KEYBOARD,
  248. .iFunction = USBD_IDX_INTERFACE0_STR,
  249. };
  250. static const usb_interface_descriptor_t prvCore_MassStorgeInterfaceDesc =
  251. {
  252. .bLength = USB_LEN_IF_DESC,
  253. .bDescriptorType = UDESC_INTERFACE,
  254. .bInterfaceNumber = DEVICE_INTERFACE_MSC_SN,
  255. .bAlternateSetting = 0,
  256. .bNumEndpoints = 2,
  257. .bInterfaceClass = UICLASS_MASS,
  258. .bInterfaceSubClass = UISUBCLASS_SCSI,
  259. .bInterfaceProtocol = UIPROTO_MASS_BBB,
  260. .iInterface = USBD_IDX_INTERFACE0_STR,
  261. };
  262. static const usb_endpoint_descriptor_t prvCore_MassStorgeEndpointDesc[2] =
  263. {
  264. {
  265. .bLength = USB_LEN_EP_DESC,
  266. .bDescriptorType = UDESC_ENDPOINT,
  267. .bEndpointAddress = UE_DIR_IN|DEVICE_MASS_STORAGE_EP_IN,
  268. .bmAttributes = UE_BULK,
  269. .wMaxPacketSize = {0x40,0x00},
  270. .bInterval = 10,
  271. },
  272. {
  273. .bLength = USB_LEN_EP_DESC,
  274. .bDescriptorType = UDESC_ENDPOINT,
  275. .bEndpointAddress = UE_DIR_OUT|DEVICE_MASS_STORAGE_EP_OUT,
  276. .bmAttributes = UE_BULK,
  277. .wMaxPacketSize = {0x40,0x00},
  278. .bInterval = 10,
  279. }
  280. };
  281. static const usb_interface_descriptor_t prvCore_HIDInterfaceDesc =
  282. {
  283. .bLength = USB_LEN_IF_DESC,
  284. .bDescriptorType = UDESC_INTERFACE,
  285. .bInterfaceNumber = DEVICE_INTERFACE_HID_SN,
  286. .bAlternateSetting = 0,
  287. .bNumEndpoints = 2,
  288. .bInterfaceClass = UICLASS_HID,
  289. .bInterfaceSubClass = 0,
  290. .bInterfaceProtocol = 0,
  291. .iInterface = USBD_IDX_INTERFACE0_STR + 1,
  292. };
  293. static const usb_endpoint_descriptor_t prvCore_HIDEndpointDesc[2] =
  294. {
  295. {
  296. .bLength = USB_LEN_EP_DESC,
  297. .bDescriptorType = UDESC_ENDPOINT,
  298. .bEndpointAddress = UE_DIR_IN|DEVICE_HID_KEYBOARD_EP_IN,
  299. .bmAttributes = UE_INTERRUPT,
  300. .wMaxPacketSize = {0x08,0x00},
  301. .bInterval = 10,
  302. },
  303. {
  304. .bLength = USB_LEN_EP_DESC,
  305. .bDescriptorType = UDESC_ENDPOINT,
  306. .bEndpointAddress = UE_DIR_OUT|DEVICE_HID_KEYBOARD_EP_OUT,
  307. .bmAttributes = UE_INTERRUPT,
  308. .wMaxPacketSize = {0x08,0x00},
  309. .bInterval = 10,
  310. },
  311. };
  312. static const usb_interface_descriptor_t prvCore_SerialInterfaceDesc =
  313. {
  314. .bLength = USB_LEN_IF_DESC,
  315. .bDescriptorType = UDESC_INTERFACE,
  316. .bInterfaceNumber = DEVICE_INTERFACE_SERIAL_SN,
  317. .bAlternateSetting = 0,
  318. .bNumEndpoints = 2,
  319. .bInterfaceClass = UICLASS_VENDOR,
  320. .bInterfaceSubClass = 0,
  321. .bInterfaceProtocol = 0,
  322. .iInterface = USBD_IDX_INTERFACE0_STR + 2,
  323. };
  324. static const usb_endpoint_descriptor_t prvCore_SerialEndpointDesc[2] =
  325. {
  326. {
  327. .bLength = USB_LEN_EP_DESC,
  328. .bDescriptorType = UDESC_ENDPOINT,
  329. .bEndpointAddress = UE_DIR_IN|DEVICE_GENERIC_SERIAL_EP_IN,
  330. .bmAttributes = UE_BULK,
  331. .wMaxPacketSize = {0x40,0x00},
  332. .bInterval = 10,
  333. },
  334. {
  335. .bLength = USB_LEN_EP_DESC,
  336. .bDescriptorType = UDESC_ENDPOINT,
  337. .bEndpointAddress = UE_DIR_OUT|DEVICE_GENERIC_SERIAL_EP_OUT,
  338. .bmAttributes = UE_BULK,
  339. .wMaxPacketSize = {0x40,0x00},
  340. .bInterval = 10,
  341. }
  342. };
  343. static const usb_hid_descriptor_t prvCore_HIDDesc =
  344. {
  345. .bLength = 9,
  346. .bDescriptorType = USB_HID_DESCRIPTOR_TYPE,
  347. .bcdHID = {0x11, 0x01},
  348. .bCountryCode = 0x21,
  349. .bNumDescriptors = 1,
  350. .bReportDescriptorType = USB_HID_REPORT_DESC,
  351. .wDescriptorLength = {63,0},
  352. };
  353. static const char prvCore_HIDCustomReportDescriptor[34] = {
  354. 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
  355. 0x09, 0x00, // USAGE (Undefined)
  356. 0xa1, 0x01, // COLLECTION (Application)
  357. 0x09, 0x00, // USAGE (Undefined)
  358. 0x75, 0x08, // REPORT_SIZE (8)
  359. 0x95, 0x08, // REPORT_COUNT (8)
  360. 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
  361. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  362. 0x81, 0x02, // INPUT (Data,Var,Abs)
  363. 0x09, 0x00, // USAGE (Undefined)
  364. 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
  365. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  366. 0x95, 0x08, // REPORT_COUNT (8)
  367. 0x75, 0x08, // REPORT_SIZE (8)
  368. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
  369. 0xc0 // END_COLLECTION
  370. };
  371. static const char prvCore_HIDKeyboardReportDesc[64] = {
  372. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  373. 0x09, 0x06, // USAGE (Keyboard)
  374. 0xa1, 0x01, // COLLECTION (Application)
  375. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  376. 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
  377. 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
  378. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  379. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  380. 0x75, 0x01, // REPORT_SIZE (1)
  381. 0x95, 0x08, // REPORT_COUNT (8)
  382. 0x81, 0x02, // INPUT (Data,Var,Abs)
  383. 0x95, 0x01, // REPORT_COUNT (1)
  384. 0x75, 0x08, // REPORT_SIZE (8)
  385. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
  386. 0x95, 0x05, // REPORT_COUNT (5)
  387. 0x75, 0x01, // REPORT_SIZE (1)
  388. 0x05, 0x08, // USAGE_PAGE (LEDs)
  389. 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
  390. 0x29, 0x05, // USAGE_MAXIMUM (Kana)
  391. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
  392. 0x95, 0x01, // REPORT_COUNT (1)
  393. 0x75, 0x03, // REPORT_SIZE (3)
  394. 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
  395. 0x95, 0x06, // REPORT_COUNT (6)
  396. 0x75, 0x08, // REPORT_SIZE (8)
  397. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  398. 0x26, 0x00, 0xff, // LOGICAL_MAXIMUM (255)
  399. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  400. 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
  401. 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
  402. 0x81, 0x00, // INPUT (Data,Ary,Abs)
  403. 0xc0 // END_COLLECTION
  404. };
  405. static int32_t prvCore_GetHIDDesc(void *pData, void *pParam)
  406. {
  407. usb_hid_descriptor_t HIDDesc;
  408. if (pData)
  409. {
  410. HIDDesc = prvCore_HIDDesc;
  411. BytesPutLe16(HIDDesc.wDescriptorLength, prvUSBApp.HIDReportLen);
  412. memcpy(pData, &HIDDesc, sizeof(usb_hid_descriptor_t));
  413. }
  414. return sizeof(usb_hid_descriptor_t);
  415. }
  416. static usb_full_interface_t prvCore_InterfaceList[3] =
  417. {
  418. {
  419. &prvCore_HIDInterfaceDesc,
  420. prvCore_HIDEndpointDesc,
  421. NULL,
  422. prvCore_GetHIDDesc,
  423. 2,
  424. },
  425. {
  426. &prvCore_MassStorgeInterfaceDesc,
  427. prvCore_MassStorgeEndpointDesc,
  428. NULL,
  429. NULL,
  430. 2,
  431. },
  432. {
  433. &prvCore_SerialInterfaceDesc,
  434. prvCore_SerialEndpointDesc,
  435. NULL,
  436. NULL,
  437. 2,
  438. },
  439. };
  440. static const usb_full_config_t prvCore_Config =
  441. {
  442. .pConfigDesc = &prvCore_ConfigDesc,
  443. .pInterfaceAssocDesc = &prvCore_AssocInterfaceDesc,
  444. .pInterfaceFullDesc = prvCore_InterfaceList,
  445. .InterfaceNum = 3,
  446. };
  447. static const USB_FullConfigStruct prvCore_FullConfig =
  448. {
  449. .pQualifierDesc = NULL,
  450. .pFullConfig = {&prvCore_Config, NULL, NULL},
  451. };
  452. static int32_t prvCore_SCSIInit(uint8_t LUN, void *pUserData)
  453. {
  454. return 0;
  455. }
  456. static int32_t prvCore_SCSIGetCapacity(uint8_t LUN, uint32_t *BlockNum, uint32_t *BlockSize, void *pUserData)
  457. {
  458. *BlockNum = prvUSBApp.tUDisk.BlockTotalNums;
  459. *BlockSize = prvUSBApp.tUDisk.BlockSize;
  460. return 0;
  461. }
  462. static int32_t prvCore_SCSIIsReady(uint8_t LUN, void *pUserData)
  463. {
  464. return 0;
  465. }
  466. static int32_t prvCore_SCSIIsWriteProtected(uint8_t LUN, void *pUserData)
  467. {
  468. return 0;
  469. }
  470. static int32_t prvCore_SCSIPreRead(uint8_t LUN, uint32_t BlockAddress, uint32_t BlockNums, void *pUserData)
  471. {
  472. if ((BlockAddress + BlockNums) * prvUSBApp.tUDisk.BlockSize > VIRTUAL_UDISK_LEN)
  473. {
  474. return -1;
  475. }
  476. prvUSBApp.tUDisk.CurAddress = BlockAddress * prvUSBApp.tUDisk.BlockSize;
  477. return 0;
  478. }
  479. static int32_t prvCore_SCSIRead(uint8_t LUN, uint32_t Len, uint8_t **pOutData, uint32_t *OutLen, void *pUserData)
  480. {
  481. if (Len + prvUSBApp.tUDisk.CurAddress > VIRTUAL_UDISK_LEN)
  482. {
  483. return -1;
  484. }
  485. *pOutData = &prvUSBApp.tUDisk.VirtualData[prvUSBApp.tUDisk.CurAddress];
  486. *OutLen = Len;
  487. prvUSBApp.tUDisk.CurAddress += Len;
  488. return 0;
  489. }
  490. static int32_t prvCore_SCSIReadNext(uint8_t LUN, void *pUserData)
  491. {
  492. return 0;
  493. }
  494. static int32_t prvCore_SCSIPreWrite(uint8_t LUN, uint32_t BlockAddress, uint32_t BlockNums, void *pUserData)
  495. {
  496. if ((BlockAddress + BlockNums) * prvUSBApp.tUDisk.BlockSize > VIRTUAL_UDISK_LEN)
  497. {
  498. return -1;
  499. }
  500. prvUSBApp.tUDisk.CurAddress = BlockAddress * prvUSBApp.tUDisk.BlockSize;
  501. return 0;
  502. }
  503. static int32_t prvCore_SCSIWrite(uint8_t LUN, uint8_t *Data, uint32_t Len, void *pUserData)
  504. {
  505. if (Len + prvUSBApp.tUDisk.CurAddress > VIRTUAL_UDISK_LEN)
  506. {
  507. return -1;
  508. }
  509. memcpy(&prvUSBApp.tUDisk.VirtualData[prvUSBApp.tUDisk.CurAddress], Data, Len);
  510. prvUSBApp.tUDisk.CurAddress += Len;
  511. return 0;
  512. }
  513. static int32_t prvCore_SCSIDoWrite(uint8_t LUN, void *pUserData)
  514. {
  515. return 0;
  516. }
  517. static int32_t prvCore_SCSIUserCmd(USB_EndpointDataStruct *pEpData, MSC_SCSICtrlStruct *pMSC)
  518. {
  519. return -1;
  520. }
  521. static int32_t prvCore_SCSIGetMaxLUN(uint8_t *LUN, void *pUserData)
  522. {
  523. *LUN = 0;
  524. }
  525. static const USB_StorageSCSITypeDef prvCore_SCSIFun =
  526. {
  527. prvCore_SCSIGetMaxLUN,
  528. prvCore_SCSIInit,
  529. prvCore_SCSIGetCapacity,
  530. prvCore_SCSIIsReady,
  531. prvCore_SCSIIsWriteProtected,
  532. prvCore_SCSIPreRead,
  533. prvCore_SCSIRead,
  534. prvCore_SCSIReadNext,
  535. prvCore_SCSIPreWrite,
  536. prvCore_SCSIWrite,
  537. prvCore_SCSIDoWrite,
  538. prvCore_SCSIUserCmd,
  539. &prvCore_StandardInquiryData,
  540. &prvCore_MSCPage00InquiryData,
  541. &prvCore_MSCPage80InquiryData,
  542. &prvCore_MSCModeSense6data,
  543. &prvCore_MSCModeSense10data,
  544. };
  545. static void prvCore_VUartOpen(Virtual_UartCtrlStruct *pVUart, uint8_t UartID)
  546. {
  547. pVUart->USBOnOff = 1;
  548. if (pVUart->TxBuf.Data)
  549. {
  550. DBG("send last data %ubyte", pVUart->TxBuf.MaxLen);
  551. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  552. }
  553. else if (pVUart->TxCacheBuf.Pos)
  554. {
  555. DBG("send cache data %ubyte", pVUart->TxCacheBuf.Pos);
  556. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  557. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  558. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  559. }
  560. pVUart->CB(UartID, UART_CB_CONNECTED);
  561. }
  562. static int32_t prvCore_VUartRxTimeoutCB(void *pData, void *pParam)
  563. {
  564. uint32_t UartID = (uint32_t)pParam;
  565. prvLuatOS_VirtualUart[UartID].CB(UartID, UART_CB_RX_TIMEOUT);
  566. }
  567. static int32_t prvCore_VHIDDummyCB(void *pData, void *pParam)
  568. {
  569. return 0;
  570. }
  571. static int32_t prvCore_VUartDummyCB(void *pData, void *pParam)
  572. {
  573. return 0;
  574. }
  575. static int32_t prvCore_VMSCDummyCB(void *pData, void *pParam)
  576. {
  577. return 0;
  578. }
  579. static void prvCore_VHIDSetReady(uint8_t OnOff)
  580. {
  581. if (prvLuatOS_VirtualHID.IsReady != OnOff)
  582. {
  583. prvLuatOS_VirtualHID.IsReady = OnOff;
  584. prvLuatOS_VirtualHID.CB(prvLuatOS_VirtualHID.USB_ID, prvLuatOS_VirtualHID.IsReady);
  585. }
  586. }
  587. static int32_t prvCore_USBEp0CB(void *pData, void *pParam)
  588. {
  589. int32_t Result = -ERROR_CMD_NOT_SUPPORT;
  590. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  591. USB_StorageSCSITypeDef *pUserFun = (USB_StorageSCSITypeDef *)prvUSBApp.tSCSI.pSCSIUserFunList;
  592. uint16_t wLength, wValue;
  593. Virtual_UartCtrlStruct *pVUart;
  594. // DBG("%d,%d,%d,%d", pEpData->USB_ID, pEpData->EpIndex, pEpData->IsToDevice, pEpData->Len);
  595. if (!pEpData->IsDataStage)
  596. {
  597. wLength = BytesGetLe16(pEpData->pLastRequest->wLength);
  598. if (pEpData->IsToDevice)
  599. {
  600. switch (pEpData->pLastRequest->bRequest)
  601. {
  602. case UCDC_SET_CONTROL_LINE_STATE:
  603. pVUart = &prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN];
  604. switch (pEpData->pLastRequest->wValue[0])
  605. {
  606. case 0:
  607. //close serial
  608. pVUart->USBOnOff = 0;
  609. pVUart->CB(pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN, UART_CB_ERROR);
  610. break;
  611. case 1:
  612. case 3:
  613. //open serial
  614. prvCore_VUartOpen(pVUart, pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN);
  615. prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN].USBOnOff = 1;
  616. break;
  617. }
  618. Result = ERROR_NONE;
  619. break;
  620. case USB_HID_REQ_SET_IDLE:
  621. prvCore_VHIDSetReady(1);
  622. Result = ERROR_NONE;
  623. break;
  624. case UR_GET_DESCRIPTOR:
  625. switch(pEpData->pLastRequest->wValue[1])
  626. {
  627. case USB_HID_REPORT_DESC:
  628. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, prvUSBApp.pHIDReport, prvUSBApp.HIDReportLen, wLength, 1);
  629. Result = ERROR_NONE;
  630. break;
  631. }
  632. break;
  633. case MSC_GET_MAX_LUN:
  634. pUserFun->GetMaxLUN(&prvUSBApp.tSCSI.LogicalUnitNum, prvUSBApp.tSCSI.pUserData);
  635. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, &prvUSBApp.tSCSI.LogicalUnitNum, 1, wLength, 1);
  636. Result = ERROR_NONE;
  637. break;
  638. case MSC_RESET:
  639. Result = ERROR_NONE;
  640. break;
  641. }
  642. }
  643. }
  644. return Result;
  645. }
  646. static int32_t prvCore_MSCCB(void *pData, void *pParam)
  647. {
  648. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  649. USB_EndpointDataStruct *pEpDataSave;
  650. switch(prvUSBApp.tSCSI.BotState)
  651. {
  652. case USB_MSC_BOT_STATE_DATA_OUT_TO_DEVICE:
  653. case USB_MSC_BOT_STATE_DATA_IN_TO_HOST:
  654. goto MSC_RUN_IN_TASK;
  655. break;
  656. default:
  657. if (pEpData->IsToDevice && pEpData->Data)
  658. {
  659. switch(pEpData->Data[15])
  660. {
  661. case SCSI_READ10:
  662. case SCSI_READ12:
  663. case SCSI_READ16:
  664. goto MSC_RUN_IN_TASK;
  665. break;
  666. }
  667. }
  668. break;
  669. }
  670. USB_MSCHandle(pEpData, &prvUSBApp.tSCSI);
  671. return ERROR_NONE;
  672. MSC_RUN_IN_TASK:
  673. pEpDataSave = malloc(sizeof(USB_EndpointDataStruct));
  674. memcpy(pEpDataSave, pEpData, sizeof(USB_EndpointDataStruct));
  675. if (pEpData->Data && pEpData->Len)
  676. {
  677. pEpDataSave->Data = malloc(pEpData->Len);
  678. memcpy(pEpDataSave->Data, pEpData->Data, pEpData->Len);
  679. }
  680. else
  681. {
  682. pEpDataSave->Data = NULL;
  683. pEpDataSave->Len = 0;
  684. }
  685. Task_SendEvent(prvUSBApp.hTaskHandle, USBD_MSC_CB, pEpDataSave, &prvUSBApp.tSCSI, pParam);
  686. return ERROR_NONE;
  687. }
  688. static int32_t prvCore_HIDCB(void *pData, void *pParam)
  689. {
  690. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  691. uint32_t USB_ID = (uint32_t)pParam;
  692. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  693. Buffer_Struct Buf;
  694. if (pEpData->IsToDevice)
  695. {
  696. prvCore_VHIDSetReady(1);
  697. Buf.Data = pEpData->Data;
  698. Buf.Pos = pEpData->Len;
  699. pVHID->CB(prvLuatOS_VirtualHID.USB_ID, &Buf);
  700. }
  701. else
  702. {
  703. OS_DeInitBuffer(&pVHID->TxBuf);
  704. if (pVHID->TxCacheBuf.Pos)
  705. {
  706. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  707. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  708. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  709. }
  710. else
  711. {
  712. pVHID->CB(USB_ID, USB_HID_SEND_DONE);
  713. }
  714. }
  715. return ERROR_NONE;
  716. }
  717. static int32_t prvCore_SerialCB(void *pData, void *pParam)
  718. {
  719. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  720. uint32_t UartID = (uint32_t)pParam;
  721. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  722. if (pEpData->IsToDevice)
  723. {
  724. //open serial
  725. if (!pVUart->USBOnOff)
  726. {
  727. prvCore_VUartOpen(pVUart, UartID);
  728. }
  729. if (pEpData->Data && pEpData->Len)
  730. {
  731. if ((pVUart->RxBuf.Pos + pEpData->Len) >= pVUart->RxBuf.MaxLen)
  732. {
  733. OS_ReSizeBuffer(&pVUart->RxBuf, pVUart->RxBuf.MaxLen * 2);
  734. }
  735. OS_BufferWrite(&pVUart->RxBuf, pEpData->Data, pEpData->Len);
  736. if (pEpData->IsDataStage && pVUart->RxTimeoutUS)
  737. {
  738. Timer_StartUS(pVUart->RxTimer, pVUart->RxTimeoutUS, 0);
  739. }
  740. else
  741. {
  742. Timer_Stop(pVUart->RxTimer);
  743. pVUart->CB(UartID, UART_CB_RX_NEW);
  744. }
  745. }
  746. }
  747. else
  748. {
  749. OS_DeInitBuffer(&pVUart->TxBuf);
  750. if (pVUart->TxCacheBuf.Pos)
  751. {
  752. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  753. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  754. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  755. }
  756. else
  757. {
  758. pVUart->CB(UartID, UART_CB_TX_ALL_DONE);
  759. }
  760. }
  761. return ERROR_NONE;
  762. }
  763. static int32_t prvCore_USBStateCB(void *pData, void *pParam)
  764. {
  765. PV_Union uPV;
  766. uint8_t i;
  767. uPV.p = pData;
  768. switch(uPV.u8[1])
  769. {
  770. case USBD_BUS_TYPE_DISCONNECT:
  771. prvCore_VHIDSetReady(0);
  772. USB_MSCReset(&prvUSBApp.tSCSI);
  773. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  774. {
  775. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  776. prvLuatOS_VirtualUart[i].CB(i, UART_CB_ERROR);
  777. }
  778. break;
  779. case USBD_BUS_TYPE_ENABLE_CONNECT:
  780. USB_StackStartDevice(uPV.u8[0]);
  781. break;
  782. }
  783. }
  784. void Core_USBDefaultDeviceStart(uint8_t USB_ID)
  785. {
  786. uint8_t langid[2] = {0x09, 0x04};
  787. int i;
  788. prvLuatOS_VirtualHID.USB_ID = USB_ID;
  789. prvLuatOS_VirtualHID.IsReady = 0;
  790. prvLuatOS_VirtualHID.ToHostEpIndex = DEVICE_HID_KEYBOARD_EP_IN;
  791. prvUSBApp.tUDisk.BlockTotalNums = VIRTUAL_UDISK_BLOCKS_NUMS;
  792. prvUSBApp.tUDisk.BlockSize = VIRTUAL_UDISK_BLOCKS_LEN;
  793. prvUSBApp.tSCSI.LogicalUnitNum = 0;
  794. prvUSBApp.tSCSI.ToHostEpIndex = DEVICE_MASS_STORAGE_EP_IN;
  795. prvUSBApp.tSCSI.ToDeviceEpIndex = DEVICE_MASS_STORAGE_EP_OUT;
  796. if (!prvUSBApp.pHIDReport)
  797. {
  798. prvUSBApp.pHIDReport = &prvCore_HIDKeyboardReportDesc;
  799. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDKeyboardReportDesc);
  800. }
  801. if (!prvUSBApp.tSCSI.pSCSIUserFunList)
  802. {
  803. prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  804. }
  805. if (!prvLuatOS_VirtualHID.CB)
  806. {
  807. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  808. }
  809. OS_ReInitBuffer(&prvLuatOS_VirtualHID.TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  810. USB_StackPowerOnOff(USB_ID, 1);
  811. USB_StackStop(USB_ID);
  812. USB_StackClearSetup(USB_ID);
  813. USB_StackSetDeviceBusPower(USB_ID, 1);
  814. USB_StackSetEpCB(USB_ID, 0, prvCore_USBEp0CB, NULL);
  815. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_IN, prvCore_HIDCB, USB_ID);
  816. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_OUT, prvCore_HIDCB, USB_ID);
  817. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_IN, prvCore_MSCCB, USB_ID);
  818. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_OUT, prvCore_MSCCB, USB_ID);
  819. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_IN, prvCore_SerialCB, VIRTUAL_UART0);
  820. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_OUT, prvCore_SerialCB, VIRTUAL_UART0);
  821. USB_StackSetDeviceConfig(USB_ID, &prvCore_DeviceDesc, &prvCore_FullConfig, 1, USBD_IDX_INTERFACE0_STR + 3, prvCore_USBStateCB, NULL);
  822. USB_StackSetCharString(USB_ID, USBD_IDX_LANGID_STR, langid, 2);
  823. USB_StackSetCharString(USB_ID, USBD_IDX_MANUFACTURER_STR, prvCore_StringManufacturer, sizeof(prvCore_StringManufacturer));
  824. USB_StackSetCharString(USB_ID, USBD_IDX_PRODUCT_STR, prvCore_StringProduct, sizeof(prvCore_StringProduct));
  825. USB_StackSetCharString(USB_ID, USBD_IDX_SERIAL_STR, prvCore_StringSerial, sizeof(prvCore_StringSerial));
  826. USB_StackSetCharString(USB_ID, USBD_IDX_CONFIG_STR, prvCore_StringConfig, sizeof(prvCore_StringConfig));
  827. for(i = 0; i < 3; i++)
  828. {
  829. USB_StackSetCharString(USB_ID, USBD_IDX_INTERFACE0_STR + i, prvCore_StringInterface[i], strlen(prvCore_StringInterface[i]));
  830. }
  831. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  832. {
  833. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  834. prvLuatOS_VirtualUart[i].USB_ID = USB_ID;
  835. if (!prvLuatOS_VirtualUart[i].RxTimer)
  836. {
  837. prvLuatOS_VirtualUart[i].RxTimer = Timer_Create(prvCore_VUartRxTimeoutCB, i, NULL);
  838. }
  839. if (!prvLuatOS_VirtualUart[i].CB)
  840. {
  841. prvLuatOS_VirtualUart[i].CB = prvCore_VUartDummyCB;
  842. }
  843. prvLuatOS_VirtualUart[i].RxTimeoutUS = 150;
  844. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  845. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  846. }
  847. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToDeviceEpIndex = DEVICE_GENERIC_SERIAL_EP_IN;
  848. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToHostEpIndex = DEVICE_GENERIC_SERIAL_EP_OUT;
  849. prvUSBApp.tUDisk.VirtualData = prvLuatOS_VirtualUart[0].TxCacheBuf.Data;
  850. USB_MSCReset(&prvUSBApp.tSCSI);
  851. USB_StackStartDevice(USB_ID);
  852. }
  853. void Core_VHIDInit(uint8_t USB_ID, CBFuncEx_t CB)
  854. {
  855. if (CB)
  856. {
  857. prvLuatOS_VirtualHID.CB = CB;
  858. }
  859. else
  860. {
  861. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  862. }
  863. }
  864. void Core_VUartInit(uint8_t UartID, uint32_t BaudRate, uint8_t IsRxCacheEnable, uint8_t DataBits, uint8_t Parity, uint8_t StopBits, CBFuncEx_t CB)
  865. {
  866. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  867. // switch(UartID)
  868. // {
  869. // case VIRTUAL_UART0:
  870. // if (!prvService.IsUSBOpen)
  871. // {
  872. // Core_USBDefaultDeviceStart(USB_ID0);
  873. // prvService.IsUSBOpen = 1;
  874. // }
  875. // break;
  876. // }
  877. if (CB)
  878. {
  879. pVUart->CB = CB;
  880. }
  881. else
  882. {
  883. pVUart->CB = prvCore_VUartDummyCB;
  884. }
  885. pVUart->UartOnOff = 1;
  886. }
  887. void Core_VUartDeInit(uint8_t UartID)
  888. {
  889. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  890. pVUart->UartOnOff = 0;
  891. }
  892. void Core_VUartSetRxTimeout(uint8_t UartID, uint32_t TimeoutUS)
  893. {
  894. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  895. pVUart->RxTimeoutUS = TimeoutUS;
  896. }
  897. void Core_VUartSetCb(uint8_t UartID, CBFuncEx_t CB)
  898. {
  899. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  900. if (CB)
  901. {
  902. pVUart->CB = CB;
  903. }
  904. else
  905. {
  906. pVUart->CB = prvCore_VUartDummyCB;
  907. }
  908. }
  909. uint32_t Core_VUartRxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  910. {
  911. uint32_t ReadLen;
  912. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  913. switch(UartID)
  914. {
  915. case VIRTUAL_UART0:
  916. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 0);
  917. break;
  918. }
  919. if (!Len)
  920. {
  921. ReadLen = pVUart->RxBuf.Pos;
  922. goto READ_END;
  923. }
  924. ReadLen = (pVUart->RxBuf.Pos < Len)?pVUart->RxBuf.Pos:Len;
  925. memcpy(Data, pVUart->RxBuf.Data, ReadLen);
  926. OS_BufferRemove(&pVUart->RxBuf, ReadLen);
  927. if (!pVUart->RxBuf.Pos && pVUart->RxBuf.MaxLen > VIRTUAL_SERIAL_BUFFER_LEN)
  928. {
  929. OS_ReInitBuffer(&pVUart->RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  930. }
  931. READ_END:
  932. switch(UartID)
  933. {
  934. case VIRTUAL_UART0:
  935. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 1);
  936. break;
  937. }
  938. return ReadLen;
  939. }
  940. int32_t Core_VUartBufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  941. {
  942. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  943. switch(UartID)
  944. {
  945. case VIRTUAL_UART0:
  946. if (!pVUart->USBOnOff)
  947. {
  948. return -1;
  949. }
  950. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  951. break;
  952. }
  953. if (Data && Len)
  954. {
  955. OS_BufferWrite(&pVUart->TxCacheBuf, Data, Len);
  956. }
  957. if (pVUart->TxBuf.Data || pVUart->TxBuf.MaxLen)
  958. {
  959. goto TX_END;
  960. }
  961. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  962. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  963. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  964. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  965. TX_END:
  966. switch(UartID)
  967. {
  968. case VIRTUAL_UART0:
  969. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  970. break;
  971. }
  972. return 0;
  973. }
  974. void Core_VUartBufferTxStop(uint8_t UartID)
  975. {
  976. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  977. switch(UartID)
  978. {
  979. case VIRTUAL_UART0:
  980. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  981. break;
  982. }
  983. OS_DeInitBuffer(&pVUart->TxBuf);
  984. pVUart->TxCacheBuf.Pos = 0;
  985. USB_StackStopDeviceTx(pVUart->USB_ID, pVUart->ToHostEpIndex, 0);
  986. switch(UartID)
  987. {
  988. case VIRTUAL_UART0:
  989. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  990. break;
  991. }
  992. }
  993. void Core_VHIDUploadData(uint8_t USB_ID, uint8_t *Data, uint16_t Len)
  994. {
  995. if (!prvLuatOS_VirtualHID.IsReady) return;
  996. USB_HIDKeyValue HIDKey;
  997. USB_HIDKeyBoradKeyStruct HIDKeyBoard;
  998. uint16_t Pos;
  999. volatile uint8_t IsShift, i, LastValue;
  1000. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1001. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1002. if (Data && Len)
  1003. {
  1004. if ((Len*16 + pVHID->TxCacheBuf.Pos) > pVHID->TxCacheBuf.MaxLen)
  1005. {
  1006. OS_ReSizeBuffer(&pVHID->TxCacheBuf, Len*16 + pVHID->TxCacheBuf.Pos);
  1007. }
  1008. Pos = 0;
  1009. while(Pos < Len)
  1010. {
  1011. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1012. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  1013. Pos++;
  1014. IsShift = HIDKey.Shift;
  1015. LastValue = HIDKey.Value;
  1016. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1017. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1018. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1019. ADD_REST:
  1020. for(i = 1; i < 6; i++)
  1021. {
  1022. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  1023. Pos++;
  1024. if ((IsShift != HIDKey.Shift) || (LastValue == HIDKey.Value) || (LastValue == '\r') || (LastValue == '\n'))
  1025. {
  1026. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1027. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1028. //加入一个抬起的data
  1029. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1030. IsShift = HIDKey.Shift;
  1031. LastValue = HIDKey.Value;
  1032. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1033. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1034. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1035. if (Pos < Len)
  1036. {
  1037. goto ADD_REST;
  1038. }
  1039. else
  1040. {
  1041. break;
  1042. }
  1043. }
  1044. // else if
  1045. // {
  1046. // OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1047. // memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1048. // //加入一个抬起的data
  1049. // OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1050. // IsShift = HIDKey.Shift;
  1051. // LastValue = HIDKey.Value;
  1052. // HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1053. // HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1054. //// DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1055. // if (Pos < Len)
  1056. // {
  1057. // goto ADD_REST;
  1058. // }
  1059. // else
  1060. // {
  1061. // break;
  1062. // }
  1063. // }
  1064. else
  1065. {
  1066. LastValue = HIDKey.Value;
  1067. HIDKeyBoard.PressKey[i] = HIDKey.Value;
  1068. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], i, HIDKey.Value, HIDKey.Shift);
  1069. if (Pos >= Len)
  1070. {
  1071. break;
  1072. }
  1073. }
  1074. }
  1075. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1076. //加入一个抬起的data
  1077. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1078. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1079. }
  1080. //加入一个抬起的data
  1081. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1082. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1083. }
  1084. // pVHID->TxCacheBuf.Pos = 0;
  1085. // return;
  1086. if (pVHID->TxBuf.Data || pVHID->TxBuf.MaxLen)
  1087. {
  1088. goto UPLOAD_END;
  1089. }
  1090. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  1091. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1092. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1093. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1094. UPLOAD_END:
  1095. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1096. }
  1097. void Core_VHIDSendRawData(uint8_t USB_ID, uint8_t *Data, uint16_t Len)
  1098. {
  1099. if (!prvLuatOS_VirtualHID.IsReady) return;
  1100. USB_HIDKeyValue HIDKey;
  1101. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1102. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1103. OS_BufferWrite(&pVHID->TxCacheBuf, Data, Len);
  1104. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1105. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1106. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1107. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1108. }
  1109. void Core_VHIDUploadStop(uint8_t USB_ID)
  1110. {
  1111. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1112. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1113. OS_DeInitBuffer(&pVHID->TxBuf);
  1114. pVHID->TxCacheBuf.Pos = 0;
  1115. USB_StackStopDeviceTx(pVHID->USB_ID, pVHID->ToHostEpIndex, 0);
  1116. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1117. }
  1118. #ifdef __BUILD_OS__
  1119. static void prvCore_USBAppTask(void *pParam)
  1120. {
  1121. OS_EVENT Event;
  1122. USB_EndpointDataStruct *pEpData;
  1123. while(1)
  1124. {
  1125. Task_GetEventByMS(prvUSBApp.hTaskHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  1126. switch(Event.ID)
  1127. {
  1128. case USB_HW_ACTION:
  1129. switch (Event.Param2)
  1130. {
  1131. case SERV_USB_RESET_END:
  1132. DBG("USB%d reset", Event.Param1);
  1133. Task_DelayMS(1);
  1134. USB_StackDeviceAfterDisconnect(Event.Param1);
  1135. break;
  1136. case SERV_USB_RESUME_END:
  1137. Task_DelayMS(20);
  1138. USB_ResumeEnd(Event.Param3);
  1139. break;
  1140. case SERV_USB_SUSPEND:
  1141. DBG("USB%d suspend", Event.Param1);
  1142. break;
  1143. case SERV_USB_RESUME:
  1144. break;
  1145. }
  1146. break;
  1147. case USBD_MSC_CB:
  1148. pEpData = (USB_EndpointDataStruct *)Event.Param1;
  1149. // DBG("%d,%d,%d,%d", pEpData->USB_ID, pEpData->EpIndex, pEpData->IsToDevice, pEpData->Len);
  1150. USB_MSCHandle(pEpData, Event.Param2);
  1151. free(pEpData->Data);
  1152. free(Event.Param1);
  1153. WDT_Feed();
  1154. break;
  1155. }
  1156. }
  1157. }
  1158. void Core_USBAction(uint8_t USB_ID, uint8_t Action, void *pParam)
  1159. {
  1160. Task_SendEvent(prvUSBApp.hTaskHandle, USB_HW_ACTION, USB_ID, Action, pParam);
  1161. }
  1162. extern const USB_StorageSCSITypeDef prvSDHC_SCSIFun;
  1163. void Core_UDiskAttachSDHC(uint8_t USB_ID, void *pCtrl)
  1164. {
  1165. if (!prvUSBApp.pSDHC)
  1166. {
  1167. prvUSBApp.pSDHC = malloc(sizeof(SDHC_SPICtrlStruct));
  1168. }
  1169. memcpy(prvUSBApp.pSDHC, pCtrl, sizeof(SDHC_SPICtrlStruct));
  1170. prvUSBApp.tSCSI.pSCSIUserFunList = &prvSDHC_SCSIFun;
  1171. prvUSBApp.tSCSI.pUserData = prvUSBApp.pSDHC;
  1172. DBuffer_ReInit(&prvUSBApp.DataBuf, 8 * 1024);
  1173. prvUSBApp.pSDHC->SCSIDataBuf = &prvUSBApp.DataBuf;
  1174. }
  1175. void Core_UDiskDetachSDHC(uint8_t USB_ID)
  1176. {
  1177. prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  1178. prvUSBApp.tSCSI.pUserData = NULL;
  1179. free(prvUSBApp.pSDHC);
  1180. prvUSBApp.pSDHC = NULL;
  1181. DBuffer_DeInit(&prvUSBApp.DataBuf);
  1182. }
  1183. void Core_USBAppGlobalInit(void)
  1184. {
  1185. prvUSBApp.hTaskHandle = Task_Create(prvCore_USBAppTask, NULL,2 * 1024, USB_TASK_PRO, "usb app");
  1186. }
  1187. INIT_TASK_EXPORT(Core_USBAppGlobalInit, "2");
  1188. #endif