2011-11-01 92 views
11

我目前正在嘗試從用戶用地連接USB音頻設備。我目前已經完全列舉了該設備,並且已經設置了接口並將接口設置爲接口非零帶寬替代接口。用戶模式從設備到主機的USB等時傳輸

首先,我必須說我不能使用像libusb這樣的東西。我需要通過Linux的USB設備文件系統來做到這一點。

因此,據我所知,我已準備好開始接收等時數據。但是,我可以找到有關如何執行同步傳輸的信息很少。

從我可以告訴我需要填充usbdevfs_urb結構,但我完全不確定如何填寫此結構。

而且,一旦我填補這個結構我是正確的思維,我需要調用如下

int retSubmit = ioctl(fd, USBDEVFS_SUBMITURB, &usbRequest); 

然後一旦提交,我可以等待請求使用完成

USBDEVFS_REAPURBNDELAY 

就REAPURBNDELAY而言,我需要傳遞的參數究竟是什麼?

我甚至會吠叫正確的樹嗎?

任何信息將大規模讚賞。

在此先感謝!

編輯:

我試圖做同步傳輸如下:

usbdevfs_urb& urbRequest  = *(usbdevfs_urb*)malloc(384); 
urbRequest.type     = USBDEVFS_URB_TYPE_ISO; 
urbRequest.endpoint    = mpEndpoint->GetEndpointAddress();//mpEndpoint->GetEndpointIndex(); 
urbRequest.status    = 0; 
urbRequest.flags    = USBDEVFS_URB_ISO_ASAP; 
urbRequest.buffer    = pData; 
urbRequest.buffer_length  = 0; 
urbRequest.actual_length  = 0; 
urbRequest.start_frame   = 0; 
urbRequest.number_of_packets = 1; 
urbRequest.error_count   = 0; 
urbRequest.signr    = 0; 
urbRequest.usercontext   = pData; 

usbdevfs_iso_packet_desc* pIsoPacketDesc = &urbRequest.iso_frame_desc[0]; 
pIsoPacketDesc->length   = 384; 
pIsoPacketDesc->actual_length = 0; 
pIsoPacketDesc->status   = 0; 

Unfgortunately這給了我-28(ENOSPC)錯誤。

<7>[ 3184.243163] usb 1-1: usbfs: usb_submit_urb returned -28 

我不明白爲什麼沒有足夠的USB總線帶寬。只有1個USB端口,我的設備是唯一插入它的設備。

有什麼想法?

+0

爲什麼你不能使用libusb? –

+0

@Jim Clay因爲有問題的特定平臺是Android和我已經有一個開放的文件描述符,我不能,由於權限,使用libusb打開一個設備... – Goz

+0

嗨Goz,我目前正試圖解決同樣的問題 - 在android上同步傳輸,避免libusb。有什麼方法可以發佈有效的代碼示例嗎?我現在的關鍵點是結構定義和請求值。你在哪裏採購這些?提前致謝。 – Gusdor

回答

5

好吧,事實證明,這個問題是由於android操作系統放置了一個HID驅動程序來處理HID控件。這似乎阻止了帶寬。從HID接口分離這些驅動程序會釋放帶寬,以便進行同步傳輸。

您可通過執行以下分離內核驅動程序:

usbdevfs_ioctl command; 
command.ifno  = mpInterface->GetInterfaceNumber(); 
command.ioctl_code = USBDEVFS_DISCONNECT; 
command.data  = NULL; 

int ret = ioctl(fd, USBDEVFS_IOCTL, &command); 

否則我所做的是正確的。

3

我知道你不使用libusb的唯一原因是你不能自己打開USB設備,但你有一個文件描述符指向它。

如果這一切都正確,你爲什麼要重新實現libusb中的所有東西,而不是重新實現將文件描述符作爲參數和struct usb_device *的usb_open()函數。你可以從libusb usb_open()源代碼中獲取大部分代碼,剩餘部分使用libusb。

+0

因爲那時我犯了LGPL許可證...... – Goz

+2

我不明白你對LGPL的問題,你在開發一個專有軟件嗎?如果是這種情況,您仍然可以將它與LGPL庫相鏈接,而不是GPL庫。如果我沒有記錯,唯一的義務就是提供一種與其他圖書館聯繫的方式。如果你正在分發一個動態鏈接的二進制文件,那麼你沒有問題。如果您提供了一個靜態鏈接的二進制文件,那麼您將不得不提供二進制文件的目標文件,以便人們可以輕鬆地與其他文件重新鏈接。 –

+0

唉,我不能做出這個選擇。 – Goz

1

我已經寫了用戶模式USB同步傳輸的Java類:UsbIso

它採用JNA通過IOCTL調用訪問USBFS API。

+0

不錯,書籤:) – Goz

相關問題