gc3355.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /*
  2. * Copyright 2014 Nate Woolls
  3. * Copyright 2014 Dualminer Team
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the Free
  7. * Software Foundation; either version 3 of the License, or (at your option)
  8. * any later version. See COPYING for more details.
  9. */
  10. #include "gc3355.h"
  11. #include <string.h>
  12. #include "miner.h"
  13. #include "icarus-common.h"
  14. #include "logging.h"
  15. #ifndef WIN32
  16. #include <sys/ioctl.h>
  17. #else
  18. #include <io.h>
  19. #endif
  20. #define DEFAULT_DELAY_TIME 2000
  21. #define HUBFANS_0_9V_sha2 "60"
  22. #define HUBFANS_1_2V_sha2 "0"
  23. #define DEFAULT_0_9V_sha2 "60"
  24. #define DEFAULT_1_2V_sha2 "0"
  25. static
  26. const char *pll_freq_1200M_cmd[] =
  27. {
  28. "55AAEF000500E085",
  29. "55AA0FFFB02800C0",
  30. "",
  31. };
  32. static
  33. const char *pll_freq_1100M_cmd[] =
  34. {
  35. "55AAEF0005006085",
  36. "55AA0FFF4C2500C0",
  37. "",
  38. };
  39. static
  40. const char *pll_freq_1000M_cmd[] =
  41. {
  42. "55AAEF000500E084",
  43. "55AA0FFFE82100C0",
  44. "",
  45. };
  46. static
  47. const char *pll_freq_950M_cmd[] =
  48. {
  49. "55AAEF000500A084",
  50. "55AA0FFF362000C0",
  51. "",
  52. };
  53. static
  54. const char *pll_freq_900M_cmd[] =
  55. {
  56. "55AAEF0005006084",
  57. "55AA0FFF841E00C0",
  58. "",
  59. };
  60. static
  61. const char *pll_freq_850M_cmd[] =
  62. {
  63. "55AAEF0005002084",
  64. "55AA0FFFD21C00C0",
  65. "",
  66. };
  67. static
  68. const char *pll_freq_800M_cmd[] =
  69. {
  70. "55AAEF000500E083",
  71. "55AA0FFF201B00C0",
  72. "",
  73. };
  74. static
  75. const char *pll_freq_750M_cmd[] =
  76. {
  77. "55AAEF000500A083",
  78. "55AA0FFF6E1900C0",
  79. "",
  80. };
  81. static
  82. const char *pll_freq_700M_cmd[] =
  83. {
  84. "55AAEF0005006083",
  85. "55AA0FFFBC1700C0",
  86. "",
  87. };
  88. static
  89. const char *pll_freq_650M_cmd[] =
  90. {
  91. "55AAEF0005002083",
  92. "55AA0FFF0A1600C0",
  93. "",
  94. };
  95. static
  96. const char *pll_freq_600M_cmd[] =
  97. {
  98. "55AAEF000500E082",
  99. "55AA0FFF581400C0",
  100. "",
  101. };
  102. static
  103. const char *pll_freq_550M_cmd[] =
  104. {
  105. "55AAEF000500A082",
  106. "55AA0FFFA61200C0",
  107. "",
  108. };
  109. static
  110. const char *pll_freq_500M_cmd[] =
  111. {
  112. "55AAEF0005006082",
  113. "55AA0FFFF41000C0",
  114. "",
  115. };
  116. static
  117. const char *pll_freq_400M_cmd[] =
  118. {
  119. "55AAEF000500E081",
  120. "55AA0FFF900D00C0",
  121. "",
  122. };
  123. static
  124. const char *sha2_gating[] =
  125. {
  126. "55AAEF0200000000",
  127. "55AAEF0300000000",
  128. "55AAEF0400000000",
  129. "55AAEF0500000000",
  130. "55AAEF0600000000",
  131. "",
  132. };
  133. static
  134. const char *sha2_single_open[] =
  135. {
  136. "55AAEF0200000001",
  137. "55AAEF0200000003",
  138. "55AAEF0200000007",
  139. "55AAEF020000000F",
  140. "55AAEF020000001F",
  141. "55AAEF020000003F",
  142. "55AAEF020000007F",
  143. "55AAEF02000000FF",
  144. "55AAEF02000001FF",
  145. "55AAEF02000003FF",
  146. "55AAEF02000007FF",
  147. "55AAEF0200000FFF",
  148. "55AAEF0200001FFF",
  149. "55AAEF0200003FFF",
  150. "55AAEF0200007FFF",
  151. "55AAEF020000FFFF",
  152. "55AAEF020001FFFF",
  153. "55AAEF020003FFFF",
  154. "55AAEF020007FFFF",
  155. "55AAEF02000FFFFF",
  156. "55AAEF02001FFFFF",
  157. "55AAEF02003FFFFF",
  158. "55AAEF02007FFFFF",
  159. "55AAEF0200FFFFFF",
  160. "55AAEF0201FFFFFF",
  161. "55AAEF0203FFFFFF",
  162. "55AAEF0207FFFFFF",
  163. "55AAEF020FFFFFFF",
  164. "55AAEF021FFFFFFF",
  165. "55AAEF023FFFFFFF",
  166. "55AAEF027FFFFFFF",
  167. "55AAEF02FFFFFFFF",
  168. "55AAEF0300000001",
  169. "55AAEF0300000003",
  170. "55AAEF0300000007",
  171. "55AAEF030000000F",
  172. "55AAEF030000001F",
  173. "55AAEF030000003F",
  174. "55AAEF030000007F",
  175. "55AAEF03000000FF",
  176. "55AAEF03000001FF",
  177. "55AAEF03000003FF",
  178. "55AAEF03000007FF",
  179. "55AAEF0300000FFF",
  180. "55AAEF0300001FFF",
  181. "55AAEF0300003FFF",
  182. "55AAEF0300007FFF",
  183. "55AAEF030000FFFF",
  184. "55AAEF030001FFFF",
  185. "55AAEF030003FFFF",
  186. "55AAEF030007FFFF",
  187. "55AAEF03000FFFFF",
  188. "55AAEF03001FFFFF",
  189. "55AAEF03003FFFFF",
  190. "55AAEF03007FFFFF",
  191. "55AAEF0300FFFFFF",
  192. "55AAEF0301FFFFFF",
  193. "55AAEF0303FFFFFF",
  194. "55AAEF0307FFFFFF",
  195. "55AAEF030FFFFFFF",
  196. "55AAEF031FFFFFFF",
  197. "55AAEF033FFFFFFF",
  198. "55AAEF037FFFFFFF",
  199. "55AAEF03FFFFFFFF",
  200. "55AAEF0400000001",
  201. "55AAEF0400000003",
  202. "55AAEF0400000007",
  203. "55AAEF040000000F",
  204. "55AAEF040000001F",
  205. "55AAEF040000003F",
  206. "55AAEF040000007F",
  207. "55AAEF04000000FF",
  208. "55AAEF04000001FF",
  209. "55AAEF04000003FF",
  210. "55AAEF04000007FF",
  211. "55AAEF0400000FFF",
  212. "55AAEF0400001FFF",
  213. "55AAEF0400003FFF",
  214. "55AAEF0400007FFF",
  215. "55AAEF040000FFFF",
  216. "55AAEF040001FFFF",
  217. "55AAEF040003FFFF",
  218. "55AAEF040007FFFF",
  219. "55AAEF04000FFFFF",
  220. "55AAEF04001FFFFF",
  221. "55AAEF04003FFFFF",
  222. "55AAEF04007FFFFF",
  223. "55AAEF0400FFFFFF",
  224. "55AAEF0401FFFFFF",
  225. "55AAEF0403FFFFFF",
  226. "55AAEF0407FFFFFF",
  227. "55AAEF040FFFFFFF",
  228. "55AAEF041FFFFFFF",
  229. "55AAEF043FFFFFFF",
  230. "55AAEF047FFFFFFF",
  231. "55AAEF04FFFFFFFF",
  232. "55AAEF0500000001",
  233. "55AAEF0500000003",
  234. "55AAEF0500000007",
  235. "55AAEF050000000F",
  236. "55AAEF050000001F",
  237. "55AAEF050000003F",
  238. "55AAEF050000007F",
  239. "55AAEF05000000FF",
  240. "55AAEF05000001FF",
  241. "55AAEF05000003FF",
  242. "55AAEF05000007FF",
  243. "55AAEF0500000FFF",
  244. "55AAEF0500001FFF",
  245. "55AAEF0500003FFF",
  246. "55AAEF0500007FFF",
  247. "55AAEF050000FFFF",
  248. "55AAEF050001FFFF",
  249. "55AAEF050003FFFF",
  250. "55AAEF050007FFFF",
  251. "55AAEF05000FFFFF",
  252. "55AAEF05001FFFFF",
  253. "55AAEF05003FFFFF",
  254. "55AAEF05007FFFFF",
  255. "55AAEF0500FFFFFF",
  256. "55AAEF0501FFFFFF",
  257. "55AAEF0503FFFFFF",
  258. "55AAEF0507FFFFFF",
  259. "55AAEF050FFFFFFF",
  260. "55AAEF051FFFFFFF",
  261. "55AAEF053FFFFFFF",
  262. "55AAEF057FFFFFFF",
  263. "55AAEF05FFFFFFFF",
  264. "55AAEF0600000001",
  265. "55AAEF0600000003",
  266. "55AAEF0600000007",
  267. "55AAEF060000000F",
  268. "55AAEF060000001F",
  269. "55AAEF060000003F",
  270. "55AAEF060000007F",
  271. "55AAEF06000000FF",
  272. "55AAEF06000001FF",
  273. "55AAEF06000003FF",
  274. "55AAEF06000007FF",
  275. "55AAEF0600000FFF",
  276. "55AAEF0600001FFF",
  277. "55AAEF0600003FFF",
  278. "55AAEF0600007FFF",
  279. "55AAEF060000FFFF",
  280. "55AAEF060001FFFF",
  281. "55AAEF060003FFFF",
  282. "55AAEF060007FFFF",
  283. "55AAEF06000FFFFF",
  284. "55AAEF06001FFFFF",
  285. "55AAEF06003FFFFF",
  286. "55AAEF06007FFFFF",
  287. "55AAEF0600FFFFFF",
  288. "55AAEF0601FFFFFF",
  289. "55AAEF0603FFFFFF",
  290. "55AAEF0607FFFFFF",
  291. "55AAEF060FFFFFFF",
  292. "55AAEF061FFFFFFF",
  293. "55AAEF063FFFFFFF",
  294. "55AAEF067FFFFFFF",
  295. "55AAEF06FFFFFFFF",
  296. "",
  297. };
  298. static
  299. const char *scrypt_only_init[] =
  300. {
  301. "55AAEF0200000000",
  302. "55AAEF0300000000",
  303. "55AAEF0400000000",
  304. "55AAEF0500000000",
  305. "55AAEF0600000000",
  306. "55AAEF3040000000",
  307. "55AA1F2810000000",
  308. "55AA1F2813000000",
  309. "",
  310. };
  311. char *opt_dualminer_sha2_gating = NULL;
  312. int opt_pll_freq = 0; // default is set in gc3355_pll_freq_init2
  313. int opt_sha2_number = 160;
  314. bool opt_hubfans = false;
  315. bool opt_dual_mode = false;
  316. void gc3355_dual_reset(int fd)
  317. {
  318. #ifdef WIN32
  319. DCB dcb;
  320. memset(&dcb, 0, sizeof(DCB));
  321. GetCommState(_get_osfhandle(fd), &dcb);
  322. dcb.fDtrControl = DTR_CONTROL_ENABLE;
  323. SetCommState(_get_osfhandle(fd), &dcb);
  324. Sleep(1);
  325. GetCommState(_get_osfhandle(fd), &dcb);
  326. dcb.fDtrControl = DTR_CONTROL_DISABLE;
  327. SetCommState(_get_osfhandle(fd), &dcb);
  328. #else
  329. int dtr_flag = 0;
  330. ioctl(fd, TIOCMGET, &dtr_flag);
  331. dtr_flag |= TIOCM_DTR;
  332. ioctl(fd, TIOCMSET, &dtr_flag);
  333. usleep(1000);
  334. ioctl(fd, TIOCMGET, &dtr_flag);
  335. dtr_flag &= ~TIOCM_DTR;
  336. ioctl(fd, TIOCMSET, &dtr_flag);
  337. #endif
  338. }
  339. static
  340. void gc3355_send_cmds(int fd, const char *cmds[])
  341. {
  342. int i = 0;
  343. unsigned char ob_bin[32];
  344. for(i = 0 ;; i++)
  345. {
  346. memset(ob_bin, 0, sizeof(ob_bin));
  347. if (cmds[i][0] == 0)
  348. break;
  349. hex2bin(ob_bin, cmds[i], strlen(cmds[i]) / 2);
  350. icarus_write(fd, ob_bin, 8);
  351. usleep(DEFAULT_DELAY_TIME);
  352. }
  353. }
  354. void gc3355_opt_scrypt_init(int fd)
  355. {
  356. const char *initscrypt_ob[] =
  357. {
  358. "55AA1F2810000000",
  359. "55AA1F2813000000",
  360. ""
  361. };
  362. gc3355_send_cmds(fd, initscrypt_ob);
  363. }
  364. int gc3355_get_cts_status(int fd)
  365. {
  366. int ret;
  367. int status = 0;
  368. #ifdef WIN32
  369. GetCommModemStatus(_get_osfhandle(fd), &status);
  370. applog(LOG_DEBUG, "Get CTS Status is : %d [Windows: 0 is 1.2; 16 is 0.9]\n", status);
  371. ret = (status == 0) ? 1 : 0;
  372. return ret;
  373. #else
  374. ioctl(fd, TIOCMGET, &status);
  375. ret = (status & 0x20) ? 0 : 1;
  376. applog(LOG_DEBUG, "Get CTS Status is : %d [Linux: 1 is 1.2; 0 is 0.9]\n", ret);
  377. return ret;
  378. #endif
  379. }
  380. void gc3355_set_rts_status(int fd, unsigned int value)
  381. {
  382. #ifdef WIN32
  383. DCB dcb;
  384. memset(&dcb, 0, sizeof(DCB));
  385. GetCommState(_get_osfhandle(fd), &dcb);
  386. if (value != 0)
  387. dcb.fRtsControl = RTS_CONTROL_ENABLE;
  388. else
  389. dcb.fRtsControl = RTS_CONTROL_DISABLE;
  390. SetCommState(_get_osfhandle(fd), &dcb);
  391. #else
  392. int rts_flag = 0;
  393. ioctl(fd, TIOCMGET, &rts_flag);
  394. if (value != 0)
  395. rts_flag |= TIOCM_RTS;
  396. else
  397. rts_flag &= ~TIOCM_RTS;
  398. ioctl(fd, TIOCMSET, &rts_flag);
  399. #endif
  400. }
  401. static
  402. void gc3355_pll_freq_init2(int fd, int pll_freq)
  403. {
  404. switch(pll_freq)
  405. {
  406. case 400:
  407. {
  408. gc3355_send_cmds(fd, pll_freq_400M_cmd);
  409. break;
  410. }
  411. case 500:
  412. {
  413. gc3355_send_cmds(fd, pll_freq_500M_cmd);
  414. break;
  415. }
  416. case 550:
  417. {
  418. gc3355_send_cmds(fd, pll_freq_550M_cmd);
  419. break;
  420. }
  421. case 600:
  422. {
  423. gc3355_send_cmds(fd, pll_freq_600M_cmd);
  424. break;
  425. }
  426. case 650:
  427. {
  428. gc3355_send_cmds(fd, pll_freq_650M_cmd);
  429. break;
  430. }
  431. case 700:
  432. {
  433. gc3355_send_cmds(fd, pll_freq_700M_cmd);
  434. break;
  435. }
  436. case 750:
  437. {
  438. gc3355_send_cmds(fd, pll_freq_750M_cmd);
  439. break;
  440. }
  441. case 800:
  442. {
  443. gc3355_send_cmds(fd, pll_freq_800M_cmd);
  444. break;
  445. }
  446. case 850:
  447. {
  448. gc3355_send_cmds(fd, pll_freq_850M_cmd);
  449. break;
  450. }
  451. case 900:
  452. {
  453. gc3355_send_cmds(fd, pll_freq_900M_cmd);
  454. break;
  455. }
  456. case 950:
  457. {
  458. gc3355_send_cmds(fd, pll_freq_950M_cmd);
  459. break;
  460. }
  461. case 1000:
  462. {
  463. gc3355_send_cmds(fd, pll_freq_1000M_cmd);
  464. break;
  465. }
  466. case 1100:
  467. {
  468. gc3355_send_cmds(fd, pll_freq_1100M_cmd);
  469. break;
  470. }
  471. case 1200:
  472. {
  473. gc3355_send_cmds(fd, pll_freq_1200M_cmd);
  474. break;
  475. }
  476. default:
  477. {
  478. if (gc3355_get_cts_status(fd) == 1)
  479. //1.2v - Scrypt mode
  480. gc3355_send_cmds(fd, pll_freq_850M_cmd);
  481. else
  482. //0.9v - Scrypt + SHA mode
  483. gc3355_send_cmds(fd, pll_freq_550M_cmd);
  484. }
  485. }
  486. }
  487. void gc3355_open_sha2_unit(int fd, char *opt_sha2_gating)
  488. {
  489. unsigned char ob_bin[32];
  490. int i;
  491. //---sha2 unit---
  492. char sha2_gating[5][17] =
  493. {
  494. "55AAEF0200000000",
  495. "55AAEF0300000000",
  496. "55AAEF0400000000",
  497. "55AAEF0500000000",
  498. "55AAEF0600000000",
  499. };
  500. union
  501. {
  502. unsigned int i32[5];
  503. unsigned char c8[20] ;
  504. }sha2_group;
  505. int sha2_number=0;
  506. if (opt_sha2_gating== NULL)
  507. sha2_number = 70;
  508. else
  509. {
  510. if (atoi(opt_sha2_gating) <= 160 && atoi(opt_sha2_gating) >= 0)
  511. sha2_number = atoi(opt_sha2_gating);
  512. else
  513. sha2_number = 70;
  514. }
  515. for(i = 0; i < 5; i++)
  516. sha2_group.i32[i] = 0;
  517. for(i = 0; i < sha2_number; i++)
  518. sha2_group.i32[i / 32] += 1 << ( i % 32);
  519. for(i = 0; i < 20; i++)
  520. sprintf(&sha2_gating[i / 4][8 + (i % 4) * 2], "%02x", sha2_group.c8[i]);
  521. //---sha2 unit end---
  522. for(i = 0; i < 5; i++)
  523. {
  524. memset(ob_bin, 0, sizeof(ob_bin));
  525. if (sha2_gating[i][0] == '\0')
  526. break;
  527. hex2bin(ob_bin, sha2_gating[i], sizeof(ob_bin));
  528. icarus_write(fd, ob_bin, 8);
  529. usleep(DEFAULT_DELAY_TIME);
  530. }
  531. opt_sha2_number = sha2_number;
  532. }
  533. static
  534. void gc3355_open_sha2_unit_one_by_one(int fd, char *opt_sha2_gating)
  535. {
  536. int unit_count = 0;
  537. unsigned char ob_bin[32];
  538. int i;
  539. unit_count = atoi(opt_sha2_gating);
  540. if (unit_count < 0)
  541. unit_count = 0;
  542. if (unit_count > 160)
  543. unit_count = 160;
  544. if (unit_count > 0 && unit_count <= 160)
  545. {
  546. for(i = 0; i <= unit_count; i++)
  547. {
  548. memset(ob_bin, 0, sizeof(ob_bin));
  549. hex2bin(ob_bin, sha2_single_open[i], sizeof(ob_bin));
  550. icarus_write(fd, ob_bin, 8);
  551. usleep(DEFAULT_DELAY_TIME * 2);
  552. }
  553. opt_sha2_number = unit_count;
  554. }
  555. else if (unit_count == 0)
  556. gc3355_send_cmds(fd, sha2_gating);
  557. }
  558. void gc3355_opt_scrypt_only_init(int fd)
  559. {
  560. gc3355_send_cmds(fd, scrypt_only_init);
  561. gc3355_pll_freq_init2(fd, opt_pll_freq);
  562. }
  563. void gc3355_open_scrypt_unit(int fd, int status)
  564. {
  565. const char *scrypt_only_ob[] =
  566. {
  567. "55AA1F2810000000",
  568. "",
  569. };
  570. const char *scrypt_ob[] =
  571. {
  572. "55AA1F2814000000",
  573. "",
  574. };
  575. if (status == SCRYPT_UNIT_OPEN)
  576. {
  577. if (opt_dual_mode)
  578. gc3355_opt_scrypt_init(fd);
  579. else
  580. gc3355_opt_scrypt_only_init(fd);
  581. }
  582. else
  583. {
  584. if (opt_dual_mode)
  585. gc3355_send_cmds(fd, scrypt_ob);
  586. else
  587. gc3355_send_cmds(fd, scrypt_only_ob);
  588. }
  589. }
  590. void gc3355_dualminer_init(int fd)
  591. {
  592. const char *init_ob[] =
  593. {
  594. #if 1
  595. "55AAEF0200000000",
  596. "55AAEF0300000000",
  597. "55AAEF0400000000",
  598. "55AAEF0500000000",
  599. "55AAEF0600000000",
  600. #endif
  601. "55AAEF3020000000",
  602. "55AA1F2817000000",
  603. ""
  604. };
  605. const char *initscrypt_ob[] =
  606. {
  607. "55AA1F2814000000",
  608. "55AA1F2817000000",
  609. ""
  610. };
  611. if (opt_scrypt)
  612. gc3355_send_cmds(fd, initscrypt_ob);
  613. else
  614. gc3355_send_cmds(fd, init_ob);
  615. if (!opt_scrypt)
  616. gc3355_pll_freq_init2(fd, opt_pll_freq);
  617. }
  618. void gc3355_init(int fd, char *sha2_unit, bool is_scrypt_only)
  619. {
  620. if (gc3355_get_cts_status(fd) == 1)
  621. {
  622. //1.2v - Scrypt mode
  623. if (opt_scrypt)
  624. {
  625. if (is_scrypt_only)
  626. gc3355_opt_scrypt_only_init(fd);
  627. }
  628. else
  629. {
  630. if (opt_hubfans)
  631. ((sha2_unit == NULL) ? gc3355_open_sha2_unit_one_by_one(fd, HUBFANS_1_2V_sha2) : gc3355_open_sha2_unit_one_by_one(fd, sha2_unit));
  632. else
  633. ((sha2_unit == NULL) ? gc3355_open_sha2_unit_one_by_one(fd, DEFAULT_1_2V_sha2) : gc3355_open_sha2_unit_one_by_one(fd, sha2_unit));
  634. }
  635. }
  636. else
  637. {
  638. //0.9v - Scrypt + SHA mode
  639. if (opt_scrypt)
  640. {
  641. if (is_scrypt_only)
  642. gc3355_opt_scrypt_only_init(fd);
  643. }
  644. else
  645. {
  646. if (opt_hubfans)
  647. ((sha2_unit == NULL) ? gc3355_open_sha2_unit_one_by_one(fd, HUBFANS_0_9V_sha2) : gc3355_open_sha2_unit_one_by_one(fd, sha2_unit));
  648. else
  649. ((sha2_unit == NULL) ? gc3355_open_sha2_unit_one_by_one(fd, DEFAULT_0_9V_sha2) : gc3355_open_sha2_unit_one_by_one(fd, sha2_unit));
  650. }
  651. }
  652. }