Apalis T30 RNDIS and Windows 10 Unsigned Driver Installation

I’m running an Apalis T30 as an RNDIS USB device.

When I connect it to Windows 10, no driver is available for this type of device. I know that Toradex provide an unsigned driver however this requires Windows 10 to restart in “unsigned driver mode” however this is not something we are able to ask our customers to do.

Is there any way to use a signed driver which is already present with Windows 10? Or do you have a signed driver for this type of USB device?

Presently on a Windows 7 machine, I use the “Microsoft Corp - Remote RNDIS” driver which works perfectly.

Thanks, Kevin

Note from WinCE Team: In order to use the same Host driver again as it has been under Windows 7 you have to modify the class / subclass settings of the USB RNDIS on the client as following:

Class: 0xEF
Subclass: 0x04
Protocol: 0x01

We did some tests, this should also be backward compatible: With this settings, the driver should also work under Windows 7, 8 and 10.

See also this question on the community.

Ok, so I’m guessing that in order to change the class/subclass/protocol of the device, I will need to modify the Linux kernel (presumably in the /drivers/usb/gadget/f_rndis.c file) and then recompile? Or is this something that can be changed via the terminal?

It doesn’t appear that any of the ‘stuff’ can be changed at runtime. If I try and change the bDeviceClass or bDeviceSubClass or bDeviceProtocol values then nothing happens - they read back as 0’ still.

Any further suggestions please? If I was to look at changing the class, subclass and protocol values in the Linux kernel for the RNDIS device, where would I look? Changing them at runtime has no effect.

Some stuff may be set at run time via /sys/class/android_usb/android0.

Here you go with the comment in the sources about this:

Default vendor and product IDs, overridden by userspace

Please also note the sequence to bring it up from userspace.

Hi Marcel, thanks for the link however this only seems to relate to the PID and VID of the USB device and not the bDeviceClass, bDeviceSubClass or bDeviceProtocol values. Having looked through the android.c file, there seems to be nowhere where the default values (for RNDIS) are specified.

The RNDIS is working, that isn’t the problem. The problem is how to change the descriptor to allow it to work with an existing signed Windows 10 driver.

I’m still no closer to solving this problem.

Is there any way I can obtain a signed version of your RNDIS driver which would allow connectivity with Windows 10? Is there any way we can get your driver signed by ourselves?

The android.c file specifies that Class is a per interface thing. Hence you need to change that in f_rndis.c, I guess just changing the struct usb_interface_descriptor accordingly should do it… However, as the c file also explains in the comment, the RNDIS specification is really not complete, and I guess there is a chance that the Windows 10 RNDIS driver (especially since it uses a different Class/SubClass) is behaving differently/incompatible…

Hi @stefan.tx

Thanks for your comment.

The reason I’m keen to get the RNDIS working is so that we can get data off our product (in which an Apalis T30 is integrated). The USB mass storage driver has severe issues including complete data loss (we’ve experienced this in the field when demonstrating to a customer), Wi-Fi is not an option due to the material used in our enclosure, Ethernet is already taken up by a built-in sensor so the only remaining logical choice is USB RNDIS.

Do you know if Toradex have plans to sign their driver? Failing that, would Toradex be willing to share their own RNDIS driver (source if necessary) to allow us to sign it ourselves?

If there are better solutions, please feel free to share.

Kind regards,
Kevin

We don’t “have” a RNDIS Windows Host driver in that sense, we just use the one which is provided by Microsoft. Now it would be possible to create (signed) a driver package with a specific inf file which makes use of Microsoft RNDIS driver for different USB products (vendor/product id and maybe also class/subclass/protocol values). Currently we don’t have such a signed driver package. The kernel documentation has a example inf file (https://www.kernel.org/doc/Documentation/usb/linux.inf), but I am not sure if that is compatible with the RNDIS driver used in the T30 Android Kernel, I guess you would have to try it out.

This website has valueable information about driver signing:
http://www.davidegrayson.com/signing/