把EmuELEC 4.3装进电视盒子其实没花多少时间,真正让我半夜爬起来继续折腾的,是那支乐视手柄LeWGP-201——蓝牙能连上,系统也能识别,但只要一碰按键就全乱套,最后查到evremap才算是找到了病根。这篇文章就把整个安装过程、手柄配对、按键错乱的原因以及evremap的解决办法原原本本写出来,给同样被LeWGP-201折腾过的朋友一个参考。无论你是刚接触EmuELEC的新手,还是已经在某个游戏整合包上折腾过一轮的老玩家,这篇内容都能帮你少走不少弯路。
1. 折腾前的准备:EmuELEC 4.3刷机与手柄连不上的第一道坎
1.1 为什么翻出4.3这个老版本
前几年我在一台老电视盒子上装EmuELEC,当时最新的版本已经是5.x,但试来试去发现老芯片的兼容性反而不如4.3。EmuELEC 4.3虽然发布有一段时间了,但它对S905、S912这类主流盒子芯片支持非常成熟,内置的驱动和输入管理工具也足够稳定,尤其适合那些不追求新内核、只想好好打游戏的老盒子。很多人喜欢直接下载现成的"emuelec游戏整合包",但整合包往往为了体积和控制体验,默认外设配置都是针对Xbox类手柄写的,换上乐视手柄就很容易出问题。
我最后选择4.3,还有一个原因是它的输入子系统改动比新版少,evremap相关的配置文件在网络上能找到的历史案例也更多。如果你手上的盒子不是太冷门,4.3版本反而比新版更省心。当然,如果你是新款盒子,那直接装新版本问题也不大,但下面的手柄配置思路同样适用。
1.2 刷机镜像与U盘准备
刷机的过程不算复杂,重点是别选错设备树文件。先把EmuELEC 4.3的镜像下载下来,用balenaEtcher烧录到一个USB 3.0的U盘里。烧录完成后,U盘会被分成几个分区,其中emuelec分区里有device_trees目录,里面放着一大堆dtb文件。这一步很关键:你要根据自己盒子的芯片型号和板子类型,找到对应的dtb文件,改成meson64_amlogic这样的名字,放到指定位置,否则开机可能会卡在logo或者完全没有显示输出。
我第一次刷的时候就是忘了这一步,开机后屏幕一直黑着,后来对比网上教程才发现是dtb没选对。所以这里提醒一句:买盒子或者刷机之前,先查清楚自己芯片的具体型号,比如S905M、S905X、S912,同一个芯片还有不同板卡,dtb不能乱用。U盘烧录好之后,插上网线,给盒子上电,EmuELEC会自动扩容分区并完成首次启动,这个过程大概两三分钟,耐心等就行。
1.3 手柄第一次连上却马上断开
系统跑起来之后,我在EmulationStation界面按Start键调出主菜单,进系统设置,找到蓝牙,把乐视手柄LeWGP-201调成配对模式。这支手柄的配对方式是按住手柄正面的乐视Logo键,同时按住Start键不放,直到指示灯开始快速闪烁。按照包装盒上的说明,这时候应该能在蓝牙列表里看到LeWGP-201,选中配对。
但问题来了:列表里能看到设备,选完配对,屏幕上也提示连接成功,可手柄的指示灯刚稳定下来,没过几秒又回到配对状态,或者干脆变成了按任何键都没反应。我一开始以为是手柄电池问题,换了一副电池依旧如此。后来才发现,EmuELEC的蓝牙服务在默认配置下,会把这类安卓电视手柄识别成键盘设备,而LeWGP-201在配对时上报的HID描述符又不算标准,这才导致连上又断开。这时候千万别急着退货,真正要解决的是系统层面的输入设备识别问题,核心就是evremap。
2. 故障现场:手柄已被识别但按键完全错乱
2.1 症状复现:按A键却触发B键
几经折腾,手柄总算能稳定连上,不会再秒断了,但更大的问题来了:在EmulationStation主界面,我想往下选择游戏,按下方向键,光标有时候不动,有时候一次跳两行;按下A键想确认,结果画面退到上一层;B键反而变成了确认键。进了游戏之后更离谱,角色会自己往左走,跳跃键和攻击键完全对不上号,按X键触发的是Y键,L1和L2也交叉错乱。
这种症状和"按键失灵"还不一样,每个键都有反应,只是“反应到了错误的按键上”。这说明手柄和系统之间的连接是通的,问题出在按键事件码的翻译上。如果你也遇到类似情况,先别急着重新配对其他手柄,这大概率是系统的输入映射把LeWGP-201的按键码理解错了。
2.2 用evtest确认原始事件码
为了确认问题,我通过SSH连上EmuELEC,输入evtest,系统会列出所有输入设备节点。找到名字里带有LeWGP-201的那个设备,输入对应编号后,屏幕上会开始实时打印手柄事件。这时候按手柄上的按键,就能看到每个键触发的事件码。
比如,我按下手柄上的A键,evtest里显示的是BTN_B;按下B键,显示的却是BTN_A。X键和Y键也反了,肩键L1对应的事件码是BTN_TRIGGER_HAPPY2,和标准的BTN_TL完全不一样。拿到这组原始事件码之后,整个问题就清晰了:LeWGP-201上报的键值和EmuELEC默认理解的键值不匹配,需要在系统层面把它们“翻译”回来,这正是evremap能做的事情。
2.3 根源:LeWGP-201的非标按键映射
LeWGP-201是乐视电视生态下的蓝牙手柄,它在设计时主要面向安卓电视游戏,事件码的排列顺序和通用PC手柄有很大差别。通用手柄通常按照Xbox按键布局上报:A键、B键、X键、Y键依次对应固定的HID usage。而LeWGP-201为了兼容自家的安卓系统,采用了另一套排列,导致在EmuELEC里被当成了“一个按键布局古怪的通用手柄”。
查一下手柄的/proc/bus/input/devices,能看到它的Vendor ID和Product ID,但这种硬件ID其实并不是问题根源,真正的根源是Linux内核的input子系统默认不会为它生成一套专门的映射表,于是应用层拿到的事件码就成了“错的”。知道这一点之后,解决思路就很直接:写一个evremap规则,把LeWGP-201上报的事件码,重新映射成EmuELEC应用层期望的事件码。
3. evremap到底改了什么:按键重映射原理与配置解读
3.1 evremap解决的是哪一层的问题
简单说,evremap运行在内核输入子系统和应用程序之间,它监听手柄设备/dev/input/eventX上报的原始按键事件,根据配置文件中定义的规则,把某个按键事件替换成另一个按键事件,然后通过一个虚拟的输入设备再重新上报给上层系统。这样做的好处是:EmulationStation和里面的游戏核心不需要做任何改动,它们看到的仍然是一个“按键完全正确”的标准手柄。
类比一下,evremap就像是在手柄和模拟器之间站了一个翻译官。手柄说“我按了BTN_A”,但这个翻译官知道系统上层需要的是BTN_B,于是他把这句话改写成“BTN_B”再传进去。这样翻译完之后,模拟器不再需要关心手柄本身长什么样,只管按标准按键处理就行。
3.2 LeWGP-201的按键错位根源
在配置evremap之前,我们最好把LeWGP-201的事件码和标准预期值做一张对照表,这样配置起来一目了然。我根据evtest的实际输出整理过一份,大概是这样:
| 手柄按键 | 上报事件码 | 预期事件码 |
|---|---|---|
| A | BTN_B | BTN_A |
| B | BTN_A | BTN_B |
| X | BTN_Y | BTN_X |
| Y | BTN_X | BTN_Y |
| L1 | BTN_TRIGGER_HAPPY2 | BTN_TL |
| R1 | BTN_TRIGGER_HAPPY1 | BTN_TR |
| L2 | BTN_TRIGGER_HAPPY4 | BTN_TL2 |
| R2 | BTN_TRIGGER_HAPPY3 | BTN_TR2 |
| Select | BTN_SELECT | BTN_SELECT |
| Start | BTN_START | BTN_START |
这个表格没有列出摇杆和十字键,因为十字键上报的通常是ABS_HAT0X/Y,方向值本身没有错乱;摇杆因为用的是绝对值坐标,一般也不需要重映射。真正错乱的就是上面这些按键,尤其是AB和XY的互换,以及肩键被识别成了BTN_TRIGGER_HAPPYx。
值得注意的是,手柄的硬件版本、固件批次不同,上报的事件码也可能有区别。所以不要照抄网上任何人的映射表,一定要用evtest在自己设备上测一遍。
3.3 一份针对LeWGP-201的配置模板
EmuELEC 4.3内置了evremap,配置文件路径在/storage/.config/evremap/evremap.yml。以我手头这个版本为例,它的配置结构是YAML格式,设备匹配需要指定Vendor和Product,然后map列表负责按键映射。我给LeWGP-201写的配置如下:
devices: - name: "LeWGP-201" vendor: 0x0e8f product: 0x0003 map: - from: BTN_A to: BTN_B - from: BTN_B to: BTN_A - from: BTN_X to: BTN_Y - from: BTN_Y to: BTN_X - from: BTN_TRIGGER_HAPPY1 to: BTN_TR - from: BTN_TRIGGER_HAPPY2 to: BTN_TL - from: BTN_TRIGGER_HAPPY3 to: BTN_TR2 - from: BTN_TRIGGER_HAPPY4 to: BTN_TL2需要说明的是,Vendor和Product要以/proc/bus/input/devices里实际看到的值为准,不同批次的LeWGP-201可能会不一样。from是手柄上报的原始事件码,to是希望上层收到的事件码。配置里没有必要把所有按键都写一遍,比如Select和Start本身是正确的,就完全可以忽略。
如果你拿到的evremap版本配置格式不是这样,比如用的是evremap.conf且每一行是原事件码=目标事件码的写法,也不用慌,核心思路不变:把实际上报的错误码改成预期码即可。打开配置文件看一下注释和示例,立刻就能理解。
4. 配置落地的完整步骤与验证方法
4.1 通过SSH进入EmuELEC
要修改evremap配置,最方便的方式是SSH登录盒子。在EmuELEC的系统设置里找到网络,看到IP地址,然后在电脑上打开终端:
ssh root@192.168.1.100如果不知道SSH账号密码,EmuELEC 4.3的默认账号是root,默认密码是emuelec,没改过的话直接输入就行。登录成功后,先备份一下原配置文件,这是一个好习惯,后面万一改错还能快速还原:
cp /storage/.config/evremap/evremap.yml /storage/.config/evremap/evremap.yml.bak接着用nano打开配置文件:
nano /storage/.config/evremap/evremap.yml4.2 修改evremap配置文件
把上一步准备好的映射规则粘进去,注意YAML的缩进,不要把from和to的层级弄错。保存退出之后,重启evremap服务,让配置生效:
systemctl restart evremap如果系统提示服务不存在,可以试试直接重启EmuELEC,或者查看一下服务名是不是evremap.service。在我这个4.3版本上,服务名就是evremap,用systemctl status evremap能看到状态为active (running)即可。
4.3 重启服务并验证按键
配置生效后,再次运行evtest,重新选择LeWGP-201对应的设备节点,按一遍所有按键。这时候的输出应该已经变成了修正后的事件码,比如按手柄的A键,输出的是BTN_A;按B键,输出的是BTN_B。这说明evremap已经在中间做了翻译。
接下来回到EmulationStation,测试方向键和ABXY,确认光标移动和确认、返回都正常。建议再进到一款街机模拟器或者FC模拟器里实际跑一下,因为个别游戏核心会另外读取自己的按键映射,如果游戏里还是错乱,需要去核心的输入设置里重新绑一遍按键,这是另一个层面的映射问题,与evremap无关。
如果你发现配置改了但按键完全没有变化,优先检查三件事:第一,设备匹配是否生效,Vendor/Product是不是填错了;第二,配置文件有没有语法错误,可以用python3 -c "import yaml; yaml.safe_load(open('/storage/.config/evremap/evremap.yml'))"来检查;第三,evremap服务有没有真正加载新配置,改完配置后必须重启服务。
5. 绕不开的坑:热插拔、蓝牙断连与多手柄共存
5.1 蓝牙断连重启后映射失效
evremap配置好之后,用的第一天很好,第二天开机手柄能连上,但按键又乱了。排查了一圈发现,手柄休眠后重新连接,设备名从LeWGP-201变成了LeWGP-201_1,或者蓝牙重新配对后Vendor/Product没变,但设备事件节点变成了event5。evremap默认会扫描所有设备,如果它匹配的是设备名而不是VID/PID,就可能在重连后匹配失败。
解决方法是尽量在devices里用Vendor和Product来匹配,而不是设备名。脚本里已经写了vendor和product,实际使用中发现对多数蓝牙手柄都有效。如果发现重连后配置又不生效了,可以先重新插拔一次手柄的蓝牙,再systemctl restart evremap,大部分时候能恢复。
5.2 多手柄共存时确认event节点
如果你像我一样,除了乐视手柄还会插一个USB手柄备用,那么/dev/input/eventX的编号会随着插拔顺序变化。有时候evremap把USB手柄当成LeWGP-201来映射,导致USB手柄按键也乱了。要避免这种情况,最好的办法是给evremap配置里加上更精确的设备路径匹配,比如用/dev/input/by-id或者/dev/input/by-path下固定链接。
EmuELEC 4.3的evremap配置文件支持指定evdev路径,你可以先用ls -l /dev/input/by-id/找到LeWGP-201对应的固定路径,然后把它写进配置。这样无论插拔顺序怎么变,evremap都能锁定到这支蓝牙手柄上。当然,如果只是日常自己玩,不经常换手柄,这一步可以跳过,但知道了以后排查起来会轻松不少。
5.3 整合包里的evremap配置不一定适用
网上流传的“EmuELEC游戏整合包”里,很多都自带了一套evremap配置,默认映射通常是为Xbox手柄或者北通手柄准备的。你下载整合包后直接接乐视手柄,按键乱其实是正常的,因为配置文件的映射表和LeWGP-201的原始事件码完全对不上。
遇到这种情况,别急着把整个evremap配置删掉,建议先备份整合包原配置,然后再加入针对LeWGP-201的映射规则。整合包里的配置往往还包含其他设备的映射,直接删除可能导致别的外设失灵。你只需要在其中追加设备的映射段,优先级高于默认映射就可以。
按照这套流程下来,我手头这支LeWGP-201在EmuELEC 4.3上已经从“按键完全没法用”变成了“日常玩街机、FC、SFC都很顺手”。如果你是第一次调evremap,建议耐心把evtest输出对照一遍再写映射,别怕麻烦,这一步值得做扎实。整合包虽然方便,但外设兼容这种事,终究还是得自己动手调一次才最可靠。