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读卡器, 否则容易失败

初次启动步骤

  1. 启动后会先进行分区扩容, 左上角能看到format提示"PARTITION RESIZING IN PROGRESS", 这一步提示后, 如果格式化成功, 会出现"Formatting EEROMES partition as FAT32...done", 倒计时5秒后重启
  2. 启动后进行user config设置, 左上角提示"A start job is running for Setup User config dir (??s / no limit)", 这一步时间需要一两分钟, 之后再重启
  3. 初始化完成后的第一次启动, 会播放开机视频, 声音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 下可以正常使用

posted on 2019-12-02 15:55  Milton  阅读(8900)  评论(8编辑  收藏  举报

导航