core_service.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516
  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. #ifdef __BUILD_OS__
  23. #include "zbar.h"
  24. #include "symbol.h"
  25. #include "image.h"
  26. extern void SPI_TestInit(uint8_t SpiID, uint32_t Speed, uint32_t TestLen);
  27. extern void SPI_TestOnce(uint8_t SpiID, uint32_t TestLen);
  28. extern void DHT11_TestOnce(uint8_t Pin, CBFuncEx_t CB);
  29. extern void DHT11_TestResult(void);
  30. extern void SHT30_Init(CBFuncEx_t CB, void *pParam);
  31. extern void SHT30_GetResult(CBFuncEx_t CB, void *pParam);
  32. extern void GC032A_TestInit(void);
  33. extern void OV2640_TestInit(void);
  34. enum
  35. {
  36. DEVICE_INTERFACE_HID_SN,
  37. DEVICE_INTERFACE_MSC_SN,
  38. DEVICE_INTERFACE_SERIAL_SN,
  39. DEVICE_INTERFACE_MAX,
  40. };
  41. #define DEVICE_HID_KEYBOARD_EP_IN (0x01)
  42. #define DEVICE_HID_KEYBOARD_EP_OUT (0x01)
  43. #define DEVICE_MASS_STORAGE_EP_IN (0x02)
  44. #define DEVICE_MASS_STORAGE_EP_OUT (0x02)
  45. #define DEVICE_GENERIC_SERIAL_EP_IN (0x03)
  46. #define DEVICE_GENERIC_SERIAL_EP_OUT (0x03)
  47. #define VIRTUAL_SERIAL_BUFFER_LEN (8192)
  48. #define VIRTUAL_VHID_BUFFER_LEN (2048)
  49. #define VIRTUAL_UDISK_BLOCKS_LEN (512)
  50. #define VIRTUAL_UDISK_BLOCKS_NUMS (32)
  51. #define VIRTUAL_UDISK_LEN (VIRTUAL_UDISK_BLOCKS_NUMS * VIRTUAL_UDISK_BLOCKS_LEN)
  52. //#define TEST_SPEED
  53. typedef struct
  54. {
  55. uint32_t CurAddress;
  56. uint32_t BlockNums;
  57. uint32_t BlockSize;
  58. uint32_t BlockTotalNums;
  59. uint8_t *VirtualData;
  60. }Virtual_UDiskCtrlStruct;
  61. typedef struct
  62. {
  63. Buffer_Struct TxBuf;
  64. Buffer_Struct TxCacheBuf; // 缓存下次发送的数据
  65. CBFuncEx_t CB;
  66. uint8_t USB_ID;
  67. uint8_t IsReady;
  68. uint8_t ToHostEpIndex;
  69. }Virtual_HIDCtrlStruct;
  70. typedef struct
  71. {
  72. Buffer_Struct TxBuf;
  73. Buffer_Struct TxCacheBuf; // 缓存下次发送的数据
  74. Buffer_Struct RxBuf;
  75. CBFuncEx_t CB;
  76. Timer_t *RxTimer;
  77. uint32_t RxTimeoutUS;
  78. uint8_t *TxData;
  79. uint8_t USBOnOff;
  80. uint8_t UartOnOff;
  81. uint8_t USB_ID;
  82. uint8_t ToHostEpIndex;
  83. uint8_t ToDeviceEpIndex;
  84. }Virtual_UartCtrlStruct;
  85. static MSC_SCSICtrlStruct prvLuatOS_SCSI;
  86. static Virtual_HIDCtrlStruct prvLuatOS_VirtualHID;
  87. static Virtual_UDiskCtrlStruct prvLuatOS_VirtualUDisk;
  88. static Virtual_UartCtrlStruct prvLuatOS_VirtualUart[VIRTUAL_UART_MAX];
  89. enum
  90. {
  91. SERVICE_LCD_DRAW = SERVICE_EVENT_ID_START + 1,
  92. SERVICE_CAMERA_DRAW,
  93. SERVICE_USB_ACTION,
  94. SERVICE_DECODE_QR,
  95. SERVICE_SCAN_KEYBOARD,
  96. };
  97. typedef struct
  98. {
  99. HANDLE HardwareHandle;
  100. HANDLE ServiceHandle;
  101. HANDLE UserHandle;
  102. uint64_t LCDDrawRequireByte;
  103. uint64_t LCDDrawDoneByte;
  104. uint32_t InitAllocMem;
  105. uint32_t LastAllocMem;
  106. }Service_CtrlStruct;
  107. static Service_CtrlStruct prvService;
  108. /* LangID = 0x0409: U.S. English */
  109. static const char prvCore_StringManufacturer[] = "airm2m";
  110. static const char prvCore_StringProduct[] = "air105 usb device";
  111. static const char prvCore_StringSerial[] = "00001";
  112. static const char prvCore_StringConfig[] = "luatos";
  113. static const char *prvCore_StringInterface[3] = {
  114. "virtual Mass Storage Device",
  115. "virtual HID Keyboard",
  116. "virtual Serial"
  117. };
  118. static const usb_device_descriptor_t prvCore_DeviceDesc =
  119. {
  120. .bLength = USB_LEN_DEV_DESC,
  121. .bDescriptorType = UDESC_DEVICE,
  122. .bcdUSB = {0x00, 0x02},
  123. .bDeviceClass = UDCLASS_IN_INTERFACE,
  124. .bDeviceSubClass = 0,
  125. .bDeviceProtocol = 0,
  126. .bMaxPacketSize = 0x40,
  127. .idVendor = {0x82, 0x17},
  128. .idProduct = {0x00, 0x4e},
  129. // .idVendor = {0x83, 0x04},
  130. // .idProduct = {0x20, 0x57},
  131. .bcdDevice = {0x00, 0x02},
  132. .iManufacturer = USBD_IDX_MANUFACTURER_STR,
  133. .iProduct = USBD_IDX_PRODUCT_STR,
  134. .iSerialNumber = 0,
  135. .bNumConfigurations = 1,
  136. };
  137. static const usb_device_qualifier_t prvCore_QualifierDesc =
  138. {
  139. .bLength = USB_LEN_DEV_QUALIFIER_DESC, /* bLength */
  140. .bDescriptorType = UDESC_DEVICE_QUALIFIER, /* bDescriptorType */
  141. .bcdUSB = {0x00, 0x02},
  142. .bDeviceClass = UDCLASS_IN_INTERFACE,
  143. .bDeviceSubClass = 0,
  144. .bDeviceProtocol = 0,
  145. .bMaxPacketSize0 = 0x40,
  146. .bNumConfigurations = 1,
  147. .bReserved = 0
  148. };
  149. static const usb_config_descriptor_t prvCore_ConfigDesc =
  150. {
  151. .bLength = USB_LEN_CFG_DESC,
  152. .bDescriptorType = UDESC_CONFIG,
  153. .wTotalLength = {0x00, 0x00},
  154. .bNumInterface = DEVICE_INTERFACE_MAX,
  155. .bConfigurationValue = 1,
  156. .iConfiguration = USBD_IDX_CONFIG_STR,
  157. .bmAttributes = UC_SELF_POWERED|UC_BUS_POWERED,
  158. .bMaxPower = (USB_MIN_POWER >> 1),
  159. };
  160. static const usb_interface_assoc_descriptor_t prvCore_AssocInterfaceDesc =
  161. {
  162. .bLength = USB_LEN_ASSOC_IF_DESC,
  163. .bDescriptorType = UDESC_IFACE_ASSOC,
  164. .bFirstInterface = 0,
  165. .bInterfaceCount = 1,
  166. // .bFunctionClass = UICLASS_MASS,
  167. // .bFunctionSubClass = UISUBCLASS_SCSI,
  168. // .bFunctionProtocol = UIPROTO_MASS_BBB,
  169. // .bFunctionClass = 0,
  170. // .bFunctionSubClass = 0,
  171. // .bFunctionProtocol = 0,
  172. .bFunctionClass = UICLASS_HID,
  173. .bFunctionSubClass = 0,
  174. .bFunctionProtocol = UIPROTO_BOOT_KEYBOARD,
  175. .iFunction = USBD_IDX_INTERFACE0_STR,
  176. };
  177. static const usb_interface_descriptor_t prvCore_MassStorgeInterfaceDesc =
  178. {
  179. .bLength = USB_LEN_IF_DESC,
  180. .bDescriptorType = UDESC_INTERFACE,
  181. .bInterfaceNumber = DEVICE_INTERFACE_MSC_SN,
  182. .bAlternateSetting = 0,
  183. .bNumEndpoints = 2,
  184. .bInterfaceClass = UICLASS_MASS,
  185. .bInterfaceSubClass = UISUBCLASS_SCSI,
  186. .bInterfaceProtocol = UIPROTO_MASS_BBB,
  187. .iInterface = USBD_IDX_INTERFACE0_STR,
  188. };
  189. static const usb_endpoint_descriptor_t prvCore_MassStorgeEndpointDesc[2] =
  190. {
  191. {
  192. .bLength = USB_LEN_EP_DESC,
  193. .bDescriptorType = UDESC_ENDPOINT,
  194. .bEndpointAddress = UE_DIR_IN|DEVICE_MASS_STORAGE_EP_IN,
  195. .bmAttributes = UE_BULK,
  196. .wMaxPacketSize = {0x40,0x00},
  197. .bInterval = 10,
  198. },
  199. {
  200. .bLength = USB_LEN_EP_DESC,
  201. .bDescriptorType = UDESC_ENDPOINT,
  202. .bEndpointAddress = UE_DIR_OUT|DEVICE_MASS_STORAGE_EP_OUT,
  203. .bmAttributes = UE_BULK,
  204. .wMaxPacketSize = {0x40,0x00},
  205. .bInterval = 10,
  206. }
  207. };
  208. static const usb_interface_descriptor_t prvCore_HIDInterfaceDesc =
  209. {
  210. .bLength = USB_LEN_IF_DESC,
  211. .bDescriptorType = UDESC_INTERFACE,
  212. .bInterfaceNumber = DEVICE_INTERFACE_HID_SN,
  213. .bAlternateSetting = 0,
  214. .bNumEndpoints = 2,
  215. .bInterfaceClass = UICLASS_HID,
  216. .bInterfaceSubClass = 0,
  217. .bInterfaceProtocol = UIPROTO_BOOT_KEYBOARD,
  218. .iInterface = USBD_IDX_INTERFACE0_STR + 1,
  219. };
  220. static const usb_endpoint_descriptor_t prvCore_HIDEndpointDesc[2] =
  221. {
  222. {
  223. .bLength = USB_LEN_EP_DESC,
  224. .bDescriptorType = UDESC_ENDPOINT,
  225. .bEndpointAddress = UE_DIR_IN|DEVICE_HID_KEYBOARD_EP_IN,
  226. .bmAttributes = UE_INTERRUPT,
  227. .wMaxPacketSize = {0x08,0x00},
  228. .bInterval = 10,
  229. },
  230. {
  231. .bLength = USB_LEN_EP_DESC,
  232. .bDescriptorType = UDESC_ENDPOINT,
  233. .bEndpointAddress = UE_DIR_OUT|DEVICE_HID_KEYBOARD_EP_OUT,
  234. .bmAttributes = UE_INTERRUPT,
  235. .wMaxPacketSize = {0x08,0x00},
  236. .bInterval = 10,
  237. },
  238. };
  239. static const usb_interface_descriptor_t prvCore_SerialInterfaceDesc =
  240. {
  241. .bLength = USB_LEN_IF_DESC,
  242. .bDescriptorType = UDESC_INTERFACE,
  243. .bInterfaceNumber = DEVICE_INTERFACE_SERIAL_SN,
  244. .bAlternateSetting = 0,
  245. .bNumEndpoints = 2,
  246. .bInterfaceClass = UICLASS_VENDOR,
  247. .bInterfaceSubClass = 0,
  248. .bInterfaceProtocol = 0,
  249. .iInterface = USBD_IDX_INTERFACE0_STR + 2,
  250. };
  251. static const usb_endpoint_descriptor_t prvCore_SerialEndpointDesc[2] =
  252. {
  253. {
  254. .bLength = USB_LEN_EP_DESC,
  255. .bDescriptorType = UDESC_ENDPOINT,
  256. .bEndpointAddress = UE_DIR_IN|DEVICE_GENERIC_SERIAL_EP_IN,
  257. .bmAttributes = UE_BULK,
  258. .wMaxPacketSize = {0x40,0x00},
  259. .bInterval = 10,
  260. },
  261. {
  262. .bLength = USB_LEN_EP_DESC,
  263. .bDescriptorType = UDESC_ENDPOINT,
  264. .bEndpointAddress = UE_DIR_OUT|DEVICE_GENERIC_SERIAL_EP_OUT,
  265. .bmAttributes = UE_BULK,
  266. .wMaxPacketSize = {0x40,0x00},
  267. .bInterval = 10,
  268. }
  269. };
  270. static const usb_hid_descriptor_t prvCore_HIDDesc =
  271. {
  272. .bLength = 9,
  273. .bDescriptorType = USB_HID_DESCRIPTOR_TYPE,
  274. .bcdHID = {0x11, 0x01},
  275. .bCountryCode = 0x21,
  276. .bNumDescriptors = 1,
  277. .bReportDescriptorType = USB_HID_REPORT_DESC,
  278. .wDescriptorLength = {63,0},
  279. };
  280. static const char prvCore_HIDReportDesc[63] = {
  281. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  282. 0x09, 0x06, // USAGE (Keyboard)
  283. 0xa1, 0x01, // COLLECTION (Application)
  284. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  285. 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
  286. 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
  287. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  288. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  289. 0x75, 0x01, // REPORT_SIZE (1)
  290. 0x95, 0x08, // REPORT_COUNT (8)
  291. 0x81, 0x02, // INPUT (Data,Var,Abs)
  292. 0x95, 0x01, // REPORT_COUNT (1)
  293. 0x75, 0x08, // REPORT_SIZE (8)
  294. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
  295. 0x95, 0x05, // REPORT_COUNT (5)
  296. 0x75, 0x01, // REPORT_SIZE (1)
  297. 0x05, 0x08, // USAGE_PAGE (LEDs)
  298. 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
  299. 0x29, 0x05, // USAGE_MAXIMUM (Kana)
  300. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
  301. 0x95, 0x01, // REPORT_COUNT (1)
  302. 0x75, 0x03, // REPORT_SIZE (3)
  303. 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
  304. 0x95, 0x06, // REPORT_COUNT (6)
  305. 0x75, 0x08, // REPORT_SIZE (8)
  306. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  307. 0x25, 0xff, // LOGICAL_MAXIMUM (255)
  308. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  309. 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
  310. 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
  311. 0x81, 0x00, // INPUT (Data,Ary,Abs)
  312. 0xc0 // END_COLLECTION
  313. };
  314. static int32_t prvCore_GetHIDDesc(void *pData, void *pParam)
  315. {
  316. if (pData)
  317. {
  318. memcpy(pData, &prvCore_HIDDesc, sizeof(usb_hid_descriptor_t));
  319. }
  320. return sizeof(usb_hid_descriptor_t);
  321. }
  322. static usb_full_interface_t prvCore_InterfaceList[3] =
  323. {
  324. {
  325. &prvCore_HIDInterfaceDesc,
  326. prvCore_HIDEndpointDesc,
  327. NULL,
  328. prvCore_GetHIDDesc,
  329. 2,
  330. },
  331. {
  332. &prvCore_MassStorgeInterfaceDesc,
  333. prvCore_MassStorgeEndpointDesc,
  334. NULL,
  335. NULL,
  336. 2,
  337. },
  338. {
  339. &prvCore_SerialInterfaceDesc,
  340. prvCore_SerialEndpointDesc,
  341. NULL,
  342. NULL,
  343. 2,
  344. },
  345. };
  346. static const usb_full_config_t prvCore_Config =
  347. {
  348. .pConfigDesc = &prvCore_ConfigDesc,
  349. .pInterfaceAssocDesc = &prvCore_AssocInterfaceDesc,
  350. .pInterfaceFullDesc = prvCore_InterfaceList,
  351. .InterfaceNum = 3,
  352. };
  353. static const USB_FullConfigStruct prvCore_FullConfig =
  354. {
  355. .pQualifierDesc = NULL,
  356. .pFullConfig = {&prvCore_Config, NULL, NULL},
  357. };
  358. static const uint8_t prvCore_StandardInquiryData[STANDARD_INQUIRY_DATA_LEN] =
  359. {
  360. 0x00, //磁盘设备
  361. 0x00, //其中最高位D7为RMB。RMB=0,表示不可移除设备。如果RMB=1,则为可移除设备。
  362. 0x02, //各种版本号
  363. 0x02, //数据响应格式 0x02
  364. 0x1F, //附加数据长度,为31字节
  365. 0x00, //保留
  366. 0x00, //保留
  367. 0x00, //保留
  368. 'A','I','R','M','2','M',' ',' ',
  369. 'L','U','A','T','O','S','-','S','O','C',' ','U','S','B',' ',' ',
  370. '1','.','0','0'
  371. };
  372. static const uint8_t prvCore_MSCPage00InquiryData[LENGTH_INQUIRY_PAGE00] =
  373. {
  374. 0x00,
  375. 0x00,
  376. 0x00,
  377. (LENGTH_INQUIRY_PAGE00 - 4U),
  378. 0x00,
  379. 0x80
  380. };
  381. /* USB Mass storage VPD Page 0x80 Inquiry Data for Unit Serial Number */
  382. static const uint8_t prvCore_MSCPage80InquiryData[LENGTH_INQUIRY_PAGE80] =
  383. {
  384. 0x00,
  385. 0x80,
  386. 0x00,
  387. LENGTH_INQUIRY_PAGE80,
  388. 0x20, /* Put Product Serial number */
  389. 0x20,
  390. 0x20,
  391. 0x20
  392. };
  393. /* USB Mass storage sense 6 Data */
  394. static const uint8_t prvCore_MSCModeSense6data[MODE_SENSE6_LEN] =
  395. {
  396. 0x22,
  397. 0x00,
  398. 0x00,
  399. 0x00,
  400. 0x08,
  401. 0x12,
  402. 0x00,
  403. 0x00,
  404. 0x00,
  405. 0x00,
  406. 0x00,
  407. 0x00,
  408. 0x00,
  409. 0x00,
  410. 0x00,
  411. 0x00,
  412. 0x00,
  413. 0x00,
  414. 0x00,
  415. 0x00,
  416. 0x00,
  417. 0x00,
  418. 0x00
  419. };
  420. /* USB Mass storage sense 10 Data */
  421. static const uint8_t prvCore_MSCModeSense10data[MODE_SENSE10_LEN] =
  422. {
  423. 0x00,
  424. 0x26,
  425. 0x00,
  426. 0x00,
  427. 0x00,
  428. 0x00,
  429. 0x00,
  430. 0x00,
  431. 0x08,
  432. 0x12,
  433. 0x00,
  434. 0x00,
  435. 0x00,
  436. 0x00,
  437. 0x00,
  438. 0x00,
  439. 0x00,
  440. 0x00,
  441. 0x00,
  442. 0x00,
  443. 0x00,
  444. 0x00,
  445. 0x00,
  446. 0x00,
  447. 0x00,
  448. 0x00,
  449. 0x00
  450. };
  451. static int32_t prvCore_SCSIInit(uint8_t LUN, void *pUserData)
  452. {
  453. return 0;
  454. }
  455. static int32_t prvCore_SCSIGetCapacity(uint8_t LUN, uint32_t *BlockNum, uint32_t *BlockSize, void *pUserData)
  456. {
  457. *BlockNum = prvLuatOS_VirtualUDisk.BlockTotalNums;
  458. *BlockSize = prvLuatOS_VirtualUDisk.BlockSize;
  459. return 0;
  460. }
  461. static int32_t prvCore_SCSIIsReady(uint8_t LUN, void *pUserData)
  462. {
  463. return 0;
  464. }
  465. static int32_t prvCore_SCSIIsWriteProtected(uint8_t LUN, void *pUserData)
  466. {
  467. return 0;
  468. }
  469. static int32_t prvCore_SCSIPreRead(uint8_t LUN, uint32_t BlockAddress, uint32_t BlockNums, void *pUserData)
  470. {
  471. if ((BlockAddress + BlockNums) * prvLuatOS_VirtualUDisk.BlockSize > VIRTUAL_UDISK_LEN)
  472. {
  473. return -1;
  474. }
  475. prvLuatOS_VirtualUDisk.CurAddress = BlockAddress * prvLuatOS_VirtualUDisk.BlockSize;
  476. return 0;
  477. }
  478. static int32_t prvCore_SCSIRead(uint8_t LUN, uint32_t Len, uint8_t **pOutData, uint32_t *OutLen, void *pUserData)
  479. {
  480. if (Len + prvLuatOS_VirtualUDisk.CurAddress > VIRTUAL_UDISK_LEN)
  481. {
  482. return -1;
  483. }
  484. *pOutData = &prvLuatOS_VirtualUDisk.VirtualData[prvLuatOS_VirtualUDisk.CurAddress];
  485. *OutLen = Len;
  486. prvLuatOS_VirtualUDisk.CurAddress += Len;
  487. return 0;
  488. }
  489. static int32_t prvCore_SCSIPreWrite(uint8_t LUN, uint32_t BlockAddress, uint32_t BlockNums, void *pUserData)
  490. {
  491. if ((BlockAddress + BlockNums) * prvLuatOS_VirtualUDisk.BlockSize > VIRTUAL_UDISK_LEN)
  492. {
  493. return -1;
  494. }
  495. prvLuatOS_VirtualUDisk.CurAddress = BlockAddress * prvLuatOS_VirtualUDisk.BlockSize;
  496. return 0;
  497. }
  498. static int32_t prvCore_SCSIWrite(uint8_t LUN, uint8_t *Data, uint32_t Len, void *pUserData)
  499. {
  500. if (Len + prvLuatOS_VirtualUDisk.CurAddress > VIRTUAL_UDISK_LEN)
  501. {
  502. return -1;
  503. }
  504. memcpy(&prvLuatOS_VirtualUDisk.VirtualData[prvLuatOS_VirtualUDisk.CurAddress], Data, Len);
  505. prvLuatOS_VirtualUDisk.CurAddress += Len;
  506. return 0;
  507. }
  508. static int32_t prvCore_SCSIUserCmd(USB_EndpointDataStruct *pEpData, MSC_SCSICtrlStruct *pMSC)
  509. {
  510. return -1;
  511. }
  512. static int32_t prvCore_SCSIGetMaxLUN(uint8_t *LUN, void *pUserData)
  513. {
  514. *LUN = 0;
  515. }
  516. static const USB_StorageSCSITypeDef prvCore_SCSIFun =
  517. {
  518. prvCore_SCSIGetMaxLUN,
  519. prvCore_SCSIInit,
  520. prvCore_SCSIGetCapacity,
  521. prvCore_SCSIIsReady,
  522. prvCore_SCSIIsWriteProtected,
  523. prvCore_SCSIPreRead,
  524. prvCore_SCSIRead,
  525. prvCore_SCSIPreWrite,
  526. prvCore_SCSIWrite,
  527. prvCore_SCSIUserCmd,
  528. &prvCore_StandardInquiryData,
  529. &prvCore_MSCPage00InquiryData,
  530. &prvCore_MSCPage80InquiryData,
  531. &prvCore_MSCModeSense6data,
  532. &prvCore_MSCModeSense10data,
  533. };
  534. static void prvCore_VUartOpen(Virtual_UartCtrlStruct *pVUart, uint8_t UartID)
  535. {
  536. pVUart->USBOnOff = 1;
  537. if (pVUart->TxBuf.Data)
  538. {
  539. DBG("send last data %ubyte", pVUart->TxBuf.MaxLen);
  540. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  541. }
  542. else if (pVUart->TxCacheBuf.Pos)
  543. {
  544. DBG("send cache data %ubyte", pVUart->TxCacheBuf.Pos);
  545. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  546. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  547. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  548. }
  549. pVUart->CB(UartID, UART_CB_CONNECTED);
  550. }
  551. static int32_t prvCore_VUartRxTimeoutCB(void *pData, void *pParam)
  552. {
  553. uint32_t UartID = (uint32_t)pParam;
  554. prvLuatOS_VirtualUart[UartID].CB(UartID, UART_CB_RX_TIMEOUT);
  555. }
  556. static int32_t prvCore_VHIDDummyCB(void *pData, void *pParam)
  557. {
  558. return 0;
  559. }
  560. static int32_t prvCore_VUartDummyCB(void *pData, void *pParam)
  561. {
  562. return 0;
  563. }
  564. static int32_t prvCore_VMSCDummyCB(void *pData, void *pParam)
  565. {
  566. return 0;
  567. }
  568. static void prvCore_VHIDSetReady(uint8_t OnOff)
  569. {
  570. if (prvLuatOS_VirtualHID.IsReady != OnOff)
  571. {
  572. prvLuatOS_VirtualHID.IsReady = OnOff;
  573. prvLuatOS_VirtualHID.CB(prvLuatOS_VirtualHID.USB_ID, prvLuatOS_VirtualHID.IsReady);
  574. }
  575. }
  576. static int32_t prvCore_USBEp0CB(void *pData, void *pParam)
  577. {
  578. int32_t Result = -ERROR_CMD_NOT_SUPPORT;
  579. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  580. USB_StorageSCSITypeDef *pUserFun = (USB_StorageSCSITypeDef *)prvLuatOS_SCSI.pSCSIUserFunList;
  581. uint16_t wLength, wValue;
  582. Virtual_UartCtrlStruct *pVUart;
  583. DBG("%d,%d,%d,%d", pEpData->USB_ID, pEpData->EpIndex, pEpData->IsToDevice, pEpData->Len);
  584. if (!pEpData->IsDataStage)
  585. {
  586. wLength = BytesGetLe16(pEpData->pLastRequest->wLength);
  587. if (pEpData->IsToDevice)
  588. {
  589. switch (pEpData->pLastRequest->bRequest)
  590. {
  591. case UCDC_SET_CONTROL_LINE_STATE:
  592. pVUart = &prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN];
  593. switch (pEpData->pLastRequest->wValue[0])
  594. {
  595. case 0:
  596. //close serial
  597. pVUart->USBOnOff = 0;
  598. pVUart->CB(pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN, UART_CB_ERROR);
  599. break;
  600. case 1:
  601. case 3:
  602. //open serial
  603. prvCore_VUartOpen(pVUart, pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN);
  604. prvLuatOS_VirtualUart[pEpData->pLastRequest->wIndex[0] - DEVICE_INTERFACE_SERIAL_SN].USBOnOff = 1;
  605. break;
  606. }
  607. Result = ERROR_NONE;
  608. break;
  609. case USB_HID_REQ_SET_IDLE:
  610. prvCore_VHIDSetReady(1);
  611. Result = ERROR_NONE;
  612. break;
  613. case UR_GET_DESCRIPTOR:
  614. switch(pEpData->pLastRequest->wValue[1])
  615. {
  616. case USB_HID_REPORT_DESC:
  617. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, prvCore_HIDReportDesc, sizeof(prvCore_HIDReportDesc), wLength, 1);
  618. Result = ERROR_NONE;
  619. break;
  620. }
  621. break;
  622. case MSC_GET_MAX_LUN:
  623. pUserFun->GetMaxLUN(&prvLuatOS_SCSI.LogicalUnitNum, prvLuatOS_SCSI.pUserData);
  624. USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, &prvLuatOS_SCSI.LogicalUnitNum, 1, wLength, 1);
  625. Result = ERROR_NONE;
  626. break;
  627. case MSC_RESET:
  628. Result = ERROR_NONE;
  629. break;
  630. }
  631. }
  632. }
  633. return Result;
  634. }
  635. static int32_t prvCore_MSCCB(void *pData, void *pParam)
  636. {
  637. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  638. USB_MSCHandle(pEpData, &prvLuatOS_SCSI);
  639. return ERROR_NONE;
  640. }
  641. static int32_t prvCore_HIDCB(void *pData, void *pParam)
  642. {
  643. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  644. uint32_t USB_ID = (uint32_t)pParam;
  645. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  646. if (pEpData->IsToDevice)
  647. {
  648. prvCore_VHIDSetReady(1);
  649. }
  650. else
  651. {
  652. OS_DeInitBuffer(&pVHID->TxBuf);
  653. if (pVHID->TxCacheBuf.Pos)
  654. {
  655. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  656. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  657. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  658. }
  659. else
  660. {
  661. pVHID->CB(USB_ID, USB_HID_SEND_DONE);
  662. }
  663. }
  664. return ERROR_NONE;
  665. }
  666. static int32_t prvCore_SerialCB(void *pData, void *pParam)
  667. {
  668. USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
  669. uint32_t UartID = (uint32_t)pParam;
  670. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  671. if (pEpData->IsToDevice)
  672. {
  673. //open serial
  674. if (!pVUart->USBOnOff)
  675. {
  676. prvCore_VUartOpen(pVUart, UartID);
  677. }
  678. if (pEpData->Data && pEpData->Len)
  679. {
  680. if ((pVUart->RxBuf.Pos + pEpData->Len) >= pVUart->RxBuf.MaxLen)
  681. {
  682. OS_ReSizeBuffer(&pVUart->RxBuf, pVUart->RxBuf.MaxLen * 2);
  683. }
  684. OS_BufferWrite(&pVUart->RxBuf, pEpData->Data, pEpData->Len);
  685. if (pEpData->IsDataStage && pVUart->RxTimeoutUS)
  686. {
  687. Timer_StartUS(pVUart->RxTimer, pVUart->RxTimeoutUS, 0);
  688. }
  689. else
  690. {
  691. Timer_Stop(pVUart->RxTimer);
  692. pVUart->CB(UartID, UART_CB_RX_NEW);
  693. }
  694. }
  695. }
  696. else
  697. {
  698. OS_DeInitBuffer(&pVUart->TxBuf);
  699. if (pVUart->TxCacheBuf.Pos)
  700. {
  701. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  702. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  703. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  704. }
  705. else
  706. {
  707. pVUart->CB(UartID, UART_CB_TX_ALL_DONE);
  708. }
  709. }
  710. return ERROR_NONE;
  711. }
  712. static int32_t prvCore_USBStateCB(void *pData, void *pParam)
  713. {
  714. PV_Union uPV;
  715. uint8_t i;
  716. uPV.p = pData;
  717. switch(uPV.u8[1])
  718. {
  719. case USBD_BUS_TYPE_DISCONNECT:
  720. prvCore_VHIDSetReady(0);
  721. USB_MSCReset(&prvLuatOS_SCSI);
  722. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  723. {
  724. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  725. prvLuatOS_VirtualUart[i].CB(i, UART_CB_ERROR);
  726. }
  727. break;
  728. case USBD_BUS_TYPE_ENABLE_CONNECT:
  729. USB_StackStartDevice(uPV.u8[0]);
  730. break;
  731. }
  732. }
  733. void Core_USBDefaultDeviceStart(uint8_t USB_ID)
  734. {
  735. uint8_t langid[2] = {0x09, 0x04};
  736. int i;
  737. prvLuatOS_VirtualHID.USB_ID = USB_ID;
  738. prvLuatOS_VirtualHID.IsReady = 0;
  739. prvLuatOS_VirtualHID.ToHostEpIndex = DEVICE_HID_KEYBOARD_EP_IN;
  740. prvLuatOS_VirtualUDisk.BlockTotalNums = VIRTUAL_UDISK_BLOCKS_NUMS;
  741. prvLuatOS_VirtualUDisk.BlockSize = VIRTUAL_UDISK_BLOCKS_LEN;
  742. prvLuatOS_SCSI.LogicalUnitNum = 0;
  743. prvLuatOS_SCSI.ToHostEpIndex = DEVICE_MASS_STORAGE_EP_IN;
  744. prvLuatOS_SCSI.ToDeviceEpIndex = DEVICE_MASS_STORAGE_EP_OUT;
  745. prvLuatOS_SCSI.pSCSIUserFunList = &prvCore_SCSIFun;
  746. if (!prvLuatOS_VirtualHID.CB)
  747. {
  748. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  749. }
  750. OS_ReInitBuffer(&prvLuatOS_VirtualHID.TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  751. USB_StackPowerOnOff(USB_ID, 1);
  752. USB_StackStop(USB_ID);
  753. USB_StackClearSetup(USB_ID);
  754. USB_StackSetDeviceBusPower(USB_ID, 1);
  755. USB_StackSetEpCB(USB_ID, 0, prvCore_USBEp0CB, NULL);
  756. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_IN, prvCore_HIDCB, USB_ID);
  757. USB_StackSetEpCB(USB_ID, DEVICE_HID_KEYBOARD_EP_OUT, prvCore_HIDCB, USB_ID);
  758. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_IN, prvCore_MSCCB, USB_ID);
  759. USB_StackSetEpCB(USB_ID, DEVICE_MASS_STORAGE_EP_OUT, prvCore_MSCCB, USB_ID);
  760. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_IN, prvCore_SerialCB, VIRTUAL_UART0);
  761. USB_StackSetEpCB(USB_ID, DEVICE_GENERIC_SERIAL_EP_OUT, prvCore_SerialCB, VIRTUAL_UART0);
  762. USB_StackSetDeviceConfig(USB_ID, &prvCore_DeviceDesc, &prvCore_FullConfig, 1, USBD_IDX_INTERFACE0_STR + 3, prvCore_USBStateCB, NULL);
  763. USB_StackSetCharString(USB_ID, USBD_IDX_LANGID_STR, langid, 2);
  764. USB_StackSetCharString(USB_ID, USBD_IDX_MANUFACTURER_STR, prvCore_StringManufacturer, sizeof(prvCore_StringManufacturer));
  765. USB_StackSetCharString(USB_ID, USBD_IDX_PRODUCT_STR, prvCore_StringProduct, sizeof(prvCore_StringProduct));
  766. USB_StackSetCharString(USB_ID, USBD_IDX_SERIAL_STR, prvCore_StringSerial, sizeof(prvCore_StringSerial));
  767. USB_StackSetCharString(USB_ID, USBD_IDX_CONFIG_STR, prvCore_StringConfig, sizeof(prvCore_StringConfig));
  768. for(i = 0; i < 3; i++)
  769. {
  770. USB_StackSetCharString(USB_ID, USBD_IDX_INTERFACE0_STR + i, prvCore_StringInterface[i], strlen(prvCore_StringInterface[i]));
  771. }
  772. for(i = 0; i < VIRTUAL_UART_MAX; i++)
  773. {
  774. prvLuatOS_VirtualUart[i].USBOnOff = 0;
  775. prvLuatOS_VirtualUart[i].USB_ID = USB_ID;
  776. if (!prvLuatOS_VirtualUart[i].RxTimer)
  777. {
  778. prvLuatOS_VirtualUart[i].RxTimer = Timer_Create(prvCore_VUartRxTimeoutCB, i, NULL);
  779. }
  780. if (!prvLuatOS_VirtualUart[i].CB)
  781. {
  782. prvLuatOS_VirtualUart[i].CB = prvCore_VUartDummyCB;
  783. }
  784. prvLuatOS_VirtualUart[i].RxTimeoutUS = 150;
  785. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  786. OS_ReInitBuffer(&prvLuatOS_VirtualUart[i].RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  787. }
  788. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToDeviceEpIndex = DEVICE_GENERIC_SERIAL_EP_IN;
  789. prvLuatOS_VirtualUart[VIRTUAL_UART0].ToHostEpIndex = DEVICE_GENERIC_SERIAL_EP_OUT;
  790. prvLuatOS_VirtualUDisk.VirtualData = prvLuatOS_VirtualUart[VIRTUAL_UART0].TxCacheBuf.Data;
  791. USB_MSCReset(&prvLuatOS_SCSI);
  792. USB_StackStartDevice(USB_ID);
  793. }
  794. void Core_VHIDInit(uint8_t USB_ID, CBFuncEx_t CB)
  795. {
  796. if (CB)
  797. {
  798. prvLuatOS_VirtualHID.CB = CB;
  799. }
  800. else
  801. {
  802. prvLuatOS_VirtualHID.CB = prvCore_VHIDDummyCB;
  803. }
  804. }
  805. void Core_VUartInit(uint8_t UartID, uint32_t BaudRate, uint8_t IsRxCacheEnable, uint8_t DataBits, uint8_t Parity, uint8_t StopBits, CBFuncEx_t CB)
  806. {
  807. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  808. // switch(UartID)
  809. // {
  810. // case VIRTUAL_UART0:
  811. // if (!prvService.IsUSBOpen)
  812. // {
  813. // Core_USBDefaultDeviceStart(USB_ID0);
  814. // prvService.IsUSBOpen = 1;
  815. // }
  816. // break;
  817. // }
  818. if (CB)
  819. {
  820. pVUart->CB = CB;
  821. }
  822. else
  823. {
  824. pVUart->CB = prvCore_VUartDummyCB;
  825. }
  826. pVUart->UartOnOff = 1;
  827. }
  828. void Core_VUartDeInit(uint8_t UartID)
  829. {
  830. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  831. pVUart->UartOnOff = 0;
  832. }
  833. void Core_VUartSetRxTimeout(uint8_t UartID, uint32_t TimeoutUS)
  834. {
  835. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  836. pVUart->RxTimeoutUS = TimeoutUS;
  837. }
  838. void Core_VUartSetCb(uint8_t UartID, CBFuncEx_t CB)
  839. {
  840. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  841. if (CB)
  842. {
  843. pVUart->CB = CB;
  844. }
  845. else
  846. {
  847. pVUart->CB = prvCore_VUartDummyCB;
  848. }
  849. }
  850. uint32_t Core_VUartRxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  851. {
  852. uint32_t ReadLen;
  853. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  854. switch(UartID)
  855. {
  856. case VIRTUAL_UART0:
  857. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 0);
  858. break;
  859. }
  860. if (!Len)
  861. {
  862. ReadLen = pVUart->RxBuf.Pos;
  863. goto READ_END;
  864. }
  865. ReadLen = (pVUart->RxBuf.Pos < Len)?pVUart->RxBuf.Pos:Len;
  866. memcpy(Data, pVUart->RxBuf.Data, ReadLen);
  867. OS_BufferRemove(&pVUart->RxBuf, ReadLen);
  868. if (!pVUart->RxBuf.Pos && pVUart->RxBuf.MaxLen > VIRTUAL_SERIAL_BUFFER_LEN)
  869. {
  870. OS_ReInitBuffer(&pVUart->RxBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  871. }
  872. READ_END:
  873. switch(UartID)
  874. {
  875. case VIRTUAL_UART0:
  876. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToDeviceEpIndex, 1, 1);
  877. break;
  878. }
  879. return ReadLen;
  880. }
  881. int32_t Core_VUartBufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  882. {
  883. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  884. switch(UartID)
  885. {
  886. case VIRTUAL_UART0:
  887. if (!pVUart->USBOnOff)
  888. {
  889. return -1;
  890. }
  891. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  892. break;
  893. }
  894. if (Data && Len)
  895. {
  896. OS_BufferWrite(&pVUart->TxCacheBuf, Data, Len);
  897. }
  898. if (pVUart->TxBuf.Data || pVUart->TxBuf.MaxLen)
  899. {
  900. goto TX_END;
  901. }
  902. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  903. Buffer_StaticInit(&pVUart->TxBuf, pVUart->TxCacheBuf.Data, pVUart->TxCacheBuf.Pos);
  904. OS_InitBuffer(&pVUart->TxCacheBuf, VIRTUAL_SERIAL_BUFFER_LEN);
  905. USB_StackTxEpData(pVUart->USB_ID, pVUart->ToHostEpIndex, pVUart->TxBuf.Data, pVUart->TxBuf.MaxLen, pVUart->TxBuf.MaxLen, 0);
  906. TX_END:
  907. switch(UartID)
  908. {
  909. case VIRTUAL_UART0:
  910. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  911. break;
  912. }
  913. return 0;
  914. }
  915. void Core_VUartBufferTxStop(uint8_t UartID)
  916. {
  917. Virtual_UartCtrlStruct *pVUart = &prvLuatOS_VirtualUart[UartID];
  918. switch(UartID)
  919. {
  920. case VIRTUAL_UART0:
  921. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 0);
  922. break;
  923. }
  924. OS_DeInitBuffer(&pVUart->TxBuf);
  925. pVUart->TxCacheBuf.Pos = 0;
  926. USB_StackStopDeviceTx(pVUart->USB_ID, pVUart->ToHostEpIndex, 0);
  927. switch(UartID)
  928. {
  929. case VIRTUAL_UART0:
  930. USB_StackEpIntOnOff(pVUart->USB_ID, pVUart->ToHostEpIndex, 0, 1);
  931. break;
  932. }
  933. }
  934. void Core_VHIDUploadData(uint8_t USB_ID, uint8_t *Data, uint16_t Len)
  935. {
  936. if (!prvLuatOS_VirtualHID.IsReady) return;
  937. USB_HIDKeyValue HIDKey;
  938. USB_HIDKeyBoradKeyStruct HIDKeyBoard;
  939. uint16_t Pos;
  940. volatile uint8_t IsShift, i, LastValue;
  941. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  942. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  943. if (Data && Len)
  944. {
  945. if ((Len*16 + pVHID->TxCacheBuf.Pos) > pVHID->TxCacheBuf.MaxLen)
  946. {
  947. OS_ReSizeBuffer(&pVHID->TxCacheBuf, Len*16 + pVHID->TxCacheBuf.Pos);
  948. }
  949. Pos = 0;
  950. while(Pos < Len)
  951. {
  952. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  953. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  954. Pos++;
  955. IsShift = HIDKey.Shift;
  956. LastValue = HIDKey.Value;
  957. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  958. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  959. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  960. ADD_REST:
  961. for(i = 1; i < 4; i++)
  962. {
  963. HIDKey = USB_HIDGetValueFromAscii(Data[Pos]);
  964. Pos++;
  965. if ((IsShift != HIDKey.Shift))
  966. {
  967. //shift发生切换,必须换新的data
  968. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  969. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  970. //加入一个抬起的data
  971. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  972. IsShift = HIDKey.Shift;
  973. LastValue = HIDKey.Value;
  974. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  975. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  976. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  977. if (Pos < Len)
  978. {
  979. goto ADD_REST;
  980. }
  981. else
  982. {
  983. break;
  984. }
  985. }
  986. else if (LastValue == HIDKey.Value)
  987. {
  988. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  989. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  990. //加入一个抬起的data
  991. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  992. IsShift = HIDKey.Shift;
  993. LastValue = HIDKey.Value;
  994. HIDKeyBoard.SPECIALHID_KEY_b.RightShift = IsShift;
  995. HIDKeyBoard.PressKey[0] = HIDKey.Value;
  996. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], 0, HIDKey.Value, HIDKey.Shift);
  997. if (Pos < Len)
  998. {
  999. goto ADD_REST;
  1000. }
  1001. else
  1002. {
  1003. break;
  1004. }
  1005. }
  1006. else
  1007. {
  1008. LastValue = HIDKey.Value;
  1009. HIDKeyBoard.PressKey[i] = HIDKey.Value;
  1010. // DBG("%u,%c,%d,%x,%d", Pos - 1, Data[Pos - 1], i, HIDKey.Value, HIDKey.Shift);
  1011. if (Pos >= Len)
  1012. {
  1013. break;
  1014. }
  1015. }
  1016. }
  1017. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1018. //加入一个抬起的data
  1019. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1020. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1021. }
  1022. //加入一个抬起的data
  1023. memset(&HIDKeyBoard, 0, sizeof(USB_HIDKeyBoradKeyStruct));
  1024. OS_BufferWrite(&pVHID->TxCacheBuf, &HIDKeyBoard, sizeof(HIDKeyBoard));
  1025. }
  1026. // pVHID->TxCacheBuf.Pos = 0;
  1027. // return;
  1028. if (pVHID->TxBuf.Data || pVHID->TxBuf.MaxLen)
  1029. {
  1030. goto UPLOAD_END;
  1031. }
  1032. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  1033. Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
  1034. OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
  1035. USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
  1036. UPLOAD_END:
  1037. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1038. }
  1039. void Core_VHIDUploadStop(uint8_t USB_ID)
  1040. {
  1041. Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
  1042. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
  1043. OS_DeInitBuffer(&pVHID->TxBuf);
  1044. pVHID->TxCacheBuf.Pos = 0;
  1045. USB_StackStopDeviceTx(pVHID->USB_ID, pVHID->ToHostEpIndex, 0);
  1046. USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
  1047. }
  1048. static void prvCore_LCDCmd(LCD_DrawStruct *Draw, uint8_t Cmd)
  1049. {
  1050. GPIO_Output(Draw->DCPin, 0);
  1051. if (Draw->DCDelay)
  1052. {
  1053. SysTickDelay(Draw->DCDelay * CORE_TICK_1US);
  1054. }
  1055. GPIO_Output(Draw->CSPin, 0);
  1056. SPI_BlockTransfer(Draw->SpiID, &Cmd, NULL, 1);
  1057. GPIO_Output(Draw->CSPin, 1);
  1058. GPIO_Output(Draw->DCPin, 1);
  1059. // SysTickDelay(300);
  1060. }
  1061. static void prvCore_LCDData(LCD_DrawStruct *Draw, uint8_t *Data, uint32_t Len)
  1062. {
  1063. GPIO_Output(Draw->CSPin, 0);
  1064. SPI_BlockTransfer(Draw->SpiID, Data, NULL, Len);
  1065. GPIO_Output(Draw->CSPin, 1);
  1066. }
  1067. static uint16_t RGB888toRGB565(uint8_t red, uint8_t green, uint8_t blue, uint8_t IsBe)
  1068. {
  1069. uint16_t B = (blue >> 3) & 0x001F;
  1070. uint16_t G = ((green >> 2) << 5) & 0x07E0;
  1071. uint16_t R = ((red >> 3) << 11) & 0xF800;
  1072. uint16_t C = (R | G | B);
  1073. if (IsBe)
  1074. {
  1075. C = (C >> 8) | ((C & 0x00ff) << 8);
  1076. }
  1077. return C;
  1078. }
  1079. static void prvHW_Task(void* params)
  1080. {
  1081. uint64_t StartUS;
  1082. OS_EVENT Event;
  1083. int32_t Result;
  1084. LCD_DrawStruct *Draw;
  1085. PV_Union uPV;
  1086. uint16_t uColor[256];
  1087. uint32_t i, j, Size;
  1088. for(i = 0; i < 256; i++)
  1089. {
  1090. uColor[i] = RGB888toRGB565(i, i, i, 1);
  1091. }
  1092. while(1)
  1093. {
  1094. Result = Task_GetEvent(prvService.HardwareHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  1095. switch(Event.ID)
  1096. {
  1097. case SERVICE_LCD_DRAW:
  1098. Draw = (LCD_DrawStruct *)Event.Param1;
  1099. if (Draw->Speed > 30000000)
  1100. {
  1101. SPI_SetTxOnlyFlag(Draw->SpiID, 1);
  1102. }
  1103. SPI_SetNewConfig(Draw->SpiID, Draw->Speed, Draw->Mode);
  1104. SPI_DMATxInit(Draw->SpiID, LCD_SPI_TX_DMA_STREAM, 0);
  1105. SPI_DMARxInit(Draw->SpiID, LCD_SPI_RX_DMA_STREAM, 0);
  1106. prvCore_LCDCmd(Draw, 0x2a);
  1107. BytesPutBe16(uPV.u8, Draw->x1 + Draw->xoffset);
  1108. BytesPutBe16(uPV.u8 + 2, Draw->x2 + Draw->xoffset);
  1109. prvCore_LCDData(Draw, uPV.u8, 4);
  1110. prvCore_LCDCmd(Draw, 0x2b);
  1111. BytesPutBe16(uPV.u8, Draw->y1 + Draw->yoffset);
  1112. BytesPutBe16(uPV.u8 + 2, Draw->y2 + Draw->yoffset);
  1113. prvCore_LCDData(Draw, uPV.u8, 4);
  1114. prvCore_LCDCmd(Draw, 0x2c);
  1115. GPIO_Output(Draw->CSPin, 0);
  1116. // StartUS = GetSysTickUS();
  1117. // SPI_Transfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size, 2);
  1118. SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
  1119. // DBG("%u, %u", Draw->Size, (uint32_t)(GetSysTickUS() - StartUS));
  1120. prvService.LCDDrawDoneByte += Draw->Size;
  1121. free(Draw->Data);
  1122. GPIO_Output(Draw->CSPin, 1);
  1123. free(Draw);
  1124. SPI_SetTxOnlyFlag(Draw->SpiID, 0);
  1125. break;
  1126. case SERVICE_CAMERA_DRAW:
  1127. Draw = (LCD_DrawStruct *)Event.Param1;
  1128. SPI_SetTxOnlyFlag(Draw->SpiID, 1);
  1129. SPI_SetNewConfig(Draw->SpiID, Draw->Speed, Draw->Mode);
  1130. SPI_DMATxInit(Draw->SpiID, LCD_SPI_TX_DMA_STREAM, 0);
  1131. SPI_DMARxInit(Draw->SpiID, LCD_SPI_RX_DMA_STREAM, 0);
  1132. prvCore_LCDCmd(Draw, 0x2a);
  1133. BytesPutBe16(uPV.u8, Draw->x1 + Draw->xoffset);
  1134. BytesPutBe16(uPV.u8 + 2, Draw->x2 + Draw->xoffset);
  1135. prvCore_LCDData(Draw, uPV.u8, 4);
  1136. prvCore_LCDCmd(Draw, 0x2b);
  1137. BytesPutBe16(uPV.u8, Draw->y1 + Draw->yoffset);
  1138. BytesPutBe16(uPV.u8 + 2, Draw->y2 + Draw->yoffset);
  1139. prvCore_LCDData(Draw, uPV.u8, 4);
  1140. prvCore_LCDCmd(Draw, 0x2c);
  1141. GPIO_Output(Draw->CSPin, 0);
  1142. switch(Draw->ColorMode)
  1143. {
  1144. case COLOR_MODE_RGB_565:
  1145. SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
  1146. break;
  1147. case COLOR_MODE_GRAY:
  1148. Size = Draw->Size/10;
  1149. uPV.pu16 = malloc(Size * 2);
  1150. for(i = 0; i < 10; i++)
  1151. {
  1152. for(j = 0; j < Size; j++)
  1153. {
  1154. uPV.pu16[j] = uColor[Draw->Data[i * Size + j]];
  1155. }
  1156. SPI_BlockTransfer(Draw->SpiID, uPV.pu8, uPV.pu8, Size * 2);
  1157. }
  1158. free(uPV.pu16);
  1159. break;
  1160. }
  1161. free(Draw);
  1162. GPIO_Output(Draw->CSPin, 1);
  1163. SPI_SetTxOnlyFlag(Draw->SpiID, 0);
  1164. break;
  1165. }
  1166. }
  1167. }
  1168. static void prvService_Task(void* params)
  1169. {
  1170. zbar_image_scanner_t *zbar_scanner;
  1171. zbar_image_t *zbar_image;
  1172. zbar_symbol_t *zbar_symbol;
  1173. CBDataFun_t CBDataFun;
  1174. PV_Union uPV;
  1175. OS_EVENT Event;
  1176. // Audio_Test();
  1177. while(1)
  1178. {
  1179. Task_GetEventByMS(prvService.ServiceHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  1180. switch(Event.ID)
  1181. {
  1182. case SERVICE_SCAN_KEYBOARD:
  1183. SoftKB_ScanOnce();
  1184. break;
  1185. case SERVICE_USB_ACTION:
  1186. switch (Event.Param2)
  1187. {
  1188. case SERV_USB_RESET_END:
  1189. DBG("USB%d reset", Event.Param1);
  1190. Task_DelayMS(1);
  1191. USB_StackDeviceAfterDisconnect(Event.Param1);
  1192. break;
  1193. case SERV_USB_RESUME_END:
  1194. Task_DelayMS(20);
  1195. USB_ResumeEnd(Event.Param3);
  1196. break;
  1197. case SERV_USB_SUSPEND:
  1198. DBG("USB%d suspend", Event.Param1);
  1199. break;
  1200. case SERV_USB_RESUME:
  1201. break;
  1202. }
  1203. break;
  1204. case SERVICE_DECODE_QR:
  1205. if (Event.Param3)
  1206. {
  1207. CBDataFun = (CBDataFun_t)(Event.Param3);
  1208. uPV.u32 = Event.Param2;
  1209. zbar_scanner = zbar_image_scanner_create();
  1210. zbar_image_scanner_set_config(zbar_scanner, 0, ZBAR_CFG_ENABLE, 1);
  1211. zbar_image = zbar_image_create();
  1212. zbar_image_set_format(zbar_image, *(int*)"Y800");
  1213. zbar_image_set_size(zbar_image, uPV.u16[0], uPV.u16[1]);
  1214. zbar_image_set_data(zbar_image, Event.Param1, uPV.u16[0] * uPV.u16[1], zbar_image_free_data);
  1215. if (zbar_scan_image(zbar_scanner, zbar_image) > 0)
  1216. {
  1217. zbar_symbol = (zbar_symbol_t *)zbar_image_first_symbol(zbar_image);
  1218. free(Event.Param1);
  1219. CBDataFun(zbar_symbol->data, zbar_symbol->datalen);
  1220. }
  1221. else
  1222. {
  1223. free(Event.Param1);
  1224. CBDataFun(NULL, 0);
  1225. }
  1226. zbar_image_destroy(zbar_image);
  1227. zbar_image_scanner_destroy(zbar_scanner);
  1228. }
  1229. else
  1230. {
  1231. free(Event.Param1);
  1232. }
  1233. break;
  1234. }
  1235. }
  1236. }
  1237. extern int luat_fs_init(void);
  1238. static void prvLuatOS_Task(void* params)
  1239. {
  1240. // 文件系统初始化
  1241. // luat_fs_init();
  1242. // 载入LuatOS主入口
  1243. luat_main();
  1244. // 永不进入的代码, 避免编译警告.
  1245. // for(;;)
  1246. // {
  1247. // vTaskDelayUntil( &xLastWakeTime, 2000 * portTICK_RATE_MS );
  1248. // }
  1249. }
  1250. extern void luat_base_init(void);
  1251. uint32_t Core_LCDDrawCacheLen(void)
  1252. {
  1253. if (prvService.LCDDrawRequireByte > prvService.LCDDrawDoneByte)
  1254. {
  1255. return (uint32_t)(prvService.LCDDrawRequireByte - prvService.LCDDrawDoneByte);
  1256. }
  1257. else
  1258. {
  1259. return 0;
  1260. }
  1261. }
  1262. void Core_LCDDraw(LCD_DrawStruct *Draw)
  1263. {
  1264. prvService.LCDDrawRequireByte += Draw->Size;
  1265. Task_SendEvent(prvService.HardwareHandle, SERVICE_LCD_DRAW, Draw, 0, 0);
  1266. }
  1267. void Core_LCDDrawBlock(LCD_DrawStruct *Draw)
  1268. {
  1269. PV_Union uPV;
  1270. uint64_t StartUS;
  1271. // if (Draw->Speed > 30000000)
  1272. // {
  1273. // SPI_SetTxOnlyFlag(Draw->SpiID, 1);
  1274. // }
  1275. SPI_SetNewConfig(Draw->SpiID, Draw->Speed, Draw->Mode);
  1276. // SPI_DMATxInit(Draw->SpiID, LCD_SPI_TX_DMA_STREAM, 0);
  1277. // SPI_DMARxInit(Draw->SpiID, LCD_SPI_RX_DMA_STREAM, 0);
  1278. prvCore_LCDCmd(Draw, 0x2a);
  1279. BytesPutBe16(uPV.u8, Draw->x1 + Draw->xoffset);
  1280. BytesPutBe16(uPV.u8 + 2, Draw->x2 + Draw->xoffset);
  1281. prvCore_LCDData(Draw, uPV.u8, 4);
  1282. prvCore_LCDCmd(Draw, 0x2b);
  1283. BytesPutBe16(uPV.u8, Draw->y1 + Draw->yoffset);
  1284. BytesPutBe16(uPV.u8 + 2, Draw->y2 + Draw->yoffset);
  1285. prvCore_LCDData(Draw, uPV.u8, 4);
  1286. prvCore_LCDCmd(Draw, 0x2c);
  1287. GPIO_Output(Draw->CSPin, 0);
  1288. // StartUS = GetSysTickUS();
  1289. // SPI_Transfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size, 2);
  1290. SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
  1291. // DBG("%u, %u", Draw->Size, (uint32_t)(GetSysTickUS() - StartUS));
  1292. // if (Draw->Speed > 30000000)
  1293. // {
  1294. // Task_DelayUS(1);
  1295. // }
  1296. GPIO_Output(Draw->CSPin, 1);
  1297. SPI_SetTxOnlyFlag(Draw->SpiID, 0);
  1298. }
  1299. void Core_CameraDraw(LCD_DrawStruct *Draw)
  1300. {
  1301. Task_SendEvent(prvService.HardwareHandle, SERVICE_CAMERA_DRAW, Draw, 0, 0);
  1302. }
  1303. void Core_DecodeQR(uint8_t *ImageData, uint16_t ImageW, uint16_t ImageH, CBDataFun_t CB)
  1304. {
  1305. PV_Union uPV;
  1306. uPV.u16[0] = ImageW;
  1307. uPV.u16[1] = ImageH;
  1308. Task_SendEvent(prvService.ServiceHandle, SERVICE_DECODE_QR, ImageData, uPV.u32, CB);
  1309. }
  1310. void Core_USBAction(uint8_t USB_ID, uint8_t Action, void *pParam)
  1311. {
  1312. Task_SendEvent(prvService.ServiceHandle, SERVICE_USB_ACTION, USB_ID, Action, pParam);
  1313. }
  1314. void Core_ScanKeyBoard(void)
  1315. {
  1316. Task_SendEvent(prvService.ServiceHandle, SERVICE_SCAN_KEYBOARD, 0, 0, 0);
  1317. }
  1318. void Core_PrintMemInfo(void)
  1319. {
  1320. uint32_t curalloc, totfree, maxfree;
  1321. OS_MemInfo(&curalloc, &totfree, &maxfree);
  1322. DBG("curalloc %uB, totfree %uB, maxfree %uB", curalloc, totfree, maxfree);
  1323. }
  1324. static uint8_t disassembly_ins_is_bl_blx(uint32_t addr) {
  1325. uint16_t ins1 = *((uint16_t *)addr);
  1326. uint16_t ins2 = *((uint16_t *)(addr + 2));
  1327. #define BL_INS_MASK 0xF800
  1328. #define BL_INS_HIGH 0xF800
  1329. #define BL_INS_LOW 0xF000
  1330. #define BLX_INX_MASK 0xFF00
  1331. #define BLX_INX 0x4700
  1332. if ((ins2 & BL_INS_MASK) == BL_INS_HIGH && (ins1 & BL_INS_MASK) == BL_INS_LOW) {
  1333. return 1;
  1334. } else if ((ins2 & BLX_INX_MASK) == BLX_INX) {
  1335. return 1;
  1336. } else {
  1337. return 0;
  1338. }
  1339. }
  1340. static void prvCore_PrintTaskStack(HANDLE TaskHandle)
  1341. {
  1342. uint32_t SP, StackAddress, Len, i, PC;
  1343. uint32_t Buffer[16];
  1344. if (!TaskHandle) return;
  1345. char *Name = vTaskInfo(TaskHandle, &SP, &StackAddress, &Len);
  1346. Len *= 4;
  1347. DBG_Trace("%s call stack info:", Name);
  1348. for(i = 0; i < 16, SP < StackAddress + Len; SP += 4)
  1349. {
  1350. PC = *((uint32_t *) SP) - 4;
  1351. if ((PC > __FLASH_APP_START_ADDR__) && (PC < (__FLASH_BASE_ADDR__ + __CORE_FLASH_BLOCK_NUM__ * __FLASH_BLOCK_SIZE__)))
  1352. {
  1353. if (PC % 2 == 0) {
  1354. continue;
  1355. }
  1356. PC = *((uint32_t *) SP) - 1;
  1357. if (disassembly_ins_is_bl_blx(PC - 4))
  1358. {
  1359. DBG_Trace("%x", PC);
  1360. i++;
  1361. }
  1362. }
  1363. }
  1364. }
  1365. void Core_PrintServiceStack(void)
  1366. {
  1367. prvCore_PrintTaskStack(prvService.HardwareHandle);
  1368. prvCore_PrintTaskStack(prvService.UserHandle);
  1369. prvCore_PrintTaskStack(prvService.ServiceHandle);
  1370. }
  1371. void Core_DebugMem(uint8_t HeapID, const char *FuncName, uint32_t Line)
  1372. {
  1373. int32_t curalloc, totfree, maxfree;
  1374. OS_MemInfo(&curalloc, &totfree, &maxfree);
  1375. if (!prvService.InitAllocMem)
  1376. {
  1377. prvService.InitAllocMem = curalloc;
  1378. prvService.LastAllocMem = curalloc;
  1379. DBG_Printf("base %d\r\n", prvService.InitAllocMem);
  1380. }
  1381. else
  1382. {
  1383. DBG_Printf("%s %u:total %d last %d\r\n", FuncName, Line, curalloc - prvService.InitAllocMem, curalloc - prvService.LastAllocMem);
  1384. prvService.LastAllocMem = curalloc;
  1385. }
  1386. }
  1387. void Core_HWTaskInit(void)
  1388. {
  1389. prvService.HardwareHandle = Task_Create(prvHW_Task, NULL, 4 * 1024, HW_TASK_PRO, "HW task");
  1390. }
  1391. void Core_ServiceInit(void)
  1392. {
  1393. prvService.ServiceHandle = Task_Create(prvService_Task, NULL, 8 * 1024, SERVICE_TASK_PRO, "Serv task");
  1394. }
  1395. void Core_UserTaskInit(void)
  1396. {
  1397. #ifdef __LUATOS__
  1398. prvService.UserHandle = Task_Create(prvLuatOS_Task, NULL, 16*1024, LUATOS_TASK_PRO, "luatos task");
  1399. luat_base_init();
  1400. #endif
  1401. }
  1402. INIT_TASK_EXPORT(Core_HWTaskInit, "0");
  1403. INIT_TASK_EXPORT(Core_ServiceInit, "1");
  1404. INIT_TASK_EXPORT(Core_UserTaskInit, "2");
  1405. #endif