To speed up my development, I’ll try using the dummy_hcd kernel module, which allows to emulate an OTG port connected to the computer.

dummy_hcd is missing on my GNU/Linux distribution (Linux Mint 17.3), so I had to build it myself:

apt-get source linux-image-`uname -r`
cd linux-lts-vivid-3.19.0
cp /boot/config-`uname -r` .config
cp /usr/src/linux-headers-`uname -r`/Module.symvers .
make menuconfig
# select → Device Drivers → USB support → USB Gadget Support → USB Peripheral Controller → Dummy HCD
make prepare
make scripts
make -j 4 M=drivers/usb/gadget
sudo cp drivers/usb/gadget/udc/dummy_hcd.ko /lib/modules/`uname -r`/kernel/drivers/usb/gadget/udc/
sudo depmod -a

Adding the following line to /etc/fstab makes it easier to mount the gadget file system:
gadget /dev/gadget gadgetfs noauto,user,group 0 0

Creating a udev rule in /etc/udev/rules.d/99-gadgetfs.rules allows to automatically mount the gadget filesystem when dummy_hcd is loaded:
ACTION=="add", DEVPATH=="/module/dummy_hcd" SUBSYSTEM=="module" RUN+="/bin/mkdir /dev/gadget" RUN+="/bin/mount /dev/gadget"
ACTION=="remove", DEVPATH=="/module/dummy_hcd" SUBSYSTEM=="module" RUN+="/bin/umount /dev/gadget" RUN+="/bin/rmdir /dev/gadget"

To apply this rule without rebooting:
sudo udevadm control --reload-rules

dummy_hcd can be loaded using modprobe:
sudo modprobe dummy_hcd

or automatically loaded at boot time adding this line to /etc/module:

The gadget can finally be controlled using the /dev/gadget/dummy_udc file.

10 Replies to “dummy_hcd”

      1. Thanks for the hints.

        You may be right, but there is functionfs see linuxDocumentation/usb/functionfs.txt
        Which should do what we want.

        I have the problem on the device that the gadgetfs hangs after removing a device
        functionfs and configfs seems to work better.

        An example for ffs is in the linux kernel: tools/usb/ffs-test.c


        1. I’m unsure if functionfs supports non blocking IO. I avoid threading as much as I can as it adds complexity and overhead. gadgetfs has non blocking IO through AIO.
          Did you check if your gadgetfs issue is fixed in newer kernels?

          1. I knew that i can’t use poll/select with normal gadgetfs.
            Nice to know that i can use AIO with poll and select.

            I hoped that I can use normal IO and poll/select, will be the first test.

            The boards that i have A20 with kernel 3.4.x and S905 with kernel 3.14.x use these custom kernels. Only these Kernels support all features.

            But on all is mainline linux kernel running, with missing features.
            I haven’t tested it yet.


Leave a Reply

Your email address will not be published. Required fields are marked *