| #!/bin/bash -e |
| |
|
|
| echo "Fix 1/3: motor port -> /dev/ttyAMA3 (udev)" |
| install -d -m 0755 /etc/udev/rules.d |
| cat > /etc/udev/rules.d/99-reachy-pi5-motor.rules <<'RULE' |
| |
| SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", SYMLINK+="ttyAMA3", GROUP="dialout", MODE="0660" |
| KERNEL=="ttyAMA2", SYMLINK+="ttyAMA3", GROUP="dialout", MODE="0660" |
| RULE |
|
|
| echo "Fix 2/3: shutdown button -> gpiozero lgpio backend" |
| install -d -m 0755 /etc/systemd/system/gpio-shutdown-daemon.service.d |
| cat > /etc/systemd/system/gpio-shutdown-daemon.service.d/10-pi5-lgpio.conf <<'DROP' |
| [Service] |
| Environment=GPIOZERO_PIN_FACTORY=lgpio |
| DROP |
| source /opt/uv/env 2>/dev/null || true |
| if [ -f /venvs/mini_daemon/bin/activate ]; then |
| source /venvs/mini_daemon/bin/activate |
| uv pip install lgpio || pip install lgpio || true |
| fi |
|
|
| echo "Fix 3/3: USB camera" |
| |
| for plugin in /usr/local/lib/*/gstreamer-1.0/libgstlibcamera.so /usr/lib/*/gstreamer-1.0/libgstlibcamera.so; do |
| [ -f "$plugin" ] && mv "$plugin" "$plugin.disabled" || true |
| done |
| |
| cat > /venvs/mini_daemon/lib/python3.12/site-packages/sitecustomize.py <<'PY' |
| |
| import sys |
| def _camera_fallback(): |
| try: |
| from reachy_mini.media import device_detection as dd |
| except Exception: |
| return |
| original = dd.get_video_device |
| def patched(): |
| try: |
| path, specs = original() |
| if path: |
| return path, specs |
| except Exception: |
| pass |
| import glob, subprocess, platform |
| if platform.system() != "Linux": |
| return "", None |
| for dev in sorted(glob.glob("/dev/video*")): |
| try: |
| info = subprocess.run(["v4l2-ctl", "-d", dev, "--info"], capture_output=True, text=True, timeout=3).stdout |
| fmts = subprocess.run(["v4l2-ctl", "-d", dev, "--list-formats-ext"], capture_output=True, text=True, timeout=3).stdout |
| except Exception: |
| continue |
| if "Reachy" in info and "MJPG" in fmts: |
| sys.stderr.write("camera fallback: %s\n" % dev) |
| return dev, dd._make_camera_specs("Reachy") |
| return "", None |
| dd.get_video_device = patched |
| _camera_fallback() |
| PY |
|
|
| echo "Pi-5 fixes applied." |
|
|