11-11-2016 01:03 PM
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!
11-14-2016 09:59 AM
What version of the OS (or run "uname -r") are you using?
11-14-2016 10:21 AM
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
11-14-2016 03:30 PM
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)
11-14-2016 06:43 PM
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'?
11-29-2016 10:06 PM
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