core_usb_app.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356
  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. if (pVUart->TxBuf.Data)
  548. {
  549. DBG("send last data %ubyte", pVUart->TxBuf.MaxLen);
  550. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  551. }
  552. else if (pVUart->TxCacheBuf.Pos)
  553. {
  554. DBG("send cache data %ubyte", pVUart->TxCacheBuf.Pos);
  555. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  556. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  557. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  558. }
  559. pVUart->CB(UartID, UART_CB_CONNECTED);
  560. }
  561. static int32_t prvCore_VUartRxTimeoutCB(void *pData, void *pParam)
  562. {
  563. uint32_t UartID = (uint32_t)pParam;
  564. prvLuatOS_VirtualUart[UartID].CB(UartID, UART_CB_RX_TIMEOUT);
  565. }
  566. static int32_t prvCore_VHIDDummyCB(void *pData, void *pParam)
  567. {
  568. return 0;
  569. }
  570. static int32_t prvCore_VUartDummyCB(void *pData, void *pParam)
  571. {
  572. return 0;
  573. }
  574. static int32_t prvCore_VMSCDummyCB(void *pData, void *pParam)
  575. {
  576. return 0;
  577. }
  578. static void prvCore_VHIDSetReady(uint8_t OnOff)
  579. {
  580. if (prvLuatOS_VirtualHID.IsReady != OnOff)
  581. {
  582. prvLuatOS_VirtualHID.IsReady = OnOff;
  583. prvLuatOS_VirtualHID.CB(prvLuatOS_VirtualHID.USB_ID, prvLuatOS_VirtualHID.IsReady);
  584. }
  585. }
  586. static int32_t prvCore_USBEp0CB(void *pData, void *pParam)
  587. {
  588. int32_t Result = -ERROR_CMD_NOT_SUPPORT;
  589. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  590. USB_StorageSCSITypeDef *pUserFun = (USB_StorageSCSITypeDef *)prvUSBApp.tSCSI.pSCSIUserFunList;
  591. uint16_t wLength, wValue;
  592. Virtual_UartCtrlStruct *pVUart;
  593. // DBG("%d,%d,%d,%d", pEpData->USB_ID, pEpData->EpIndex, pEpData->IsToDevice, pEpData->Len);
  594. if (!pEpData->IsDataStage)
  595. {
  596. wLength = BytesGetLe16(pEpData->pLastRequest->wLength);
  597. if (pEpData->IsToDevice)
  598. {
  599. switch (pEpData->pLastRequest->bRequest)
  600. {
  601. case UCDC_SET_CONTROL_LINE_STATE:
  602. pVUart = &prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN];
  603. switch (pEpData->pLastRequest->wValue[0])
  604. {
  605. case 0:
  606. //close serial
  607. pVUart->USBOnOff = 0;
  608. pVUart->CB(pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN, UART_CB_ERROR);
  609. break;
  610. case 1:
  611. case 3:
  612. //open serial
  613. prvCore_VUartOpen(pVUart, pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN);
  614. prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN].USBOnOff = 1;
  615. break;
  616. }
  617. Result = ERROR_NONE;
  618. break;
  619. case USB_HID_REQ_SET_IDLE:
  620. prvCore_VHIDSetReady(1);
  621. Result = ERROR_NONE;
  622. break;
  623. case UR_GET_DESCRIPTOR:
  624. switch(pEpData->pLastRequest->wValue[1])
  625. {
  626. case USB_HID_REPORT_DESC:
  627. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, prvUSBApp.pHIDReport, prvUSBApp.HIDReportLen, wLength, 1);
  628. Result = ERROR_NONE;
  629. break;
  630. }
  631. break;
  632. case MSC_GET_MAX_LUN:
  633. pUserFun->GetMaxLUN(&prvUSBApp.tSCSI.LogicalUnitNum, prvUSBApp.tSCSI.pUserData);
  634. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, &prvUSBApp.tSCSI.LogicalUnitNum, 1, wLength, 1);
  635. Result = ERROR_NONE;
  636. break;
  637. case MSC_RESET:
  638. Result = ERROR_NONE;
  639. break;
  640. }
  641. }
  642. }
  643. return Result;
  644. }
  645. static int32_t prvCore_MSCCB(void *pData, void *pParam)
  646. {
  647. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  648. USB_EndpointDataStruct *pEpDataSave;
  649. pEpDataSave = malloc(sizeof(USB_EndpointDataStruct));
  650. memcpy(pEpDataSave, pEpData, sizeof(USB_EndpointDataStruct));
  651. if (pEpData->Data && pEpData->Len)
  652. {
  653. pEpDataSave->Data = malloc(pEpData->Len);
  654. memcpy(pEpDataSave->Data, pEpData->Data, pEpData->Len);
  655. }
  656. else
  657. {
  658. pEpDataSave->Data = NULL;
  659. pEpDataSave->Len = 0;
  660. }
  661. Task_SendEvent(prvUSBApp.hTaskHandle, USBD_MSC_CB, pEpDataSave, &prvUSBApp.tSCSI, pParam);
  662. return ERROR_NONE;
  663. }
  664. static int32_t prvCore_HIDCB(void *pData, void *pParam)
  665. {
  666. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  667. uint32_t USB_ID = (uint32_t)pParam;
  668. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  669. Buffer_Struct Buf;
  670. if (pEpData->IsToDevice)
  671. {
  672. prvCore_VHIDSetReady(1);
  673. OS_BufferWrite(&pVHID->RxBuf, pEpData->Data, pEpData->Len);
  674. pVHID->CB(USB_ID, USB_HID_NEW_DATA);
  675. }
  676. else
  677. {
  678. OS_DeInitBuffer(&pVHID->TxBuf);
  679. if (pVHID->TxCacheBuf.Pos)
  680. {
  681. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  682. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  683. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  684. }
  685. else
  686. {
  687. pVHID->CB(USB_ID, USB_HID_SEND_DONE);
  688. }
  689. }
  690. return ERROR_NONE;
  691. }
  692. static int32_t prvCore_SerialCB(void *pData, void *pParam)
  693. {
  694. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  695. uint32_t UartID = (uint32_t)pParam;
  696. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  697. if (pEpData->IsToDevice)
  698. {
  699. //open serial
  700. if (!pVUart->USBOnOff)
  701. {
  702. prvCore_VUartOpen(pVUart, UartID);
  703. }
  704. if (pEpData->Data && pEpData->Len)
  705. {
  706. if ((pVUart->RxBuf.Pos + pEpData->Len) >= pVUart->RxBuf.MaxLen)
  707. {
  708. OS_ReSizeBuffer(&pVUart->RxBuf, pVUart->RxBuf.MaxLen * 2);
  709. }
  710. OS_BufferWrite(&pVUart->RxBuf, pEpData->Data, pEpData->Len);
  711. if (pEpData->IsDataStage && pVUart->RxTimeoutUS)
  712. {
  713. Timer_StartUS(pVUart->RxTimer, pVUart->RxTimeoutUS, 0);
  714. }
  715. else
  716. {
  717. Timer_Stop(pVUart->RxTimer);
  718. pVUart->CB(UartID, UART_CB_RX_NEW);
  719. }
  720. }
  721. }
  722. else
  723. {
  724. OS_DeInitBuffer(&pVUart->TxBuf);
  725. if (pVUart->TxCacheBuf.Pos)
  726. {
  727. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  728. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  729. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  730. }
  731. else
  732. {
  733. pVUart->CB(UartID, UART_CB_TX_ALL_DONE);
  734. }
  735. }
  736. return ERROR_NONE;
  737. }
  738. static int32_t prvCore_USBStateCB(void *pData, void *pParam)
  739. {
  740. PV_Union uPV;
  741. uint8_t i;
  742. uPV.p = pData;
  743. switch(uPV.u8[1])
  744. {
  745. case USBD_BUS_TYPE_DISCONNECT:
  746. prvCore_VHIDSetReady(0);
  747. USB_MSCReset(&prvUSBApp.tSCSI);
  748. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  749. {
  750. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  751. prvLuatOS_VirtualUart[i].CB(i, UART_CB_ERROR);
  752. }
  753. break;
  754. case USBD_BUS_TYPE_ENABLE_CONNECT:
  755. USB_StackStartDevice(uPV.u8[0]);
  756. break;
  757. }
  758. }
  759. void Core_USBSetID(uint8_t USB_ID, uint16_t VID, uint16_t PID)
  760. {
  761. BytesPutLe16(prvCore_DeviceDesc.idVendor, VID);
  762. BytesPutLe16(prvCore_DeviceDesc.idProduct, PID);
  763. }
  764. void Core_USBSetHIDMode(uint8_t USB_ID, uint8_t HIDMode, uint8_t BuffSize)
  765. {
  766. switch(BuffSize)
  767. {
  768. case 8:
  769. case 16:
  770. case 32:
  771. case 64:
  772. break;
  773. default:
  774. BuffSize = 8;
  775. break;
  776. }
  777. if (HIDMode)
  778. {
  779. prvUSBApp.pHIDReport = &prvCore_HIDCustomReportDescriptor;
  780. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDCustomReportDescriptor);
  781. prvCore_HIDCustomReportDescriptor[10] = BuffSize;
  782. prvCore_HIDCustomReportDescriptor[28] = BuffSize;
  783. prvCore_HIDEndpointDesc[0].wMaxPacketSize[0] = BuffSize;
  784. prvCore_HIDEndpointDesc[1].wMaxPacketSize[0] = BuffSize;
  785. }
  786. else
  787. {
  788. prvUSBApp.pHIDReport = &prvCore_HIDKeyboardReportDesc;
  789. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDKeyboardReportDesc);
  790. prvCore_HIDEndpointDesc[0].wMaxPacketSize[0] = 8;
  791. prvCore_HIDEndpointDesc[1].wMaxPacketSize[0] = 8;
  792. }
  793. }
  794. void Core_USBDefaultDeviceStart(uint8_t USB_ID)
  795. {
  796. uint8_t langid[2] = {0x09, 0x04};
  797. int i;
  798. USB_StackPowerOnOff(USB_ID, 1);
  799. USB_StackStop(USB_ID);
  800. prvLuatOS_VirtualHID.USB_ID = USB_ID;
  801. prvLuatOS_VirtualHID.IsReady = 0;
  802. prvLuatOS_VirtualHID.ToHostEpIndex = DEVICE_HID_KEYBOARD_EP_IN;
  803. prvLuatOS_VirtualHID.ToDeviceEpIndex = DEVICE_HID_KEYBOARD_EP_OUT;
  804. prvUSBApp.tUDisk.BlockTotalNums = VIRTUAL_UDISK_BLOCKS_NUMS;
  805. prvUSBApp.tUDisk.BlockSize = VIRTUAL_UDISK_BLOCKS_LEN;
  806. prvUSBApp.tSCSI.LogicalUnitNum = 0;
  807. prvUSBApp.tSCSI.ToHostEpIndex = DEVICE_MASS_STORAGE_EP_IN;
  808. prvUSBApp.tSCSI.ToDeviceEpIndex = DEVICE_MASS_STORAGE_EP_OUT;
  809. if (!prvUSBApp.pHIDReport)
  810. {
  811. prvUSBApp.pHIDReport = &prvCore_HIDKeyboardReportDesc;
  812. prvUSBApp.HIDReportLen = sizeof(prvCore_HIDKeyboardReportDesc);
  813. }
  814. if (!prvUSBApp.tSCSI.pSCSIUserFunList)
  815. {
  816. prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  817. }
  818. if (!prvLuatOS_VirtualHID.CB)
  819. {
  820. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  821. }
  822. OS_ReInitBuffer(&prvLuatOS_VirtualHID.TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  823. USB_StackClearSetup(USB_ID);
  824. USB_StackSetDeviceBusPower(USB_ID, 1);
  825. USB_StackSetEpCB(USB_ID, 0, prvCore_USBEp0CB, NULL);
  826. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_IN, prvCore_HIDCB, USB_ID);
  827. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_OUT, prvCore_HIDCB, USB_ID);
  828. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_IN, prvCore_MSCCB, USB_ID);
  829. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_OUT, prvCore_MSCCB, USB_ID);
  830. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_IN, prvCore_SerialCB, VIRTUAL_UART0);
  831. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_OUT, prvCore_SerialCB, VIRTUAL_UART0);
  832. USB_StackSetDeviceConfig(USB_ID, &prvCore_DeviceDesc, &prvCore_FullConfig, 1, USBD_IDX_INTERFACE0_STR + 3, prvCore_USBStateCB, NULL);
  833. USB_StackSetCharString(USB_ID, USBD_IDX_LANGID_STR, langid, 2);
  834. USB_StackSetCharString(USB_ID, USBD_IDX_MANUFACTURER_STR, prvCore_StringManufacturer, sizeof(prvCore_StringManufacturer));
  835. USB_StackSetCharString(USB_ID, USBD_IDX_PRODUCT_STR, prvCore_StringProduct, sizeof(prvCore_StringProduct));
  836. USB_StackSetCharString(USB_ID, USBD_IDX_SERIAL_STR, prvCore_StringSerial, sizeof(prvCore_StringSerial));
  837. USB_StackSetCharString(USB_ID, USBD_IDX_CONFIG_STR, prvCore_StringConfig, sizeof(prvCore_StringConfig));
  838. for(i = 0; i < 3; i++)
  839. {
  840. USB_StackSetCharString(USB_ID, USBD_IDX_INTERFACE0_STR + i, prvCore_StringInterface[i], strlen(prvCore_StringInterface[i]));
  841. }
  842. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  843. {
  844. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  845. prvLuatOS_VirtualUart[i].USB_ID = USB_ID;
  846. if (!prvLuatOS_VirtualUart[i].RxTimer)
  847. {
  848. prvLuatOS_VirtualUart[i].RxTimer = Timer_Create(prvCore_VUartRxTimeoutCB, i, NULL);
  849. }
  850. if (!prvLuatOS_VirtualUart[i].CB)
  851. {
  852. prvLuatOS_VirtualUart[i].CB = prvCore_VUartDummyCB;
  853. }
  854. prvLuatOS_VirtualUart[i].RxTimeoutUS = 150;
  855. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  856. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  857. }
  858. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToDeviceEpIndex = DEVICE_GENERIC_SERIAL_EP_IN;
  859. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToHostEpIndex = DEVICE_GENERIC_SERIAL_EP_OUT;
  860. prvUSBApp.tUDisk.VirtualData = prvLuatOS_VirtualUart[0].TxCacheBuf.Data;
  861. USB_MSCReset(&prvUSBApp.tSCSI);
  862. USB_StackStartDevice(USB_ID);
  863. prvUSBApp.IsStart = 1;
  864. }
  865. void Core_VHIDInit(uint8_t USB_ID, CBFuncEx_t CB)
  866. {
  867. if (CB)
  868. {
  869. prvLuatOS_VirtualHID.CB = CB;
  870. }
  871. else
  872. {
  873. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  874. }
  875. }
  876. void Core_VUartInit(uint8_t UartID, uint32_t BaudRate, uint8_t IsRxCacheEnable, uint8_t DataBits, uint8_t Parity, uint8_t StopBits, CBFuncEx_t CB)
  877. {
  878. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  879. // switch(UartID)
  880. // {
  881. // case VIRTUAL_UART0:
  882. // if (!prvService.IsUSBOpen)
  883. // {
  884. // Core_USBDefaultDeviceStart(USB_ID0);
  885. // prvService.IsUSBOpen = 1;
  886. // }
  887. // break;
  888. // }
  889. if (CB)
  890. {
  891. pVUart->CB = CB;
  892. }
  893. else
  894. {
  895. pVUart->CB = prvCore_VUartDummyCB;
  896. }
  897. pVUart->UartOnOff = 1;
  898. }
  899. void Core_VUartDeInit(uint8_t UartID)
  900. {
  901. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  902. pVUart->UartOnOff = 0;
  903. }
  904. void Core_VUartSetRxTimeout(uint8_t UartID, uint32_t TimeoutUS)
  905. {
  906. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  907. pVUart->RxTimeoutUS = TimeoutUS;
  908. }
  909. void Core_VUartSetCb(uint8_t UartID, CBFuncEx_t CB)
  910. {
  911. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  912. if (CB)
  913. {
  914. pVUart->CB = CB;
  915. }
  916. else
  917. {
  918. pVUart->CB = prvCore_VUartDummyCB;
  919. }
  920. }
  921. uint32_t Core_VUartRxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  922. {
  923. uint32_t ReadLen;
  924. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  925. switch(UartID)
  926. {
  927. case VIRTUAL_UART0:
  928. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 0);
  929. break;
  930. }
  931. if (!Data || !Len)
  932. {
  933. ReadLen = pVUart->RxBuf.Pos;
  934. goto READ_END;
  935. }
  936. ReadLen = (pVUart->RxBuf.Pos < Len)?pVUart->RxBuf.Pos:Len;
  937. memcpy(Data, pVUart->RxBuf.Data, ReadLen);
  938. OS_BufferRemove(&pVUart->RxBuf, ReadLen);
  939. if (!pVUart->RxBuf.Pos && pVUart->RxBuf.MaxLen > VIRTUAL_SERIAL_BUFFER_LEN)
  940. {
  941. OS_ReInitBuffer(&pVUart->RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  942. }
  943. READ_END:
  944. switch(UartID)
  945. {
  946. case VIRTUAL_UART0:
  947. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 1);
  948. break;
  949. }
  950. return ReadLen;
  951. }
  952. int32_t Core_VUartBufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  953. {
  954. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  955. switch(UartID)
  956. {
  957. case VIRTUAL_UART0:
  958. if (!pVUart->USBOnOff)
  959. {
  960. return -1;
  961. }
  962. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  963. break;
  964. }
  965. if (Data && Len)
  966. {
  967. OS_BufferWrite(&pVUart->TxCacheBuf, Data, Len);
  968. }
  969. if (pVUart->TxBuf.Data || pVUart->TxBuf.MaxLen)
  970. {
  971. goto TX_END;
  972. }
  973. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  974. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  975. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  976. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  977. TX_END:
  978. switch(UartID)
  979. {
  980. case VIRTUAL_UART0:
  981. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  982. break;
  983. }
  984. return 0;
  985. }
  986. void Core_VUartBufferTxStop(uint8_t UartID)
  987. {
  988. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  989. switch(UartID)
  990. {
  991. case VIRTUAL_UART0:
  992. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  993. break;
  994. }
  995. OS_DeInitBuffer(&pVUart->TxBuf);
  996. pVUart->TxCacheBuf.Pos = 0;
  997. USB_StackStopDeviceTx(pVUart->USB_ID, pVUart->ToHostEpIndex, 0);
  998. switch(UartID)
  999. {
  1000. case VIRTUAL_UART0:
  1001. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  1002. break;
  1003. }
  1004. }
  1005. uint32_t Core_VHIDRxBufferRead(uint8_t USB_ID, uint8_t *Data, uint32_t Len)
  1006. {
  1007. uint32_t ReadLen;
  1008. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1009. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToDeviceEpIndex, 1, 0);
  1010. if (!Data || !Len)
  1011. {
  1012. ReadLen = pVHID->RxBuf.Pos;
  1013. goto READ_END;
  1014. }
  1015. ReadLen = (pVHID->RxBuf.Pos < Len)?pVHID->RxBuf.Pos:Len;
  1016. memcpy(Data, pVHID->RxBuf.Data, ReadLen);
  1017. OS_BufferRemove(&pVHID->RxBuf, ReadLen);
  1018. if (!pVHID->RxBuf.Pos && pVHID->RxBuf.MaxLen > VIRTUAL_VHID_BUFFER_LEN)
  1019. {
  1020. OS_ReInitBuffer(&pVHID->RxBuf, VIRTUAL_VHID_BUFFER_LEN);
  1021. }
  1022. READ_END:
  1023. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToDeviceEpIndex, 1, 1);
  1024. return ReadLen;
  1025. }
  1026. void Core_VHIDUploadData(uint8_t USB_ID, uint8_t *Data, uint32_t Len)
  1027. {
  1028. if (!prvLuatOS_VirtualHID.IsReady) return;
  1029. USB_HIDKeyValue HIDKey;
  1030. USB_HIDKeyBoradKeyStruct HIDKeyBoard;
  1031. uint16_t Pos;
  1032. volatile uint8_t IsShift, i, LastValue;
  1033. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1034. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1035. if (Data && Len)
  1036. {
  1037. if ((Len*16 + pVHID->TxCacheBuf.Pos) > pVHID->TxCacheBuf.MaxLen)
  1038. {
  1039. OS_ReSizeBuffer(&pVHID->TxCacheBuf, Len*16 + pVHID->TxCacheBuf.Pos);
  1040. }
  1041. Pos = 0;
  1042. while(Pos < Len)
  1043. {
  1044. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1045. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  1046. Pos++;
  1047. IsShift = HIDKey.Shift;
  1048. LastValue = HIDKey.Value;
  1049. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1050. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1051. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1052. if (Pos >= Len)
  1053. {
  1054. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1055. break;
  1056. }
  1057. ADD_REST:
  1058. for(i = 1; i < USB_HID_KEY_CACHE; i++)
  1059. {
  1060. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  1061. Pos++;
  1062. if ((IsShift != HIDKey.Shift) || (LastValue == HIDKey.Value) || (LastValue == '\r') || (LastValue == '\n'))
  1063. {
  1064. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1065. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1066. //加入一个抬起的data
  1067. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1068. IsShift = HIDKey.Shift;
  1069. LastValue = HIDKey.Value;
  1070. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  1071. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  1072. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  1073. if (Pos < Len)
  1074. {
  1075. goto ADD_REST;
  1076. }
  1077. else
  1078. {
  1079. break;
  1080. }
  1081. }
  1082. else
  1083. {
  1084. LastValue = HIDKey.Value;
  1085. HIDKeyBoard.PressKey[i] = HIDKey.Value;
  1086. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], i, HIDKey.Value, HIDKey.Shift);
  1087. if (Pos >= Len)
  1088. {
  1089. break;
  1090. }
  1091. }
  1092. }
  1093. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1094. //加入一个抬起的data
  1095. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1096. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1097. }
  1098. //加入一个抬起的data
  1099. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1100. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1101. }
  1102. // pVHID->TxCacheBuf.Pos = 0;
  1103. // return;
  1104. if (pVHID->TxBuf.Data || pVHID->TxBuf.MaxLen)
  1105. {
  1106. goto UPLOAD_END;
  1107. }
  1108. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  1109. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1110. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1111. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1112. UPLOAD_END:
  1113. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1114. }
  1115. void Core_VHIDSendRawData(uint8_t USB_ID, uint8_t *Data, uint32_t Len)
  1116. {
  1117. uint8_t zero[USB_HID_CUST_DATA_CACHE] = {0};
  1118. if (!prvLuatOS_VirtualHID.IsReady) return;
  1119. USB_HIDKeyValue HIDKey;
  1120. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1121. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1122. OS_BufferWrite(&pVHID->TxCacheBuf, Data, Len);
  1123. if (Len % prvCore_HIDEndpointDesc[1].wMaxPacketSize[0])
  1124. {
  1125. OS_BufferWrite(&pVHID->TxCacheBuf, zero, prvCore_HIDEndpointDesc[1].wMaxPacketSize[0] - (Len % prvCore_HIDEndpointDesc[1].wMaxPacketSize[0]));
  1126. }
  1127. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1128. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1129. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1130. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1131. }
  1132. void Core_VHIDUploadStop(uint8_t USB_ID)
  1133. {
  1134. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1135. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1136. OS_DeInitBuffer(&pVHID->TxBuf);
  1137. pVHID->TxCacheBuf.Pos = 0;
  1138. USB_StackStopDeviceTx(pVHID->USB_ID, pVHID->ToHostEpIndex, 0);
  1139. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1140. }
  1141. #ifdef __BUILD_OS__
  1142. static void prvCore_USBAppTask(void *pParam)
  1143. {
  1144. OS_EVENT Event;
  1145. USB_EndpointDataStruct *pEpData;
  1146. while(1)
  1147. {
  1148. Task_GetEventByMS(prvUSBApp.hTaskHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  1149. switch(Event.ID)
  1150. {
  1151. case USB_HW_ACTION:
  1152. switch (Event.Param2)
  1153. {
  1154. case SERV_USB_RESET_END:
  1155. DBG("USB%d reset", Event.Param1);
  1156. Task_DelayMS(1);
  1157. USB_StackDeviceAfterDisconnect(Event.Param1);
  1158. break;
  1159. case SERV_USB_RESUME_END:
  1160. Task_DelayMS(20);
  1161. USB_ResumeEnd(Event.Param3);
  1162. break;
  1163. case SERV_USB_SUSPEND:
  1164. DBG("USB%d suspend", Event.Param1);
  1165. break;
  1166. case SERV_USB_RESUME:
  1167. break;
  1168. }
  1169. break;
  1170. case USBD_MSC_CB:
  1171. pEpData = (USB_EndpointDataStruct *)Event.Param1;
  1172. // DBG("%d,%d,%d,%d", pEpData->USB_ID, pEpData->EpIndex, pEpData->IsToDevice, pEpData->Len);
  1173. USB_MSCHandle(pEpData, Event.Param2);
  1174. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_IN, 0, 0);
  1175. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_OUT, 1, 0);
  1176. // if (prvUSBApp.BlockCmd)
  1177. // {
  1178. // prvUSBApp.BlockCmd--;
  1179. // }
  1180. // else
  1181. // {
  1182. // DBG("!!!");
  1183. // }
  1184. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_IN, 0, 1);
  1185. // USB_StackEpIntOnOff(pEpData->USB_ID, DEVICE_MASS_STORAGE_EP_OUT, 1, 1);
  1186. free(pEpData->Data);
  1187. free(Event.Param1);
  1188. WDT_Feed();
  1189. break;
  1190. }
  1191. }
  1192. }
  1193. void Core_USBAction(uint8_t USB_ID, uint8_t Action, void *pParam)
  1194. {
  1195. Task_SendEvent(prvUSBApp.hTaskHandle, USB_HW_ACTION, USB_ID, Action, pParam);
  1196. }
  1197. extern const USB_StorageSCSITypeDef prvSDHC_SCSIFun;
  1198. void Core_UDiskAttachSDHC(uint8_t USB_ID, void *pCtrl)
  1199. {
  1200. prvUSBApp.pSDHC = pCtrl;
  1201. prvUSBApp.tSCSI.pSCSIUserFunList = &prvSDHC_SCSIFun;
  1202. prvUSBApp.tSCSI.pUserData = prvUSBApp.pSDHC;
  1203. prvUSBApp.tSCSI.ReadTimeout = 500;
  1204. DBuffer_ReInit(&prvUSBApp.DataBuf, 8 * 1024);
  1205. prvUSBApp.pSDHC->USBDelayTime = 0; //如果USB不稳定,可调加大USBDelayTime
  1206. prvUSBApp.pSDHC->SCSIDataBuf = &prvUSBApp.DataBuf;
  1207. prvUSBApp.IsUSBAttachSDHC = 1;
  1208. }
  1209. void Core_UDiskAttachSDHCRecovery(uint8_t USB_ID, void *pCtrl)
  1210. {
  1211. if (prvUSBApp.IsUSBAttachSDHC)
  1212. {
  1213. DBG("recovery attach %d, %x", USB_ID, pCtrl);
  1214. prvUSBApp.pSDHC = pCtrl;
  1215. prvUSBApp.tSCSI.pSCSIUserFunList = &prvSDHC_SCSIFun;
  1216. prvUSBApp.tSCSI.pUserData = prvUSBApp.pSDHC;
  1217. prvUSBApp.tSCSI.ReadTimeout = 500;
  1218. DBuffer_ReInit(&prvUSBApp.DataBuf, 8 * 1024);
  1219. prvUSBApp.pSDHC->USBDelayTime = 0; //如果USB不稳定,可调加大USBDelayTime
  1220. prvUSBApp.pSDHC->SCSIDataBuf = &prvUSBApp.DataBuf;
  1221. if (prvUSBApp.IsStart)
  1222. {
  1223. DBG("reboot usb");
  1224. Core_USBDefaultDeviceStart(USB_ID);
  1225. }
  1226. }
  1227. }
  1228. void Core_UDiskDetachSDHC(uint8_t USB_ID, void *pCtrl)
  1229. {
  1230. if (pCtrl)
  1231. {
  1232. if (prvUSBApp.pSDHC != pCtrl)
  1233. {
  1234. return;
  1235. }
  1236. }
  1237. if (prvUSBApp.IsUSBAttachSDHC)
  1238. {
  1239. prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  1240. prvUSBApp.tSCSI.pUserData = NULL;
  1241. prvUSBApp.pSDHC = NULL;
  1242. DBuffer_DeInit(&prvUSBApp.DataBuf);
  1243. DBG("detach %d, %x", USB_ID, pCtrl);
  1244. if (!pCtrl) //NULL表示用户退出
  1245. {
  1246. prvUSBApp.IsUSBAttachSDHC = 0;
  1247. DBG("free attach %d, %x", USB_ID, pCtrl);
  1248. }
  1249. }
  1250. if (prvUSBApp.IsStart)
  1251. {
  1252. DBG("reboot usb");
  1253. Core_USBDefaultDeviceStart(USB_ID);
  1254. }
  1255. }
  1256. void Core_USBAppGlobalInit(void)
  1257. {
  1258. prvUSBApp.hTaskHandle = Task_Create(prvCore_USBAppTask, NULL, 1024, USB_TASK_PRO, "usb app");
  1259. }
  1260. INIT_TASK_EXPORT(Core_USBAppGlobalInit, "2");
  1261. #endif