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

Reply via email to