前面完成 Raspberry OS 的烧录和 Linux 内核的重新配置和编译。接下来需要完成编译并加载 Raw Gadget 模块

可以参考 raw-gadget 官方github 文章:Raw Gadget on Raspberry Pi
(好奇怪,发布文章后发现被插入了好多商品链接,现在的CSDN确实有点不一样了,全文链接我放的只有这一个哈,raw-gadget 官方 github 的链接)

拉取Raw Gadget 源码

git clone https://github.com/xairy/raw-gadget.git

git clone

编译Raw Gadget 模块

编译 Raw Gadget 模块,生成 raw_gadget.ko

cd raw-gadget/raw-gadget
make

make

加载 dummy_hcd 和 raw_gadget

在编译dummy_hcd 的时候报了源码的错,当前内核版本与raw-gadget仓库自带的 dummy_hcd 源码不匹配,代码旧版,内核新版。
所以尝试直接使用系统自带 dummy_hcd 模块,跳过 dummy_hcd 手动编译的步骤。

加载并验证,可行:
dummy-udc
但是因为我的测试对象本来就是实体机器,但是 dummy_udc.0 是虚拟控制器,只能用于本地模拟,无法通过物理 USB 线连接外部设备。
要连接实体机器,需要启用树莓派5硬件的 UDC (即 dwc2驱动)。这里遇到了问题,卡了很久,写在后面。

执行 insmod raw_gadget.ko 提示 File exists.
验证 /dev/raw-gadget 存在就是已经加载了
raw-gadget

配置开机自动加载

dummy_hcd 是内核自带模块,可以直接写入 /etc/modules

echo "dummy_hcd" | sudo tee -a /etc/modules

dummy_hcd
raw_gadget 是外部模块,直接写在 /etc/modules 怕找不到,所以在 rc.local(新建) 中加载

sudo nano /etc/rc.local
在exit 0 之前添加:
insmod /home/raspberry/raw-gadget/raw-gadget/raw_gadget.ko  //raw_gadget.ko 中间是下划线_,不是横杠-
保存后赋予执行权限:
sudo chmod +x /etc/rc.local

raw-gadget
(这里写错了,raw_gadget.ko 中间是下划线_,不是横杠- ,阴差阳错只有第一次成功,后面一直很奇怪为什么启动不加载 raw-gadget,再后来才知道是 rc.local 这里写错了)

重启生效。还是能看到 dummy_udc.0 和 /dev/raw-gadget 就可以
auto load

验证 Raw Gadget 准备就绪

前面加载成功 dummy_hcd 和 raw_gadget 后,可以运行官方提供的示例来验证环境,运行没报错应该就可以

cd examples
make
sudo ./keyboard dummy_udc.0

example

Dwc2 的问题(重点)

上面说过测试对象是实体机器,需要树莓派作为device 连接到测试设备上,所以需要的是硬件驱动 dwc2,在这里配置遇到了问题,记录如下。
首先在 /boot/firmware/config.txt 和 cmdline.txt 添加说明,需重启生效。

1. /boot/firmware/config.txt 添加:
dtoverlay=dwc2,dr_mode=peripheral
2. /boot/firmware/cmdline.txt 添加:
modules-load=dwc2

dwc2
在这里遇到了问题,一直没有输出 dwc2 ,只有dummy_hcd.0,卡了很久很久,一直在检查问题
查询dtoverlay -l 一直提示 No overlays loaded,系统在启动时没有应用覆盖层。
尝试手动加载覆盖层,发现是成功的,那覆盖层本身没问题,只是启动时没加载,又得回到config.txt里面。
dtoverlay

运行 sudo vclog -m | tail -30 ,有个之前看过的 overlay “vc4-kms-v3d”,它也在 config.txt 里面,为什么启动时它能被自动加载,dwc2 却不行。
vclog
原来是因为我把 dtoverlay=dwc2,dr_mode=peripheral 写在了 [cm5] 下面,因为它原本有一条 dtoverlay=dwc2,dr_mode=host 就是在 [cm5] 下面,被我注释掉了,我以为还是写在这就可以了。结果不是。
因为 cm5(Compute Module 5) 是树莓派的一款核心板模块,(用于工业嵌入场景,没有标准接口,需要搭配底板使用。),硬件跟树莓派5开发板不同,在 config.txt 里面的 [cm5] 节的内容只会在 CM5 上生效,在普通的树莓派5开发板上会被完全忽略。config.txt 里面还有其它节,如[cm4],它只会在 CM4 上生效。
而全局区域,除了[xx]节下面的,还有 [all] 节中的内容才对所有型号生效。[all]节是一个特殊的节,里面的配置会无条件应用到所有硬件型号(包括各种 Compute Module 和普通 Pi),并且它的生效时机在所有其他节之后,可以用于覆盖之前条件节中设置的参数。
那直接把 dtoverlay=dwc2,dr_mode=peripheral 添加在那个 vc4 后面吧。
vc4
重启生效。这下有了。
reboot

一个从一开始配置 config.txt 就出错的问题,卡了很久,试了很久,知识储备薄弱,也是第一次接触树莓派,不知道这些细节,只是看着前面有写一条 dwc2,就跟着写在下面了,原来这才是根源的问题。
果然问题不会少,只会一个接一个,上面处理好 dwc2了,raw-gadget 又不行了,官方给的示例没跑起来,上面在跑 dummy_udc.0 还好好的。
example

重新编译 raw_gadget
remake

然后就可以了
example

会看到测试电脑(Host)一直有 X 输入,至此,我们确认Raw Gadget 可以正常工作。
X was entered on the host

测试结果跟官方说的一致。
raw-gadget example

好了,第三步完成。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐