2011-11-01 37 views
11

Tôi hiện đang cố gắng kết nối với thiết bị âm thanh USB từ vùng đất của người dùng. Tôi hiện đang có thiết bị đầy đủ liệt kê và tôi đã thiết lập giao diện và thiết lập giao diện thay thế cho giao diện thay thế không phải băng thông giao diện.Chế độ người dùng USB chuyển đổi đẳng thời từ thiết bị đến máy chủ

Trước hết tôi phải nói rằng tôi không thể sử dụng bất cứ thứ gì như libusb. Tôi đã thực hiện điều này thông qua hệ thống tệp thiết bị USB của Linux.

Vì vậy, theo như tôi có thể nói tôi đã sẵn sàng để bắt đầu nhận dữ liệu đẳng thời. Tuy nhiên tôi có thể tìm thấy rất ít thông tin về cách thực hiện chuyển giao đẳng thời.

Từ những gì tôi có thể nói tôi cần điền cấu trúc usbdevfs_urb nhưng tôi hoàn toàn không chắc chắn về cách điền chính xác cấu trúc này.

Ngoài ra, một khi tôi đã điền cấu trúc này là tôi ngay trong suy nghĩ tôi cần phải gọi như sau:

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

và sau đó một lần nộp tôi có thể chờ cho yêu cầu để hoàn thành sử dụng

USBDEVFS_REAPURBNDELAY 

Trong trường hợp REAPURBNDELAY chính xác thì thông số nào tôi cần phải vượt qua?

Tôi thậm chí còn sủa cây đúng không?

Mọi thông tin sẽ được đánh giá ồ ạt.

Cảm ơn trước!

Edit:

tôi cố gắng để làm việc chuyển nhượng đẳng thời như sau:

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 này mang lại cho tôi một lỗi của -28 (ENOSPC).

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

Tôi không hiểu tại sao không có đủ băng thông bus USB. Chỉ có 1 cổng USB và thiết bị của tôi là thiết bị duy nhất được cắm vào nó.

Mọi suy nghĩ?

+0

Tại sao bạn không thể sử dụng libusb? –

+0

@Jim Clay Vì nền tảng cụ thể được đề cập là android và tôi đã có bộ mô tả tệp mở và tôi không thể, do quyền, hãy mở một thiết bị bằng libusb ... – Goz

+0

Xin chào, tôi hiện đang cố gắng giải quyết cùng một vấn đề - đó là chuyển isochronous trên android, tránh libusb. Có cách nào bạn sẽ đăng một mẫu mã làm việc? Điểm gắn bó của tôi hiện tại là định nghĩa cấu trúc và các giá trị yêu cầu. Bạn tìm nguồn cung ứng ở đâu? Cảm ơn trước. – Gusdor

Trả lời

5

Ok vậy nó chỉ ra rằng vấn đề là do thực tế là hệ điều hành Android đã đặt một trình điều khiển HID để xử lý các điều khiển HID. Điều này dường như chặn băng thông. Việc tách các trình điều khiển này khỏi các giao diện HID giải phóng băng thông cho phép truyền tải đẳng thời.

Bạn tách kernel driver bằng cách làm như sau:

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

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

Nếu những gì tôi đã làm là đúng.

3

Tôi hiểu lý do duy nhất bạn không sử dụng libusb là bạn không thể tự mở thiết bị USB nhưng bạn có một trình mô tả tệp trỏ đến nó.

Nếu điều này là chính xác, tại sao bạn đang cố gắng triển khai lại mọi thứ có trong libusb thay vì chỉ thực hiện lại hàm usb_open() sẽ lấy một bộ mô tả tệp làm đối số và cấu trúc của bạn usb_device *. Bạn có thể lấy hầu hết mã từ mã nguồn libusb usb_open() và sử dụng libusb cho phần còn lại.

+0

Vì sau đó tôi bị lỗi giấy phép LGPL ... – Goz

+2

Tôi không hiểu vấn đề của bạn với LGPL, bạn có đang phát triển một phần mềm sở hữu độc quyền không? Nếu đúng như vậy, bạn vẫn có thể liên kết nó với thư viện LGPL, trái ngược với thư viện GPL. Nghĩa vụ duy nhất bạn sẽ có, nếu tôi nhớ chính xác, sẽ là cung cấp một cách để liên kết với một thư viện khác. Nếu bạn đang phân phối một tệp nhị phân được liên kết động, thì bạn không có vấn đề gì. Nếu bạn đang cung cấp một nhị phân liên kết tĩnh, thì bạn sẽ phải cung cấp tệp đối tượng của tệp nhị phân để mọi người có thể liên kết lại với một thứ khác dễ dàng. –

+0

Than ôi, tôi không có được sự lựa chọn đó. – Goz

1

Tôi đã viết một lớp Java để truyền đẳng thời chế độ người dùng USB: UsbIso

Nó sử dụng JNA để truy cập USBFS API qua IOCTL gọi.

+0

Rất hay, đánh dấu là :) – Goz

Các vấn đề liên quan