Install ttyACM Module – NVIDIA Jetson TX Development Kits

A USB ttyACM device cannot be accessed on a stock L4T 28.1 installation. In this article, we cover installation of a prebuilt cdc-acm module on the NVIDIA Jetson Dev Kits running L4T 28.1 to access ttyACM devices. This works with both the Jetson TX1 and Jetson TX2. Looky here:

Background

Some USB devices report as USB, others report as ACM. Here’s an article explaining the good bits about what that means. Many devices, such as some Arduinos, report as ACM devices.

We have previously gone over how to download the kernel sources and build the kernel and modules, even how to build a module specifically to “talk ACM”. However, that seems like a lot of work to do something both simple and frequently needed. Therefore there’s a JetsonHacks repository on Github named installACMModule which contains a pre-built module along with a script to install the module.

Installation

Installation is straightforward:

$ git clone https://github.com/jetsonhacks/installACMModule
$ cd installACMModule

There is one script:

$ ./installCDCACMModule.sh

The script compares the module version with the currently running kernel version. If the versions match, then the cdc-acm module is installed. If the versions do not match, then you will be asked if this is something you really want to do. In this case, you should make sure that the kernel on your machine is a version of 4.4.38:

$ uname -r

If you have a custom version of 4.4.38 running, it should be fine. If you have a different version, then you probably should not proceed. If you decide to go ahead, you may have to do a force install, which you can do with something similar to modprobe -f cdc-acm though this hasn’t been tested. There are many online resources which talk about this type of situation, so we won’t cover them here. Here’s an extra bit of information. A module contains something called a ‘version magic’ string which tells which version of a particular kernel built the module. If the kernel version of your machine and the version magic do not match, then the module system pouts a little bit. You can override it, but just remember that it is there for a reason.

Conclusion

Whether you’re just starting out on the Jetson, or you just need a quick fix for not being able to access your ttyACM USB device, this should be a useful tool for your bag of tricks.

Notes

This has been tested both on NVIDIA Jetson TX1 and TX2 Development Kits, directly after flashing with L4T 28.1 (JetPack 3.1).

13 Comments

    • More info – I need to do sudo modprobe cdc-acm to make it show up in lsmod, however I still get “ls: cannot access ‘/dev/ttyACM*’: No such file or directory”

      Any ideas?

        • Thank you! I love this website by the way, been a long time lurker.

          How do I do that? I can’t compile anything from the kernel, I keep getting that ‘cannot stat’ error. I understand that it has something to do with L4T 28.1, but I dont know how to fix this.

  1. Okay, I have a freshly flashed Jetson TX2 on the latest Jetpack 3.1 (https://developer.nvidia.com/embedded/jetpack). I first attempted to follow http://www.jetsonhacks.com/2017/07/31/build-kernel-ttyacm-module-nvidia-jetson-tx2/, but kept getting the ‘cannot stat’ error when trying to run the copyImage.sh script. Then I found this tutorial, and I’ve done as described.

    (sorry for making a new reply thread, I wasn’t given the option to reply to your last reply)

  2. ‘cannot stat’ means that the file can not be file. This in turns means that the Image file did not compile correctly. At some point in the output, there was probably an error message stating the issue. There are sometimes issues in the make process that are related to using multiple threads. Assuming that you ran the top level scripts, you can check to see where the compile error is (from the file https://github.com/jetsonhacks/buildJetsonTX2Kernel/blob/master/scripts/makeKernel.sh):
    You will have to run these commands as super user (something like $ sudo su ):

    $ cd /usr/src/kernel/kernel-4.4
    $ make prepare
    $ make modules_prepare
    # Make alone will build the dts files too
    # make -j6
    $ make Image
    $ make modules
    $ make modules_install

    The line $ make Image should be where the issue lies. However, note that make may just build the files it missed first time through and and proceed correctly to the finish.

    Once finished, the Image file should be in:
    /usr/src/kernel/kernel-4.4arch/arm64/boot/Image

    and you should be able to use the script to copy it to the right place.

    • You are correct that the issue lies within make Image, however it’s fairly cryptic. Here is my output:

      CHK include/config/kernel.release
      CHK include/generated/uapi/linux/version.h
      CHK include/generated/utsrelease.h
      make[1]: ‘include/generated/mach-types.h’ is up to date.
      CHK include/generated/bounds.h
      CHK include/generated/timeconst.h
      CHK include/generated/asm-offsets.h
      CALL scripts/checksyscalls.sh
      CHK include/generated/compile.h
      CHK kernel/config_data.h
      CC drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.o
      In file included from drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.c:14:0:
      drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.c: In function ‘mc_ecc_config_read’:
      drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.c:113:32: error: ‘MC_EMEM_ADR_CFG_CHANNEL_MASK_1’ undeclared (first use in this function)
      mc_cfg.chanmask[1] = mc_readl(MC_EMEM_ADR_CFG_CHANNEL_MASK_1);
      ^
      include/linux/platform/tegra/mc.h:140:62: note: in definition of macro ‘mc_readl’
      #define mc_readl(reg) __mc_readl(MC_BROADCAST_CHANNEL, reg)
      ^
      drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.c:113:32: note: each undeclared identifier is reported only once for each function it appears in
      mc_cfg.chanmask[1] = mc_readl(MC_EMEM_ADR_CFG_CHANNEL_MASK_1);
      ^
      include/linux/platform/tegra/mc.h:140:62: note: in definition of macro ‘mc_readl’
      #define mc_readl(reg) __mc_readl(MC_BROADCAST_CHANNEL, reg)
      ^
      scripts/Makefile.build:261: recipe for target ‘drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.o’ failed
      make[5]: *** [drivers/../../t18x/drivers/platform/tegra/mc/mc_addr_translate.o] Error 1
      scripts/Makefile.build:406: recipe for target ‘drivers/../../t18x/drivers/platform/tegra/mc’ failed
      make[4]: *** [drivers/../../t18x/drivers/platform/tegra/mc] Error 2
      scripts/Makefile.build:406: recipe for target ‘drivers/../../t18x/drivers/platform/tegra’ failed
      make[3]: *** [drivers/../../t18x/drivers/platform/tegra] Error 2
      scripts/Makefile.build:406: recipe for target ‘drivers/../../t18x/drivers/platform’ failed
      make[2]: *** [drivers/../../t18x/drivers/platform] Error 2
      scripts/Makefile.build:406: recipe for target ‘drivers/../../t18x/drivers’ failed
      make[1]: *** [drivers/../../t18x/drivers] Error 2
      Makefile:973: recipe for target ‘drivers’ failed
      make: *** [drivers] Error 2

Leave a Reply

Your email address will not be published.


*