2011-11-01 8 views
11

मैं वर्तमान में उपयोगकर्ता भूमि से एक यूएसबी ऑडियो डिवाइस के साथ इंटरफेस करने की कोशिश कर रहा हूँ। मेरे पास वर्तमान में डिवाइस पूरी तरह से समझा गया है और मैंने इंटरफ़ेस सेट किया है और इंटरफ़ेस गैर-शून्य-बैंडविड्थ वैकल्पिक इंटरफ़ेस में वैकल्पिक इंटरफ़ेस सेट किया है।उपयोगकर्ता मोड यूएसबी isochronous स्थानांतरण डिवाइस से मेजबान

सबसे पहले मुझे कहना है कि मैं libusb जैसी किसी भी चीज़ का उपयोग नहीं कर सकता। मैंने लिनक्स की यूएसबी डिवाइस फाइल सिस्टम के माध्यम से ऐसा करने का प्रयास किया।

तो जहां तक ​​मैं कह सकता हूं कि मैं isochronous डेटा प्राप्त करने के लिए तैयार हूं। हालांकि मुझे एक आइसोक्रोनस ट्रांसफर करने के तरीके पर बहुत कम जानकारी मिल सकती है।

जो मैं कह सकता हूं उससे मुझे एक 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 

मुझे समझ में नहीं आ रहा है कि पर्याप्त यूएसबी बस बैंडविड्थ क्यों नहीं होगी। केवल 1 यूएसबी पोर्ट है और मेरा डिवाइस एकमात्र डिवाइस है जो इसमें प्लग है।

कोई विचार?

+0

आप libusb का उपयोग क्यों नहीं कर सकते? –

+0

@ जिम क्ले क्योंकि प्रश्न में विशिष्ट प्लेटफार्म एंड्रॉइड है और मेरे पास पहले से ही एक खुली फ़ाइल डिस्क्रिप्टर है और मैं अनुमतियों के कारण, libusb का उपयोग कर एक डिवाइस खोल सकता हूं ... – Goz

+0

हाय गोज़, मैं वर्तमान में हल करने की कोशिश कर रहा हूं एक ही समस्या - libusb से परहेज, एंड्रॉइड पर isochronous हस्तांतरण की है। क्या कोई तरीका है कि आप एक वर्किंग कोड नमूना पोस्ट करेंगे? मेरा चिपकने वाला बिंदु वर्तमान में संरचना परिभाषाएं और अनुरोध मान है। आप इन्हें कहां सोर्स कर रहे हैं? अग्रिम में धन्यवाद। – Gusdor

उत्तर

5

ठीक है तो यह पता चला है कि समस्या इस तथ्य के कारण है कि एंड्रॉइड ओएस ने छुपा नियंत्रण को संभालने के लिए एक छिपाई चालक रखा है। ऐसा लगता है कि बैंडविड्थ को अवरुद्ध करना है। एचआईडी इंटरफेस से इन ड्राइवरों को अलग करना बैंडविड्थ को जारी करने के लिए इकोक्रोनस स्थानांतरण को अनुमति देता है।

आप निम्न कार्य करके कर्नेल ड्राइवर को अलग:

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_open() फ़ंक्शन को फिर से कार्यान्वित करने के बजाय libusb में मौजूद सभी चीज़ों को फिर से कार्यान्वित करने का प्रयास क्यों कर रहे हैं जो फ़ाइल डिस्क्रिप्टर को तर्क और आपकी संरचना usb_device * के रूप में ले जाएगा। आप libusb usb_open() स्रोत कोड से अधिकांश कोड ले सकते हैं, और बाकी के लिए libusb का उपयोग कर सकते हैं।

+0

क्योंकि तब मैं एलजीपीएल लाइसेंस का असफल पड़ता हूं ... – Goz

+2

मैं एलजीपीएल के साथ आपकी समस्या को समझ नहीं पा रहा हूं, क्या आप एक मालिकाना सॉफ्टवेयर विकसित कर रहे हैं? यदि ऐसा है, तो आप अभी भी एक जीपीएल लाइब्रेरी के विपरीत एलजीपीएल लाइब्रेरी से लिंक कर सकते हैं। यदि आपको सही याद है, तो एकमात्र दायित्व आपके पास होगा, एक और लाइब्रेरी से जुड़ने का एक तरीका प्रदान करना होगा। यदि आप गतिशील रूप से जुड़ी बाइनरी वितरित कर रहे हैं, तो आपके पास कोई समस्या नहीं है। यदि आप एक स्थिर रूप से जुड़ी बाइनरी प्रदान कर रहे हैं, तो आपको अपनी बाइनरी की ऑब्जेक्ट फ़ाइल प्रदान करनी होगी ताकि लोग आसानी से किसी और चीज़ से फिर से लिंक कर सकें। –

+0

अलास मुझे वह विकल्प नहीं मिला है। – Goz

1

मैं उपयोगकर्ता मोड यूएसबी समकालिक हस्तांतरण के लिए एक जावा वर्ग में लिखा है: UsbIso

यह JNA का उपयोग करता है के माध्यम से IOCTL कॉल USBFS API एक्सेस करने की।

+0

अच्छा, बुकमार्क किया गया :) – Goz

संबंधित मुद्दे