Jetpack 默认内核不支持手柄的,在装好的 Jetson 板子上接入手柄,识别不了...
可以看到当前我装的是 Jetpack 3.3.2,内核版本是 4.4.159-tegra
,插上手柄之后在 /dev/input
里是看不到 jsx
的。
为了 RACECAR 的调试及控制,我们首先要对 Jetpack 重新编译内核,添加手柄支持。
简单理解就是,Jetpack 的系统是阉割版,有些 ubuntu 默认功能它不支持。
Jetsonhacks 网站做过编译内核的脚本,只要运行就可以编译 [1]。但这个太久没更新了,最后留下的是针对 Jetpack 3.2.1 的支持,现在都到 4.3 版本了,而且使用 NVIDIA SDK Manager 安装的话,最老版本也是 Jetpack 3.3.1。
所以我对脚本进行了部分修改,现在可以支持 Jetpack 3.3.x 和 Jetpack 4.3 的内核编译了。
其实就是在脚本文件内增加了相应版本的 kernel 源文件地址并做了相应的修改。如果你想编译其他内核,在 Nvidia 网站上找相应的 Kernel 文件就可以了 [2]。
来看下怎么操作吧。
这里是用的方法是在 Jetson 主机上编译 ,我用的 VNC 登录的 Jetson 远程桌面,你也可以尝试交叉编译,速度更快一些 [3]。
一、下载脚本文件
首先下载我修改过的 Github Repo
$ git clone https://github.com/gwwang16/buildJetsonTX2Kernel
然后进入 Repo 的目录下
$ cd buildJetsonTX2Kernel
二、获取内核源文件并修改设置
- 首先看看自己系统的版本信息,运行小脚本
jetson_release.sh
根据你安装的 Jetpack 版本不同,需要切换到相应 tag。如果是 Jetpack 3.3.x,对应的 L4T 28.3.x;如果是 Jetpack 4.3,对应的是 L4T 32.3.1。 不同版本不通用!
这里看到我安装的系统版本是 Jetpack 3.3.2 , L4T28.3.2,切换到相应分支,执行
$ git checkout L4T28.3.2
- 然后要下载相应版本的内核文件,解压出来,并进行相应设置。有脚本后只需要执行就可以自动操作了。
$ ./getKernelSources.sh
- 该脚本执行的最后一步会打开一个 GUI,在打开的 GUI 内找到 Joystick 支持,勾选上保存就可以了。具体步骤是:先取个名字,便于区分当前内核与原版内核。左侧选中
General setup
--> 在右侧双击Local version
-->填入你的版本号。我这里设置的是racecar-v0.1
。
- 下一步,在左侧找到
Input device support
,右侧确认Joystick interface
已勾选。
- 继续在右侧的下方打开
Joysticks/Gamepads
选项卡,我用的是 Xbox 360 手柄,所以选择了下图里的三项,具体根据你的手柄品牌选择。
- 设置完之后,点击左上方的保存按钮,便可以关闭当前 GUI 了。
你如果想要其他支持,都可以在这里面勾选。
三、编译内核
想要的内核配置完之后,就开始编译并安装了。具体执行的是更新配置、编译内核、编译并安装模块
$ make prepare
$ make modules_prepare
$ make Image
$ make modules
$ make modules_install
有脚本就简单了,只需要执行
$ ./makeKernel.sh
这一步时间较长,Jetpack 3.3 大约 20分钟,Jetpack 4.3 大约 40 分钟...(记得打开 Jetson 的高性能模式)
四、复制内核
执行下面脚本将刚刚编译好的内核文件复制到 /boot
目录替换原内核文件,最好先备份一下。如果你在用外部设备(比如挂载了 SSD)作为根目录,并且在用 eMMC 引导,则需要将映像文件同样复制到 eMMC 的 /boot
目录下。
$ sudo cp /boot/Image /boot/image.bak
$ ./copyImage.sh
如果出现错误:提示找不到Image文件说明上一步的内核编译出现问题,将/usr/src/中的kernel文件夹删除,同时删除下载的压缩包和source文件夹,删除完后重启TX2,重新进行编译。
复制完成后重启 Jetson,打开终端输入 uname -r
,看是否显示 4.4.159racecar-v0.1
,如果是就说明内核编译成功了。
这时插入 XBOX 360 手柄,在终端内输入ls /dev/input/
,应该可以看到 jsx
显示了,使用 jstest
测试一下看是否正常使用。
$ jstest /dev/input/js0
五、清理文件
当确认一切正常之后,可以把不需要的文件清理掉了,还是相当占空间的。执行下面命令会清理该过程中的所有中间文件和源 Kernel 文件。在操作之前最好是做个备份,以后可以继续用。
我没备份,因为我懒… 确认能用之后就直接删除了,如果出了问题以后重新编译...
$ ./removeAllKernelSources.sh
这样,编译内核就结束啦。
参考
- ^https://www.jetsonhacks.com/2018/03/22/build-kernel-modules-nvidia-jetson-tx2-2/
- ^https://developer.nvidia.com/embedded/jetpack-archive
- ^https://blog.csdn.net/huiyuanliyan/article/details/92803764