NI Linux Real-Time Discussions

cancel
Showing results for 
Search instead for 
Did you mean: 

Help! Need cdc-acm driver for cRIO-9035

Hi,

I developed C++ code on a sbRIO unit that works with a USB-serial device using the CDC-ACM driver --

admin@NI-sbRIO-9637-030d3e0e:/home/lvuser# modprobe cdc-acm

admin@NI-sbRIO-9637-030d3e0e:/home/lvuser# cat /proc/modules | grep cdc

   cdc_acm 19398 0 - Live 0xbf1f9000

Now I need to deploy the code on a cRIO-9035 but to my dismay I can't find a CDC-ACM driver for it --

admin@cRIO-9035_eric:~# modprobe cdc-acm

   modprobe: FATAL: Module cdc-acm not found.

I looked in opkg for this device, and I find some other "cdc" drivers but unfortunately not "cdc-acm" --

admin@cRIO-9035_eric:~# opkg update

admin@cRIO-9035_eric:~# opkg list | grep cdc

   kernel-module-cdc-eem - 3.14+git138+0ddca5df17-r0.309 - cdc-eem kernel module  cdc-eem kernel module; USB CDC EEM

   kernel-module-cdc-ether - 3.14+git138+0ddca5df17-r0.309 - cdc-ether kernel module  cdc-ether kernel module; USB CDC Ethernet

   kernel-module-cdc-ncm - 3.14+git138+0ddca5df17-r0.309 - cdc-ncm kernel module  cdc-ncm kernel module; USB CDC NCM host driver

   kernel-module-cdc-subset - 3.14+git138+0ddca5df17-r0.309 - cdc-subset kernel module  cdc-subset kernel module; Simple 'CDC Subset'

Please help!

0 Kudos
Message 1 of 6
(4,185 Views)

What version of the OS (or run "uname -r") are you using?

0 Kudos
Message 2 of 6
(4,026 Views)

On the cRIO (no "cdc-acm")

admin@cRIO-9035:~# uname -r

3.14.46-rt46-3.5.0f0

admin@cRIO-9035:~# uname -a

Linux cRIO-9035 3.14.46-rt46-3.5.0f0 #1 SMP PREEMPT RT Tue Jan 19 21:39:08 CST 2016 x86_64 GNU/Linux

On the sbRIO (yes "cdc-acm")

admin@NI-sbRIO-9637-030d3e0e:~# uname -a

Linux NI-sbRIO-9637-030d3e0e 3.14.40-rt37-ni-3.0.0f2 #1 SMP PREEMPT RT Thu Jun 11 17:43:52 CDT 2015 armv7l GNU/Linux

0 Kudos
Message 3 of 6
(4,026 Views)

The primary issue is that it seems that the 2015 Intel kernel (what's being used on the 9035) does not have the CDC-ACM module configured (nor is it installable from the feeds, as you've found out). In past releases, the configuration used for the ARM and Intel kernels had diverged more than they should have, we'll fix that in future releases.

Basically, you're going to need to enable the module for your 9035's kernel. We've posted a few videos that go over how to do this(Working with the Linux Kernel on NI LabVIEW RT targets - Exercise 1 Working with the Linux Kernel on NI LabVIEW RT targets - Exercise 2), or if you'd rather just read some quick instructions, we include them in NI's github documentation (https://github.com/ni/nilrt/blob/nilrt/15.0/KERNEL_SOURCE.txt)

0 Kudos
Message 4 of 6
(4,026 Views)

Sigh. Rebuilding the kernel at this point is beyond my available time and knowledge, not feasible for the team and schedule.

Thanks for looking into it though.

Another question then: I could comm with the device using 'usbserial' instead of 'cdc-acm' driver.

On other Linux distros, I can associate 'usbserial' with this device by its VID/PID like this:

# modprobe usbserial vendor=0x1ad5 product=0x0300

But on sbRIO that syntax apparently doesn't work (pretty sure I got the same result on cRIO too) --

# dmesg

...

usbserial: unknown parameter 'vendor' ignored

usbserial: unknown parameter 'product' ignored

usbcore: registered new interface driver usbserial

Am I missing something? Is there some other way for me to use 'usbserial' in place of the missing 'cdc-acm'?

0 Kudos
Message 5 of 6
(4,026 Views)

The way to do this is through the new_id sysfs interface. Be warned, though, that I don't know that the generic usb serial device driver will work for a CDC ACM device (which, despite acting similar externally, probably don't have the same OS control interface. Have you actually tested this out with the other distros?

 

From a quick check of the kernel sources used for 2015, those should be reasonable parameters to pass:

https://github.com/ni/linux/blob/nilrt_pub/15.0/3.14/drivers/usb/serial/generic.c#L31

0 Kudos
Message 6 of 6
(4,008 Views)