无法在BeagleBoneBlack上激活USB HID设备

时间:2016-10-17 15:10:17

标签: usb beagleboneblack hid

背景:

我试图弄清楚如何使用ConfigFS在BeagleBoneBlack上设置HID设备。

我在网上找到了以下示例(www.isticktoit.net/?p=1383)并尝试了它。该示例在Raspberry Pi Zero上运行。但是,样本不适用于我的BBB。以下是我编写的脚本,以root身份执行。该脚本尝试定义键盘隐藏设备。

#!/bin/bash
cd /sys/kernel/config/usb_gadget/
modprobe libcomposite
modprobe usb_f_hid
mkdir -p isticktoit
cd isticktoit
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "fedcba9876543210" > strings/0x409/serialnumber
echo "Tobias Girstmair" > strings/0x409/manufacturer
echo "iSticktoit.net USB Device" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
# Add functions here
pwd
mkdir -p functions/hid.xyz
echo 1 > functions/hid.xyz/protocol
echo 1 > functions/hid.xyz/subclass
echo 8 > functions/hid.xyz/report_length
echo -ne \\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0 > functions/hid.xyz/report_desc
ln -s functions/hid.xyz configs/c.1/
# End functions
ls /sys/class/udc > UDC

我得到的错误是" ls:写错误:设备或资源繁忙"。

我正在运行Debian Jessie - Linux版本4.4.9-ti-r25

我做了一个lsmod和libcomposite并加载了usb_f_hid。

加载了usb设备控制器musb-hdrc-0.auto。

问题:

  1. 如何判断哪个设备正忙?

  2. 在哪里可以找到BBB的USB configfs缺陷错误列表。

  3. 是否有记录文件和启用参数可以让我了解发生了什么?

  4. 感谢您的帮助

    David Glaser

1 个答案:

答案 0 :(得分:0)

你可能遇到的beaglebone black问题是cdc_acm驱动程序。如果你不知道怎么做,很难删除(好吧,现在不是我现在知道怎么做)因为这些步骤还没有找到任何地方。我发现了这个:https://media.defcon.org/DEF%20CON%2023/DEF%20CON%2023%20presentations/DEFCON-23-Phil-Polstra-One-device-to-Pwn-them-all.pdf

这使我得到了以下解决方案

#!/usr/bin/env bash

function checkModule(){
  MODULE="$1"
  if lsmod | grep "$MODULE" &> /dev/null ; then
    echo "$MODULE" found.
    return 0
  else
    echo "$MODULE" not found.
    return 1
  fi
}


if which 'systemctl' | grep "systemctl" &> /dev/null ; then
 systemctl stop serial-getty@ttyGS0.service >/dev/null
fi

if checkModule "g_serial" == 0; then
  modprobe -r g_serial
fi

if checkModule "usb_f_acm" == 0; then
  modprobe -r usb_f_acm
fi

if ! checkModule "libcomposite" == 0; then
  modprobe libcomposite
fi

基本上,它会停止serial-getty服务,允许你删除g_serial设备,然后这允许你删除usb_f_acm。这反过来会删除您实际想要保留的libcomposite设备。完成后,您可以完成所有需要做的事情。我有一个漂亮的HID键盘以这种方式工作(好吧,我猜它现在是一个KeygleBone Black)......一旦你理解了所有的碎片,这很简单,但是我很简单把设备撕下来有点麻烦。我可能不需要最终,但我希望能够做到这一点,似乎某些目录无法删除(即"字符串"我已经创建的目录)。这意味着我无法完全拆除设备,但也许我只需要:

echo "" > /sys/kernel/config/usb_gadget/my_gadget/UDC

实际上把它撕下来。我尚无法解决这个问题。还有一些C库,但我有一堆我想要使用的python脚本,而且我还没有那些python包装器。但这可能不是太多工作。

我不想忘记提及,我试图将上面的脚本扔进rc.local,所以我正在使用的beaglebone black将是" HID ready"在开机。可能有更好的位置和方法来做到这一点,但我只是想使用rc.local,因为上面是一个脚本,rc.local是一个脚本,它应该在启动时运行......但它没有。 ..你必须确保使rc.local可运行(chmod 755 /etc/rc.local)以及修改它想要运行的默认shell(好吧,它总是运行bash,但它运行bash的方法是" POSIX"方法,但似乎不起作用,所以你必须强制它在非POSIX模式下运行bash:

#!/usr/bin/bash

同样,可能有其他更好的方法(我在这里很懒,而且,我只是老学校),特别是如果你的设备将成为物联网设备或任何链接到网络,所以你如果您需要在启动时运行此脚本,可能还需要考虑其他内容。

我确实愚蠢地遗漏了一件事:我确保beaglebone black并没有出现它通常的"磁盘"部分也是如此。我会在这里详细说明,但坦率地说,那些我必须追踪到的。我基本上搜索了如何禁用beaglebone黑色磁盘。这并不困难,等于我将一些文件移动到另一个名称,因此它没有找到" USB磁盘"启动时的配置。您也可以在我认为的某个地方更改uboot配置中的一行,但我并不是真的想这样做。

找到文件:/var/local/bb_usb_mass_storage.img

好吧,它可能是bbg_usb_mass_storage.img,如果它是一个beaglebone绿色,但我只是移动了这个文件,所以它不会提供大容量存储设备。这应该可以让你做你想做的事。

相关问题