From e2c6db72f5093ab10f44a656eedb300326328c20 Mon Sep 17 00:00:00 2001 From: Maxim Devaev Date: Mon, 20 Jan 2025 04:18:53 +0200 Subject: [PATCH] mic --- README.md | 3 +- docs/_usb_limits.md | 55 +----- docs/audio.md | 146 ++++++++++------ docs/audio/menu_mic.png | Bin 0 -> 61265 bytes docs/audio/{menu.png => menu_speakers.png} | Bin docs/usb.md | 193 +++++++++++++++++++++ docs/usb_dynamic.md | 98 ----------- docs/usb_serial.md | 2 +- docs/v3.md | 4 +- docs/v4.md | 10 +- mkdocs.yml | 5 +- 11 files changed, 301 insertions(+), 215 deletions(-) create mode 100644 docs/audio/menu_mic.png rename docs/audio/{menu.png => menu_speakers.png} (100%) create mode 100644 docs/usb.md delete mode 100644 docs/usb_dynamic.md diff --git a/README.md b/README.md index 8466f5cf..f2d361bb 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ PiKVM supports several different hardware configurations, referred to as **platf All of them uses our common open source software stack. * **PiKVM V4** and **V3** are our own **plug-and-play, fully assembled, industrial grade, robust** devices.
- Supports **H.264 video & audio** transmission, **host power management**, **mass-storage emulation** and much more. + Supports **H.264 video & two-way audio with microphone** transmission, **host power management**, **mass-storage emulation** and much more. They are really well-made, reliable things which you can use yourself or provide to your clients. V4 and V3 also have more features than DIY builds. @@ -101,6 +101,7 @@ All of them uses our common open source software stack. | **HDMI 1920x1200@60Hz** support
for big displays | ✅ | ✅ | | ❌ | | ❌ | ❌ | | **HDMI 1920x1080@60Hz** support
for better BIOS/UEFI compatibility | ✅ | ✅ | | ❌ | | ❌ | ❌ | | **HDMI audio** capture | ✅ | ✅ | | ✅ | | ❌ | ❌ | +| **Microphone emulation** for two-way audio | ✅ | ✅ | | ✅ | | ❌ | ❌ | | **Super fast H.264 & MJPEG video:**
720p - 60fps, 1080p - 30fps for H.264 | ✅ | ✅ | | ✅ | | ✅ | ✅ | || || diff --git a/docs/_usb_limits.md b/docs/_usb_limits.md index 2267fee8..0c0ab18b 100644 --- a/docs/_usb_limits.md +++ b/docs/_usb_limits.md @@ -1,54 +1,7 @@ -??? warning "USB limitations" - **TL;DR: By default, you can add only one additional device to choose from, such as USB Ethernet, or USB Serial, or an extra Mass Storage Drive.** +!!! info "USB limitations" - There is a hardware limit on the number of devices that can be emulated at the same time. - Each USB device uses so-called endpoints to communicate with the host. - Depending on the type, the device consumes a different number of endpoints, - while their total number is limited by the capabilities of the chip, **for Raspberry Pi it is 8**. + Each emulated USB device consumes a limited hardware resource called **endpoints**. - It is quite difficult to calculate the number of endpoints used, but in the case of PiKVM, - you can focus on the following numbers: + Short info: by default, you can add only one additional USB device. - | Device | Endpoints | - |--------|-----------| - | Keyboard, mouse | 1 for each | - | Mass Storage Drive | 2 for each | - | USB Ethernet, USB Serial | 3 for each | - - V2 and V3 emulates one mouse by default, V4 emulates two mouses. Thus, V2 and V3 use 4 endpoints, and V4 uses 5 by default. - - Creating an axtra Mass Storage Drive consumes additional endpoints, as well as USB Serial and USB Ethernet, - so only a limited number of devices can be selected for the final configuration, for example, one USB Ethernet. - - If you need something more non-standard, you can [disable the regular Mass Storage Drive](msd.md#disable-msd) - and the additional mouse (on V4) to free up some extra endpoints. - - The `kvmd-otg` service is responsible for setting up USB emulation. If the endpoint limit is exceeded, - the service will not be able to start and no emulated USB device will work. - - In the log it looks something like this: - - ``` - # journalctl -u kvmd-otg - ... - kvmd-otg[382]: kvmd.apps.otg INFO --- ===== Preparing complete ===== - kvmd-otg[382]: kvmd.apps.otg INFO --- Enabling the gadget ... - kvmd-otg[382]: kvmd.apps.otg INFO --- WRITE --- /sys/kernel/config/usb_gadget/kvmd/UDC - kvmd-otg[382]: OSError: [Errno 524] Unknown error 524 - kvmd-otg[382]: During handling of the above exception, another exception occurred: - kvmd-otg[382]: Traceback (most recent call last): - kvmd-otg[382]: File "/usr/bin/kvmd-otg", line 9, in - kvmd-otg[382]: main() - kvmd-otg[382]: File "/usr/lib/python3.10/site-packages/kvmd/apps/otg/__init__.py", line 348, in main - kvmd-otg[382]: options.cmd(config) - kvmd-otg[382]: File "/usr/lib/python3.10/site-packages/kvmd/apps/otg/__init__.py", line 278, in _cmd_start - kvmd-otg[382]: _write(join(gadget_path, "UDC"), udc) - kvmd-otg[382]: File "/usr/lib/python3.10/site-packages/kvmd/apps/otg/__init__.py", line 83, in _write - kvmd-otg[382]: with open(path, "w") as file: - kvmd-otg[382]: OSError: [Errno 524] Unknown error 524 - systemd[1]: kvmd-otg.service: Main process exited, code=exited, status=1/FAILURE - systemd[1]: kvmd-otg.service: Failed with result 'exit-code'. - systemd[1]: Failed to start PiKVM - OTG setup. - ``` - - In this case, you need to disable some of the previously enabled devices and restart PiKVM. + To get more information about the endpoints, add more devices, and flexibly manage the configuration on the fly, see [here](usb.md). diff --git a/docs/audio.md b/docs/audio.md index dfe37b1e..8991dfb2 100644 --- a/docs/audio.md +++ b/docs/audio.md @@ -1,91 +1,125 @@ # PiKVM V3+ Audio -Official PiKVM V3, V4 Mini and V4 Plus devices have an exclusive audio transmission feature. -Audio is transmitted over an HDMI cable from the target host to PiKVM as if it were a regular monitor -with speakers, and then from PiKVM to a web browser in [WebRTC video mode](webrtc.md). -This brings the user experience of working with a remote host even closer to the local one. +Official [PiKVM V3](v3.md) and [PiKVM V4](v4.md) devices have an exclusive audio transmission feature, +including **two-way** communication with microphone directly in the browser. + +The incoming stream is captured from the target host via HDMI, the outgoing stream is transmitted to an emulated USB microphone. +This brings the user experience of working with voice applications on the remote host even closer to the local one. !!! note - * This feature does not work with DIY devices, either CSI or USB video dongles. + * Audio does not work with DIY devices, either CSI or USB video dongles. - * Reverse audio transmission, that is, from the browser towards PiKVM - (for example, to emulate a microphone) is not yet supported. - - * [VNC](vnc.md) does not support audio, it only works in the Web UI. + * [VNC](vnc.md) does not support audio, it only works in the Web UI in [WebRTC](webrtc.md) mode. ----- -## Preparing +## Speakers (incoming audio) -For PiKVM V4, this feature is enabled by default and no special preparations are required. +* On [PiKVM V4](v4.md), this feature is enabled by default, unless you didn't disable it [with custom EDID](edid.md). -For PiKVM V3, this feature is disabled by default for historical reasons so as not to break -old user configurations that were created before audio support was added. +* On [PiKVM V3](v3.md), this is disabled for historical reasons so as not to break old user's configurations + that was created before audio support was introduced. -??? example "Enabling audio on PiKVM V3" + ??? example "Enabling audio on PiKVM V3" - 1. Make sure that you have not removed the [audio jumpers (4)](v3.md#io-ports-and-jumpers) - on the V3 HAT board and have not deleted or commented the `dtoverlay=tc358743-audio` - line in `/boot/config.txt`. Return everything as it was, if you changed it. + 1. Make sure that you have not removed the [audio jumpers (4)](v3.md#io-ports-and-jumpers) + on the V3 HAT board and have not deleted or commented the `dtoverlay=tc358743-audio` + line in `/boot/config.txt`. Return everything as it was, if you changed it. - 2. Update OS and reboot: + 2. Update OS and reboot: + + {!_update_os.md!} + + 3. Enable the Basic Audio support in the [EDID](edid.md) in the `/etc/kvmd/tc358743-edid.hex` and reboot the device again: + + ```console + [root@pikvm ~]# rw + [root@pikvm ~]# kvmd-edidconf --set-audio=yes + [root@pikvm ~]# reboot + ``` + +The target host determines whether it is possible to output audio via HDMI. Each OS does this in its own way. +In general, make sure that the audio output is HDMI in the mixer. +PiKVM supports stereo mode with any standard bits and frequencies like 32/44.1/48 kHz with 16/24 bit. + +* **Mac OS** usually understands the priority of HDMI for audio output on its own, + but you can specify this explicitly in the settings. + +* **Windows** requires explicit specifying of the audio output device. + +* In **Linux**, everything depends on the distribution you use. In ancient times, the audio required performing + a ritual dance under the full Moon. For now, a working Pipewire or Pulseaudio most likely be enough. + Just specify HDMI as the audio sink in the mixer. + +To receive audio in the PiKVM Web UI, go to the **System** menu and switch the video mode to `WebRTC`. +If everything is in order, the volume slider will appear. Set the volume to a non-zero value. +The video stream will restart and you should start hearing sounds from the target host. + + + +If the volume slider is set to zero, then PiKVM does not accept the audio stream to save traffic, +while the target host will still assume that the audio output to HDMI is available. + +Besides, when the page is reloaded, the volume slider will be reset to zero. +Saving this setting is not possible due to browser limitation that do not allow web pages to play audio +immediately after opening without user activity to protect against annoying ads. + + +----- +## Microphone (outgoing audio) + +PiKVM is able to emulate a USB microphone on the target host to transmit your speech from the browser to the host. +This feature is disabled by default for backward compatibility reasons. + +{!_usb_limits.md!} + +??? example "Enabling USB Microphone" + + 1. Microphone requires speakers support so check the previous paragraph. Also perform OS updating and reboot if you didn't: {!_update_os.md!} - 3. Add the following lines to `/etc/kvmd/janus/janus.plugin.ustreamer.jcfg` if they missing: - - ``` - audio: { - device = "hw:0,0" - tc358743 = "/dev/kvmd-video" - } - ``` - - 4. Enable the Basic Audio support in the [EDID](edid.md) in the `/etc/kvmd/tc358743-edid.hex`: + 2. Switch filesystem to RW-mode: ```console - [root@pikvm ~]# kvmd-edidconf --set-audio=yes + [root@pikvm ~]# rw ``` - 5. Reboot the device: + 3. Add a config to `/etc/kvmd/override.yaml`: + + ```yaml + otg: + devices: + audio: + enabled: true + ``` + + 4. Perform reboot: ```console [root@pikvm ~]# reboot ``` +To receive and transmit audio in the PiKVM Web UI, go to the **System** menu and switch the video mode to `WebRTC`. +If everything is in order, the volume slider will appear with additional Microphone switch. +Set the volume to a non-zero value, next switch the mic switch. +Your browser will ask for permission to use the microphone, allow it. ------ -## Usage + -The target host determines whether it is possible to output audio via HDMI. Each OS does this in its own way. +The switch state will be saved in the browser's local settings. +The microphone signal will not be transmitted if the volume level is zero. -* Mac OS usually understands the priority of HDMI for audio output on its own, - but you can specify this explicitly in the settings. +!!! warning "USB compatibility" -* Windows requires explicit specifying of the audio output device. + This feature is very new, so we don't know how much it affects the ability to interact with the BIOS and UEFI. -* In Linux, everything depends on the distribution you use. In ancient times, audio required performing - a ritual dance on a full moon. For now, a working Pipewire or Pulseaudio most likely be enough. - Just specify HDMI as the audio sink in the mixer. + Please try this and [let us know](https://discord.gg/bpmXfz5) if you have lost the ability to access + the BIOS or boot OS from PiKVM Mass Storage after turning on the USB microphone. -In general, make sure that the audio output is output via HDMI. -PiKVM supports stereo mode with any standard bits and frequencies like 32/44.1/48 kHz with 16/24 bit. - -To receive audio in the PiKVM Web UI, go to the **System** menu and switch the video mode to `H.264 / WebRTC`. -If everything is in order, the volume slider will appear. Set the volume to a non-zero value. -The video stream will restart and you should start hearing sounds from the target host. - - - -!!! note - - If the volume slider is set to zero, then PiKVM does not accept the audio stream to save traffic, - while the target host will still assume that the audio output to HDMI is available. - - Besides, when the page is reloaded, the volume slider will be reset to zero. - Saving this setting is not possible due to browser limitation that do not allow web pages to play audio - immediately after opening without user activity to protect against annoying ads. + But even if this happens, don't worry. You can use [the dynamic USB device control](usb.md) + to temporarily turn off the microphone emulation. ----- diff --git a/docs/audio/menu_mic.png b/docs/audio/menu_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..0c526b1dce8c69b868f0a309762968ab290798c1 GIT binary patch literal 61265 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%0AGGX5UP;SvYN2%pBPBV7gbfG%zh366<-5& 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 literal 0 HcmV?d00001 diff --git a/docs/audio/menu.png b/docs/audio/menu_speakers.png similarity index 100% rename from docs/audio/menu.png rename to docs/audio/menu_speakers.png diff --git a/docs/usb.md b/docs/usb.md new file mode 100644 index 00000000..f25ec8c8 --- /dev/null +++ b/docs/usb.md @@ -0,0 +1,193 @@ +# USB configuration + +PiKVM V2+ emulates a small set of USB devices to ensure normal operation: a keyboard, [mouse](mouse.md) and [mass storage drive](msd.md). +However, the possibilities are not limited to this. Optionally, you can add a [USB ethernet](usb_ethernet.md), +[serial port](usb_serial.md), or (exclusive to [PiKVM V3](v3.md) and [V4](v4.md)) [a microphone to support two-way audio](audio.md). + +In rare cases, the target host's BIOS/UEFI may not understand such a large number of emulated devices on single USB port, +and some of them may need to be disabled. + +A complete USB configuration changing (adding or removing devices) requires a reboot, but it is possible +to temporarily disable and then re-enable existing emulated devices in preset. + + +----- +## Basics + +Each emulated USB device consumes a limited hardware resource called **endpoints**. + +Depending on the device, the number of required endpoints varies: + +| Device | Endpoints | +|--------|-----------| +| Keyboard, mouse | 1 for each | +| Mass Storage Drive | 2 for each | +| USB Microphone | 2 | +| USB Ethernet, USB Serial | 3 for each | + +**In total, PiKVM provides 9 endpoints for USB emulation**, some of which are used by default: + +* PiKVM V2-V3 emulates one absolute mouse and one mass storage and uses 4 of 9 endpoints. + +* PiKVM V4 also adds a relative mouse by default so it uses 5 of 9 endpoints. + +You can add other devices remaining endpoints, disable existing ones at all to free some endpoints, or do this only temporarily. + +Moreover, you can configure the preset with a large number of devices (more than PiKVM allows by endpoints), +and then dynamically enable only the necessary ones. + +If you have configured too many devices that consume more than 9 endpoints in total, +the least important of them will be inactive. You can enable them using dynamic configuration. + +To configure additional devices, please refer to the corresponding pages: + +* [USB Microphone](audio.md) - Two-way audio communication for voice applications on the target host. + Exclusive to [PiKVM V3](v3.md) and [V4](v4.md). + +* [Absolute and relative mouse](mouse.md) - The most convenient type of mouse is an absolute mouse, + but some BIOSes may not understand it. In this case, the relative one will help you. + +* [USB Ethernet](usb_ethernet.md) - A FTP or Samba server on PiKVM can be configured, and the target host + will see this over the network. It is also possible that PiKVM can work as a router to connect a host to a big network. + +* [USB Serial Port](usb_serial.md) - It can be used for terminal access from the target host to the PiKVM, + or for any other purpose that requires a serial connection. + + +----- +## Default preset + +Device setup includes two stages: adding to config and starting. + +When you add a device as described on the pages above, it automatically turns on after PiKVM reboot +and becomes available on the target device. This behaviour can be changed: the device will be created, +but not active until you turn it on dynamically. + +The `/etc/kvmd/override.yaml` file is used for such changes. In the following example, +there are [USB Serial Port](usb_serial.md) and [Microphone](audio.md) enabled, +but the serial port is not started by default: + +```yaml +otg: + devices: + serial: + enabled: true + start: false + audio: + enabled: true +``` + +The `start` parameter is also available for all USB devices, see `kvmd -m` for the entire configuration tree. + + +## Dynamic configuration + + +### Command-line utility + +The `kvmd-otgconf` utility allows you to view and modify the USB configuration on the fly. + +It will also inform you about the number of endpoints used. + +Changing requires root permissions. + +View the config. Each line represents an emulated device. +Plus or minus sign means the state (enabled or not), next it displays the device name, +the number of required endpoints and its description. + +```console +[root@pikvm ~]# kvmd-otgconf +# Endpoints used: 7 of 9 +# Endpoints free: 2 +- acm.usb0 # [3] Serial Port ++ hid.usb0 # [1] Keyboard ++ hid.usb1 # [1] Absolute Mouse ++ hid.usb2 # [1] Relative Mouse ++ mass_storage.usb0 # [2] Mass Storage Drive ++ uac2.usb0 # [2] Microphone +``` + +Sometimes it happens that it is impossible to get into the UEFI/BIOS due to their bugs in USB support, +and you need to boot from the PiKVM mass storage. + +In this case you can disable all devices except keyboard and relative mouse, and enter the BIOS: + +```console +[root@pikvm ~]# kvmd-otgconf -d mass_storage.usb0 uac2.usb0 hid.usb1 +# Endpoints used: 2 of 9 +# Endpoints free: 7 +- acm.usb0 # [3] Serial Port +- ecm.usb0 # [3] Ethernet ++ hid.usb0 # [1] Keyboard +- hid.usb1 # [1] Absolute Mouse ++ hid.usb2 # [1] Relative Mouse +- mass_storage.usb0 # [2] Mass Storage Drive +- uac2.usb0 # [2] Microphone +``` + +Then change the boot order in the BIOS by setting the USB sticks as first priority. + +Exit the BIOS, and turn on mass storage again. Use it as usual to boot the image from PiKVM mass storage: + +```console +[root@pikvm ~]# kvmd-otgconf -e mass_storage.usb0 +# Endpoints used: 4 of 9 +# Endpoints free: 5 +- acm.usb0 # [3] Serial Port +- ecm.usb0 # [3] Ethernet ++ hid.usb0 # [1] Keyboard +- hid.usb1 # [1] Absolute Mouse ++ hid.usb2 # [1] Relative Mouse ++ mass_storage.usb0 # [2] Mass Storage Drive +- uac2.usb0 # [2] Microphone +``` + +You can also enable `uac2.usb0` and `hid.usb1` again. + + +### Web UI Menu + +Using the pseudo-GPIO driver, you can USB control devices via the menu in the web interface. +Read about GPIO basics [here](gpio.md). + +To setup the menu, use `kvmd-otgconf --make-gpio-config` to generate the configuration, and merge it +with your existing one in `/etc/kvmd/override.yaml` in a usual way. + +??? example "The example of `kvmd-otgconf --make-gpio-config` output" + ```yaml + # kvmd-otgconf --make-gpio-config + kvmd: + gpio: + drivers: + otgconf: + type: otgconf + scheme: + hid.usb0: + driver: otgconf + mode: output + pin: hid.usb0 + pulse: false + hid.usb1: + driver: otgconf + mode: output + pin: hid.usb1 + pulse: false + hid.usb2: + driver: otgconf + mode: output + pin: hid.usb2 + pulse: false + mass_storage.usb0: + driver: otgconf + mode: output + pin: mass_storage.usb0 + pulse: false + view: + table: + - ["#Keyboard", "#hid.usb0", hid.usb0] + - ["#Absolute Mouse", "#hid.usb1", hid.usb1] + - ["#Relative Mouse", "#hid.usb2", hid.usb2] + - ["#Mass Storage Drive", "#mass_storage.usb0", mass_storage.usb0] + ``` + +Please note that this menu is not dynamically generated, you need to update the configuration if you added or deleted devices. diff --git a/docs/usb_dynamic.md b/docs/usb_dynamic.md deleted file mode 100644 index c5d46481..00000000 --- a/docs/usb_dynamic.md +++ /dev/null @@ -1,98 +0,0 @@ -# Dynamic USB configuration - -PiKVM emulates a number of USB devices to ensure normal operation: keyboards, mouse and mass storage drive. -Also an additional [relative mouse](mouse.md) may be present (like on PiKVM V4 by default), -or a user configured [USB Ethernet](usb_ethernet.md) or [Serial port](usb_serial.md). - -In rare cases, the host BIOS/UEFI may not understand such a large number of emulated devices on single USB port, -so some of them may need to be disabled. USB reconfiguration usually requires a reboot, but it is possible -to temporarily disable already configured existing emulated devices. - -!!! warning - This feature is experimental. Due to the imperfections of the kernel modules, rarely a dynamic configuration change - can lead to a kernel panic and reboot. - - For PiKVM V3 and V4 this is considered more secure because they have two independent watchdog systems - that can bring devices back to life after a timeout of a few minutes. - - ------ -## Command-line utility - -The `kvmd-otgconf` utility allows you to view and modify the USB configuration on the fly. -It requires root permission and can be used for example from a web terminal. - -View the config: -``` -# kvmd-otgconf -+ hid.usb0 # Keyboard -+ hid.usb1 # Absolute Mouse -+ hid.usb2 # Relative Mouse -+ mass_storage.usb0 # Mass Storage Drive -``` -Each line represents a device (function). First comes plus or minus sign (the device on or off), then the name of the device and its description. - -Disabling the device: -``` -[root@pikvm ~]# kvmd-otgconf --disable-function mass_storage.usb0 -+ hid.usb0 # Keyboard -+ hid.usb1 # Absolute Mouse -+ hid.usb2 # Relative Mouse -- mass_storage.usb0 # Mass Storage Drive -``` - -Enabling the device: -``` -[root@pikvm ~]# kvmd-otgconf --enable-function mass_storage.usb0 -+ hid.usb0 # Keyboard -+ hid.usb1 # Absolute Mouse -+ hid.usb2 # Relative Mouse -+ mass_storage.usb0 # Mass Storage Drive -``` - - ------ -## Web UI menu - -Using the pseudo-GPIO driver, you can also control devices via the menu in the web interface. -Read about GPIO basics [here](gpio.md). - -To setup the menu, use `kvmd-otgconf --make-gpio-config` to generate the configuration, and merge it -with your existing one in `/etc/kvmd/override.yaml` in a usual way. - -??? example "The example of `kvmd-otgconf --make-gpio-config` output" - ```yaml - # kvmd-otgconf --make-gpio-config - kvmd: - gpio: - drivers: - otgconf: - type: otgconf - scheme: - hid.usb0: - driver: otgconf - mode: output - pin: hid.usb0 - pulse: false - hid.usb1: - driver: otgconf - mode: output - pin: hid.usb1 - pulse: false - hid.usb2: - driver: otgconf - mode: output - pin: hid.usb2 - pulse: false - mass_storage.usb0: - driver: otgconf - mode: output - pin: mass_storage.usb0 - pulse: false - view: - table: - - ["#Keyboard", "#hid.usb0", hid.usb0] - - ["#Absolute Mouse", "#hid.usb1", hid.usb1] - - ["#Relative Mouse", "#hid.usb2", hid.usb2] - - ["#Mass Storage Drive", "#mass_storage.usb0", mass_storage.usb0] - ``` diff --git a/docs/usb_serial.md b/docs/usb_serial.md index aa014bf8..a895003c 100644 --- a/docs/usb_serial.md +++ b/docs/usb_serial.md @@ -1,6 +1,6 @@ # Serial-over-USB connection -Specifically to V2+. This can be used for terminal access from the managed server to the PiKVM, or for any other purpose that requires a serial connection. In the last case, you only need to perform step 1 and reboot. +Specifically to V2+. This can be used for terminal access from the target host to the PiKVM, or for any other purpose that requires a serial connection. In the last case, you only need to perform step 1 and reboot. {!_usb_limits.md!} diff --git a/docs/v3.md b/docs/v3.md index abaaf083..6c30d4b0 100644 --- a/docs/v3.md +++ b/docs/v3.md @@ -96,7 +96,7 @@ If you have a kit without a metal case, you can use our free 3D printing case dr 10. !!! warning "IO ports and other things" **Before using GPIO** pins to control a relay, KVM switch, or anything else, be sure to [check the HAT pinout](#io-ports-and-jumpers). Many ports are busy with internal functions. Before using them for your own use, you must disable them, otherwise you may damage the device. -11. Enable [audio forwarding](audio.md){target=_blank} if you want. +11. Enable [audio speakers and microphone](audio.md){target=_blank} if you want. 12. Configure access to PiKVM from the Internet using [port forwarding](https://docs.pikvm.org/port_forwarding) or [Tailscale VPN](https://docs.pikvm.org/tailscale), if you need it. @@ -175,5 +175,5 @@ The standard Raspberry Pi HDMI output (marked as `VIDEO OUT` on the PiKVM case) ## Known issues and limitations -* There may be **compatibility** issues with some motherboards (such as **HP** or **DELL**) which are the same as those that exist with PiKVM V2. Not everything is perfect, but if you have already used PiKVM V2 - our new V3 will work great and please you. If there is no image from the BIOS, you can fine-tune the HDMI settings, but it is possible that the Mass Storage devices will not be available in the BIOS. +* There may be **compatibility** issues with some motherboards (such as **HP** or **DELL**) which are the same as those that exist with PiKVM V2. Not everything is perfect, but if you have already used PiKVM V2 - our new V3 will work great and please you. If there is no image from the BIOS, you can fine-tune the HDMI settings, but it is possible that the Mass Storage devices will not be available in the BIOS. In the last case, [USB dynamic configuration](usb.md) will solve the problem. * Pre-release V3.2 board (NOT Kickstarter/Store edition) doesn't have HDMI backpowering workaround jumper. diff --git a/docs/v4.md b/docs/v4.md index 76ce8acd..437434d7 100644 --- a/docs/v4.md +++ b/docs/v4.md @@ -63,12 +63,14 @@ If something doesn't work, check out our [FAQ](faq.md) (it's really useful). If nothing helped, you can get support in our [Discord chat](https://discord.gg/bpmXfz5). -7. Configure access to PiKVM from the Internet using [port forwarding](https://docs.pikvm.org/port_forwarding) +7. Enable [microphone for two-way audio](audio.md){target=_blank} if you want. + +8. Configure access to PiKVM from the Internet using [port forwarding](https://docs.pikvm.org/port_forwarding) or [Tailscale VPN](https://docs.pikvm.org/tailscale), if you need it. -8. **If you are using PiKVM V4 Plus, check out its new exclusive feature: [HDMI Passthrough](pass.md)!** +9. **If you are using PiKVM V4 Plus, check out its new exclusive feature: [HDMI Passthrough](pass.md)!** -9. Explore the features of PiKVM using the site's table of contents and have fun! +10. Explore the features of PiKVM using the site's table of contents and have fun! ----- @@ -141,5 +143,5 @@ To enable USB 3.0, it is required to flash the USB controller firmware. It's ver ----- ## Known issues and limitations -* There may be **compatibility** issues with some motherboards (such as **HP** or **DELL**) which are the same as those that exist with PiKVM V2. Not everything is perfect, but if you have already used PiKVM V2 - our new V4 will work great and please you. If there is no image from the BIOS, you can fine-tune the HDMI settings, but it is possible that the Mass Storage devices will not be available in the BIOS. +* There may be **compatibility** issues with some motherboards (such as **HP** or **DELL**) which are the same as those that exist with PiKVM V2. Not everything is perfect, but if you have already used PiKVM V2 - our new V4 will work great and please you. If there is no image from the BIOS, you can fine-tune the HDMI settings, but it is possible that the Mass Storage devices will not be available in the BIOS. In the last case, [USB dynamic configuration](usb.md) will solve the problem. * While there is a Mini-PCIe slot in the V4 Plus, this was only designed with the LTE modem with USB lines in mind, therefore if you decide to get a NVME card, it will not work. diff --git a/mkdocs.yml b/mkdocs.yml index bc20943c..e97a920e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ plugins: "gsm.md": "modem.md" "3g.md": "modem.md" "4g.md": "modem.md" + "usb_dynamic.md": "usb.md" nav: - "Device guides": @@ -90,8 +91,9 @@ nav: - "HDMI passthrough": pass.md - "H.264 / WebRTC": webrtc.md - "Working with video": video.md - - "HDMI audio": audio.md - "Peripheral devices": + - "USB configuration": usb.md + - "Audio / microphone": audio.md - "Keyboard & mouse": - "Mouse modes": mouse.md - "Mouse jiggler": mouse_jiggler.md @@ -100,7 +102,6 @@ nav: - "Mass Storage Drive": msd.md - "Ethernet-over-USB": usb_ethernet.md - "Serial-over-USB": usb_serial.md - - "Dynamic USB configuration": usb_dynamic.md - "GPIO (pins, relays, lamps, etc)": gpio.md - "Advanced usage": - "On-boot configuration": on_boot_config.md