usb_packet.cc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. // // ******************************************************************
  2. // // /\ /| @File Usb_packet.cc
  3. // // \ V/ @Brief
  4. // // | "") @Author lijinwen, ghz005@uni-trend.com.cn
  5. // // / | @Creation 2024-05-17
  6. // // / \\ @Modified 2024-06-24
  7. // // *(__\_\
  8. // // ******************************************************************
  9. #include "Usb_packet.h"
  10. #include "../BaseHelper/common_helper.h"
  11. #include "../BaseHelper/Loger.h"
  12. namespace Protocol
  13. {
  14. UsbPacket::UsbPacket() : PacketTitle(), pid_(0), last_nrbz_data_bit_(false), polarity_(false), end_point_(0),
  15. crc_sign_num_(0),
  16. crc16_(0), is_valid_(false),
  17. is_crc_checked_(false),
  18. to_extracted_next_data_start_index_(-1),
  19. to_nrzi_decode_next_data_start_index_(-1),
  20. max_possible_data_length_(-1)
  21. {
  22. }
  23. UsbPacket::UsbPacket(TwoLevelEdgePulse* pid_node, int32_t& left_over_size, const Sync& sync
  24. , const bool polarity, const int32_t max_data_length)
  25. {
  26. this->polarity_ = polarity;
  27. packet_sync_ = sync;
  28. if (max_data_length >= 0)
  29. {
  30. max_possible_data_length_ = max_data_length;
  31. }
  32. //this->pidType = nullptr;
  33. TwoLevelEdgePulse* tmp_pid_node = pid_node;
  34. /*if (tmp_pid_node->startIndex < sync.endIndex && tmp_pid_node->startIndex < sync.nodePtr->startIndex + sync.Length())
  35. {
  36. while (tmp_pid_node->startIndex < sync.endIndex && tmp_pid_node->startIndex < sync.nodePtr->startIndex + sync.Length())
  37. {
  38. tmp_pid_node += 1;
  39. }
  40. tmp_pid_node -= 2;
  41. }*/
  42. if (!GetPID(tmp_pid_node))
  43. {
  44. return;
  45. }
  46. is_valid_ = true;
  47. if (this->packet_type_ == UsbEnums::UsbPacketType::NO_DEFINE)
  48. {
  49. return;
  50. }
  51. //解码域内容
  52. DecodeFields(tmp_pid_node);
  53. }
  54. bool UsbPacket::CheckNibblesInverse(const uint8_t value)
  55. {
  56. const uint8_t high_nibble = static_cast<uint8_t>(value >> 4);
  57. const uint8_t low_nibble = static_cast<uint8_t>(value & 0x0F);
  58. return high_nibble == (~low_nibble & 0x0F);
  59. }
  60. bool UsbPacket::GetPID(TwoLevelEdgePulse*& pid_node)
  61. {
  62. if (!CheckNodeValid(static_cast<EdgePulse>(*pid_node)))
  63. {
  64. WriteLog(LogLevel::Level2, "node check fail");
  65. return false;
  66. }
  67. if (packet_sync_.single_bit_timing_length <= 0)
  68. {
  69. return false;
  70. }
  71. //last_nrbz_data_bit_ = !polarity_;
  72. last_nrbz_data_bit_ = true;
  73. uint8_t data;
  74. int32_t pid_start_index = packet_sync_.end_index + 2;
  75. if (!DecodeNextByte(pid_node, pid_start_index, data))
  76. {
  77. return false;
  78. }
  79. pid_ = data;
  80. auto handshake_type = UsbEnums::HandshakePackageType::NAK;
  81. if (IsTokenPackageType())
  82. {
  83. packet_type_ = UsbEnums::UsbPacketType::TOKEN;
  84. }
  85. else if (IsDataPackageType())
  86. {
  87. packet_type_ = UsbEnums::UsbPacketType::DATA;
  88. }
  89. else if (IsHandshakePackageType(handshake_type))
  90. {
  91. packet_type_ = UsbEnums::UsbPacketType::HAND_SHAKE;
  92. switch (handshake_type)
  93. {
  94. case UsbEnums::HandshakePackageType::ACK:
  95. PacketTitle = UsbEnums::EventInfoTitles::ACK;
  96. break;
  97. case UsbEnums::HandshakePackageType::NAK:
  98. PacketTitle = UsbEnums::EventInfoTitles::NAK;
  99. break;
  100. case UsbEnums::HandshakePackageType::STALL:
  101. PacketTitle = UsbEnums::EventInfoTitles::STALL;
  102. break;
  103. case UsbEnums::HandshakePackageType::NYET:
  104. PacketTitle = UsbEnums::EventInfoTitles::NYET;
  105. break;
  106. default: // NOLINT(clang-diagnostic-covered-switch-default)
  107. return false;
  108. }
  109. }
  110. else if (IsSpecialPacketType())
  111. {
  112. packet_type_ = UsbEnums::UsbPacketType::SPECIAL;
  113. }
  114. else
  115. {
  116. return false;
  117. }
  118. return true;
  119. }
  120. bool UsbPacket::GetNRZIData(TwoLevelEdgePulse*& node, const int32_t need_bit_count, int32_t start_index,
  121. std::vector<bool>& out_data)
  122. {
  123. if (!CheckNodeValid(node))
  124. {
  125. WriteLog(LogLevel::Level2, "node check fail");
  126. return false;
  127. }
  128. const int32_t get_data_start_index = start_index;
  129. //const int32_t get_data_start_index = node->StartIndex;
  130. // const bool high_polarity_edge = polarity_ ?
  131. // packet_sync_.nodePtr->edge == Edge::Rise
  132. // : packet_sync_.nodePtr->edge == Edge::Falling;
  133. auto actual_level_edge = polarity_ ? Edge::RISE : Edge::FALL;
  134. const double single_bit_timing_length_threshold = packet_sync_.single_bit_timing_length * USB_SYNC_BIT_TOL;
  135. out_data = {};
  136. //nrzi 补位个数
  137. const int32_t pre_complement_number = need_bit_count / USB_NRZI_COMPLEMENT_PER_NUM;
  138. const int32_t pre_complement_need_bit_count = need_bit_count + pre_complement_number;
  139. std::vector<bool> nrzi_data(pre_complement_need_bit_count, false);
  140. int32_t getbit_count = 0;
  141. bool get_last_nrzi_bit_polarity = false;
  142. while (getbit_count < pre_complement_need_bit_count)
  143. {
  144. if (!CheckNodeValid(node))
  145. {
  146. WriteLog(LogLevel::Level2, "GetNRZIData node check fail");
  147. return false;
  148. }
  149. if (node->end_index < start_index)
  150. {
  151. node++;
  152. continue;
  153. }
  154. ////fix
  155. if (node->end_index - start_index < packet_sync_.single_bit_timing_length / 2)
  156. {
  157. node++;
  158. if (!CheckNodeValid(node))
  159. {
  160. WriteLog(LogLevel::Level2, "GetNRZIData node check fail");
  161. return false;
  162. }
  163. }
  164. if (!get_last_nrzi_bit_polarity && CheckNodeValid(node - 1))
  165. {
  166. if (start_index - node->start_index > single_bit_timing_length_threshold)
  167. {
  168. last_nrbz_data_bit_ = node->current_level == TwoLevelEdgePulseStatusType::Low;
  169. if (polarity_)
  170. {
  171. last_nrbz_data_bit_ = !last_nrbz_data_bit_;
  172. }
  173. }
  174. else
  175. {
  176. //不用改
  177. //last_NRBZ_data_bit = (node - 1)->CurrentLevel == TwoLevelEdgePulseStatusType::High;
  178. }
  179. get_last_nrzi_bit_polarity = true;
  180. }
  181. if (node->end_index - start_index >= single_bit_timing_length_threshold)
  182. {
  183. const int bits_count = static_cast<int>((node->end_index - start_index) /
  184. single_bit_timing_length_threshold);
  185. const int last_gotbit_count = getbit_count;
  186. for (int i = 0; i < bits_count; i++)
  187. {
  188. if (last_gotbit_count + i >= pre_complement_need_bit_count)
  189. {
  190. break;
  191. }
  192. if ((last_gotbit_count + i) >= static_cast<int32_t>(nrzi_data.size()))
  193. {
  194. WriteLog(LogLevel::Level2, "GetNRZIData error: last_gotbit_count + i > nrzi_data.size()");
  195. break;
  196. }
  197. /*nrzi_data[last_gotbit_count + i] = high_polarity_edge == (node->edge ==
  198. actual_level_edge);*/
  199. nrzi_data[last_gotbit_count + i] = node->edge ==
  200. actual_level_edge;
  201. getbit_count++;
  202. start_index += packet_sync_.single_bit_timing_length;
  203. }
  204. }
  205. else
  206. {
  207. nrzi_data[getbit_count] = node->edge == actual_level_edge;
  208. getbit_count++;
  209. }
  210. if (getbit_count == pre_complement_need_bit_count)
  211. {
  212. break;
  213. }
  214. node++;
  215. if (start_index < node->start_index)
  216. {
  217. start_index = node->start_index;
  218. }
  219. }
  220. //待提取下个位标_位移数
  221. int32_t move_bit_count = 0;
  222. //lastNRBZDataBit = node->Edge == Edge::Rise;
  223. //处理连续 输出结果
  224. int32_t continuous_count = 0;
  225. bool last_value = false;
  226. for (bool data : nrzi_data)
  227. {
  228. move_bit_count++;
  229. //6个连续下一个翻转,必然是插入的bit
  230. if (continuous_count == USB_NRZI_COMPLEMENT_PER_NUM && data != last_value)
  231. {
  232. continuous_count = 0;
  233. continue;
  234. }
  235. if (last_value == data)
  236. {
  237. continuous_count++;
  238. }
  239. else
  240. {
  241. last_value = data;
  242. continuous_count = 0;
  243. }
  244. out_data.push_back(data);
  245. if (static_cast<int32_t>(out_data.size()) == need_bit_count)
  246. {
  247. // if (get_data_start_index == packetSYNC.NodePtr->StartIndex)
  248. // {
  249. // to_extracted_next_data_start_index = packetSYNC.EndIndex;
  250. // }
  251. // else
  252. // {
  253. to_extracted_next_data_start_index_ = get_data_start_index + (move_bit_count * packet_sync_.
  254. single_bit_timing_length);
  255. //}
  256. //while (pre_complement_number > 0 && to_extracted_next_data_start_index > 0 && to_extracted_next_data_start_index
  257. // < node->StartIndex)
  258. //{
  259. // //退回多抽的点位标
  260. // pre_complement_number--;
  261. // node--;
  262. //}
  263. while (to_extracted_next_data_start_index_ > 0 && to_extracted_next_data_start_index_
  264. < node->start_index)
  265. {
  266. //退回多抽的点位标
  267. node--;
  268. }
  269. return true;
  270. }
  271. }
  272. WriteLog(LogLevel::LevelDebug, "GetNRZIData return fail");
  273. return false;
  274. }
  275. //NRZI解码下个字节
  276. bool UsbPacket::DecodeNextByteByDataField(TwoLevelEdgePulse*& node, uint8_t& out_data)
  277. {
  278. return DecodeNextByte(node, to_extracted_next_data_start_index_, out_data);
  279. }
  280. void UsbPacket::NRBZToNormalData(const TwoLevelEdgePulse* node,
  281. const int32_t need_bit_count, std::vector<bool> nrzi_data, uint8_t& out_data)
  282. {
  283. //lastNRBZDataBit = node->Edge == Edge::Rise;
  284. for (int i = 0; i < need_bit_count; i++)
  285. {
  286. //信号不变,就是数据1
  287. if (last_nrbz_data_bit_ == nrzi_data[i])
  288. {
  289. out_data |= (1 << i);
  290. }
  291. else
  292. {
  293. //信号变了就是数据0
  294. }
  295. last_nrbz_data_bit_ = nrzi_data[i];
  296. }
  297. //out_data = CommonHelper::ReverseOrderBits(out_data);
  298. }
  299. //NRZI解码下个字节
  300. bool UsbPacket::DecodeNextByte(TwoLevelEdgePulse*& node, const int32_t start_index, uint8_t& out_data)
  301. {
  302. out_data = 0;
  303. constexpr int32_t need_bit_count = 8;
  304. std::vector<bool> nrzi_data = {};
  305. if (!GetNRZIData(node, need_bit_count, start_index, nrzi_data))
  306. {
  307. WriteLog(LogLevel::Level2, "DecodeNextByte GetNRZIData fail");
  308. return false;
  309. }
  310. NRBZToNormalData(node, need_bit_count, nrzi_data, out_data);
  311. return true;
  312. }
  313. bool UsbPacket::DecodeTokenBytes(TwoLevelEdgePulse*& node, const UsbEnums::TokenPackageType type)
  314. {
  315. bool is_sof_type = type == UsbEnums::TokenPackageType::SOF;
  316. bool result;
  317. if (!is_sof_type)
  318. {
  319. //7addr-4enp-5crc bit
  320. //////////////////////////// addr ////////////////////////////
  321. std::vector<bool> addr_data = {};
  322. uint8_t addr = 0;
  323. result = GetNRZIData(node, USB_ADDR_BIT_COUNT, to_extracted_next_data_start_index_,
  324. addr_data);
  325. if (!result)
  326. {
  327. return false;
  328. }
  329. NRBZToNormalData(node, USB_ADDR_BIT_COUNT, addr_data
  330. , addr);
  331. address_.push_back(addr);
  332. //////////////////////////// endpoint ////////////////////////////
  333. std::vector<bool> endpoint_data = {};
  334. result = GetNRZIData(node, USB_ENDPOINT_BIT_COUNT, to_extracted_next_data_start_index_,
  335. endpoint_data);
  336. if (!result)
  337. {
  338. return false;
  339. }
  340. NRBZToNormalData(node, USB_ENDPOINT_BIT_COUNT, endpoint_data
  341. , end_point_);
  342. }
  343. else
  344. {
  345. //11frame-5bitcrc
  346. //////////////////////////// frame ////////////////////////////
  347. std::vector<bool> frame_data = {};
  348. uint8_t frame_id_tmp = 0;
  349. datas_ = {};
  350. result = GetNRZIData(node, USB_FRAMEID_BIT_COUNT, to_extracted_next_data_start_index_,
  351. frame_data);
  352. if (!result)
  353. {
  354. return false;
  355. }
  356. NRBZToNormalData(node, USB_FRAMEID_BIT_COUNT, frame_data
  357. , frame_id_tmp);
  358. datas_.push_back(frame_id_tmp);
  359. frame_id_tmp = 0;
  360. for (int i = 8; i < USB_FRAMEID_BIT_COUNT - 8; i++)
  361. {
  362. if (last_nrbz_data_bit_ != frame_data[i])
  363. {
  364. last_nrbz_data_bit_ = frame_data[i];
  365. }
  366. else
  367. {
  368. frame_id_tmp |= (1 << i);
  369. }
  370. }
  371. datas_.push_back(frame_id_tmp);
  372. }
  373. //////////////////////////// CRC5 ////////////////////////////
  374. std::vector<bool> crc_data = {};
  375. uint8_t crc = 0;
  376. result = GetNRZIData(node, USB_CRC5_BIT_COUNT, to_extracted_next_data_start_index_,
  377. crc_data);
  378. if (!result)
  379. {
  380. return false;
  381. }
  382. NRBZToNormalData(node, USB_CRC5_BIT_COUNT, crc_data
  383. , crc);
  384. crc_sign_num_ = USB_CRC5_BIT_COUNT;
  385. crc16_ = crc;
  386. WriteLog(LogLevel::LevelDebug, "DecodeTokenBytes = true,crc_sign_num=%d,crc=0x%x"
  387. , crc_sign_num_, crc16_);
  388. return true;
  389. }
  390. void UsbPacket::DecodeFields(TwoLevelEdgePulse*& node)
  391. {
  392. switch (packet_type_) // NOLINT(clang-diagnostic-switch-enum)
  393. {
  394. case UsbEnums::UsbPacketType::TOKEN:
  395. DecodeFieldsByToken(node);
  396. break;
  397. case UsbEnums::UsbPacketType::DATA:
  398. DecodeFieldsByData(node);
  399. break;
  400. case UsbEnums::UsbPacketType::HAND_SHAKE:
  401. break;
  402. case UsbEnums::UsbPacketType::SPECIAL:
  403. DecodeFieldsBySpecial(node);
  404. break;
  405. default:
  406. break;
  407. }
  408. }
  409. void UsbPacket::DecodeFieldsByToken(TwoLevelEdgePulse*& node)
  410. {
  411. if (packet_type_ == UsbEnums::UsbPacketType::NO_DEFINE)
  412. {
  413. WriteLog(LogLevel::Level2, "DecodeFieldsByToken error:packetType is NO_DEFINE");
  414. return;
  415. }
  416. switch (static_cast<
  417. UsbEnums::TokenPackageType>(RealPID()))
  418. {
  419. case UsbEnums::TokenPackageType::SOF:
  420. PacketTitle = UsbEnums::EventInfoTitles::SOF;
  421. DecodeTokenBytes(node, UsbEnums::TokenPackageType::SOF);
  422. break;
  423. case UsbEnums::TokenPackageType::SETUP:
  424. PacketTitle = UsbEnums::EventInfoTitles::SETUP;
  425. DecodeTokenBytes(node, UsbEnums::TokenPackageType::SETUP);
  426. break;
  427. case UsbEnums::TokenPackageType::IN_TYPE:
  428. PacketTitle = UsbEnums::EventInfoTitles::TIN;
  429. DecodeTokenBytes(node, UsbEnums::TokenPackageType::IN_TYPE);
  430. break;
  431. case UsbEnums::TokenPackageType::OUT_TYPE:
  432. PacketTitle = UsbEnums::EventInfoTitles::TOUT;
  433. DecodeTokenBytes(node, UsbEnums::TokenPackageType::OUT_TYPE);
  434. break;
  435. // default:
  436. // return;
  437. }
  438. }
  439. void UsbPacket::DecodeFieldsByData(TwoLevelEdgePulse*& node)
  440. {
  441. if (packet_type_ == UsbEnums::UsbPacketType::NO_DEFINE)
  442. {
  443. WriteLog(LogLevel::Level2, "DecodeFieldsByToken error:packetType is NO_DEFINE");
  444. return;
  445. }
  446. int32_t end_index = packet_sync_.node_ptr->end_index;
  447. std::vector<uint8_t> get_data_tmp = {};
  448. switch (auto package_type = static_cast<UsbEnums::DataPackageType>(RealPID()))
  449. {
  450. case UsbEnums::DataPackageType::DATA0:
  451. case UsbEnums::DataPackageType::DATA1:
  452. PacketTitle = package_type == UsbEnums::DataPackageType::DATA0
  453. ? UsbEnums::EventInfoTitles::DATA0
  454. : UsbEnums::EventInfoTitles::DATA1;
  455. datas_.clear();
  456. if (max_possible_data_length_ >= 0 && max_possible_data_length_
  457. > packet_sync_.Length())
  458. {
  459. end_index = max_possible_data_length_ + packet_sync_.node_ptr->start_index - packet_sync_.single_bit_timing_length / 2;
  460. }
  461. while (CheckNodeValid(node) && node->start_index < end_index)
  462. {
  463. uint8_t data;
  464. bool result = DecodeNextByteByDataField(node, data);
  465. if (!result)
  466. {
  467. WriteLog(LogLevel::Level2, "DecodeFieldsByData DecodeNextByte fail:StartIndex:%d", node->start_index);
  468. break;
  469. }
  470. get_data_tmp.push_back(data);
  471. }
  472. if (get_data_tmp.size() > 3)
  473. {
  474. //data
  475. for (uint64_t i = 0; i < get_data_tmp.size() - 3; i++)
  476. {
  477. datas_.push_back(get_data_tmp[i]);
  478. }
  479. //crc16
  480. /* for (uint64_t i = (get_data_tmp.size() - 2); i < get_data_tmp.size(); i++)
  481. {
  482. }*/
  483. const uint8_t crc16_h = CommonHelper::ReverseOrderBits(get_data_tmp[get_data_tmp.size() - 3]);
  484. const uint8_t crc16_l = CommonHelper::ReverseOrderBits(get_data_tmp[get_data_tmp.size() - 2]);
  485. crc16_ = (static_cast<uint16_t>(crc16_h) << 8) + static_cast<uint16_t>(crc16_l);
  486. crc_sign_num_ = 16;
  487. }
  488. else
  489. {
  490. WriteLog(LogLevel::Level2, "Waring:DecodeFieldsByData Decode DataSize < 2 (%d)", get_data_tmp.size());
  491. datas_ = std::move(get_data_tmp);
  492. }
  493. get_data_tmp.clear();
  494. break;
  495. case UsbEnums::DataPackageType::DATA2:
  496. PacketTitle = UsbEnums::EventInfoTitles::DATA2;
  497. break;
  498. case UsbEnums::DataPackageType::M_DATA:
  499. PacketTitle = UsbEnums::EventInfoTitles::MDATA;
  500. break;
  501. // default:
  502. // break;
  503. }
  504. }
  505. void UsbPacket::DecodeFieldsBySpecial(TwoLevelEdgePulse*& node) const
  506. {
  507. //todo
  508. if (packet_type_ != UsbEnums::UsbPacketType::SPECIAL)
  509. {
  510. }
  511. }
  512. bool UsbPacket::IsTokenPackageType() const
  513. {
  514. int32_t real_pid = RealPID();
  515. if (static_cast<int32_t>(UsbEnums::TokenPackageType::IN_TYPE) == real_pid
  516. || static_cast<int32_t>(UsbEnums::TokenPackageType::OUT_TYPE) == real_pid
  517. || static_cast<int32_t>(UsbEnums::TokenPackageType::SETUP) == real_pid
  518. || static_cast<int32_t>(UsbEnums::TokenPackageType::SOF) == real_pid
  519. )
  520. {
  521. return true;
  522. }
  523. return false;
  524. }
  525. bool UsbPacket::IsSpecialPacketType() const
  526. {
  527. int32_t real_pid = RealPID();
  528. if (static_cast<int32_t>(UsbEnums::SpecialPacketType::ERR) == real_pid
  529. || static_cast<int32_t>(UsbEnums::SpecialPacketType::PING) == real_pid
  530. || static_cast<int32_t>(UsbEnums::SpecialPacketType::REMAIN) == real_pid
  531. || static_cast<int32_t>(UsbEnums::SpecialPacketType::SPLIT) == real_pid
  532. )
  533. {
  534. return true;
  535. }
  536. return false;
  537. }
  538. bool UsbPacket::IsHandshakePackageType(UsbEnums::HandshakePackageType& type) const
  539. {
  540. int32_t real_pid = RealPID();
  541. if (static_cast<int32_t>(UsbEnums::HandshakePackageType::NYET) == real_pid
  542. || static_cast<int32_t>(UsbEnums::HandshakePackageType::STALL) == real_pid
  543. || static_cast<int32_t>(UsbEnums::HandshakePackageType::ACK) == real_pid
  544. || static_cast<int32_t>(UsbEnums::HandshakePackageType::NAK) == real_pid
  545. )
  546. {
  547. type = static_cast<UsbEnums::HandshakePackageType>(real_pid);
  548. return true;
  549. }
  550. return false;
  551. }
  552. bool UsbPacket::IsDataPackageType()
  553. {
  554. int32_t real_pid = RealPID();
  555. if (static_cast<int32_t>(UsbEnums::DataPackageType::DATA0) == real_pid
  556. || static_cast<int32_t>(UsbEnums::DataPackageType::DATA1) == real_pid
  557. || static_cast<int32_t>(UsbEnums::DataPackageType::DATA2) == real_pid
  558. || static_cast<int32_t>(UsbEnums::DataPackageType::M_DATA) == real_pid
  559. )
  560. {
  561. to_nrzi_decode_next_data_start_index_ = packet_sync_.end_index + (packet_sync_.one_byte_timing_length);
  562. return true;
  563. }
  564. return false;
  565. }
  566. }