[問題] 請教libUSB操作

作者: newranger (ranger)   2013-04-25 18:37:58
請教各位先進, 目前在摸索USB, 我的計畫本來是這樣想:
libusb可以從usbcore調上來的API, 好讓我可以在使用者模式下寫些小程式實驗
另外我本身有一塊RS232轉USB,
首先我使用minicom對RS232隨便打一些字串, 然後使用usbmon觀察
把觀察到的結果紀錄後, 用自己帶有libusb的小程式去傳一些字
usbmon觀察到的結果如下<輸入"123">
f3106300 2770600118 S Bo:2:005:2 -115 1 = 31
f3106300 2770751467 C Bo:2:005:2 0 1 >
f3106480 2770761014 C Bi:2:005:3 0 1 = 31
f3106480 2770761030 S Bi:2:005:3 -115 64 <
f3106300 2771335026 S Bo:2:005:2 -115 1 = 32
f3106300 2771336300 C Bo:2:005:2 0 1 >
f3106480 2771340617 C Bi:2:005:3 0 1 = 32
f3106480 2771340637 S Bi:2:005:3 -115 64 <
f3106300 2771848105 S Bo:2:005:2 -115 1 = 33
f3106300 2771849336 C Bo:2:005:2 0 1 >
f3106480 2771850486 C Bi:2:005:3 0 1 = 33
f3106480 2771850495 S Bi:2:005:3 -115 64 <
f3106300 2775748383 S Bo:2:005:2 -115 1 = 0d
f3106300 2776196661 C Bo:2:005:2 0 1 >
f3106480 2776201096 C Bi:2:005:3 0 1 = 0d
f3106480 2776201137 S Bi:2:005:3 -115 64 <
f3106480 2776201846 C Bi:2:005:3 0 1 = 0a
f3106480 2776201929 S Bi:2:005:3 -115 64 <
f3106480 2776223409 C Bi:2:005:3 0 1 = 2d
f3106480 2776223451 S Bi:2:005:3 -115 64 <
f3106480 2776234018 C Bi:2:005:3 0 24 = 73683a20 3132333a 20636f6d 6d616e64
206e6f74 20666f75
f3106480 2776234027 S Bi:2:005:3 -115 64 <
f3106480 2776234926 C Bi:2:005:3 0 4 = 6e640d0a
f3106480 2776234940 S Bi:2:005:3 -115 64 <
f3106480 2776240407 C Bi:2:005:3 0 1 = 72
f3106480 2776240481 S Bi:2:005:3 -115 64 <
f3106480 2776242658 C Bi:2:005:3 0 14 = 6f6f7440 286e6f6e 6529207e 2420
f3106480 2776242724 S Bi:2:005:3 -115 64 <
想說看到的是其實也沒甚麼機關, 單純只是區塊傳送, 所以我照本宣科去做:
先初始化libusb
libusb_init(NULL);
.......
然後在查看BUS中裝置
libusb_get_device_list(NULL, &devs);
.......
在眾裝置中找到我的RS232轉USB
libusb_get_device_descriptor(dev, &desc);
if(desc.idVendor==RS232_ID)
libusb_open(iPod_device, &iPod_device_handle);
對他詢問DEVICE DESCRIPT 與 CONFIGRATION DESCRIPT資料
libusb_control_transfer
(iPod_device_handle,
LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_DEVICE,
LIBUSB_REQUEST_GET_DESCRIPTOR,
LIBUSB_DT_DEVICE<<8|0,
0,
data,
500,
1000
);
libusb_control_transfer
(iPod_device_handle,
LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_DEVICE,
LIBUSB_REQUEST_GET_DESCRIPTOR,
LIBUSB_DT_CONFIG<<8|(LockConfig-1),
0,
data,
500,
1000
);
記住目前configraiton與interface為何, 並讓目前interface從OS手上釋放掉
libusb_get_configuration(iPod_device_handle, &LockConfig);
.......
for()
{
ack=libusb_kernel_driver_active(iPod_device_handle,i);
if(ack==1)
func_status=libusb_detach_kernel_driver(iPod_device_handle, i);
}
重新宣告目前configration與interface對象
libusb_set_configuration(iPod_device_handle,i);
libusb_claim_interface(iPod_device_handle,i);
然後使用區塊傳送一段ASCII字串<"cd /home">
libusb_bulk_transfer
(iPod_device_handle,
2,
data,
9,
&actual_length
,1000
);
usbmon觀察我的動作如下
f31de080 3432273883 S Ci:2:005:0 s 80 06 0100 0000 01f4 500 <
f31de080 3432294194 C Ci:2:005:0 0 18 = 12011001 00000040 7b060323 00040102
0001
f31de800 3432294641 S Ci:2:005:0 s 80 06 0200 0000 01f4 500 <
f31de800 3432298158 C Ci:2:005:0 0 39 = 09022700 010100a0 32090400 0003ff00
00000705 81030a00 01070502 02400000
f31de800 3432298583 S Co:2:005:0 s 00 09 0001 0000 0000 0
f31de800 3432405110 C Co:2:005:0 0 0
f31de800 3432405401 S Bo:2:005:2 -115 9 = 6364202f 686f6d0d
f31de800 3432405837 C Bo:2:005:2 0 9 >
結果我看UART的另一端, 根本沒有把字串丟過去,
請問我中間有環節還是觀念有錯誤嗎? 希望有版友能指點一下
謝謝
我擔心排版混亂講的很撩亂, 程式完整版如下URL
http://ideone.com/EacJyJ

Links booklink

Contact Us: admin [ a t ] ucptt.com