USB client mode / usb HID mouse emulation with Beaglebone Black

Hello,

I’m currently looking for help/information regarding the possibility to use the Beaglebone Black as an external device (attached to a computer via USB) emulating a mouse (USB HID Device). The BBB should register with the computer as normal mouse and send eg. random movements to it.
My questions are the following:

  1. Is this theoretically possible?
  2. How would I achieve this? (So far I’ve searched for “USB HID mouse BBB emulation”, but have only come up with solutions for arduinos)
  3. Is there maybe an tutorial on this?
  4. Is there an API for this?
  5. Could someone provide me with a short example program?

Thank you very much in advance.

WIth kind regards
Felix

Felix,
I can help you figure this out if you want, but it begs the question…why not do this with something like a Teensy2 for half the price? The Teensy2 would be perfect for this. There are example projects that could get you doing exactly this within a few minutes of taking the Teensy2 out of the box!
thx!
-frenchy

Hi Steve,

the thing is that I already have a BBB and I need to do rather computationally intensive stuff with it. I thought it would be best to just use the available USB Port on the BBB to communicate with a host device (=Computer) in order to avoid additional hardware and software layers. Would you recommend coupling a Teensy2 with the BBB for this task?
In the end I want to plug (either the BBB or something else) into an computer which recognized the device as a USB HID mouse.

Thanks a lot.
Felix

Hi, is it possible for BeagleBone act as USB HID Camera device? (for example after installing v4l2loopback device driver)?

hi Felix and Steven,

Is there any update for this thread?
I manage to kick off a project which requires exactly what Felix intended to do.(i.e. connect BBB as a mouse to PC)
However I have no idea yet.

Can you share me the direction?

thank you

felix.w…@googlemail.com於 2013年9月24日星期二UTC+8上午2時21分40秒寫道:

Hi,

no, there are no news on it and I still haven’t figured out how to do it. I would still be very grateful for any kind of help/hint. If you do succeed, please do share your findings.

Kind regards,
Felix

I hope, that this is possible somehow, but I don’t know how. Have you had any luck so far?

Hi Steve,

could you please help me out with this problem? So far I’ve tried using gadgetfs on the angstrom (v2012.12, kernel 3.8.13) on the beagleboard black.
I can succesfully modprobe g_zero after forcefully removing g_multi (which acts as a usb-network interface to the computer, as well as a storage device).
Whenever I try to load (modprobe) g_hid, i only get the error message “ERROR: could not insert ‘g_hid’: No such device”.
Modprobing gadgetfs gives me the following message in the syslog “gadgetfs: USB Gadget filesystem, version 24 Aug 2004” and creating a dir called /dev/gadget (mkdir -p /dev/gadget), then mounting it to the gadgetfs filesystem (mount -t gadgetfs gadgetfs /dev/gadget)
gives me the following device
/dev/gadget/musb-hdrc but I do not know what to do with it.

Thanks in advance.

Regards
Felix

If you’ve gotten gadgetfs to load then you’re good. Your software just creates files in the /dev/gadgetfs folder to communicate with the usb device. Its all user space from here on.

Well, it loads and leaves the following traces in the logfiles:

[ 4535.674596] gadgetfs: USB Gadget filesystem, version 24 Aug 2004

but I did not get it to work. I’ve tried to use the following example [1], but it does not compile. Even if it would compile, I do not understand the program as “my_hid” structure that one is supposed to copy into this program is never used anywhere in the associated snippet. And still it relies on /dev/hidX to be present, which on my machine is not there.

I’ve also tried the code found on [2] but this does not work because /dev/gadget/ep0 etc. is not present. (The program did not even branch into the “else if (stat (DEVNAME = “musb_hdrc”, &statb) == 0) {” branch. I had to manually force it there).
Trying to create the nodes with “mknod ep1in c 240 1” resulted “mknod: ep1in: Operation not permitted”.

Could somebody please provide me with a (concise) example of how to use my beaglebone black as a hid (mouse or keyboard) device? I would be really grateful.

Thank you

This is an excerpt from the boot log about loading the musb-hdrc driver:
Jan 01 01:36:03 beaglebone kernel: usbcore: registered new interface driver cdc_acm
Jan 01 01:36:03 beaglebone kernel: cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
Jan 01 01:36:03 beaglebone kernel: Initializing USB Mass Storage driver…
Jan 01 01:36:03 beaglebone kernel: usbcore: registered new interface driver usb-storage
Jan 01 01:36:03 beaglebone kernel: USB Mass Storage support registered.
Jan 01 01:36:03 beaglebone kernel: musb-hdrc: version 6.0, ?dma?, otg (peripheral+host)
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.0.auto: pdev->id = 0
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.0.auto: drivers/usb/musb/musb_dsps.c:468 dsps_musb_init: OK
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.0.auto: *** mode=3
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.0.auto: *** power=250
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.1.auto: pdev->id = 1
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.1.auto: drivers/usb/musb/musb_dsps.c:468 dsps_musb_init: OK
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.1.auto: *** mode=1
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.1.auto: *** power=250
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
Jan 01 01:36:03 beaglebone kernel: musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 1
Jan 01 01:36:03 beaglebone kernel: usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
Jan 01 01:36:03 beaglebone kernel: usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
Jan 01 01:36:03 beaglebone kernel: usb usb1: Product: MUSB HDRC host driver
Jan 01 01:36:03 beaglebone kernel: usb usb1: Manufacturer: Linux 3.8.13 musb-hcd

[1] https://www.kernel.org/doc/Documentation/usb/gadget_hid.txt
[2] http://www.linux-usb.org/gadget/usb.c

I’m not too sure about your HID issue. I’ll look into it. The problem with the usb.c file is that in the file its “musb_hdrc” but that is actually wrong. You need to edit the file and then compile and it would fall through the switch perfectly fine. The actual name is “musb-hdrc”. I’m not sure how whoever wrote the file messed up the name.

Now, once you load gadget fs and compile usb.c, you still need to make one change, which will unfortunately require a kernel recompile. Information it can be found here: http://permalink.gmane.org/gmane.linux.usb.general/99672

So for a test, i suggest starting over and doing these steps:

  1. make sure you are connected via ssh over the network and not ssh through the usb0 network as we need to unload that module.

  2. using rmmod, unload g_multi and libcomposite, in that order

  3. modprobe gadgetfs

  4. compile usb.c using one of the make commands at the top of the file, the first is for polling io and the second is for async io

  5. run the output executable, if all goes well, the BBB will freeze… lol, this is alright though, this means that gadgetfs is working, if you had it hooked up to a windows machine, you should have even heard the “bladoonk” sound.

  6. Go to the link I provided and follow the instructions on recompiling the kernel to get the appropriate fixes for the freeze problem.

  7. run usb.c again and everything should be gravy. Using usb.c as a template, you should be able to start writing your software.

I have been considering creating some type of site dedicated to the gadget framework because there is literally one files worth of documentation on it, and while it is an excellent piece of software, its difficult to understand and really needs tutorials and docs. I just don’t have the time…

Also, I forgot the step where you actually mount the gadgetfs but I think you already knew that.

Hello Darrell,

thank you very much. You’ve helped me a lot. It did fail as you’ve said it would. I’ve received the following lines in the logfile of the host computer:
[ 6634.154670] usb 2-1.2: new high-speed USB device number 11 using ehci_hcd
[ 6634.249933] usb 2-1.2: New USB device found, idVendor=0525, idProduct=a4a4
[ 6634.249937] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6634.249940] usb 2-1.2: Product: My Source/Sink Product
[ 6634.249942] usb 2-1.2: Manufacturer: Licensed to Code, LLC
[ 6634.249945] usb 2-1.2: SerialNumber: emg8c8t4tfu7n9oo0viqrkn5bp97lxgcbwjp4bceyvrbs42nahnth3hjf22olbj

I tried to fix the file “inode.c” as [1] suggests but I could not find the file in /usr/src/kernel/drivers/usb/gadget/ or anywhere else (“opkg search inode.c” turned out empty).
Reading your other post I think you might be in the same place. I’ll wait till they release more information or patch the kernel.

[1] https://github.com/dominicgs/USBProxy/tree/master/doc

Hi Felix,

Were you able to make it work at the end? If you did, do you mind giving me some help? I see you are using gadgetfs but I’m not sure how this works. Do you know of any documentation or tutorial on the subject?

Thanks for all the help,
Bart