EmuELEC笔记, 乐视尚酷版手柄SELECT键设置
分区结构
在img写入后, 会产生两个分区
- EMUELEC: 用于启动的文件, 例如dtb文件等, 以及system.img & system.img.md5, EmuELEC的系统文件都在这个img里面
- STORAGE: 空
Update 2022-02-18:
在 EmuELEC4.3 中会产生3个分区, 新分区为 EEROMES, 原先 storage 分区中的 roms 目录, 映射到了第三个分区上. 镜像写入在 Win10 下可以使用 Rufus, 在 Ubuntu 下直接用系统的 Disk 工具的 Restore Disk Image.
新写入的TF卡, 建议直接放入TF卡槽启动, 不要用USB读卡器, 否则容易失败
初次启动步骤
- 启动后会先进行分区扩容, 左上角能看到format提示"PARTITION RESIZING IN PROGRESS", 这一步提示后, 如果格式化成功, 会出现"Formatting EEROMES partition as FAT32...done", 倒计时5秒后重启
- 启动后进行user config设置, 左上角提示"A start job is running for Setup User config dir (??s / no limit)", 这一步时间需要一两分钟, 之后再重启
- 初始化完成后的第一次启动, 会播放开机视频, 声音100%, 做好心理准备, 视频播完后进入正常界面
如果扩容正常, 看到的df输出是这样的, 如果没有出现 mmcblk1p3 和正确的容量, 说明扩容时的格式化失败了, 可以看到, mmcblk1p1 和 mmcblk1p3 这两个分区是vfat格式, 这两个在windows下是可以访问的
# df -Th
Filesystem Type Size Used Available Use% Mounted on
devtmpfs devtmpfs 290.9M 4.0K 290.9M 0% /dev
/dev/mmcblk1p1 vfat 2.0G 789.4M 1.2G 39% /flash
/dev/loop0 squashfs 774.5M 774.5M 0 100% /
/dev/mmcblk1p2 ext4 1.9G 394.0M 1.5G 20% /storage
/dev/mmcblk1p3 vfat 26.0G 2.9M 26.0G 0% /storage/roms
/dev/mmcblk1p3 vfat 26.0G 2.9M 26.0G 0% /storage/.update
tmpfs tmpfs 402.2M 0 402.2M 0% /dev/shm
tmpfs tmpfs 402.2M 10.2M 392.0M 3% /run
tmpfs tmpfs 402.2M 0 402.2M 0% /sys/fs/cgroup
tmpfs tmpfs 402.2M 2.2M 400.1M 1% /var
tmpfs tmpfs 402.2M 0 402.2M 0% /tmp
none overlay 1.9G 394.0M 1.5G 20% /tmp/cores
none overlay 1.9G 394.0M 1.5G 20% /tmp/database
none overlay 1.9G 394.0M 1.5G 20% /tmp/joypads
none overlay 1.9G 394.0M 1.5G 20% /tmp/assets
none overlay 1.9G 394.0M 1.5G 20% /tmp/overlays
none overlay 1.9G 394.0M 1.5G 20% /tmp/shaders
ports overlay 1.9G 394.0M 1.5G 20% /storage/roms/ports_scripts
运行中目录结构
/dev/mmcblk1p1 511.7M 373.6M 138.2M 73% /flash
/dev/loop0 357.5M 357.5M 0 100% /
/dev/mmcblk1p2 28.6G 3.5G 25.1G 12% /storage
启动后, EMUELEC分区被挂载为 /flash, STORAGE分区被挂载为 /storage, system.img 通过 /dev/loop0 被挂载为系统根目录 /
所以, 用户能修改的仅仅是 /flash 和 /storage 目录下的内容
root用户的home目录被定位到 /storage, 如果需要添加登录后自动执行的命令(例如添加alias), 可以直接在 /storage 目录下新建 .profile 文件来实现
开机启动顺序
这个是在uboot中进行管理的, 可以通过fw_printenv命令进行查看
EmuELEC:/usr/sbin # fw_printenv
...
baudrate=115200
boot_count=0
bootcmd=if test ${bootfromnand} = 1; then setenv bootfromnand 0; saveenv; else run bootfromsd; run bootfromusb; fi; run storeboot
bootcount_check=echo bootcounts=${boot_count}; if itest ${boot_count} == 0; then setenv boot_count 1;saveenv;else if itest ${boot_count} == 1; then setenv boot_count 2;saveenv;else if itest ${boot_count} == 2; then setenv boot_count 3;saveenv;else if itest ${boot_count} == 3; then setenv boot_count 4;saveenv;else if itest ${boot_count} == 4; then run recovery_from_flash;fi;fi;fi;fi;fi
bootdelay=0
bootfromnand=0
bootfromsd=mmcinfo; if fatload mmc 0 ${loadaddr} kernel.img; then run sddtb; setenv bootargs ${bootargs} bootfromsd; bootm; fi
bootfromusb=usb start 0; if fatload usb 0 ${loadaddr} kernel.img; then run usbdtb; setenv bootargs ${bootargs} bootfromusb; bootm; fi
bootmode_check=get_rebootmode; echo reboot_mode=${reboot_mode};if test ${reboot_mode} = factory_reset; then defenv_reserv;setenv upgrade_step 2; save;fi;
cmdline_keys=if keyman init 0x1234; then if sec_keyunify read mac ${loadaddr} str; then setenv bootargs ${bootargs} mac=${mac} androidboot.mac=${mac};fi;fi;
...
可以看到其中的 bootfromnand 变量是用于控制设备的启动顺序, 如果值为1, 那么从nand(设备内部存储, eMMC等), 如果值为0, 那么依次从sd, 从usb启动, 在这个过程中如果某个介质可以启动了, 就把这个方式加到bootargs变量的值当中去, 例如
setenv bootargs ${bootargs} bootfromsd;
然后调用系统函数bootm启动内核. bootm会调用 ./lib_arm/armlinux.c的do_bootm() 方法, 里面会调用./common/cmd_bootm.c的do_bootm_linux()
如果这些都不成功, 那就调用storeboot
storeboot=if imgread kernel boot ${loadaddr}; then bootm ${loadaddr}; fi;run update;
而update会依次尝试从各个媒介升级
update=run usb_burning; run sdc_burning; if mmcinfo; then run recovery_from_sdcard;fi;if usb start 0; then run recovery_from_udisk;fi;run recovery_from_flash;
中间还会记录启动次数, 如果启动次数达到4, 就会执行 recovery_from_flash
recovery_from_flash=setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if imgread kernel ${recovery_part} ${loadaddr} ${recovery_offset}; then wipeisb; bootm ${loadaddr}; fi
ES的Quit菜单中的Reboot From NAND, 实际执行的就是 /usr/sbin/rebootfromnand 这个命令, 里面将 bootfromnand 值设为了1
EmuELEC:/usr/sbin # more rebootfromnand
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2016-2018 kszaq (kszaquitto@gmail.com)
# Copyright (C) 2018-present Team CoreELEC (https://coreelec.org)
if /usr/sbin/fw_printenv whereToBootFrom > /dev/null 2>&1; then /usr/sbin/fw_setenv whereToBootFrom internal; fi
/usr/sbin/fw_setenv bootfromnand 1
服务启动顺序
系统启动的服务是通过systemd管理的, 启动脚本位于 /usr/lib/systemd/system/ 下, 因为是过loop设备挂载的, 所以这里面的文件都不可修改. 默认的启动target为
EmuELEC:/usr/lib/systemd/system # systemctl get-default
emuelec.target
EmuELEC:/usr/lib/systemd/system # ll def*.*
lrwxrwxrwx 1 root root 14 Nov 19 00:42 default.target -> emuelec.target
服务依赖关系为
EmuELEC:/usr/lib/systemd/system # systemctl list-dependencies emuelec.target
emuelec.target
● ├─emuelec-autostart.service
● ├─emustation.service
● ├─retroarch.service
● ├─tmp-assets.mount
● ├─tmp-cores.mount
● ├─tmp-database.mount
● ├─tmp-joypads.mount
● ├─tmp-overlays.mount
● ├─tmp-shaders.mount
● ├─graphical.target
● │ ├─unbind-console.service
● │ └─multi-user.target
● │ ├─avahi-daemon.service
● │ ├─connman.service
● │ ├─dbus.service
● │ ├─entware.service
● │ ├─iptables.service
● │ ├─nmbd.service
● │ ├─pulseaudio.service
● │ ├─rpcbind.service
● │ ├─sixaxis@multi-user.service
● │ ├─smbd.service
● │ ├─sshd.service
● │ ├─systemd-ask-password-wall.path
● │ ├─systemd-logind.service
● │ └─basic.target
● │ ├─add-entropy.service
● │ ├─amlogic-dvb.service
● │ ├─fstrim.service
● │ ├─hwdb.service
● │ ├─kvimfan.service
● │ ├─openvfd.service
● │ ├─show-version.service
● │ ├─swap.service
● │ ├─tmp.mount
● │ ├─var.mount
● │ ├─wetekdvb.service
● │ ├─paths.target
● │ ├─slices.target
● │ │ ├─-.slice
● │ │ └─system.slice
● │ ├─sockets.target
● │ │ ├─dbus.socket
● │ │ ├─systemd-initctl.socket
● │ │ ├─systemd-journald-audit.socket
● │ │ ├─systemd-journald-dev-log.socket
● │ │ ├─systemd-journald.socket
● │ │ ├─systemd-udevd-control.socket
● │ │ └─systemd-udevd-kernel.socket
● │ ├─sysinit.target
● │ │ ├─debug-shell.service
● │ │ ├─debugconfig.service
● │ │ ├─dev-hugepages.mount
● │ │ ├─dev-mqueue.mount
● │ │ ├─kmod-static-nodes.service
● │ │ ├─machine-id.service
● │ │ ├─openssl-config.service
● │ │ ├─sys-fs-fuse-connections.mount
● │ │ ├─sys-kernel-config.mount
● │ │ ├─sys-kernel-debug.mount
● │ │ ├─systemd-ask-password-console.path
● │ │ ├─systemd-hwdb-update.service
● │ │ ├─systemd-journal-catalog-update.service
● │ │ ├─systemd-journal-flush.service
● │ │ ├─systemd-journald.service
● │ │ ├─systemd-modules-load.service
● │ │ ├─systemd-sysctl.service
● │ │ ├─systemd-tmpfiles-setup-dev.service
● │ │ ├─systemd-tmpfiles-setup.service
● │ │ ├─systemd-udev-trigger.service
● │ │ ├─systemd-udevd.service
● │ │ ├─tz-data.service
● │ │ ├─usercache.service
● │ │ ├─userconfig.service
● │ │ ├─local-fs.target
● │ │ │ ├─kernel-overlays.service
● │ │ │ ├─libmali.service
● │ │ │ ├─tmp.mount
● │ │ │ └─var.mount
● │ │ └─swap.target
● │ └─timers.target
● │ └─systemd-tmpfiles-clean.timer
● └─multi-user.target
● ├─avahi-daemon.service
● ├─connman.service
● ├─dbus.service
● ├─entware.service
● ├─iptables.service
● ├─nmbd.service
● ├─pulseaudio.service
● ├─rpcbind.service
● ├─sixaxis@multi-user.service
● ├─smbd.service
● ├─sshd.service
● ├─systemd-ask-password-wall.path
● ├─systemd-logind.service
● └─basic.target
在 emuelec-autostart.service 里, 执行了/storage/.config/autostart.sh
在autostart.sh的结尾, 又执行了 /storage/.config/custom_start.sh
最后一步, 通过 emustation.service, 把/usr/bin/emulationstation启动起来
设置操作说明
通过ScreenScraper自动下载游戏说明和截图
首先到 https://www.screenscraper.fr/ 注册一个帐号, 需要邮箱验证
在EmuELEC界面上, 通过 SCRAPE 菜单, 填充帐号和口令, 依次选择
- Scrape From: SCREENSCRAPER
- Image Source: SCREENSHOT(游戏运行画面), TITLE SCREENSHOT(游戏开始画面), MIX (游戏运行截图+游戏盒子合并在一起的一张图)
- Box Source: NONE (游戏包装, 2d或3d, 因为色深为24bit, 文件size会比较大, 都是200~400K大小, 如果用列表展示, 就不需要下载这个)
- Logo Source: WHEEL
- Scrape Ratings: YES
- Scrape Videos: NO
然后点击Scrape Now, 选择要下载的集合, 选择处理冲突的方式, 建议自动.
系统就会在后台自动下载, 因为来源在国外所以速度会比较慢.
修改时区
系统默认时区为墨西哥, 界面上没有修改时区的地方, 需要命令行登录后修改 /emuelec/configs/emuelec.conf , 里面有timezone配置. 改为
system.timezone=Asia/Shanghai
Update 2022-02-18: 在新的 EmuELEC4.3 中, 已经可以直接在界面菜单里设置时区了
连发键的设置Autofire, Turbo Button, Duty Cycle
这个其实是RetroArch的配置, 和以往的连发键设置不太一样, RetroArch用的是开关触发的机制, 有三处相关的设置
- Settings->Input->Turbo Period, 连发键开启时, 在连发当中每次按下的时间长度(多少帧)
- Settings->Input->Duty Cycle, 连发键开启时, 在连发当中按下的时间占空比
- Settings->Input->User/Port[1,2,3,4] Binds->User/Port[1,2,3,4] Turbo, 开启连发的键
使用方法是, 按住需要连发的按键后, 按一下开启连发的键, 这个按住的键就开启连发了. 这个开启连发的效果只在按住时有效, 松开按键后连发的效果就消失, 需要再来一遍.
输入设备按键测试
查看所有输入设备, 列出各设备对应的event编号
cat /proc/bus/input/devices
输入设备测试
# 手柄测试, 需要对应上面命令输出的js编号
jstest --event /dev/input/js0
# 通用的输入事件测试, 需要对应上面命令产生的event编号
evtest /dev/input/event3
设置乐视尚酷版手柄 LeWGP-201
对于乐视尚酷版手柄, 无法设置select键的问题: 这个手柄在输入设备里会产生两个设备, 分别是
I: Bus=0003 Vendor=0101 Product=1d79 Version=0110
N: Name="MY-POWER LeWGP-201"
P: Phys=usb-xhci-hcd.0.auto-1.4/input0
S: Sysfs=/devices/c9000000.dwc3/xhci-hcd.0.auto/usb1/1-1/1-1.4/1-1.4:1.0/0003:0101:1D79.0003/input/input4
U: Uniq=
H: Handlers=js0 event4
B: PROP=0
B: EV=1b
B: KEY=7fff0000 0 0 0 0 0 0 0 0 0
B: ABS=3063f
B: MSC=10
I: Bus=0003 Vendor=0101 Product=1d79 Version=0110
N: Name="MY-POWER LeWGP-201"
P: Phys=usb-xhci-hcd.0.auto-1.4/input1
S: Sysfs=/devices/c9000000.dwc3/xhci-hcd.0.auto/usb1/1-1/1-1.4/1-1.4:1.1/0003:0101:1D79.0004/input/input5
U: Uniq=
H: Handlers=kbd event5
B: PROP=0
B: EV=1f
B: KEY=3007f 0 0 0 0 483ffff 17aff32d bf544446 0 0 1 120c13 b17c000 267bfa d941dfed 9e1680 4400 0 10000002
B: REL=40
B: ABS=1 0
B: MSC=10
其中js0:event4设备可以响应除了back键和底下一排三个键以外其他所有按键, 而kbd:event5设备则正好相反.
通过下面的命令可以测试按键, js编号和event编号根据上面的设备输出调整
jstest --event /dev/input/js0
evtest /dev/input/event4
可以通过evremap将event5的按键映射到event4
# Enable 'BACK' key on LeWGP-201 gamepad
evremap /dev/input/by-id/usb-MY-POWER_LeWGP-201-event-if01 /dev/input/by-id/usb-MY-POWER_LeWGP-201-event-joystick
将其添加到 /storage/.config/custom_start.sh 文件中, 将来开机就会自动生效.
在 EmuELEC 4.3 上已经没有 evremap 程序, 下面这个是从 EmuELEC 3.2 上复制下来的, 经过测试可以使用, https://pan.baidu.com/s/12nSqxboNvE3mzc4hSuEQDA, 链接: 提取码: kdqm. 在目录下找 EmuELEC-Amlogic.arm-3.2-config-bin-evermap.zip 这个文件下载. 解压后, 放到 /storage/.config/emuelec/bin 目录下. 因为这个目录在 PATH 中并且是可以写的.
可以在命令行下直接运行命令测试
evremap /dev/input/by-id/usb-MY-POWER_LeWGP-201-event-if01 /dev/input/by-id/usb-MY-POWER_LeWGP-201-event-joystick
另外对于乐视尚酷版手柄在连接后每隔几秒钟会断开一秒(断开时可以看到手柄上方4个灯一起闪, 连接好以后应该是只亮一个灯的)的问题, 这个通过dmesg看并无硬件通断事件, 如果连接头连接在usbhub上就容易有这个问题, 在R3300L上, 通过otg口连接到盒子的microusb口, 就不会出现断开的问题了. 推断是因为乐视这个接收头对电压的要求较高, usbhub的电压不足以使其稳定工作所致.
游戏ROM
这里有一些分机种带截图的合集可以下载 https://www.right.com.cn/forum/thread-2320907-1-1.html 在 EmuELEC 4.3 下可以正常使用