fork download
  1. #include <stdio.h>
  2.  
  3. #include <string.h>
  4.  
  5. #include <sys/types.h>
  6.  
  7. #include <libusb-1.0.h>
  8.  
  9.  
  10.  
  11.  
  12.  
  13. struct libusb_device * find_devs(struct libusb_device **devs, uint16_t ivendor);
  14.  
  15. void list_devs(struct libusb_device **devs);
  16.  
  17. void fGet_device_status(struct libusb_device *adevice, struct libusb_device_handle *adevice_handle);
  18.  
  19.  
  20.  
  21. int main (int argc,char **argv)
  22.  
  23. {
  24.  
  25. //先宣告Device Handle 與Device Struct
  26.  
  27. struct libusb_device_handle *iPod_device_handle;
  28.  
  29. struct libusb_device *iPod_device;
  30.  
  31.  
  32.  
  33. int open_status=-1;
  34.  
  35. int func_status=-1;
  36.  
  37. int intf_status=-1;
  38.  
  39. int interface;
  40.  
  41.  
  42.  
  43. unsigned char send_data=0xff;
  44.  
  45. unsigned char receive_data=0;
  46.  
  47. unsigned char CtrlOut;
  48.  
  49. unsigned char CtrlIn;
  50.  
  51.  
  52.  
  53. libusb_device **devs;
  54.  
  55. ssize_t cnt;
  56.  
  57. unsigned char data[500];
  58.  
  59. int actual_length=0;
  60.  
  61. int r;
  62.  
  63.  
  64.  
  65. int i=0,ack=0;
  66.  
  67. int TotalConfig=-1,LockConfig=-1;
  68.  
  69. int TotalInter=-1,LockInter=-1;
  70.  
  71.  
  72.  
  73. char mailo[64];
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83. //USB初始化動作,設置訊息等級
  84.  
  85. {
  86.  
  87. ack=libusb_init(NULL);
  88.  
  89. if(ack==0)
  90.  
  91. printf("(1)Init....................Done\r\n");
  92.  
  93. else
  94.  
  95. printf("(1)Init....................Error(%d)\r\n",ack);
  96.  
  97. libusb_set_debug(NULL,3);
  98.  
  99. }
  100.  
  101.  
  102.  
  103. //回傳連接USB的device個數, 並把資料放到第二個參數指標內
  104.  
  105. {
  106.  
  107. ack=libusb_get_device_list(NULL, &devs);
  108.  
  109. if(ack>=0)
  110.  
  111. printf("(2)Got Devices=%d...........Done\r\n",ack);
  112.  
  113. else
  114.  
  115. {
  116.  
  117. printf("(2)Got Devices.............Error(%d)\r\n",ack);
  118.  
  119. return (int) cnt;
  120.  
  121. }
  122.  
  123. }
  124.  
  125.  
  126.  
  127. //因為libusb_device是個lib沒有釋出結構的指標, 必須換成libusb_device_descriptor這個有定義的東西秀出來
  128.  
  129. list_devs(devs);
  130.  
  131.  
  132.  
  133. //比對VID碼
  134.  
  135. {
  136.  
  137. //Sicon USB: 0x0457
  138.  
  139. //RS232 bard: 0x067b
  140.  
  141. iPod_device=find_devs(devs, 0x067b);
  142.  
  143. if(iPod_device>0)
  144.  
  145. printf("(3)Got Apple...............Done\r\n");
  146.  
  147. else
  148.  
  149. printf("(3)Got Apple...............Error(%d)\r\n",ack);
  150.  
  151. }
  152.  
  153.  
  154.  
  155. if(iPod_device>0)
  156.  
  157. {
  158.  
  159. //這裡是使用libusb_device指標打開, 並且第二個參數是拿來回傳存放結構的指標
  160.  
  161. {
  162.  
  163. open_status=libusb_open(iPod_device, &iPod_device_handle);
  164.  
  165. if(open_status==0)
  166.  
  167. printf("(4)Open Device.............Done\r\n",ack);
  168.  
  169. else
  170.  
  171. printf("(4)Open Device.............Error(%d)\r\n",ack);
  172.  
  173. }
  174.  
  175.  
  176.  
  177. if(open_status==0)//success
  178.  
  179. {
  180.  
  181. //讀取目前config數量
  182.  
  183. {
  184.  
  185. ack=libusb_control_transfer
  186.  
  187. (iPod_device_handle,
  188.  
  189. LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_DEVICE,
  190.  
  191. LIBUSB_REQUEST_GET_DESCRIPTOR,
  192.  
  193. LIBUSB_DT_DEVICE<<8|0,
  194.  
  195. 0,
  196.  
  197. data,
  198.  
  199. 500,
  200.  
  201. 1000
  202.  
  203. );
  204.  
  205. TotalConfig=data[17];
  206.  
  207. if(ack==18)
  208.  
  209. printf("(5)Total Config=%d..........Done\r\n",TotalConfig);
  210.  
  211. else
  212.  
  213. printf("(5)Total Config............Error(%d)\r\n",ack);
  214.  
  215.  
  216.  
  217. }
  218.  
  219.  
  220.  
  221. //偵測OS是否占用目前鎖定config裡的interface
  222.  
  223. {
  224.  
  225. //這裡的config從1開始算, 跟control_transfer的偏移量不同
  226.  
  227. ack=libusb_get_configuration(iPod_device_handle, &LockConfig);
  228.  
  229. if(ack==0)
  230.  
  231. printf("(5)Lock Config=%d...........Done\r\n",LockConfig);
  232.  
  233. else
  234.  
  235. printf("(5)Lock Config.............Error(%d)\r\n",ack);
  236.  
  237.  
  238.  
  239.  
  240.  
  241. ack=libusb_control_transfer
  242.  
  243. (iPod_device_handle,
  244.  
  245. LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_DEVICE,
  246.  
  247. LIBUSB_REQUEST_GET_DESCRIPTOR,
  248.  
  249. LIBUSB_DT_CONFIG<<8|(LockConfig-1),
  250.  
  251. 0,
  252.  
  253. data,
  254.  
  255. 500,
  256.  
  257. 1000
  258.  
  259. );
  260.  
  261. TotalInter=data[4];
  262.  
  263. printf("(6)Total Interface=%d.......Done\r\n",TotalInter);
  264.  
  265.  
  266.  
  267. for(i=0;i<TotalInter;i++)
  268.  
  269. {
  270.  
  271. ack=libusb_kernel_driver_active(iPod_device_handle,i);
  272.  
  273. printf("(6)OS toke Interface%d......Done(%d)\r\n",i,ack);
  274.  
  275. if(ack==1)
  276.  
  277. { //關閉OS對這interface的使用
  278.  
  279. func_status=libusb_detach_kernel_driver(iPod_device_handle, i);
  280.  
  281. LockInter=i;
  282.  
  283. }
  284.  
  285. }
  286.  
  287. }
  288.  
  289.  
  290.  
  291. //設定這個configration為alive
  292.  
  293. {
  294.  
  295. i=LockConfig;
  296.  
  297. ack=libusb_set_configuration(iPod_device_handle,i);
  298.  
  299. if(ack==0)
  300.  
  301. printf("(7)Set LockConfig=%d........Done\r\n",i);
  302.  
  303. else
  304.  
  305. printf("(7)Set LockConfig..........Error(%d)\r\n",ack);
  306.  
  307. }
  308.  
  309.  
  310.  
  311. //申請這個介面為alive
  312.  
  313. if(LockInter!=-1)
  314.  
  315. {
  316.  
  317. i=LockInter;
  318.  
  319. intf_status=libusb_claim_interface(iPod_device_handle,i);
  320.  
  321. if(intf_status==0)
  322.  
  323. printf("(7)Set LockInter=%d.........Done\r\n",i);
  324.  
  325. else
  326.  
  327. printf("(7)Set LockInter...........Error(%d)\r\n",ack);
  328.  
  329. }
  330.  
  331.  
  332.  
  333. memset(data,0x00,sizeof(data));
  334.  
  335. strcpy(data,"cd //home");
  336.  
  337. data[8]=0xD;
  338.  
  339.  
  340.  
  341. ack=libusb_bulk_transfer
  342.  
  343. (iPod_device_handle,
  344.  
  345. 2,
  346.  
  347. data,
  348.  
  349. 9,
  350.  
  351. &actual_length
  352.  
  353. ,1000
  354.  
  355. );
  356.  
  357. printf("ack=%d,data tarnslen=%d\r\n",ack,actual_length);
  358.  
  359. }
  360.  
  361. else
  362.  
  363. return -1;
  364.  
  365. }
  366.  
  367.  
  368.  
  369.  
  370.  
  371. libusb_free_device_list(devs, 1);
  372.  
  373.  
  374.  
  375.  
  376.  
  377. if(intf_status==0)
  378.  
  379. {
  380.  
  381. func_status = libusb_release_interface(iPod_device_handle, interface);
  382.  
  383. printf("release_interface %d status=%d\n",interface,func_status);
  384.  
  385. }
  386.  
  387.  
  388.  
  389. if(open_status==0)
  390.  
  391. {
  392.  
  393. libusb_close(iPod_device_handle);
  394.  
  395. printf("close_handle\n");
  396.  
  397.  
  398.  
  399. }
  400.  
  401.  
  402.  
  403. libusb_exit(NULL);
  404.  
  405.  
  406.  
  407.  
  408.  
  409. }
  410.  
  411.  
  412.  
  413. void fGet_device_status(struct libusb_device *dev, struct libusb_device_handle *dev_handle)
  414.  
  415. {
  416.  
  417. int r;
  418.  
  419. struct libusb_device_descriptor desc;
  420.  
  421. struct libusb_config_descriptor *config,*config2,*config3;
  422.  
  423. int index;
  424.  
  425. unsigned char atempstring[200];
  426.  
  427. int i;
  428.  
  429.  
  430.  
  431. r = libusb_get_device_descriptor(dev, &desc);
  432.  
  433. printf("device_descriptor status=%d\n",r);
  434.  
  435.  
  436.  
  437. r = libusb_get_active_config_descriptor(dev, &config);
  438.  
  439. printf("get_active_config_descriptor status=%d\n",r);
  440.  
  441.  
  442.  
  443. index=0;
  444.  
  445. r = libusb_get_config_descriptor(dev, index, &config2);
  446.  
  447. printf("get_config_descriptor %d status=%d\n", index, r);
  448.  
  449.  
  450.  
  451. index=1;
  452.  
  453. r = libusb_get_config_descriptor_by_value(dev, index, &config3);
  454.  
  455. printf("get_config_descriptor_byValue %d status=%d\n", index, r);
  456.  
  457.  
  458.  
  459. for(i=1;i<5;i++)
  460.  
  461. {
  462.  
  463. memset(atempstring, 0, 200);
  464.  
  465. r=libusb_get_string_descriptor_ascii(dev_handle, i, atempstring, 200 );
  466.  
  467. printf("get_cstring_descriptor %d _ascii \"%s\" len=%d\n", i, atempstring, r);
  468.  
  469. }
  470.  
  471.  
  472.  
  473. for(i=1;i<5;i++)
  474.  
  475. {
  476.  
  477. memset(atempstring, 0, 200);
  478.  
  479. r=libusb_get_descriptor(dev_handle, LIBUSB_DT_DEVICE, i, atempstring, 200 );
  480.  
  481. printf("get_cstring_descriptor %d len=%d\n", i, r);
  482.  
  483. }
  484.  
  485.  
  486.  
  487. for(i=1;i<5;i++)
  488.  
  489. {
  490.  
  491. memset(atempstring, 0, 200);
  492.  
  493. r=libusb_get_descriptor(dev_handle, LIBUSB_DT_INTERFACE, i, atempstring, 200 );
  494.  
  495. printf("get_cstring_descriptor %d len=%d\n", i, r);
  496.  
  497. }
  498.  
  499.  
  500.  
  501. libusb_free_config_descriptor(config);
  502.  
  503. printf("free_config_descriptor");
  504.  
  505. libusb_free_config_descriptor(config2);
  506.  
  507. printf("free_config_descriptor");
  508.  
  509. libusb_free_config_descriptor(config3);
  510.  
  511. printf("free_config_descriptor");
  512.  
  513. return;
  514.  
  515. }
  516.  
  517.  
  518.  
  519. struct libusb_device * find_devs(struct libusb_device **devs, uint16_t ivendor)
  520.  
  521. {
  522.  
  523. struct libusb_device *dev;
  524.  
  525. struct libusb_device_descriptor desc;
  526.  
  527. int i=0,r=0;
  528.  
  529.  
  530.  
  531. while((dev=devs[i++])!=NULL)
  532.  
  533. {
  534.  
  535. r=libusb_get_device_descriptor(dev, &desc);
  536.  
  537. if(r < 0)
  538.  
  539. {
  540.  
  541. fprintf(stderr, "failed to get device descriptor");
  542.  
  543. }
  544.  
  545. else
  546.  
  547. {
  548.  
  549. if(desc.idVendor==ivendor)
  550.  
  551. return dev;
  552.  
  553. }
  554.  
  555. }
  556.  
  557. return 0;
  558.  
  559. }
  560.  
  561.  
  562.  
  563. void list_devs(struct libusb_device **devs)
  564.  
  565. {
  566.  
  567. struct libusb_device *dev;
  568.  
  569. struct libusb_device_descriptor desc;
  570.  
  571. int i=0,r=0;
  572.  
  573.  
  574.  
  575. while((dev=devs[i++])!=NULL)
  576.  
  577. {
  578.  
  579. r=libusb_get_device_descriptor(dev, &desc);
  580.  
  581. if(r<0)
  582.  
  583. {
  584.  
  585. fprintf(stderr, "failed to get device descriptor");
  586.  
  587.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:7:24: fatal error: libusb-1.0.h: No such file or directory
compilation terminated.
stdout
Standard output is empty