I'm trying to work with a CDC-ACM device which has five end-points.
The three first ones are the regular Control + Data and the other two are
proprietary end-points, for transferring some binary data.
Needless to mention that the device has no Linux driver (only
windows).
Till recently the device was a pure CDC-ACM one, had only 3 end-points
and was recognized by the acm as a modem.
This USED to be its configuration:
T: Bus=01 Lev=01 Prnt=01
Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 1.01 Cls=02(comm.) Sub=00 Prot=00 MxPS=16 #Cfgs=
1
P: Vendor=xxxx ProdID=xxxx Rev= 0.00
S: Manufacturer=xxxxxxxxxxxxxxxxxxx
S: Product=xxxxxxxxxxxxxxxxxxxxxxxxxx
S: SerialNumber=Serial Number
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
I: If#=
0 Alt= 0 #EPs= 1
Cls=02(comm.)
Sub=02 Prot=01 Driver=(none)
E:
Ad=81(I)
Atr=03(Int.) MxPS= 16 Ivl= 32ms
I: If#=
1 Alt= 0 #EPs= 2
Cls=0a(data
) Sub=00 Prot=00
Driver=(none)
E: Ad=8a(I)
Atr=02(Bulk) MxPS= 64
Ivl= 0ms
E:
Ad=0b(O)
Atr=02(Bulk) MxPS= 64 Ivl= 0ms
In its new release they've added two more end-points and although
still being a CDC-ACM compatible, they changed the class to 0xff:
T: Bus=01 Lev=01 Prnt=01
Port=00 Cnt=01 Dev#= 4 Spd=12 MxCh= 0
D: Ver= 1.01 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=16 #Cfgs=
1
P: Vendor=xxxx ProdID=xxxx Rev= 0.00
S: Manufacturer=xxxxxxxxxxxxxxx
S: Product=xxxxxxxxxxxxxxxxx
S: SerialNumber=Serial Number
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
I: If#=
0 Alt= 0 #EPs= 3
Cls=ff(vend.)
Sub=ff Prot=ff
Driver=(none)
E:
Ad=81(I)
Atr=03(Int.) MxPS= 16 Ivl=128ms
E:
Ad=8a(I)
Atr=02(Bulk) MxPS= 64 Ivl= 0ms
E:
Ad=0b(O)
Atr=02(Bulk) MxPS= 64 Ivl= 0ms
I: If#=
1 Alt= 0 #EPs= 2 Cls=ff(vend.)
Sub=ff Prot=ff Driver=(none)
E:
Ad=83(I) Atr=02(Bulk) MxPS= 64 Ivl= 0ms
E: Ad=06(O) Atr=02(Bulk) MxPS= 64 Ivl= 0ms
I need to work with this device(modem) asap, and I really don't have time
for writing a device driver from scratch (nor do I have the
knowledge).
Since I have access to the device source code I tried to re-make it
CDC-ACM compatible by re-arranging the descriptors:
T: Bus=01 Lev=01 Prnt=01
Port=00 Cnt=01 Dev#= 11 Spd=12 MxCh= 0
D: Ver= 1.01 Cls=02(comm.) Sub=00 Prot=00 MxPS=16 #Cfgs=
1
P: Vendor=xxxx ProdID=xxxx Rev= 0.00
S: Manufacturer=xxxxxxxxxxxxxxxx
S: Product=xxxxxxxxxxxxxx
S: SerialNumber=Serial Number
C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA
I: If#=
0 Alt= 0 #EPs= 1
Cls=02(comm.)
Sub=02 Prot=01 Driver=(none)
E: Ad=81(I)
Atr=03(Int.) MxPS= 16
Ivl=128ms
I: If#=
1 Alt= 0 #EPs= 2
Cls=0a(data
) Sub=00 Prot=00
Driver=(none)
E:
Ad=8a(I) Atr=02(Bulk)
MxPS= 64 Ivl= 0ms
E:
Ad=0b(O)
Atr=02(Bulk) MxPS= 64
Ivl= 0ms
I: If#=
2 Alt= 0 #EPs= 2
Cls=ff(vend.)
Sub=ff Prot=ff Driver=(none)
E:
Ad=83(I)
Atr=02(Bulk) MxPS= 64
Ivl= 0ms
E:
Ad=06(O)
Atr=02(Bulk) MxPS= 64 Ivl= 0ms
What I wanted was that the ACM driver will recognize the device as
a modem, so again I'll be able to use it as one.
The ACM module was loaded successfully but when I tried doing:
echo atd > /dev/input/ttyACM0
I got a "wrong parameter" message.
I REALLY need some help here...
Is it possible to have an ACM device with more then 3 end-points?
What should I change in the ACM driver in-order for the modem to work
fine?
IF the ACM will work fine, will it be possible for me to use the other
two (unused) end-points by using IOCTL and the end-point id?
Thanks in advance,
--Gilad
- Re: [linux-usb-devel] ACM device with 5 end-points Gilad Bornstein
- Re: [linux-usb-devel] ACM device with 5 end-points Vojtech Pavlik
