endpoints.c 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053
  1. #include <string.h>
  2. #include "lpc176x.h"
  3. #include "hal.h"
  4. #include "main.h"
  5. #include "usb_hardware.h"
  6. #ifdef USBTMC // #endif â êîíöå ôàéëà
  7. #define _ENDPOINTS_C_
  8. #include "endpoints.h"
  9. #include "usb_application.h"
  10. #include "usb_proto.h"
  11. #include "usbtmc.h"
  12. const BYTE abDescriptors_USBTMC[] =
  13. {
  14. // =======================================================================================
  15. // ============================ Device descriptor ========================================
  16. // =======================================================================================
  17. // ----------------------------------------------------------------------
  18. // # bLength
  19. sizeof(USB_DEVICE_DESCRIPTOR),
  20. // ----------------------------------------------------------------------
  21. // # bDescriptorType
  22. USB_DESCR_TYPE_DEVICE,
  23. // ----------------------------------------------------------------------
  24. // # bcdUSB
  25. TWOBYTES_LE(0x0200), //-- bcdUSB 2.00
  26. // ----------------------------------------------------------------------
  27. // # bDeviceClass // bDeviceClass >> ïî USBTMC âñåãäà 0x00
  28. 0x00,
  29. // ----------------------------------------------------------------------
  30. // # bDeviceSubClass // bDeviceSubClass >> ïî USBTMC âñåãäà 0x00
  31. 0x00,
  32. // ----------------------------------------------------------------------
  33. // # bDeviceProtocol // bDeviceProtocol >> ïî USBTMC âñåãäà 0x00
  34. 0x00,
  35. // ----------------------------------------------------------------------
  36. // # bMaxPacketSize äëÿ EP0, äëÿ USB 2.0 âñåãäà 64
  37. USB_MAX_PACKET0,
  38. // ----------------------------------------------------------------------
  39. // # idVendor - Planar
  40. TWOBYTES_LE(0x2226),
  41. // ----------------------------------------------------------------------
  42. // # idProduct - Auto Calibration Module SCPI
  43. TWOBYTES_LE(0x000F),
  44. // ----------------------------------------------------------------------
  45. // # bcdDevice 1.00
  46. TWOBYTES_LE(0x0100),
  47. // ----------------------------------------------------------------------
  48. // # iManufacturer - index of string 1
  49. 2,
  50. // ----------------------------------------------------------------------
  51. // # iProduct - index of string 2
  52. 1,
  53. // ----------------------------------------------------------------------
  54. // # iSerialNumber - index of string 3
  55. 4,
  56. #warning Íóæåí óíèêàëüíûé iSerialNumber, à íå 00000000. USBTMC spec, see 5.1 Device Descriptor Table 40 -- Device Descriptor
  57. // ---------------------------------------------------------------------
  58. // # bNumConfigurations
  59. 1,
  60. // =======================================================================================
  61. // ============================ Configuration descriptor =================================
  62. // =======================================================================================
  63. // # bLength
  64. sizeof(USB_CONFIGURATION_DESCRIPTOR),
  65. // ----------------------------------------------------------------------
  66. // # bDescriptorType
  67. USB_DESCR_TYPE_CONFIGURATION,
  68. // ----------------------------------------------------------------------
  69. // # wTotalLength
  70. TWOBYTES_LE(
  71. // length of configuration desc
  72. sizeof(USB_CONFIGURATION_DESCRIPTOR) +
  73. // length of interface desc
  74. sizeof(USB_INTERFACE_DESCRIPTOR) + //-- 1st Interface
  75. // length of bulk-endpoints phy4, phy5 desc, interrupt phy 3
  76. NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)
  77. ),
  78. // ----------------------------------------------------------------------
  79. // # bNumInterfaces
  80. 0x01,
  81. // ----------------------------------------------------------------------
  82. // # bConfigurationValue
  83. 0x01,
  84. // ----------------------------------------------------------------------
  85. // # iConfiguration
  86. 0x03,
  87. // ----------------------------------------------------------------------
  88. // # bmAttributes
  89. USB_CONFIG_BUS_POWERED | USB_CONFIG_REMOTE_WAKEUP,
  90. // ----------------------------------------------------------------------
  91. // # bMaxPower (mA /2)
  92. 100>>1,
  93. // =======================================================================================
  94. // ============================ Interface descriptor =====================================
  95. // =======================================================================================
  96. // # bLength
  97. sizeof(USB_INTERFACE_DESCRIPTOR),
  98. // ----------------------------------------------------------------------
  99. // # bDescriptorType
  100. USB_DESCR_TYPE_INTERFACE,
  101. // ----------------------------------------------------------------------
  102. // # bInterfaceNumber
  103. 0x00,
  104. // ----------------------------------------------------------------------
  105. // # bAlternateSetting
  106. 0x00,
  107. // ----------------------------------------------------------------------
  108. // # bNumEndPoints
  109. NUM_ENDPOINTS,
  110. // ----------------------------------------------------------------------
  111. // # bInterfaceClass // bInterfaceClass >> ïî USBTMC spec (page 33) == 0xFE
  112. 0xFE,
  113. // ----------------------------------------------------------------------
  114. // # bInterfaceSubClass // bInterfaceSubClass >> ïî USBTMC spec (page 33) == 0x03
  115. 0x03,
  116. // ----------------------------------------------------------------------
  117. // # bInterfaceProtocol // bInterfaceProtocol >> ïî USBTMC spec (page 33) == 0x01
  118. 0x01,
  119. // ----------------------------------------------------------------------
  120. // # iInterface // index of string descriptor describing this interface
  121. 3,
  122. // =======================================================================================
  123. // ================= Physical EndPoint 4 descriptor ======================================
  124. // =======================================================================================
  125. // # bLength
  126. sizeof(USB_ENDPOINT_DESCRIPTOR),
  127. // ----------------------------------------------------------------------
  128. // # bDescriptorType
  129. USB_DESCR_TYPE_ENDPOINT,
  130. // ----------------------------------------------------------------------
  131. // # bEndpointAddress, Out, EP4
  132. 0x02,
  133. // ----------------------------------------------------------------------
  134. // # bmAttributes, Bulk
  135. 0x02,
  136. // ----------------------------------------------------------------------
  137. // # wMaxPacketSize, 64
  138. TWOBYTES_LE(USB_MAX_PACKET2),
  139. // ----------------------------------------------------------------------
  140. // # bInterval, *ignored for bulk!*
  141. 0x00,
  142. // =======================================================================================
  143. // ================= Psysical EndPoint 5 descriptor ======================================
  144. // =======================================================================================
  145. // # bLength
  146. sizeof(USB_ENDPOINT_DESCRIPTOR),
  147. // ----------------------------------------------------------------------
  148. // # bDescriptorType
  149. USB_DESCR_TYPE_ENDPOINT,
  150. // ----------------------------------------------------------------------
  151. // # bEndpointAddress, In, EP5
  152. 0x82,
  153. // ----------------------------------------------------------------------
  154. // # bmAttributes, Bulk
  155. 0x02,
  156. // ----------------------------------------------------------------------
  157. // # wMaxPacketSize, 64
  158. TWOBYTES_LE(USB_MAX_PACKET2),
  159. // ----------------------------------------------------------------------
  160. // # bInterval, *ignored for bulk!*
  161. 0x00,
  162. // ----------------------------------------------------------------------
  163. #ifdef __SERIAL_POLL_SUPPORT__
  164. // =======================================================================================
  165. // ================= Psysical EndPoint 3 descriptor ======================================
  166. // =======================================================================================
  167. // # bLength
  168. sizeof(USB_ENDPOINT_DESCRIPTOR),
  169. // ----------------------------------------------------------------------
  170. // # bDescriptorType
  171. USB_DESCR_TYPE_ENDPOINT,
  172. // ----------------------------------------------------------------------
  173. // # bEndpointAddress, In, EP5
  174. 0x81,
  175. // ----------------------------------------------------------------------
  176. // # bmAttributes, Interrupt
  177. 0x03,
  178. // ----------------------------------------------------------------------
  179. // # wMaxPacketSize, 64
  180. TWOBYTES_LE(USB_MAX_PACKET1),
  181. // ----------------------------------------------------------------------
  182. // # bInterval, VALUE = 2 ^ (bInterval-1); 1<=VALUE<=16, see USB 2.0 Spec, Table 9-13. Standard Endpoint Descriptor (Continued)
  183. 0x08,
  184. // ----------------------------------------------------------------------
  185. #endif
  186. // =======================================================================================
  187. // ================== String descriptors =================================================
  188. // =======================================================================================
  189. // ##### 0 String Descriptior describes support languages ( USB-IF Spec )
  190. // # bLength
  191. 4,
  192. // ----------------------------------------------------------------------
  193. // # bDescriptorType
  194. USB_DESCR_TYPE_STRING,
  195. // ----------------------------------------------------------------------
  196. // # Lang - English
  197. TWOBYTES_LE(0x0409),
  198. // ----------------------------------------------------------------------
  199. #if defined(PLANAR)
  200. // ##### 1 String Descriptior describes device name
  201. // # bLength
  202. 38,
  203. // ----------------------------------------------------------------------
  204. // # DescriptorType
  205. USB_DESCR_TYPE_STRING,
  206. // ----------------------------------------------------------------------
  207. // Text in unicode
  208. 'A', 0,
  209. 'u', 0,
  210. 't', 0,
  211. 'o', 0,
  212. 'C', 0,
  213. 'a', 0,
  214. 'l', 0,
  215. ' ', 0,
  216. 'M', 0,
  217. 'o', 0,
  218. 'd', 0,
  219. 'u', 0,
  220. 'l', 0,
  221. 'e', 0,
  222. ' ', 0,
  223. 'A', 0,
  224. 'C', 0,
  225. 'M', 0,
  226. // ----------------------------------------------------------------------
  227. #elif defined(CMT)
  228. // ##### 1 String Descriptior describes device name
  229. // # bLength
  230. 38,
  231. // ----------------------------------------------------------------------
  232. // # DescriptorType
  233. USB_DESCR_TYPE_STRING,
  234. // ----------------------------------------------------------------------
  235. // Text in unicode
  236. 'A', 0,
  237. 'u', 0,
  238. 't', 0,
  239. 'o', 0,
  240. 'C', 0,
  241. 'a', 0,
  242. 'l', 0,
  243. ' ', 0,
  244. 'M', 0,
  245. 'o', 0,
  246. 'd', 0,
  247. 'u', 0,
  248. 'l', 0,
  249. 'e', 0,
  250. ' ', 0,
  251. 'A', 0,
  252. 'C', 0,
  253. 'M', 0,
  254. // ----------------------------------------------------------------------
  255. #else
  256. #error Please, specify VENDOR macro
  257. #endif
  258. #if defined(PLANAR)
  259. 68, //-- bLength
  260. USB_DESCR_TYPE_STRING, //-- bDescriptorType
  261. 'P', 0,
  262. 'l', 0,
  263. 'a', 0,
  264. 'n', 0,
  265. 'a', 0,
  266. 'r', 0,
  267. ' ', 0,
  268. '(', 0,
  269. 'h', 0,
  270. 't', 0,
  271. 't', 0,
  272. 'p', 0,
  273. ':', 0,
  274. '/', 0,
  275. '/', 0,
  276. 'w', 0,
  277. 'w', 0,
  278. 'w', 0,
  279. '.', 0,
  280. 'p', 0,
  281. 'l', 0,
  282. 'a', 0,
  283. 'n', 0,
  284. 'a', 0,
  285. 'r', 0,
  286. 'c', 0,
  287. 'h', 0,
  288. 'e', 0,
  289. 'l', 0,
  290. '.', 0,
  291. 'r', 0,
  292. 'u', 0,
  293. ')', 0,
  294. #elif defined(CMT)
  295. // ##### 2 String Descriptior describes manufacturer name
  296. // # bLength
  297. 122,
  298. // ----------------------------------------------------------------------
  299. // # DescriptorType
  300. USB_DESCR_TYPE_STRING, //-- bDescriptorType
  301. // ----------------------------------------------------------------------
  302. 'C', 0,
  303. 'o', 0,
  304. 'p', 0,
  305. 'p', 0,
  306. 'e', 0,
  307. 'r', 0,
  308. ' ', 0,
  309. 'M', 0,
  310. 'o', 0,
  311. 'u', 0,
  312. 'n', 0,
  313. 't', 0,
  314. 'a', 0,
  315. 'i', 0,
  316. 'n', 0,
  317. ' ', 0,//16
  318. 'T', 0,
  319. 'e', 0,
  320. 'c', 0,
  321. 'h', 0,
  322. 'n', 0,
  323. 'o', 0,
  324. 'l', 0,
  325. 'o', 0,
  326. 'g', 0,
  327. 'i', 0,
  328. 'e', 0,
  329. 's', 0,
  330. ' ', 0,
  331. '(', 0,
  332. 'h', 0,
  333. 't', 0, //32
  334. 't', 0,
  335. 'p', 0,
  336. ':', 0,
  337. '/', 0,
  338. '/', 0,
  339. 'c', 0,
  340. 'o', 0,
  341. 'p', 0,
  342. 'p', 0,
  343. 'e', 0,
  344. 'r', 0,
  345. 'm', 0,
  346. 'o', 0,
  347. 'u', 0,
  348. 'n', 0,
  349. 't', 0,
  350. 'a', 0,
  351. 'i', 0,
  352. 'n', 0,
  353. 't', 0,
  354. 'e', 0,
  355. 'c', 0,
  356. 'h', 0,
  357. '.', 0,
  358. 'c', 0,
  359. 'o', 0,
  360. 'm', 0,
  361. ')', 0, //60
  362. // ----------------------------------------------------------------------
  363. #else
  364. #error Please, specify VENDOR macro
  365. #endif
  366. // ##### 3 String Descriptior describes interface name
  367. // # bLength
  368. 28,
  369. // ----------------------------------------------------------------------
  370. // # DescriptorType
  371. USB_DESCR_TYPE_STRING, //-- bDescriptorType
  372. // ----------------------------------------------------------------------
  373. 'U', 0,
  374. 'S', 0,
  375. 'B', 0,
  376. 'T', 0,
  377. 'M', 0,
  378. 'C', 0,
  379. '-', 0,
  380. 'U', 0,
  381. 'S', 0,
  382. 'B', 0,
  383. '4', 0,
  384. '8', 0,
  385. '8', 0,
  386. // ##### 4 String Descriptior describes interface serial number, USB_SN_STRING_DESCRIPTOR
  387. // # bLength
  388. // ----------------------------------------------------------------------
  389. //-- Terminating zero
  390. 0
  391. };
  392. // ----------------------------------------------------------------------
  393. BYTE SerialNumberDescriptor[] =
  394. {
  395. 18,
  396. // ----------------------------------------------------------------------
  397. // # DescriptorType
  398. USB_DESCR_TYPE_STRING, //-- bDescriptorType
  399. // ----------------------------------------------------------------------
  400. '0', 0,
  401. '0', 0,
  402. '0', 0,
  403. '0', 0,
  404. '0', 0,
  405. '0', 0,
  406. '0', 0,
  407. '0', 0,
  408. };
  409. void ModifySerialNumberDescriptor( const char * sn, unsigned int maxsize )
  410. {
  411. uint8_t * pSerial = SerialNumberDescriptor;
  412. int32_t limit = sizeof(SerialNumberDescriptor) - 2;
  413. pSerial++; // skip length in @SerialNumberDescriptor
  414. pSerial++; // skip type in @SerialNumberDescriptor
  415. for( unsigned int i = 0; (limit > 0) && (maxsize > 0); ++i )
  416. {
  417. *pSerial = *sn; // copy
  418. pSerial++; // skip current character (low)
  419. pSerial++; // skip current character (high)
  420. limit-=2;
  421. maxsize--; //
  422. sn++; //
  423. }
  424. }
  425. // ====================================================================================================================
  426. static inline void USB_INTERRUPT_CLEAR_BULKIN()
  427. {
  428. #ifdef MYDEBUG_OLDMETHOD
  429. rUSBEpIntClr = 1<<(USB_EP_PHY_ADDRESS_BULK_IN);
  430. #else
  431. USB_EpIntrClr( USB_EP_PHY_ADDRESS_BULK_IN );
  432. #endif
  433. }
  434. static inline void USB_INTERRUPT_CLEAR_BULKOUT()
  435. {
  436. #ifdef MYDEBUG_OLDMETHOD
  437. rUSBEpIntClr = 1<<(USB_EP_PHY_ADDRESS_BULK_OUT);
  438. #else
  439. USB_EpIntrClr( USB_EP_PHY_ADDRESS_BULK_OUT );
  440. #endif
  441. }
  442. static inline void USB_INTERRUPT_CLEAR_INTIN()
  443. {
  444. #ifdef MYDEBUG_OLDMETHOD
  445. rUSBEpIntClr = 1<<(USB_EP_PHY_ADDRESS_INT_IN);
  446. #else
  447. USB_EpIntrClr( USB_EP_PHY_ADDRESS_INT_IN );
  448. #endif
  449. }
  450. // ====================================================================================================================
  451. // ====================================================================================================================
  452. // ====================================================================================================================
  453. #ifdef __SERIAL_POLL_SUPPORT__
  454. // Ðåàëèçàöèÿ Serial Poll äëÿ USB488
  455. //
  456. // Òî÷êà InterruptIN Îòäàåò äâà áàéòà ñòðóêòóðû _INTERRUPT_IN, îïèñàíîé â USB488, ñòð 9
  457. //
  458. void usb_EP1_tx_int_func(USB_DEVICE_INFO * udi) //-- Interrupt IN
  459. {
  460. USB_INTERRUPT_CLEAR_INTIN();
  461. }
  462. #endif
  463. // ====================================================================================================================
  464. // ====================================================================================================================
  465. // ====================================================================================================================
  466. //----------------------------------------------------------------------------
  467. /* =========================================================================================================================================*/
  468. // @@@@ @@@@@ @@@@@@ @ @ @@@@ @@@@@@ @ @ @@@ @ @ @@@@@@
  469. // @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @
  470. // @@@@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @
  471. // @ @@@@@ @ @ @@ @ @ @ @ @ @ @ @ @ @
  472. // @ @ @ @ @@ @@ @ @ @ @ @ @ @ @@ @
  473. // @@@@ @ @@@ @ @ @@@@ @@@ @ @ @@@ @ @ @@@
  474. // ---------------- EP2 Device-To-Host stream ------------------
  475. // usb_EP2_tx_int_func - âûçûâàåòñÿ ïîñëå îòïðàâêè äàííûõ èç áóôåðà
  476. // êîíå÷íîé òî÷êè Ep5 (Bulk-In) õîñòó èëè îòâåòà åìó NAK. Ñàìûé ïåðâûé
  477. // Bulk-In òîêåí âñåãäà çàâåðøàåòñÿ NAKîì, åñëè äàííûå â áóôåð çàãðóæàþòñÿ
  478. // òîëüêî â ýòîì ïðåðûâàíèè.
  479. //
  480. void usb_EP2_tx_int_func(USB_DEVICE_INFO * udi)
  481. {
  482. /*
  483. // -------------------------------------------------------------------
  484. // USB_INTERRUPT_DISABLE_BULKIN_NAK - çàïðåùàåò ïðåðûâàíèÿ îò âñåõ Bulk-In
  485. // òî÷åê ïî NAK. Ýòî äåëàåòñÿ äëÿ òîãî, ÷òîáû â ñëó÷àå ïðèõîäà íåñâîåâðåìåííîãî
  486. // Bulk-IN ïàêåòà (ðàíüøå Bulk-Out ïàêåòà) ýòî ïðåðûâàíèå íå ïîðòèëî íàì æèçíü,
  487. // îñòàíàâëèâàÿ îñíîâíóþ ïðîãðàììó - è, â ñâîþ î÷åðåäü, îñòàíàâëèâàÿ îáðàáîòêó
  488. // ñîáûòèÿ ïðèõîäà äàííûõ Bulk-Out
  489. // ÷èòàåì ñòàòóñ òîëüêî ÷òî îòïðàâëåííîãî ïàêåòà
  490. int ep_status = usb_lpc_cmd_read(CMD_EP_SELECT | USB_EP_PHY_ADDRESS_BULK_IN);
  491. if( ep_status & ( 1<<1 )) // åñëè ìû îòâåòèëè STALL-îì
  492. {
  493. int error = usb_getlasterror();
  494. udi->BulkRespondStatus.INTransferInProgress = FALSE; //ïåðåäà÷à çàâåðøåíà
  495. udi->BulkRespondStatus.INTransferTerminating = FALSE;
  496. }
  497. //
  498. // -------------------------------------------------------------------
  499. */
  500. USB_INTERRUPT_CLEAR_BULKIN(); // Ñáðîñ ïðåðûâàíèÿ, ÷òîá íå ùåëêàëî
  501. usb_EP2_tx_func__( udi );
  502. }
  503. // volatile size_t debug_call_1 = 0;
  504. //------------------------------------------------------------------------------------------------------------------------------------------
  505. // @@@@ @@@@@ @@@@@@ @ @ @@@@ @@@@@@ @ @ @@@@ @@@@ @ @ @@@@@ @ @@@@ @@@@@@ @@@@
  506. // @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @@ @ @ @ @ @ @ @ @
  507. // @@@@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @@@@@@ @ @@@@@@
  508. // @ @@@@@ @ @ @@ @ @ @ @ @ @ @ @ @ @ @@@@@ @ @ @ @
  509. // @ @ @ @ @@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
  510. // @@@@ @ @@@ @ @ @@@@ @@@ @ @ @@@@ @@@@ @ @ @ @@@@@@ @@@@ @@@ @@@@
  511. void usb_EP2_tx_func__(USB_DEVICE_INFO * udi)
  512. {
  513. //- --------------------------------------------------------------------------------------------------
  514. USB_EP_STATUS * bulk_status = (USB_EP_STATUS *) &udi->EPBulkStatus;
  515. USB_BULKRESPOND_STATUS * pBulkRespond = (USB_BULKRESPOND_STATUS *) &udi->BulkRespondStatus;
  516. USB_BULKMESSAGE_STATUS * pBulkMessage = (USB_BULKMESSAGE_STATUS *) &udi->BulkMessageStatus;
  517. USB_USBTMC_CLASS_STATUS * pUSBTMCStatus = (USB_USBTMC_CLASS_STATUS*) &udi->usbtmcStatus;
  518. USB_PIPE_ENTRY_IN * pInPipe = (USB_PIPE_ENTRY_IN *) &bulk_status->InPipe;
  519. //- --------------------------------------------------------------------------------------------------
  520. volatile unsigned int ep_status;
  521. volatile unsigned int ep_errorcode;
  522. int bytes;
  523. //- --------------------------------------------------------------------------------------------------
  524. // bTag çàïðîñà è îòâåòà íå ñîâïàäàþò. Îòâåò áóäåò íå êîððåêòíûì
  525. if( pInPipe->dwLength > 0 && (pBulkRespond->bTag != pBulkMessage->bTag) )
  526. {
  527. ep_status = usb_lpc_cmd_read( CMD_EP_SELECT | USB_EP_PHY_ADDRESS_BULK_IN );
  528. if( (!(ep_status & (1<<4))) && ( ep_status&((1<<5)|(1<<6))) ) // îòâåòèëè íå NAK-îì, à äàííûìè, è äàííûå åùå îñòàëèñü â îäíîì èç áóôåðîâ
  529. {
  530. usb_ep_clear_buffers( USB_EP_LOG_ADDRESS_BULK_IN );
  531. }
  532. pInPipe->dwLength = 0;
  533. // âîçìîæíî ðàíüøå ÷åì Bulk-Out ïðèøåë Bulk-IN.
  534. return;
  535. }
  536. //- ----------------------------------------------------------------------------------
  537. if( pInPipe->dwLength > 0 )
  538. {
  539. //USB_BULKRESPOND_STATUS debug_test_brs;
  540. //USB_PIPE_ENTRY_IN debug_test_ip;
  541. //
  542. //memcpy( &debug_test_brs, pBulkRespond, sizeof(debug_test_brs) );
  543. //memcpy( &debug_test_ip, pInPipe, sizeof(debug_test_ip) );
  544. pBulkRespond->INTransferInProgress = TRUE;
  545. // ------------------------------------------------------------------------------------
  546. // ìèíèìàëüíîå èç InPipe.dwLength è USB_MAX_PACKET2
  547. bytes = (pInPipe->dwLength > USB_MAX_PACKET2)? USB_MAX_PACKET2:pInPipe->dwLength;
  548. // ------------------------------------------------------------------------------------
  549. //#error Ïðè óìåíüøåíèè âûõîäíîãî áóôåðà äî 96 áàéò, êàæäàÿ òî÷êà çàíèìàëà 38 áàéò, êîòîðûå è îòïðàâëÿëèñü\
  550. íî èíîãäà çäåñü bytes>64, ïî÷åìó? èççà ýòîãî óõîäèò short ïàêåò, ïðè÷åì ðàíüøå, ÷åì\
  551. ñàìà ôóíêöèÿ ïåðåäàñò âñå äàííûå
  552. //---------------------------------------------------------------------------------
  553. // çàïèñü â áóôåð êîíå÷íîé òî÷êè
  554. bytes = usb_ep_write( USB_EP_LOG_ADDRESS_BULK_IN, (BYTE*)pInPipe->pData, bytes);
  555. //---------------------------------------------------------------------------------
  556. // --------------------------------------------------------------------------
  557. // óâåëè÷èâàåì ñ÷åò÷èê ïåðåäàíûõ áàéò äëÿ çàïðîñà CHECK_ABORT_BULK_IN_STATUS
  558. pBulkRespond->nBytesSent += bytes;
  559. // à òàêæå èçìåíÿåì äàííûå Pipe
  560. pInPipe->dwLength -= bytes; // -- êîëè÷åñòâî áàéò ê ïåðåäà÷å (òåêóùàÿ Transfer)
  561. pInPipe->dwAllLength -= bytes; // -- âñåãî áàéò ê ïåðåäà÷å
  562. pInPipe->pData += bytes; // ++ óêàçàòåëü ïåðåäà÷è (RD)
  563. pBulkRespond->dwDeviceOut -= bytes; // -- âñåãî áàéò êîòîðûå ïîñòàâèëî â î÷åðåäü óñòðîéñòâî (ðàçìåð âûõ áóôåðà Device)
  564. pBulkRespond->bEndOfMessage = FALSE;
  565. // --------------------------------------------------------------------------
  566. // ----------------------- âûçîâ Callback ôóíêöèè ïî çàâåðøåíèþ ïåðåäà÷è áóôåðà ---------------
  567. if( pBulkRespond->dwDeviceOut == 0 || pInPipe->dwLength == 0) // åñëè áóôåð îïóñòåë (êîíåö Transfer)
  568. if( pBulkRespond->bIsLastTransfer == FALSE ) // åñëè ýòî íå ïîñëåäÿÿ Transfer
  569. if( pInPipe->pfTransferEndHandler != NULL ) // åñëè åñòü CallBack
  570. {
  571. // -------------------------------------------------------------------------
  572. pBulkRespond->INTransferInProgress = FALSE; // Transfer - çàâåðøåíà
  573. if( pBulkRespond->INTransferTerminating == TRUE ) // åñëè ìû æäàëè ...
  574. { pBulkRespond->INTransferTerminating = FALSE; // ... çàâåðøåíèÿ ïåðåäà÷è
  575. pUSBTMCStatus->USBTMC_status = STATUS_SUCCESS;}
  576. // -------------------------------------------------------------------------
  577. //#error âûçâàëè. îí ìîäèôèöèðîâàë íàì dwLength (è âñòàâèë BULKINHEADER ñî ñòàðûì bTag!!!)
  578. // debug_call_1 ++;
  579. pInPipe->pfTransferEndHandler ( udi ); // îáðàáîò÷èê çàâåðøåíèÿ Transfer
  580. }
  581. // --------------------------------------------------------------------------------------------
  582. // ---------------------------------------
  583. if(pBulkRespond->dwDeviceOut == 0) GPIB_CLR_MAV();
  584. // ---------------------------------------
  585. // ---------------------------------------------------------------------------------------------------------------------------
  586. // Åñëè âñåòàêè pInPipe->dwLength === 0, íóæíî çàâåðøèòü ïåðåäà÷ó Short ïàêåòîì
  587. // ----------------------------------------------------------------------------
  588. bulk_status->shortpacket = FALSE; // ñòàâèòü â î÷åðåäü Short ïàêåò íå òðåáóåòñÿ ïî óìîë÷àíèþ
  589. //#error ïðîâåðèòü, âåðíî ëè óñëîâèå óñòàíîâêè bulk_status->shortpacket=true, ïîäîçðèòåëüíî, ÷òî bytes ïðèñâàèâàåòñÿ ÄÎ âûçîâà pfTransferEndHandler, à ïîòîì îíî àíàëèçèðóåòñÿ...\
  590. À åñëè pfTransferEndHandler âûäàñò äàííûå è shortïàêåò íå íóæåí?
  591. // åñëè òðåáóåòñÿ ïðåðâàòü ïåðåäà÷ó - îòïàâëÿåì short-ïàêåò
  592. if( pBulkRespond->INTransferTerminating )
  593. bulk_status->shortpacket = TRUE;
  594. // åñëè òîëüêî ÷òî îòïðàâëåííûå - ïîñëåäíèå âî âñåé ïîñûëêå USBTMC - îòïàâëÿåì short-ïàêåò
  595. if( (pInPipe->dwLength == 0) && (bytes == USB_MAX_PACKET2) )
  596. {
  597. // äàííûõ íà ïåðåäà÷ó â êàíàëå íå îñòàëîñü (pInPipe->dwLength = 0)
  598. // ïîñëåäíÿÿ ïîñûëêà â EP îêàçàëàñü ðàâíà ìàêñèìàëüíîìó ðàçìåðó EP (bytes == USB_MAX_PACKET2)
  599. // âðîäå êàê íàäî îòïðàâèòü short-ïàêåò ....
  600. // 03/09/18. õîñò óïðàâëÿåò êîëè÷åñòâîì ñ÷èòûâàåìûõ äàííûõ. Äàæå åñëè
  601. // óæå pBulkRespond->dwDeviceOut > 0, ïåðåäà÷à BulkIN çàêîí÷èëàñü, õîñò äîëæåí
  602. // ïðèñëàòü ñëåäóþùèé çàïðîñ íà BulkIN. À ýòó ïåðåäà÷ó íåîáõîäèìî çàêîí÷èòü
  603. // short-ïàêåòîì.
  604. bulk_status->shortpacket = TRUE;
  605. }
  606. // ---------------------------------------------------------------------------------------------------------------------------
  607. }
  608. else
  609. {
  610. // =============== QUEUE SHORT PACKET ====================
  611. if( bulk_status->shortpacket == TRUE )
  612. {
  613. bulk_status->shortpacket = FALSE;
  614. bulk_status->shortpacketsending = TRUE;
  615. usb_ep_write( USB_EP_LOG_ADDRESS_BULK_IN, (BYTE*)pInPipe->pData, 0); // ÷åñòíûé áàëê æäåò îò íàñ Short ïàêåòà.
  616. }
  617. else
  618. {
  619. //NAK â ñëåäóþùåì IN òîêåíå
  620. if( bulk_status->shortpacketsending == TRUE )
  621. {
  622. bulk_status->shortpacketsending = FALSE;
  623. bulk_status->shortpacket = FALSE;
  624. }
  625. // =======================================================
  626. pBulkRespond->INTransferInProgress = FALSE;
  627. if( pBulkRespond->INTransferTerminating == TRUE ) // åñëè ìû æäàëè çàâåðøåíèÿ ïåðåäà÷è
  628. {
  629. pBulkRespond->INTransferTerminating = FALSE;
  630. pUSBTMCStatus->USBTMC_status = STATUS_SUCCESS;
  631. }
  632. //---------------------------------------------------
  633. // -- ñáðàñûâàåì Message Available áèò, âñå ïåðåäàëè.
  634. if(pBulkRespond->dwDeviceOut == 0)
  635. {
  636. GPIB_CLR_MAV();
  637. }
  638. // see USB488 spec ,rev 1.0, 2003, page 13, 4.3.1.3
  639. //---------------------------------------------------
  640. }
  641. }
  642. }
  643. // ---------------- ------------------------- ------------------
  644. /* =========================================================================================================================================*/
  645. /* =========================================================================================================================================*/
  646. // @@@@ @@@@@ @@@@@@ @ @ @@@@ @@@@@ @ @ @@@ @ @ @@@@@@
  647. // @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @
  648. // @@@@@@ @ @ @ @ @ @ @ @@@@@ @ @ @ @ @ @
  649. // @ @@@@@ @ @ @@ @ @ @ @ @ @ @ @ @ @ @
  650. // @ @ @ @ @@ @@ @ @ @ @ @ @ @ @ @@ @
  651. // @@@@ @ @@@ @ @ @@@@ @ @@ @ @ @@@ @ @ @@@
  652. // ---------------- EP2 Host-To-Device stream ------------------
  653. void usb_EP2_rx_int_func(USB_DEVICE_INFO * udi)
  654. {
  655. USB_INTERRUPT_CLEAR_BULKOUT();
  656. usb_EP2_rx_func__ ( udi );
  657. }
  658. //=============================================================================================================================================================================================
  659. // @@@@@ @ @ @ @ @ @@@@@ @@@@ @@@@ @@@ @@@@ @ @ @@@@
  660. // @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
  661. // @@@@@ @ @ @ @@@@ @@@@@ @@@@@@ @ @ @@@@@@ @ @ @@@@@@
  662. // @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
  663. // @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
  664. // @@@@@ @@@@ @@@@@@ @ @ @ @@ @@@@ @@@@ @@@ @@@@ @@ @@@@
  665. void usb_EP2_rx_func__(USB_DEVICE_INFO * udi)
  666. {
  667. //------------------------------------------------------------------------------------------
  668. unsigned int len;
  669. unsigned int treshold;
  670. volatile unsigned int ep_status;
  671. int sibytes_limit;
  672. int iDoubleBufferPeekAttempts; // ñêîëüêî ðàç ìîæíî ïðè bNeedHaltEndpoint çàáèðàòü äàííûå èç âòîðîãî áóôåðà FIFO
  673. //------------------------------------------------------------------------------------------
  674. BOOL rc;
  675. BOOL bNeedHaltEndpoint = FALSE; // óñëîâèå îñòàíîâêè Bulk-End point. see USBTMC spec, rev 1.0, page 11, "3.2.2.4 Halt"
  676. BOOL bItIsFirstPacket = FALSE; // ýòî ïåðâûé ïàêåò ïåðåäà÷è, ñîäåðæàùèé çàãîëîâîê
  677. BOOL bHostToDevice_Direction; // åñëè TRUE, ñòàäèÿ äàííûõ íàïðàâëåíà îò Host -> Device, çàïèñü â óñòðîéñòâî
  678. BOOL bBufferOverflow = FALSE; // TRUE óêàçûâàåò, ïðîèçîøëî ëè ïåðåïîëíåíèå âõîäíîãî áóôåðà
  679. BOOL bBuffer1Full;
  680. BOOL bBuffer2Full;
  681. BOOL bSkipPacket;
  682. BOOL bGenError = FALSE;
  683. //------------------------------------------------------------------------------------------
  684. USB_PIPE_ENTRY_IN * pPipeIn = (USB_PIPE_ENTRY_IN *) &udi->EPBulkStatus.InPipe; // HostIN, DeviceOUT
  685. USB_PIPE_ENTRY_OUT * pPipeOut = (USB_PIPE_ENTRY_OUT*) &udi->EPBulkStatus.OutPipe; // HostOUT, DeviceIN
  686. //------------------------------------------------------------------------------------------
  687. USB_BULKMESSAGE_STATUS * pBulkMessage = (USB_BULKMESSAGE_STATUS*) &udi->BulkMessageStatus;
  688. USB_BULKRESPOND_STATUS * pBulkRespond = (USB_BULKRESPOND_STATUS*) &udi->BulkRespondStatus;
  689. BULKOUT_HEADER * pBulkOutHeader; //
  690. BYTE * pBulkData; //
  691. //------------------------------------------------------------------------------------------
  692. iDoubleBufferPeekAttempts = 1; // ñêîëüêî ðàç ìîæíî ïðè bNeedHaltEndpoint çàáèðàòü äàííûå èç âòîðîãî áóôåðà FIFO
  693. // --- ïðîâåðêà îáîèõ áóôåðîâ EP
  694. while((bNeedHaltEndpoint==FALSE) || (bNeedHaltEndpoint && iDoubleBufferPeekAttempts--)) // äàæå åñëè bNeedHaltEndpoint âòîðîé ïàêåò ïîõîæå íóæíî çàáðàòü (DoubleBuffer)
  695. {
  696. // ------------------------------------------------------------------------------------------------------------------------
  697. ep_status = usb_lpc_cmd_read(CMD_EP_SELECT | USB_EP_PHY_ADDRESS_BULK_OUT); // Phy EP4 - Host-to-Device Direction (Host OUT)
  698. bBuffer1Full = (ep_status & (1<<5));
  699. bBuffer2Full = (ep_status & (1<<6));
  700. if( bBuffer1Full==FALSE && bBuffer2Full == FALSE ) break;
  701. // ------------------------------------------------------------------------------------------------------------------------
  702. // ---- Åñòü äàííûå â áóôåðå
  703. if( pBulkMessage->bBulkHeaderRecieved == FALSE || bBufferOverflow == TRUE) // åñëè íå ïðèíÿò çàãîëîâîê èëè ïåðåïîëíåíèå áóôåðà
  704. {
  705. pPipeOut->pData = pPipeOut->pDefaultBuffer;
  706. pPipeOut->dwLength = 0;
  707. pBulkMessage->nBytesRecieved = 0;
  708. pBulkMessage->bBulkHeaderRecieved = FALSE; //
  709. sibytes_limit = -1; // íåò ëèìèòà
  710. } else {
  711. // îãðàíè÷èâàåì ðàçìåð ñ÷èòûâàåìûõ áàéò â áóôåð. ïðè ïðåâûøåíèè ëèìèòà áàéòû ïðîñòî äîñòàþòñÿ èç FIFO è òåðÿþòñÿ
  712. sibytes_limit = USB_MAX_BULKOUT_BUFFERSIZE - pBulkMessage->nBytesRecieved - sizeof(BULKOUT_HEADER); // äëèííà çàãîëîâêà â nBytesRecieved íå âõîäèò, íî çàãîëîâîê òî òîæå íóæíî õðàíèòü
  713. if( sibytes_limit >= USB_MAX_PACKET2)
  714. sibytes_limit = -1; //åñòü ñìûñë îãðàíè÷èâàòü êîëè÷åñòâî áàéò òîãäà, êîãäà îíî áîëüøå ÷åì USB_MAX_PACKET2.
  715. // åñëè sibytes_limit ñêàæåì 500, íå íóæíî ïîñûëàòü 500, ïîòîìó ÷òî ó òî÷êè âñÿêî ìåíüøå: USB_MAX_PACKET2
  716. }
  717. // ----------------------------- Îñâîáîæäåíèå FIFO áóôåðà --------------------------------------------------------
  718. len = usb_ep_read( USB_EP_LOG_ADDRESS_BULK_OUT, pPipeOut->pData, sibytes_limit ); // çàïèñü áóôåðà FIFO ïî óêàçàòåëþ çàïèñè
  719. // åñëè çàãîëîâîê íå ïðèíÿò, çàïèñü èäåò â íà÷àëî áóôåðà
  720. //-------------------------------------------------------------------------------------------------------------------------------
  721. //-------------------------------------------------------------------------------------------------------------------------------
  722. bBufferOverflow = (( (sibytes_limit >=0 ) && ( len > sibytes_limit ) ) )?TRUE:FALSE; // ïåðåïîëíåíèå áóôåðà
  723. bBufferOverflow = bBufferOverflow || bNeedHaltEndpoint;
  724. if(bBufferOverflow == TRUE && bGenError == FALSE)
  725. { bGenError = TRUE;
  726. usbtmc_GenRecieveError( udi );
  727. }
  728. //-------------------------------------------------------------------------------------------------------------------------------
  729. //---------------- Èíèöèàëèçàöèÿ óêàçàòåëåé -------------------------------------------------------------------------------------
  730. pBulkData = pPipeOut->pData;
  731. pBulkOutHeader = (BULKOUT_HEADER*) pPipeOut->pData;
  732. //-------------------------------------------------------------------------------------------------------------------------------
  733. // -- îïðåäåëÿåì ïîðîã êîëè÷åñòâà áàéò
  734. if(pBulkMessage->bBulkHeaderRecieved != TRUE)
  735. treshold = (USB_MAX_PACKET2<sizeof(BULKOUT_HEADER))?USB_MAX_PACKET2:sizeof(BULKOUT_HEADER);// åñëè íå ïðèíÿò çàãîëîâîê- ïîðîã ðàçìåð çàãîëîâêà, èíà÷å ïàêåò íåêîððåêòåí
  736. else
  737. treshold = 1; // åñëè çàãîëîâîê ïðèíÿò, ïîðîã - õîòÿáû îäèí áàéò
  738. // -------------------------------------------------------------------------------------------
  739. // Îòáðàñûâàåì âñå ïàêåòû, åñëè åùå íå ïðèíÿëè çàãîëîâîê (Bulk-In Header è íàì ïðèøåë ïàêåò
  740. // äëèííîé ìåíüøå ÷åì äëèííà çàãîëîâêà è äàæå ìåíüøå ÷åì ðàçìåð áóôåðà EP. Ïîèäåå, åñëè ðàçìåð
  741. // çàãîëîâêà áîëüøå ðàçìåðà áóôåðà, òî treshold == ðàçìåðó áóôåðà, äàííûå ïðîéäóò. Åñëè æå
  742. // ðàçìåð çàãîëîâêà ìåíüøå ðàçìåðà áóôåðà, treshold == ðàçìåðó çàãîëîâêà, äàííûå îïÿòü ïðîéäóò.
  743. // Íî åñëè æå ìû åùå íå ïðèíÿëè çàãîëîâîê, òîåñòü pBulkMessage->bBulkHeaderRecieved == FALSE,
  744. // òî íåïðåìåííî ïðèíèìàåìûå äàííûå äîëæíû íà÷àòüñÿ ñ ýòîãî çàãîëîâêà, à äàííûå íåêîððåêòíû ïî
  745. // ðàçìåðó. Çíà÷èò èìååò ìåñòî ðàñ-ñèíõðîíèçàöèÿ Bulk-Out - äàííûå áóäóò îòáðîøåíû
  746. // --------------------------------------------------------------------------------------------
  747. if(len>=treshold && bBufferOverflow==FALSE)
  748. {
  749. // see USBTMC spec, rev 1.0, 2003, page 6, cipfer 3. Åñëè õîñò ïðèøëåò äâà Bulk-Out header, âòîðîé îïîçíàåòñÿ êàê äàííûå åñëè ôëàã óñòàíîâëåí
  750. // #### -------------- òðåáóåòñÿ ïðèíÿòü çàãîëîâîê Bulk-Out, åñëè îí åùå íå ïðèíÿò
  751. if(pBulkMessage->bBulkHeaderRecieved!= TRUE || pBulkMessage->nBytesRecieved == 0 )
  752. {
  753. // -------- çàãîëîâîê ïðèíÿò: ñëåä ïîñûëêà ðàññìàòðèâàåòñÿ êàê äàííûå ------
  754. pBulkMessage->bBulkHeaderRecieved = TRUE;
  755. // -------------------------------------------------------------------------
  756. // ----------- çàïîëíÿåì ñòðóêòóðó USBTMC ñîîáùåíèÿ ----------------------------------------------------------
  757. pBulkMessage->MsgID = pBulkOutHeader->MsgID; // ïðèíÿòî ñîîáùåíèå USBTMC
  758. pBulkMessage->bTagLast = pBulkMessage->bTag; // Ïðåäûäóùèé òåã ñîîáùåíèÿ, åñëè ñîîáùåíèå ðàçäåëåíî íà íåñê. ïåðåäà÷ ( ïåðåäà÷, à íå òðàíçàêöèé )
  759. pBulkMessage->bTag = pBulkOutHeader->bTag; // òåêóùèé òåã ñîîáùåíèÿ, åñëè ñîîáùåíèå ðàçäåëåíî íà íåñê. ïåðåäà÷ ( ïåðåäà÷, à íå òðàíçàêöèé )
  760. pBulkMessage->bEOM = (pBulkOutHeader->stCommandMessage.bmTransferAttributes & USBTMC_BITMAP_EOM);
  761. // -----------------------------------------------------------------------------------------------------------
  762. // ---- îïðåäåëÿåì íàïðàâëåíèå ñòàäèè äàííûõ (çàïðîñ èç óñòðîéñòâà èëè çàïèñü â íåãî íà îñíîâíèè êîäà çàïðîñà) ----
  763. bHostToDevice_Direction = usbtmc_parse( udi, TRUE ); // ïñåâäî âûçîâ ñ ôëàãîì âîçâðàùàåò íàïðàâëåíèå
  764. // ----------------------------------------------------------------------------------------------------------------
  765. if( bHostToDevice_Direction ){
  766. // Host(OUT) -> (IN)Device
  767. // -- ïîëó÷àåì äëèííó ïîñûëêè: see usbtmc.h, Appendix 1
  768. pPipeOut->dwLength = pBulkOutHeader->stCommandMessage.TransferSize; // -- OutPipe.dwLength --- äëèííà âèðòóàëüíîãî ìàññèâà äàííûõ pBulkData,
  769. pBulkMessage->OutTransferSize = pBulkOutHeader->stCommandMessage.TransferSize; // -- êîòîðûé ìîæåò ðàçáèâàòüñÿ íà ÷àñòè â ðàçíûõ òðàíçàêöèÿõ è ïåðåäà÷àõ
  770. } else {
  771. // Host(IN) <- (OUT)Device
  772. pPipeIn->dwLength = 0; // ìîäèôèöèðóåòñÿ â REQUEST_DEP_DEV_MSG_IN
  773. pPipeOut->dwLength = 0; // íàïðàâëåíèå ñòàäèè äàííûõ Device->Host
  774. pBulkRespond->InTransferSize = pBulkOutHeader->stCommandMessage.TransferSize; // -- ñêîëüêî õîñò õî÷åò ïðî÷èòàòü
  775. }
  776. // ïðîâåðÿåì êîððåêòíîñòü çàãîëîâêà, åñëè bTag != bTagInverse, òî ïðèøëè íåâåðíûå äàííûå. çàãîëîâîê íåêîððåêòíûé è áóäåò îòáðîøåí
  777. if( !((pBulkOutHeader->bTag ^ pBulkOutHeader->bTagInverse) == 0xFF) )
  778. pBulkMessage->bBulkHeaderRecieved = FALSE;
  779. if( pBulkMessage->bBulkHeaderRecieved == TRUE)
  780. {
  781. pBulkData += sizeof(BULKOUT_HEADER); // -- ïðûãàåì ê íà÷àëó äàííûõ, ñëåäóþøèõ ÇÀ çàãîëîâêîì
  782. len -= sizeof(BULKOUT_HEADER); // -- len == êîëè÷åñòâî áàéò ÄÀÍÍÛÕ òðàíçàêöèè ïîñëå çàãîëîâêà
  783. bItIsFirstPacket = TRUE; // -- óêàçûâàåò ÷òî ýòî ïåðâàÿ òðàíçàêöèÿ ñîîáøåíèÿ (ñîäåðæèò çàãîëîâîê)
  784. pBulkMessage->pData = pBulkData; // -- ñîõðàíÿåì óêàçàòåëü íà äàííûå
  785. if( pPipeOut->dwLength <= USB_MAX_BULK_PAYLOAD ) {
  786. // åñëè ïîñûëêà ÍÅ ðàçáèâàåòñÿ íà íåñêîëüêî òðàíçàêöèé
  787. pBulkMessage->nBytesRecieved = 0; // óâåëè÷èâàåòñÿ äàëüøå
  788. } else {
  789. // åñëè ïîñûëêà ðàçáèâàåòñÿ íà íåñêîëüêî òðàíçàêöèé
  790. pBulkMessage->nBytesRecieved = 0; // óâåëè÷èâàåòñÿ äàëüøå
  791. pBulkMessage->OUTTransferInProgress = TRUE; // ïîêàçûâàåò, ÷òî ïðîèñõîäèò äëèòåëüíàÿ ïåðåäà÷à äàííûõ - íóæíî äëÿ îáðàáîòêè çàïðîñà INITIATE_ABORT_BULK_OUT
  792. }
  793. } // if ( HEADER RECIEVED )
  794. }
  795. else
  796. {
  797. // fixed 29/08/18
  798. bHostToDevice_Direction = usbtmc_parse( udi, TRUE ); // ïñåâäî âûçîâ ñ ôëàãîì âîçâðàùàåò íàïðàâëåíèå
  799. }
  800. //-------------------------------------------------------------------------------------------------------------
  801. if( pBulkMessage->bBulkHeaderRecieved == TRUE )
  802. {
  803. //-----------------------------------------------------------------------------------------------
  804. if( pBulkMessage->nBytesRecieved + len > USB_MAX_BULKOUT_BUFFERSIZE ) // çàùèòà
  805. {
  806. len = USB_MAX_BULKOUT_BUFFERSIZE - pBulkMessage->nBytesRecieved;
  807. // =============================== //
  808. // >>> Ïàìÿòü ïåðåïîëíåíà <<< //
  809. // ------------------------------- //
  810. // __ //
  811. // / \ Ïàìÿòü ïåðåïîëíåíà //
  812. // | X | Â áóôåðå íåò ìåñòà //
  813. // \ __ / äëÿ êåøèðîâàíèÿ äàí- //
  814. // íûõ. //
  815. // ------------------------------- //
  816. }
  817. pBulkData += len; //ïåðåäâèãàåì óêàçàòåëü çàïèñè. Ïî çàâåðøåíèè íóæíî çàïèñàòü ýòîò óêàçàòåëü â pPipeOut->pData
  818. pBulkMessage->nBytesRecieved +=len; // óâåëè÷èâàåì ñ÷åò÷èê ïðèíÿòûõ áàéò
  819. //-----------------------------------------------------------------------------------------------
  820. // see USBTMC spec, rev 1.0, 2003, page 11, table 7, point 6
  821. if(len > pPipeOut->dwLength)
  822. if(len - pPipeOut->dwLength > 3) // it is not aligment bytes
  823. bNeedHaltEndpoint = TRUE;
  824. //------------------------------------------------------------------
  825. // Âûÿñíÿåì, ñêîëüêî äàííûõ îñòàëîñü ïðèíÿòü
  826. // â pBulkEPStatus->OutPipe.dwLength ñîäåðæèòñÿ îæèäàåìîå êîëè÷åñòâî áàéò ñîîáùåíèÿ, êîòîðûå åùå íå ïðèíÿòû
  827. if( bHostToDevice_Direction )
  828. pPipeOut->dwLength = (len > pPipeOut->dwLength)? 0: pPipeOut->dwLength-len;
  829. //------------------------------------------------------------------
  830. BOOL bShortPacketRecieved = ((len+((bItIsFirstPacket)?sizeof(BULKOUT_HEADER):0)) < USB_MAX_PACKET2)?TRUE:FALSE;
  831. //-------------------------------------------------------------------------------------------------
  832. // see USBTMC spec, rev 1.0, 2003, page 6, cipfer 4, "The device must consider the transfer complete when it has recieved and processed"
  833. // - exactly the amount of data expected : udi->EPBulkStatus.OutPipe.dwLength == 0
  834. // - a packet with payload size less wMaxPacketSize: len < USB_MAX_PACKET2
  835. // - òîëüêî len - äëèííà âñåãî ïàêåòà âìåñòå ñ çàãîëîâêîì
  836. //see USBTMC spec, rev 1.0, 2003, page 11, table 7, point 4
  837. if( bShortPacketRecieved && pPipeOut->dwLength != 0) // dwLength - åùå îñòàëîñü ïðèíÿòü
  838. bNeedHaltEndpoint = TRUE;
  839. // ------------------------------------------------------------------------------------
  840. // -- ïðîïóñêàåì ïàêåò åñëè bNeedHaltEndpoint âñåãäà, çà èñêêëþ÷åíèåì: bBufferOverflow==TRUE && iDoubleBufferPeekAttempts == 0
  841. bSkipPacket = bNeedHaltEndpoint;
  842. if(bSkipPacket) { bSkipPacket = (bBufferOverflow==FALSE);
  843. if( bSkipPacket )
  844. bSkipPacket = (iDoubleBufferPeekAttempts > 0);
  845. // îáðàáàòûâàåì ÑËÅÄÓÞÙÈÉ ïàêåò, ïîñëå ïàêåòà ïåðåïîëíèâøåãî áóôôåð
  846. }
  847. // ------------------------------------------------------------------------------------
  848. if( !bSkipPacket && (pPipeOut->dwLength == 0 || bShortPacketRecieved)) // åñëè ñîîáùåíèå ïîëíîñòüþ ïðèíÿòî
  849. {
  850. pBulkMessage->OUTTransferInProgress = FALSE;
  851. // =====================================================================
  852. // >>> Î áóôåðå è ðàçìåðå îòâåòíîãî ñîîáùåíèÿ <<<
  853. // ---------------------------------------------------------------------
  854. // ____ Âíèìàíèå! Èñïîëüçóåòñÿ áóôåð ðàçìåðîì 1,5Êá, ñîîáùåíèÿ,
  855. // / \ ðàçìåðîì áîëüøå 1,5Êá îòïðàâëÿòü íåëüçÿ! Òàê êàê îòïðàâêà
  856. // | X | ïðîèñõîäèò ïî ïðåðûâàíèþ è óêàçàòåëè ñäâèãàþòñÿ ïî ïðåðûâàíèþ,
  857. // \____/ â usbtmc_parse ñëåäóåò áûòü îñòîðîæíåå ñ ðàçìåðîì ïåðåäàâàåìûõ
  858. // äàííûõ. Åñëè çàïèñàòü ïî óêàçàòåëþ pData äàííûõ áîëüøå ÷åì 1,5Êá
  859. // âñå ïðîéäåò íåçàìåòíî è äàííûå âûëåçóò çà ãðàíèöó ìàññèâà è ïîéäåò êàòàâàñèÿ
  860. // =====================================================================
  861. if( bHostToDevice_Direction) // åñëè DEV_DEP_MSG_OUT ÷èñòèì áóôåð, îí çàïîëíèòñÿ äàííûìè, à êîãäà ïðèäåò REQUEST_DEV_DEP_MSG_IN óæå ÷èñòèòü íåëüçÿ, òàì îòâåò!
  862. {
  863. usb_reset_pipe_status( pPipeIn );
  864. usbtmc_flush_buffer ( USB_EP_LOG_ADDRESS_BULK_IN, pPipeIn );
  865. }
  866. rc = usbtmc_parse( udi, FALSE ); // Ðàçáèðàåì ñîîáùåíèå
  867. if( rc == TRUE )
  868. {
  869. // ÅÑËÈ ïðèøåë DEV_DEP_MSG_OUT - äàííûå â âûõîäíîì áóôåðå (pPipeIn) íî äëèííà pPipeIn->dwLength ðàâíà íóëþ. Îíà èçìåíèòñÿ íà âàëèäíóþ â REQUEST_DEP_DEV_MSG_IN
  870. // ÅÑËÈ ïðèøåë REQUEST_DEP_DEV_MSG_IN - äàííûå â áóôåðå, êîëè÷åñòâî îòïðàâëÿåìûõ äàííûõ ëåæèò â ïåðåìåííîé eps->InPipe.dwLength
  871. //if( bNeedHaltEndpoint ) //!#!
  872. // pPipeIn->dwLength = 0; // ñîîáùåíèå ðàñïàðñåíî, íî òàê êàê ïåðåïîëíåíèå áûëî, äàííûõ ìû íå îòäàäèì! Íóæíî äëÿ INITIATE_ABORT_BULK_IN
  873. }
  874. else
  875. bNeedHaltEndpoint = TRUE; // see USBTMC spec, rev 1.0,2003, page 10, table 7, index =2
  876. pBulkMessage->bBulkHeaderRecieved = FALSE; // ñáðîñèòü ôëàã çàãîëîâêà - òåïåðü íàäî ïðèíÿòü ñëåäóþùèé çàãîëîâîê, ïîòîê äàííûõ çàêîí÷èëñÿ
  877. }
  878. else
  879. { // ñîîáùåíèå ïðèÿíÿòî íå ïîëíîñòüþ
  880. // æäåì...
  881. }
  882. pPipeOut->pData = pBulkData; // ñîõðàíÿåì ïîçèöèþ çàïèñè
  883. //--------------------------------------------------------------------------------------------------
  884. }
  885. else {
  886. //see USBTMC spec, rev 1.0, 2003, page 11, "3.2.2.4 Halt":
  887. // + "The device may Halt the endpoint for reasons other than those specified in Table 7."
  888. // + The device does not receive a complete Bulk-OUT Header in the first transaction of the transfer.
  889. bNeedHaltEndpoint = TRUE;
  890. }
  891. //--------------------------------------------------------------------------------------------*
  892. // ============ # INFO # ============= # ============ # =========== # =========== # ========
  893. //
  894. // len - ïåðåìåííàÿ, ñîäåðæàùàÿ êîëè÷åñòâî áàéò äàííûõ â ñîîáùåíèè, ïî àäðåñó pBulkData
  895. // udi->EPBulkStatus.OutPipe.dwLength - ïåðåìåííàÿ, ñîäåðæàùàÿ îáùåå ÎÑÒÀÂØÅÅÑß êîëè÷åñòâî áàéò ïîñûëêè, êîòîðûå òðåáóåòñÿ ïðèíÿòü â ñëåäóþùèõ òðàíçàêöèÿõ ñîîáùåíèÿ
  896. //
  897. // ============ # ---- # ============= # ============ # =========== # =========== # ========
  898. // ####...........................................................................................................####
  899. // ###################################################################################################################
  900. }// if(len>=treshold) ...
  901. else {
  902. // see USBTMC spec, p 10, table 7
  903. // see USBTMC spec, p 6, point 4: "If the last data payload is wMaxPacketSize, the Host should not send a zero-length packet",
  904. // should - íå ñëåäóåò, íî ìîæåò è ïîñëàòü, ïîýòîìó èãíîðèì íóëåâîé ïàêåò
  905. if(len>0)
  906. bNeedHaltEndpoint = TRUE;
  907. }
  908. }
  909. USB_INTERRUPT_ENABLE_BULKOUT();
  910. //---------------------------------------
  911. if( bNeedHaltEndpoint )
  912. /* --------------------------------------- */
  913. // ñì usbtmc.c :: usbtmc_HOOK_control_out()
  914. // abort() ïðîèçîéäåò êàê òîëüêî õîñò î÷èñòèò òî÷êó STALL->UNSTALL.
  915. // Abort() òàêæå ïðîèñçîéäåò åñëè õîñò ïðèøëåò initiate_abort_bulk_out() èëè initiate_clear()
  916. // ïîýòîìó ñìûñëà òóò äåëàòü abort() íåò, ê òîìó æå, íóæíî ñîõðàíèòü ñîñòîÿíèå, íà ñëó÷àé åñëè õîñò
  917. // âñå æå ïðèøëåò initiate_abort_bulk_out è ìû åìó îòâåòèì SUCCESS à íå STATUS_TRANSFER_NOT_IN_PROGRESS
  918. usb_stall_ep( USB_EP_LOG_ADDRESS_BULK_OUT, 0x01 ); // ïóñòü õîñò ïðèñûëàåò INITIATE_ABORT!
  919. /* --------------------------------------- */
  920. }
  921. //----------------------------------------------------------------------------
  922. void usb_ep_clear_buffers( TENDPOINT_PHY_ADDRESS ep_num_physical )
  923. {
  924. int ep_status = usb_lpc_cmd_read(CMD_EP_SELECT | ep_num_physical);
  925. if( ep_status & 0x60 )
  926. {
  927. usb_lpc_cmd(CMD_EP_CLEAR_BUFFER);
  928. usb_lpc_cmd(CMD_EP_CLEAR_BUFFER);
  929. ep_status = usb_lpc_cmd_read(CMD_EP_SELECT | ep_num_physical);
  930. usb_lpc_cmd(CMD_EP_CLEAR_BUFFER);
  931. }
  932. }
  933. #endif