core_usb_app.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360
  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. Buffer_Struct RxBuf;
  56. CBFuncEx_t CB;
  57. uint8_t USB_ID;
  58. uint8_t IsReady;
  59. uint8_t ToHostEpIndex;
  60. uint8_t ToDeviceEpIndex;
  61. }Virtual_HIDCtrlStruct;
  62. typedef struct
  63. {
  64. Buffer_Struct TxBuf;
  65. Buffer_Struct TxCacheBuf; // 缓存下次发送的数据
  66. Buffer_Struct RxBuf;
  67. CBFuncEx_t CB;
  68. Timer_t *RxTimer;
  69. uint32_t RxTimeoutUS;
  70. uint8_t *TxData;
  71. uint8_t USBOnOff;
  72. uint8_t UartOnOff;
  73. uint8_t USB_ID;
  74. uint8_t ToHostEpIndex;
  75. uint8_t ToDeviceEpIndex;
  76. }Virtual_UartCtrlStruct;
  77. typedef struct
  78. {
  79. MSC_SCSICtrlStruct tSCSI;
  80. Virtual_UDiskCtrlStruct tUDisk;
  81. DBuffer_Struct DataBuf;
  82. SDHC_SPICtrlStruct *pSDHC;
  83. HANDLE hTaskHandle;
  84. uint8_t *pHIDReport;
  85. uint16_t HIDReportLen;
  86. uint8_t IsUSBAttachSDHC;
  87. uint8_t IsStart;
  88. }USB_AppCtrlStruct;
  89. static const uint8_t prvCore_StandardInquiryData[STANDARD_INQUIRY_DATA_LEN] =
  90. {
  91. 0x00, //磁盘设备
  92. 0x00, //其中最高位D7为RMB。RMB=0,表示不可移除设备。如果RMB=1,则为可移除设备。
  93. 0x02, //各种版本号
  94. 0x02, //数据响应格式 0x02
  95. 0x1F, //附加数据长度,为31字节
  96. 0x00, //保留
  97. 0x00, //保留
  98. 0x00, //保留
  99. 'A','I','R','M','2','M',' ',' ',
  100. 'L','U','A','T','O','S','-','S','O','C',' ','U','S','B',' ',' ',
  101. '1','.','0','0'
  102. };
  103. const uint8_t prvCore_MSCPage00InquiryData[LENGTH_INQUIRY_PAGE00] =
  104. {
  105. 0x00,
  106. 0x00,
  107. 0x00,
  108. (LENGTH_INQUIRY_PAGE00 - 4U),
  109. 0x00,
  110. 0x80
  111. };
  112. /* USB Mass storage VPD Page 0x80 Inquiry Data for Unit Serial Number */
  113. const uint8_t prvCore_MSCPage80InquiryData[LENGTH_INQUIRY_PAGE80] =
  114. {
  115. 0x00,
  116. 0x80,
  117. 0x00,
  118. LENGTH_INQUIRY_PAGE80,
  119. 0x20, /* Put Product Serial number */
  120. 0x20,
  121. 0x20,
  122. 0x20
  123. };
  124. /* USB Mass storage sense 6 Data */
  125. const uint8_t prvCore_MSCModeSense6data[MODE_SENSE6_LEN] =
  126. {
  127. 0x22,
  128. 0x00,
  129. 0x00,
  130. 0x00,
  131. 0x08,
  132. 0x12,
  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. 0x00,
  147. 0x00,
  148. 0x00,
  149. 0x00
  150. };
  151. /* USB Mass storage sense 10 Data */
  152. const uint8_t prvCore_MSCModeSense10data[MODE_SENSE10_LEN] =
  153. {
  154. 0x00,
  155. 0x26,
  156. 0x00,
  157. 0x00,
  158. 0x00,
  159. 0x00,
  160. 0x00,
  161. 0x00,
  162. 0x08,
  163. 0x12,
  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. 0x00,
  178. 0x00,
  179. 0x00,
  180. 0x00
  181. };
  182. static USB_AppCtrlStruct prvUSBApp;
  183. static Virtual_HIDCtrlStruct prvLuatOS_VirtualHID;
  184. static Virtual_UartCtrlStruct prvLuatOS_VirtualUart[VIRTUAL_UART_MAX];
  185. /* LangID = 0x0409: U.S. English */
  186. static const char prvCore_StringManufacturer[] = "airm2m";
  187. static const char prvCore_StringProduct[] = "air105 usb device";
  188. static const char prvCore_StringSerial[] = "00001";
  189. static const char prvCore_StringConfig[] = "luatos";
  190. static const char *prvCore_StringInterface[3] = {
  191. "virtual Mass Storage Device",
  192. "virtual HID Keyboard",
  193. "virtual Serial"
  194. };
  195. static usb_device_descriptor_t prvCore_DeviceDesc =
  196. {
  197. .bLength = USB_LEN_DEV_DESC,
  198. .bDescriptorType = UDESC_DEVICE,
  199. .bcdUSB = {0x00, 0x02},
  200. .bDeviceClass = UDCLASS_IN_INTERFACE,
  201. .bDeviceSubClass = 0,
  202. .bDeviceProtocol = 0,
  203. .bMaxPacketSize = 0x40,
  204. .idVendor = {0x82, 0x17},
  205. .idProduct = {0x00, 0x4e},
  206. // .idVendor = {0x83, 0x04},
  207. // .idProduct = {0x20, 0x57},
  208. .bcdDevice = {0x00, 0x02},
  209. .iManufacturer = USBD_IDX_MANUFACTURER_STR,
  210. .iProduct = USBD_IDX_PRODUCT_STR,
  211. .iSerialNumber = 0,
  212. .bNumConfigurations = 1,
  213. };
  214. static const usb_device_qualifier_t prvCore_QualifierDesc =
  215. {
  216. .bLength = USB_LEN_DEV_QUALIFIER_DESC, /* bLength */
  217. .bDescriptorType = UDESC_DEVICE_QUALIFIER, /* bDescriptorType */
  218. .bcdUSB = {0x00, 0x02},
  219. .bDeviceClass = UDCLASS_IN_INTERFACE,
  220. .bDeviceSubClass = 0,
  221. .bDeviceProtocol = 0,
  222. .bMaxPacketSize0 = 0x40,
  223. .bNumConfigurations = 1,
  224. .bReserved = 0
  225. };
  226. static const usb_config_descriptor_t prvCore_ConfigDesc =
  227. {
  228. .bLength = USB_LEN_CFG_DESC,
  229. .bDescriptorType = UDESC_CONFIG,
  230. .wTotalLength = {0x00, 0x00},
  231. .bNumInterface = DEVICE_INTERFACE_MAX,
  232. .bConfigurationValue = 1,
  233. .iConfiguration = USBD_IDX_CONFIG_STR,
  234. .bmAttributes = UC_SELF_POWERED|UC_BUS_POWERED,
  235. .bMaxPower = (USB_MIN_POWER >> 1),
  236. };
  237. static const usb_interface_assoc_descriptor_t prvCore_AssocInterfaceDesc =
  238. {
  239. .bLength = USB_LEN_ASSOC_IF_DESC,
  240. .bDescriptorType = UDESC_IFACE_ASSOC,
  241. .bFirstInterface = 0,
  242. .bInterfaceCount = 1,
  243. // .bFunctionClass = UICLASS_MASS,
  244. // .bFunctionSubClass = UISUBCLASS_SCSI,
  245. // .bFunctionProtocol = UIPROTO_MASS_BBB,
  246. // .bFunctionClass = 0,
  247. // .bFunctionSubClass = 0,
  248. // .bFunctionProtocol = 0,
  249. .bFunctionClass = UICLASS_HID,
  250. .bFunctionSubClass = 0,
  251. .bFunctionProtocol = UIPROTO_BOOT_KEYBOARD,
  252. .iFunction = USBD_IDX_INTERFACE0_STR,
  253. };
  254. static const usb_interface_descriptor_t prvCore_MassStorgeInterfaceDesc =
  255. {
  256. .bLength = USB_LEN_IF_DESC,
  257. .bDescriptorType = UDESC_INTERFACE,
  258. .bInterfaceNumber = DEVICE_INTERFACE_MSC_SN,
  259. .bAlternateSetting = 0,
  260. .bNumEndpoints = 2,
  261. .bInterfaceClass = UICLASS_MASS,
  262. .bInterfaceSubClass = UISUBCLASS_SCSI,
  263. .bInterfaceProtocol = UIPROTO_MASS_BBB,
  264. .iInterface = USBD_IDX_INTERFACE0_STR,
  265. };
  266. static const usb_endpoint_descriptor_t prvCore_MassStorgeEndpointDesc[2] =
  267. {
  268. {
  269. .bLength = USB_LEN_EP_DESC,
  270. .bDescriptorType = UDESC_ENDPOINT,
  271. .bEndpointAddress = UE_DIR_IN|DEVICE_MASS_STORAGE_EP_IN,
  272. .bmAttributes = UE_BULK,
  273. .wMaxPacketSize = {0x40,0x00},
  274. .bInterval = 10,
  275. },
  276. {
  277. .bLength = USB_LEN_EP_DESC,
  278. .bDescriptorType = UDESC_ENDPOINT,
  279. .bEndpointAddress = UE_DIR_OUT|DEVICE_MASS_STORAGE_EP_OUT,
  280. .bmAttributes = UE_BULK,
  281. .wMaxPacketSize = {0x40,0x00},
  282. .bInterval = 10,
  283. }
  284. };
  285. static const usb_interface_descriptor_t prvCore_HIDInterfaceDesc =
  286. {
  287. .bLength = USB_LEN_IF_DESC,
  288. .bDescriptorType = UDESC_INTERFACE,
  289. .bInterfaceNumber = DEVICE_INTERFACE_HID_SN,
  290. .bAlternateSetting = 0,
  291. .bNumEndpoints = 2,
  292. .bInterfaceClass = UICLASS_HID,
  293. .bInterfaceSubClass = 0,
  294. .bInterfaceProtocol = 0,
  295. .iInterface = USBD_IDX_INTERFACE0_STR + 1,
  296. };
  297. static usb_endpoint_descriptor_t prvCore_HIDEndpointDesc[2] =
  298. {
  299. {
  300. .bLength = USB_LEN_EP_DESC,
  301. .bDescriptorType = UDESC_ENDPOINT,
  302. .bEndpointAddress = UE_DIR_IN|DEVICE_HID_KEYBOARD_EP_IN,
  303. .bmAttributes = UE_INTERRUPT,
  304. .wMaxPacketSize = {0x08,0x00},
  305. .bInterval = 10,
  306. },
  307. {
  308. .bLength = USB_LEN_EP_DESC,
  309. .bDescriptorType = UDESC_ENDPOINT,
  310. .bEndpointAddress = UE_DIR_OUT|DEVICE_HID_KEYBOARD_EP_OUT,
  311. .bmAttributes = UE_INTERRUPT,
  312. .wMaxPacketSize = {0x08,0x00},
  313. .bInterval = 10,
  314. },
  315. };
  316. static const usb_interface_descriptor_t prvCore_SerialInterfaceDesc =
  317. {
  318. .bLength = USB_LEN_IF_DESC,
  319. .bDescriptorType = UDESC_INTERFACE,
  320. .bInterfaceNumber = DEVICE_INTERFACE_SERIAL_SN,
  321. .bAlternateSetting = 0,
  322. .bNumEndpoints = 2,
  323. .bInterfaceClass = UICLASS_VENDOR,
  324. .bInterfaceSubClass = 0,
  325. .bInterfaceProtocol = 0,
  326. .iInterface = USBD_IDX_INTERFACE0_STR + 2,
  327. };
  328. static const usb_endpoint_descriptor_t prvCore_SerialEndpointDesc[2] =
  329. {
  330. {
  331. .bLength = USB_LEN_EP_DESC,
  332. .bDescriptorType = UDESC_ENDPOINT,
  333. .bEndpointAddress = UE_DIR_IN|DEVICE_GENERIC_SERIAL_EP_IN,
  334. .bmAttributes = UE_BULK,
  335. .wMaxPacketSize = {0x40,0x00},
  336. .bInterval = 10,
  337. },
  338. {
  339. .bLength = USB_LEN_EP_DESC,
  340. .bDescriptorType = UDESC_ENDPOINT,
  341. .bEndpointAddress = UE_DIR_OUT|DEVICE_GENERIC_SERIAL_EP_OUT,
  342. .bmAttributes = UE_BULK,
  343. .wMaxPacketSize = {0x40,0x00},
  344. .bInterval = 10,
  345. }
  346. };
  347. static const usb_hid_descriptor_t prvCore_HIDDesc =
  348. {
  349. .bLength = 9,
  350. .bDescriptorType = USB_HID_DESCRIPTOR_TYPE,
  351. .bcdHID = {0x11, 0x01},
  352. .bCountryCode = 0x21,
  353. .bNumDescriptors = 1,
  354. .bReportDescriptorType = USB_HID_REPORT_DESC,
  355. .wDescriptorLength = {63,0},
  356. };
  357. static char prvCore_HIDCustomReportDescriptor[34] = {
  358. 0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
  359. 0x09, 0x00, // USAGE (Undefined)
  360. 0xa1, 0x01, // COLLECTION (Application)
  361. 0x09, 0x00, // USAGE (Undefined)
  362. 0x95, USB_HID_KB_DATA_CACHE, // REPORT_COUNT (8)
  363. 0x75, 0x08, // REPORT_SIZE (8)
  364. 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
  365. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  366. 0x81, 0x02, // INPUT (Data,Var,Abs)
  367. 0x09, 0x00, // USAGE (Undefined)
  368. 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
  369. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  370. 0x95, USB_HID_KB_DATA_CACHE, // REPORT_COUNT (8)
  371. 0x75, 0x08, // REPORT_SIZE (8)
  372. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
  373. 0xc0 // END_COLLECTION
  374. };
  375. static const char prvCore_HIDKeyboardReportDesc[64] = {
  376. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  377. 0x09, 0x06, // USAGE (Keyboard)
  378. 0xa1, 0x01, // COLLECTION (Application)
  379. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  380. 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
  381. 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
  382. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  383. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  384. 0x75, 0x01, // REPORT_SIZE (1)
  385. 0x95, 0x08, // REPORT_COUNT (8)
  386. 0x81, 0x02, // INPUT (Data,Var,Abs)
  387. 0x95, 0x01, // REPORT_COUNT (1)
  388. 0x75, 0x08, // REPORT_SIZE (8)
  389. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
  390. 0x95, 0x05, // REPORT_COUNT (5)
  391. 0x75, 0x01, // REPORT_SIZE (1)
  392. 0x05, 0x08, // USAGE_PAGE (LEDs)
  393. 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
  394. 0x29, 0x05, // USAGE_MAXIMUM (Kana)
  395. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
  396. 0x95, 0x01, // REPORT_COUNT (1)
  397. 0x75, 0x03, // REPORT_SIZE (3)
  398. 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
  399. 0x95, USB_HID_KEY_CACHE, // REPORT_COUNT (30)
  400. 0x75, 0x08, // REPORT_SIZE (8)
  401. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  402. 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
  403. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  404. 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
  405. 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
  406. 0x81, 0x00, // INPUT (Data,Ary,Abs)
  407. 0xc0 // END_COLLECTION
  408. };
  409. static int32_t prvCore_GetHIDDesc(void *pData, void *pParam)
  410. {
  411. usb_hid_descriptor_t HIDDesc;
  412. if (pData)
  413. {
  414. HIDDesc = prvCore_HIDDesc;
  415. BytesPutLe16(HIDDesc.wDescriptorLength, prvUSBApp.HIDReportLen);
  416. memcpy(pData, &HIDDesc, sizeof(usb_hid_descriptor_t));
  417. }
  418. return sizeof(usb_hid_descriptor_t);
  419. }
  420. static usb_full_interface_t prvCore_InterfaceList[3] =
  421. {
  422. {
  423. &prvCore_HIDInterfaceDesc,
  424. prvCore_HIDEndpointDesc,
  425. NULL,
  426. prvCore_GetHIDDesc,
  427. 2,
  428. },
  429. {
  430. &prvCore_MassStorgeInterfaceDesc,
  431. prvCore_MassStorgeEndpointDesc,
  432. NULL,
  433. NULL,
  434. 2,
  435. },
  436. {
  437. &prvCore_SerialInterfaceDesc,
  438. prvCore_SerialEndpointDesc,
  439. NULL,
  440. NULL,
  441. 2,
  442. },
  443. };
  444. static const usb_full_config_t prvCore_Config =
  445. {
  446. .pConfigDesc = &prvCore_ConfigDesc,
  447. .pInterfaceAssocDesc = &prvCore_AssocInterfaceDesc,
  448. .pInterfaceFullDesc = prvCore_InterfaceList,
  449. .InterfaceNum = 3,
  450. };
  451. static const USB_FullConfigStruct prvCore_FullConfig =
  452. {
  453. .pQualifierDesc = NULL,
  454. .pFullConfig = {&prvCore_Config, NULL, NULL},
  455. };
  456. static int32_t prvCore_SCSIInit(uint8_t LUN, void *pUserData)
  457. {
  458. return 0;
  459. }
  460. static int32_t prvCore_SCSIGetCapacity(uint8_t LUN, uint32_t *BlockNum, uint32_t *BlockSize, void *pUserData)
  461. {
  462. *BlockNum = prvUSBApp.tUDisk.BlockTotalNums;
  463. *BlockSize = prvUSBApp.tUDisk.BlockSize;
  464. return 0;
  465. }
  466. static int32_t prvCore_SCSIIsReady(uint8_t LUN, void *pUserData)
  467. {
  468. return 0;
  469. }
  470. static int32_t prvCore_SCSIIsWriteProtected(uint8_t LUN, void *pUserData)
  471. {
  472. return 0;
  473. }
  474. static int32_t prvCore_SCSIPreRead(uint8_t LUN, uint32_t BlockAddress, uint32_t BlockNums, void *pUserData)
  475. {
  476. if ((BlockAddress + BlockNums) * prvUSBApp.tUDisk.BlockSize > VIRTUAL_UDISK_LEN)
  477. {
  478. return -1;
  479. }
  480. prvUSBApp.tUDisk.CurAddress = BlockAddress * prvUSBApp.tUDisk.BlockSize;
  481. return 0;
  482. }
  483. static int32_t prvCore_SCSIRead(uint8_t LUN, uint32_t Len, uint8_t **pOutData, uint32_t *OutLen, void *pUserData)
  484. {
  485. if (Len + prvUSBApp.tUDisk.CurAddress > VIRTUAL_UDISK_LEN)
  486. {
  487. return -1;
  488. }
  489. *pOutData = &prvUSBApp.tUDisk.VirtualData[prvUSBApp.tUDisk.CurAddress];
  490. *OutLen = Len;
  491. prvUSBApp.tUDisk.CurAddress += Len;
  492. return 0;
  493. }
  494. static int32_t prvCore_SCSIReadNext(uint8_t LUN, void *pUserData)
  495. {
  496. return 0;
  497. }
  498. static int32_t prvCore_SCSIPreWrite(uint8_t LUN, uint32_t BlockAddress, uint32_t BlockNums, void *pUserData)
  499. {
  500. if ((BlockAddress + BlockNums) * prvUSBApp.tUDisk.BlockSize > VIRTUAL_UDISK_LEN)
  501. {
  502. return -1;
  503. }
  504. prvUSBApp.tUDisk.CurAddress = BlockAddress * prvUSBApp.tUDisk.BlockSize;
  505. return 0;
  506. }
  507. static int32_t prvCore_SCSIWrite(uint8_t LUN, uint8_t *Data, uint32_t Len, void *pUserData)
  508. {
  509. if (Len + prvUSBApp.tUDisk.CurAddress > VIRTUAL_UDISK_LEN)
  510. {
  511. return -1;
  512. }
  513. memcpy(&prvUSBApp.tUDisk.VirtualData[prvUSBApp.tUDisk.CurAddress], Data, Len);
  514. prvUSBApp.tUDisk.CurAddress += Len;
  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_SCSIUserCmd,
  538. &prvCore_StandardInquiryData,
  539. &prvCore_MSCPage00InquiryData,
  540. &prvCore_MSCPage80InquiryData,
  541. &prvCore_MSCModeSense6data,
  542. &prvCore_MSCModeSense10data,
  543. };
  544. static void prvCore_VUartOpen(Virtual_UartCtrlStruct *pVUart, uint8_t UartID)
  545. {
  546. pVUart->USBOnOff = 1;
  547. OS_DeInitBuffer(&pVUart->TxBuf);
  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. OS_DeInitBuffer(&pVUart->TxCacheBuf);
  610. pVUart->CB(pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN, UART_CB_ERROR);
  611. break;
  612. case 1:
  613. case 3:
  614. //open serial
  615. prvCore_VUartOpen(pVUart, pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN);
  616. prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN].USBOnOff = 1;
  617. break;
  618. }
  619. Result = ERROR_NONE;
  620. break;
  621. case USB_HID_REQ_SET_IDLE:
  622. prvCore_VHIDSetReady(1);
  623. Result = ERROR_NONE;
  624. break;
  625. case UR_GET_DESCRIPTOR:
  626. switch(pEpData->pLastRequest->wValue[1])
  627. {
  628. case USB_HID_REPORT_DESC:
  629. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, prvUSBApp.pHIDReport, prvUSBApp.HIDReportLen, wLength, 1);
  630. Result = ERROR_NONE;
  631. break;
  632. }
  633. break;
  634. case MSC_GET_MAX_LUN:
  635. pUserFun->GetMaxLUN(&prvUSBApp.tSCSI.LogicalUnitNum, prvUSBApp.tSCSI.pUserData);
  636. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, &prvUSBApp.tSCSI.LogicalUnitNum, 1, wLength, 1);
  637. Result = ERROR_NONE;
  638. break;
  639. case MSC_RESET:
  640. Result = ERROR_NONE;
  641. break;
  642. }
  643. }
  644. }
  645. return Result;
  646. }
  647. static int32_t prvCore_MSCCB(void *pData, void *pParam)
  648. {
  649. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  650. USB_EndpointDataStruct *pEpDataSave;
  651. pEpDataSave = malloc(sizeof(USB_EndpointDataStruct));
  652. memcpy(pEpDataSave, pEpData, sizeof(USB_EndpointDataStruct));
  653. if (pEpData->Data && pEpData->Len)
  654. {
  655. pEpDataSave->Data = malloc(pEpData->Len);
  656. memcpy(pEpDataSave->Data, pEpData->Data, pEpData->Len);
  657. }
  658. else
  659. {
  660. pEpDataSave->Data = NULL;
  661. pEpDataSave->Len = 0;
  662. }
  663. Task_SendEvent(prvUSBApp.hTaskHandle, USBD_MSC_CB, pEpDataSave, &prvUSBApp.tSCSI, pParam);
  664. return ERROR_NONE;
  665. }
  666. static int32_t prvCore_HIDCB(void *pData, void *pParam)
  667. {
  668. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  669. uint32_t USB_ID = (uint32_t)pParam;
  670. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  671. Buffer_Struct Buf;
  672. if (pEpData->IsToDevice)
  673. {
  674. prvCore_VHIDSetReady(1);
  675. OS_BufferWrite(&pVHID->RxBuf, pEpData->Data, pEpData->Len);
  676. pVHID->CB(USB_ID, USB_HID_NEW_DATA);
  677. }
  678. else
  679. {
  680. OS_DeInitBuffer(&pVHID->TxBuf);
  681. if (pVHID->TxCacheBuf.Pos)
  682. {
  683. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  684. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  685. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  686. }
  687. else
  688. {
  689. pVHID->CB(USB_ID, USB_HID_SEND_DONE);
  690. }
  691. }
  692. return ERROR_NONE;
  693. }
  694. static int32_t prvCore_SerialCB(void *pData, void *pParam)
  695. {
  696. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  697. uint32_t UartID = (uint32_t)pParam;
  698. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  699. if (pEpData->IsToDevice)
  700. {
  701. //open serial
  702. if (!pVUart->USBOnOff)
  703. {
  704. prvCore_VUartOpen(pVUart, UartID);
  705. }
  706. if (pEpData->Data && pEpData->Len)
  707. {
  708. if ((pVUart->RxBuf.Pos + pEpData->Len) >= pVUart->RxBuf.MaxLen)
  709. {
  710. OS_ReSizeBuffer(&pVUart->RxBuf, pVUart->RxBuf.MaxLen * 2);
  711. }
  712. OS_BufferWrite(&pVUart->RxBuf, pEpData->Data, pEpData->Len);
  713. if (pEpData->IsDataStage && pVUart->RxTimeoutUS)
  714. {
  715. Timer_StartUS(pVUart->RxTimer, pVUart->RxTimeoutUS, 0);
  716. }
  717. else
  718. {
  719. Timer_Stop(pVUart->RxTimer);
  720. pVUart->CB(UartID, UART_CB_RX_NEW);
  721. }
  722. }
  723. }
  724. else
  725. {
  726. OS_DeInitBuffer(&pVUart->TxBuf);
  727. if (pVUart->TxCacheBuf.Pos)
  728. {
  729. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  730. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  731. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  732. }
  733. else
  734. {
  735. pVUart->CB(UartID, UART_CB_TX_ALL_DONE);
  736. }
  737. }
  738. return ERROR_NONE;
  739. }
  740. static int32_t prvCore_USBStateCB(void *pData, void *pParam)
  741. {
  742. PV_Union uPV;
  743. uint8_t i;
  744. uPV.p = pData;
  745. switch(uPV.u8[1])
  746. {
  747. case USBD_BUS_TYPE_DISCONNECT:
  748. prvCore_VHIDSetReady(0);
  749. USB_MSCReset(&prvUSBApp.tSCSI);
  750. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  751. {
  752. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  753. OS_DeInitBuffer(&prvLuatOS_VirtualUart[i].TxBuf);
  754. OS_DeInitBuffer(&prvLuatOS_VirtualUart[i].TxCacheBuf);
  755. prvLuatOS_VirtualUart[i].CB(i, UART_CB_ERROR);
  756. }
  757. break;
  758. case USBD_BUS_TYPE_ENABLE_CONNECT:
  759. USB_StackStartDevice(uPV.u8[0]);
  760. break;
  761. }
  762. }
  763. void Core_USBSetID(uint8_t USB_ID, uint16_t VID, uint16_t PID)
  764. {
  765. BytesPutLe16(prvCore_DeviceDesc.idVendor, VID);
  766. BytesPutLe16(prvCore_DeviceDesc.idProduct, PID);
  767. }
  768. void Core_USBSetHIDMode(uint8_t USB_ID, uint8_t HIDMode, uint8_t BuffSize)
  769. {
  770. switch(BuffSize)
  771. {
  772. case 8:
  773. case 16:
  774. case 32:
  775. case 64:
  776. break;
  777. default:
  778. BuffSize = 8;
  779. break;
  780. }
  781. if (HIDMode)
  782. {
  783. prvUSBApp.pHIDReport = &prvCore_HIDCustomReportDescriptor;
  784. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDCustomReportDescriptor);
  785. prvCore_HIDCustomReportDescriptor[10] = BuffSize;
  786. prvCore_HIDCustomReportDescriptor[28] = BuffSize;
  787. prvCore_HIDEndpointDesc[0].wMaxPacketSize[0] = BuffSize;
  788. prvCore_HIDEndpointDesc[1].wMaxPacketSize[0] = BuffSize;
  789. }
  790. else
  791. {
  792. prvUSBApp.pHIDReport = &prvCore_HIDKeyboardReportDesc;
  793. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDKeyboardReportDesc);
  794. prvCore_HIDEndpointDesc[0].wMaxPacketSize[0] = 8;
  795. prvCore_HIDEndpointDesc[1].wMaxPacketSize[0] = 8;
  796. }
  797. }
  798. void Core_USBDefaultDeviceStart(uint8_t USB_ID)
  799. {
  800. uint8_t langid[2] = {0x09, 0x04};
  801. int i;
  802. USB_StackPowerOnOff(USB_ID, 1);
  803. USB_StackStop(USB_ID);
  804. prvLuatOS_VirtualHID.USB_ID = USB_ID;
  805. prvLuatOS_VirtualHID.IsReady = 0;
  806. prvLuatOS_VirtualHID.ToHostEpIndex = DEVICE_HID_KEYBOARD_EP_IN;
  807. prvLuatOS_VirtualHID.ToDeviceEpIndex = DEVICE_HID_KEYBOARD_EP_OUT;
  808. prvUSBApp.tUDisk.BlockTotalNums = VIRTUAL_UDISK_BLOCKS_NUMS;
  809. prvUSBApp.tUDisk.BlockSize = VIRTUAL_UDISK_BLOCKS_LEN;
  810. prvUSBApp.tSCSI.LogicalUnitNum = 0;
  811. prvUSBApp.tSCSI.ToHostEpIndex = DEVICE_MASS_STORAGE_EP_IN;
  812. prvUSBApp.tSCSI.ToDeviceEpIndex = DEVICE_MASS_STORAGE_EP_OUT;
  813. if (!prvUSBApp.pHIDReport)
  814. {
  815. prvUSBApp.pHIDReport = &prvCore_HIDKeyboardReportDesc;
  816. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDKeyboardReportDesc);
  817. }
  818. if (!prvUSBApp.tSCSI.pSCSIUserFunList)
  819. {
  820. prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  821. }
  822. if (!prvLuatOS_VirtualHID.CB)
  823. {
  824. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  825. }
  826. OS_ReInitBuffer(&prvLuatOS_VirtualHID.TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  827. USB_StackClearSetup(USB_ID);
  828. USB_StackSetDeviceBusPower(USB_ID, 1);
  829. USB_StackSetEpCB(USB_ID, 0, prvCore_USBEp0CB, NULL);
  830. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_IN, prvCore_HIDCB, USB_ID);
  831. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_OUT, prvCore_HIDCB, USB_ID);
  832. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_IN, prvCore_MSCCB, USB_ID);
  833. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_OUT, prvCore_MSCCB, USB_ID);
  834. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_IN, prvCore_SerialCB, VIRTUAL_UART0);
  835. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_OUT, prvCore_SerialCB, VIRTUAL_UART0);
  836. USB_StackSetDeviceConfig(USB_ID, &prvCore_DeviceDesc, &prvCore_FullConfig, 1, USBD_IDX_INTERFACE0_STR + 3, prvCore_USBStateCB, NULL);
  837. USB_StackSetCharString(USB_ID, USBD_IDX_LANGID_STR, langid, 2);
  838. USB_StackSetCharString(USB_ID, USBD_IDX_MANUFACTURER_STR, prvCore_StringManufacturer, sizeof(prvCore_StringManufacturer));
  839. USB_StackSetCharString(USB_ID, USBD_IDX_PRODUCT_STR, prvCore_StringProduct, sizeof(prvCore_StringProduct));
  840. USB_StackSetCharString(USB_ID, USBD_IDX_SERIAL_STR, prvCore_StringSerial, sizeof(prvCore_StringSerial));
  841. USB_StackSetCharString(USB_ID, USBD_IDX_CONFIG_STR, prvCore_StringConfig, sizeof(prvCore_StringConfig));
  842. for(i = 0; i < 3; i++)
  843. {
  844. USB_StackSetCharString(USB_ID, USBD_IDX_INTERFACE0_STR + i, prvCore_StringInterface[i], strlen(prvCore_StringInterface[i]));
  845. }
  846. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  847. {
  848. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  849. prvLuatOS_VirtualUart[i].USB_ID = USB_ID;
  850. if (!prvLuatOS_VirtualUart[i].RxTimer)
  851. {
  852. prvLuatOS_VirtualUart[i].RxTimer = Timer_Create(prvCore_VUartRxTimeoutCB, i, NULL);
  853. }
  854. if (!prvLuatOS_VirtualUart[i].CB)
  855. {
  856. prvLuatOS_VirtualUart[i].CB = prvCore_VUartDummyCB;
  857. }
  858. prvLuatOS_VirtualUart[i].RxTimeoutUS = 150;
  859. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  860. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  861. }
  862. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToDeviceEpIndex = DEVICE_GENERIC_SERIAL_EP_IN;
  863. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToHostEpIndex = DEVICE_GENERIC_SERIAL_EP_OUT;
  864. prvUSBApp.tUDisk.VirtualData = prvLuatOS_VirtualUart[0].TxCacheBuf.Data;
  865. USB_MSCReset(&prvUSBApp.tSCSI);
  866. USB_StackStartDevice(USB_ID);
  867. prvUSBApp.IsStart = 1;
  868. }
  869. void Core_VHIDInit(uint8_t USB_ID, CBFuncEx_t CB)
  870. {
  871. if (CB)
  872. {
  873. prvLuatOS_VirtualHID.CB = CB;
  874. }
  875. else
  876. {
  877. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  878. }
  879. }
  880. void Core_VUartInit(uint8_t UartID, uint32_t BaudRate, uint8_t IsRxCacheEnable, uint8_t DataBits, uint8_t Parity, uint8_t StopBits, CBFuncEx_t CB)
  881. {
  882. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  883. // switch(UartID)
  884. // {
  885. // case VIRTUAL_UART0:
  886. // if (!prvService.IsUSBOpen)
  887. // {
  888. // Core_USBDefaultDeviceStart(USB_ID0);
  889. // prvService.IsUSBOpen = 1;
  890. // }
  891. // break;
  892. // }
  893. if (CB)
  894. {
  895. pVUart->CB = CB;
  896. }
  897. else
  898. {
  899. pVUart->CB = prvCore_VUartDummyCB;
  900. }
  901. pVUart->UartOnOff = 1;
  902. }
  903. void Core_VUartDeInit(uint8_t UartID)
  904. {
  905. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  906. pVUart->UartOnOff = 0;
  907. }
  908. void Core_VUartSetRxTimeout(uint8_t UartID, uint32_t TimeoutUS)
  909. {
  910. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  911. pVUart->RxTimeoutUS = TimeoutUS;
  912. }
  913. void Core_VUartSetCb(uint8_t UartID, CBFuncEx_t CB)
  914. {
  915. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  916. if (CB)
  917. {
  918. pVUart->CB = CB;
  919. }
  920. else
  921. {
  922. pVUart->CB = prvCore_VUartDummyCB;
  923. }
  924. }
  925. uint32_t Core_VUartRxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  926. {
  927. uint32_t ReadLen;
  928. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  929. switch(UartID)
  930. {
  931. case VIRTUAL_UART0:
  932. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 0);
  933. break;
  934. }
  935. if (!Data || !Len)
  936. {
  937. ReadLen = pVUart->RxBuf.Pos;
  938. goto READ_END;
  939. }
  940. ReadLen = (pVUart->RxBuf.Pos < Len)?pVUart->RxBuf.Pos:Len;
  941. memcpy(Data, pVUart->RxBuf.Data, ReadLen);
  942. OS_BufferRemove(&pVUart->RxBuf, ReadLen);
  943. if (!pVUart->RxBuf.Pos && pVUart->RxBuf.MaxLen > VIRTUAL_SERIAL_BUFFER_LEN)
  944. {
  945. OS_ReInitBuffer(&pVUart->RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  946. }
  947. READ_END:
  948. switch(UartID)
  949. {
  950. case VIRTUAL_UART0:
  951. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 1);
  952. break;
  953. }
  954. return ReadLen;
  955. }
  956. int32_t Core_VUartBufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  957. {
  958. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  959. switch(UartID)
  960. {
  961. case VIRTUAL_UART0:
  962. if (!pVUart->USBOnOff)
  963. {
  964. return -1;
  965. }
  966. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  967. break;
  968. }
  969. if (Data && Len)
  970. {
  971. OS_BufferWrite(&pVUart->TxCacheBuf, Data, Len);
  972. }
  973. if (pVUart->TxBuf.Data || pVUart->TxBuf.MaxLen)
  974. {
  975. goto TX_END;
  976. }
  977. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  978. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  979. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  980. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  981. TX_END:
  982. switch(UartID)
  983. {
  984. case VIRTUAL_UART0:
  985. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  986. break;
  987. }
  988. return 0;
  989. }
  990. void Core_VUartBufferTxStop(uint8_t UartID)
  991. {
  992. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  993. switch(UartID)
  994. {
  995. case VIRTUAL_UART0:
  996. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  997. break;
  998. }
  999. OS_DeInitBuffer(&pVUart->TxBuf);
  1000. pVUart->TxCacheBuf.Pos = 0;
  1001. USB_StackStopDeviceTx(pVUart->USB_ID, pVUart->ToHostEpIndex, 0);
  1002. switch(UartID)
  1003. {
  1004. case VIRTUAL_UART0:
  1005. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  1006. break;
  1007. }
  1008. }
  1009. uint32_t Core_VHIDRxBufferRead(uint8_t USB_ID, uint8_t *Data, uint32_t Len)
  1010. {
  1011. uint32_t ReadLen;
  1012. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1013. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToDeviceEpIndex, 1, 0);
  1014. if (!Data || !Len)
  1015. {
  1016. ReadLen = pVHID->RxBuf.Pos;
  1017. goto READ_END;
  1018. }
  1019. ReadLen = (pVHID->RxBuf.Pos < Len)?pVHID->RxBuf.Pos:Len;
  1020. memcpy(Data, pVHID->RxBuf.Data, ReadLen);
  1021. OS_BufferRemove(&pVHID->RxBuf, ReadLen);
  1022. if (!pVHID->RxBuf.Pos && pVHID->RxBuf.MaxLen > VIRTUAL_VHID_BUFFER_LEN)
  1023. {
  1024. OS_ReInitBuffer(&pVHID->RxBuf, VIRTUAL_VHID_BUFFER_LEN);
  1025. }
  1026. READ_END:
  1027. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToDeviceEpIndex, 1, 1);
  1028. return ReadLen;
  1029. }
  1030. void Core_VHIDUploadData(uint8_t USB_ID, uint8_t *Data, uint32_t Len)
  1031. {
  1032. if (!prvLuatOS_VirtualHID.IsReady) return;
  1033. USB_HIDKeyValue HIDKey;
  1034. USB_HIDKeyBoradKeyStruct HIDKeyBoard;
  1035. uint16_t Pos;
  1036. volatile uint8_t IsShift, i, LastValue;
  1037. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1038. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1039. if (Data && Len)
  1040. {
  1041. if ((Len*16 + pVHID->TxCacheBuf.Pos) > pVHID->TxCacheBuf.MaxLen)
  1042. {
  1043. OS_ReSizeBuffer(&pVHID->TxCacheBuf, Len*16 + pVHID->TxCacheBuf.Pos);
  1044. }
  1045. Pos = 0;
  1046. while(Pos < Len)
  1047. {
  1048. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1049. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  1050. Pos++;
  1051. IsShift = HIDKey.Shift;
  1052. LastValue = HIDKey.Value;
  1053. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1054. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1055. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1056. if (Pos >= Len)
  1057. {
  1058. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1059. break;
  1060. }
  1061. ADD_REST:
  1062. for(i = 1; i < USB_HID_KEY_CACHE; i++)
  1063. {
  1064. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  1065. Pos++;
  1066. if ((IsShift != HIDKey.Shift) || (LastValue == HIDKey.Value) || (LastValue == '\r') || (LastValue == '\n'))
  1067. {
  1068. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1069. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1070. //加入一个抬起的data
  1071. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1072. IsShift = HIDKey.Shift;
  1073. LastValue = HIDKey.Value;
  1074. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1075. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1076. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1077. if (Pos < Len)
  1078. {
  1079. goto ADD_REST;
  1080. }
  1081. else
  1082. {
  1083. break;
  1084. }
  1085. }
  1086. else
  1087. {
  1088. LastValue = HIDKey.Value;
  1089. HIDKeyBoard.PressKey[i] = HIDKey.Value;
  1090. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], i, HIDKey.Value, HIDKey.Shift);
  1091. if (Pos >= Len)
  1092. {
  1093. break;
  1094. }
  1095. }
  1096. }
  1097. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1098. //加入一个抬起的data
  1099. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1100. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1101. }
  1102. //加入一个抬起的data
  1103. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1104. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1105. }
  1106. // pVHID->TxCacheBuf.Pos = 0;
  1107. // return;
  1108. if (pVHID->TxBuf.Data || pVHID->TxBuf.MaxLen)
  1109. {
  1110. goto UPLOAD_END;
  1111. }
  1112. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  1113. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1114. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1115. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1116. UPLOAD_END:
  1117. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1118. }
  1119. void Core_VHIDSendRawData(uint8_t USB_ID, uint8_t *Data, uint32_t Len)
  1120. {
  1121. uint8_t zero[USB_HID_CUST_DATA_CACHE] = {0};
  1122. if (!prvLuatOS_VirtualHID.IsReady) return;
  1123. USB_HIDKeyValue HIDKey;
  1124. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1125. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1126. OS_BufferWrite(&pVHID->TxCacheBuf, Data, Len);
  1127. if (Len % prvCore_HIDEndpointDesc[1].wMaxPacketSize[0])
  1128. {
  1129. OS_BufferWrite(&pVHID->TxCacheBuf, zero, prvCore_HIDEndpointDesc[1].wMaxPacketSize[0] - (Len % prvCore_HIDEndpointDesc[1].wMaxPacketSize[0]));
  1130. }
  1131. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1132. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1133. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1134. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1135. }
  1136. void Core_VHIDUploadStop(uint8_t USB_ID)
  1137. {
  1138. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1139. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1140. OS_DeInitBuffer(&pVHID->TxBuf);
  1141. pVHID->TxCacheBuf.Pos = 0;
  1142. USB_StackStopDeviceTx(pVHID->USB_ID, pVHID->ToHostEpIndex, 0);
  1143. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1144. }
  1145. #ifdef __BUILD_OS__
  1146. static void prvCore_USBAppTask(void *pParam)
  1147. {
  1148. OS_EVENT Event;
  1149. USB_EndpointDataStruct *pEpData;
  1150. while(1)
  1151. {
  1152. Task_GetEventByMS(prvUSBApp.hTaskHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  1153. switch(Event.ID)
  1154. {
  1155. case USB_HW_ACTION:
  1156. switch (Event.Param2)
  1157. {
  1158. case SERV_USB_RESET_END:
  1159. DBG("USB%d reset", Event.Param1);
  1160. Task_DelayMS(1);
  1161. USB_StackDeviceAfterDisconnect(Event.Param1);
  1162. break;
  1163. case SERV_USB_RESUME_END:
  1164. Task_DelayMS(20);
  1165. USB_ResumeEnd(Event.Param3);
  1166. break;
  1167. case SERV_USB_SUSPEND:
  1168. DBG("USB%d suspend", Event.Param1);
  1169. break;
  1170. case SERV_USB_RESUME:
  1171. break;
  1172. }
  1173. break;
  1174. case USBD_MSC_CB:
  1175. pEpData = (USB_EndpointDataStruct *)Event.Param1;
  1176. // DBG("%d,%d,%d,%d", pEpData->USB_ID, pEpData->EpIndex, pEpData->IsToDevice, pEpData->Len);
  1177. USB_MSCHandle(pEpData, Event.Param2);
  1178. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_IN, 0, 0);
  1179. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_OUT, 1, 0);
  1180. // if (prvUSBApp.BlockCmd)
  1181. // {
  1182. // prvUSBApp.BlockCmd--;
  1183. // }
  1184. // else
  1185. // {
  1186. // DBG("!!!");
  1187. // }
  1188. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_IN, 0, 1);
  1189. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_OUT, 1, 1);
  1190. free(pEpData->Data);
  1191. free(Event.Param1);
  1192. WDT_Feed();
  1193. break;
  1194. }
  1195. }
  1196. }
  1197. void Core_USBAction(uint8_t USB_ID, uint8_t Action, void *pParam)
  1198. {
  1199. Task_SendEvent(prvUSBApp.hTaskHandle, USB_HW_ACTION, USB_ID, Action, pParam);
  1200. }
  1201. extern const USB_StorageSCSITypeDef prvSDHC_SCSIFun;
  1202. void Core_UDiskAttachSDHC(uint8_t USB_ID, void *pCtrl)
  1203. {
  1204. prvUSBApp.pSDHC = pCtrl;
  1205. prvUSBApp.tSCSI.pSCSIUserFunList = &prvSDHC_SCSIFun;
  1206. prvUSBApp.tSCSI.pUserData = prvUSBApp.pSDHC;
  1207. prvUSBApp.tSCSI.ReadTimeout = 500;
  1208. DBuffer_ReInit(&prvUSBApp.DataBuf, 8 * 1024);
  1209. prvUSBApp.pSDHC->USBDelayTime = 0; //如果USB不稳定,可调加大USBDelayTime
  1210. prvUSBApp.pSDHC->SCSIDataBuf = &prvUSBApp.DataBuf;
  1211. prvUSBApp.IsUSBAttachSDHC = 1;
  1212. }
  1213. void Core_UDiskAttachSDHCRecovery(uint8_t USB_ID, void *pCtrl)
  1214. {
  1215. if (prvUSBApp.IsUSBAttachSDHC)
  1216. {
  1217. DBG("recovery attach %d, %x", USB_ID, pCtrl);
  1218. prvUSBApp.pSDHC = pCtrl;
  1219. prvUSBApp.tSCSI.pSCSIUserFunList = &prvSDHC_SCSIFun;
  1220. prvUSBApp.tSCSI.pUserData = prvUSBApp.pSDHC;
  1221. prvUSBApp.tSCSI.ReadTimeout = 500;
  1222. DBuffer_ReInit(&prvUSBApp.DataBuf, 8 * 1024);
  1223. prvUSBApp.pSDHC->USBDelayTime = 0; //如果USB不稳定,可调加大USBDelayTime
  1224. prvUSBApp.pSDHC->SCSIDataBuf = &prvUSBApp.DataBuf;
  1225. if (prvUSBApp.IsStart)
  1226. {
  1227. DBG("reboot usb");
  1228. Core_USBDefaultDeviceStart(USB_ID);
  1229. }
  1230. }
  1231. }
  1232. void Core_UDiskDetachSDHC(uint8_t USB_ID, void *pCtrl)
  1233. {
  1234. if (pCtrl)
  1235. {
  1236. if (prvUSBApp.pSDHC != pCtrl)
  1237. {
  1238. return;
  1239. }
  1240. }
  1241. if (prvUSBApp.IsUSBAttachSDHC)
  1242. {
  1243. prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  1244. prvUSBApp.tSCSI.pUserData = NULL;
  1245. prvUSBApp.pSDHC = NULL;
  1246. DBuffer_DeInit(&prvUSBApp.DataBuf);
  1247. DBG("detach %d, %x", USB_ID, pCtrl);
  1248. if (!pCtrl) //NULL表示用户退出
  1249. {
  1250. prvUSBApp.IsUSBAttachSDHC = 0;
  1251. DBG("free attach %d, %x", USB_ID, pCtrl);
  1252. }
  1253. }
  1254. if (prvUSBApp.IsStart)
  1255. {
  1256. DBG("reboot usb");
  1257. Core_USBDefaultDeviceStart(USB_ID);
  1258. }
  1259. }
  1260. void Core_USBAppGlobalInit(void)
  1261. {
  1262. prvUSBApp.hTaskHandle = Task_Create(prvCore_USBAppTask, NULL, 1024, USB_TASK_PRO, "usb app");
  1263. }
  1264. INIT_TASK_EXPORT(Core_USBAppGlobalInit, "2");
  1265. #endif