{"repo":"hrvach/deskhop","free":true,"listed":false,"github":"https://github.com/hrvach/deskhop","clone":"git clone https://github.com/hrvach/deskhop.git","description":"Fast Desktop Switching Device","language":"C","stars":7872,"topics":["arm","c","desktop","diy","embedded","hid","keyboard","kvm","mouse","pi","pico","raspberry","raspberry-pi","rp2040","switch","usb"],"license":"GPL-3.0","category":"dev_tool","readme_excerpt":"# DeskHop - Fast Desktop Switching\n\nDid you ever notice how, in the crazy world of tech, there's always that one quirky little project trying to solve a problem so niche that its only competitors might be a left-handed screwdriver and a self-hiding alarm clock?\n\nI use two different computers in my daily workflow and share a single keyboard/mouse pair between them. Trying several USB switching boxes found on Amazon made me realize they all suffer from similar issues - it takes a while to switch, the process is quite clumsy when trying to find the button and frankly, it just doesn't get any better with time.\n\nAll I wanted was a way to use a keyboard shortcut to quickly switch outputs, paired with the ability to do the same by magically moving the mouse pointer between monitors. This project enables you to do both, even if your computers run different operating systems!\n\n![DeskHop case and board](img/case_and_board_s.png)\n\n## Features\n\n- Completely **[free and open source](https://certification.oshwa.org/de000149.html)**\n- No noticeable delay when switching\n- Simply drag the mouse pointer between computers\n- No software installed\n- Affordable and obtainable components (<15€)\n- 3D printable snap-fit case\n- Full Galvanic isolation between your outputs\n- Works with Linux, macOS and Windows\n\n[User Manual](misc/user-manual.pdf) is now available\n\n![Open Source Hardware Logo](img/oshw.svg)\n\n------\n\n## How it works\n\nThe device acts as an intermediary between your keyboard/mouse and the computer, establishing and maintaining connections with both computers at once. Then it chooses where to forward your mouse and keystrokes to, depending on your selection. Keyboard follows the mouse and vice versa, so just dragging the mouse to the other desktop will switch both.\n\n## Mouse\n\nTo get the mouse cursor to magically jump across, the mouse hid report descriptor was changed to use absolute coordinates and then the mouse reports (that still come in relative movements) accumulate internally, keeping the accurate tally on the position.\n\nWhen you try to leave the monitor area in the direction of the other monitor, it keeps the Y coordinate and swaps the maximum X for a minimum X, then flips the outputs. This ensures that the cursor seamlessly appears at the same height on the other monitor, enhancing the perception of a smooth transition.\n\n![DeskHop Mouse Demo](img/deskhop-demo.gif)\n\n<p align=\"center\"> Dragging the mouse from Mac to Linux automatically switches outputs. </p>\n\n------\n\nThe actual switch happens at the very moment when one arrow stops moving and the other one starts.\n\n## Keyboard\n\nActing as a USB Host and querying your keyboard periodically, it looks for a preconfigured hotkey in the hid report (usually Ctrl + Caps Lock for me). When found, it will forward all subsequent characters to the other output.\n\nTo have a visual indication which output you are using at any given moment, you can repurpose keyboard LEDs and have them provide the necessary feedback.\n\nIt also remembers the LED state for each computer, so you can pick up exactly how you left it.\n\n![DeskHop Typing Demo](img/demo-typing.gif)\n\n## How to build\n\nTo avoid version mismatch and reported path issues when building, as well as to save you from having to download a large SDK, the project now bundles minimal pico sdk and tinyusb.\n\nOn a Debian/Ubuntu systems, make sure to install these:\n\n```shell\napt update\napt install \\\n    build-essential \\\n    cmake \\\n    gcc-arm-none-eabi \\\n    libnewlib-arm-none-eabi \\\n    python3\n```\n\nYou should be able to build by running:\n\n```shell\ncmake -S . -B build\ncmake --build build\n```\n\nadditionally, to rebuild web UI check webconfig/ and execute ```./render.py```, you'll need jinja2 installed.\n\nAn alternative can be to use docker via 'docker compose' or 'docker-compose':\n```\ndocker-compose -f misc/docker.yml run --rm build_container\n```\nThis ensures reproducible builds.\n\nTo rebuild the disk, check disk/ folder and run ```./create.sh```, tweak to your system if needed. You'll need **dosfstools** (to provide mkdosfs),\n\n## Using a pre-built image\n\nAlternatively, you can use the [pre-built images](https://github.com/hrvach/deskhop/releases). Since version 0.6 there is only a single universal image. You need the .uf2 file which you simply copy to the device in one of the following ways:\n\n## Upgrading firmware\n\n**Option 1** - (firmware 0.6 and later) Put the device in \"config mode\" by simultaneously pressing **left ctrl + right shift + c + o**. Device your keyboard is plugged into will reboot and turn into a USB drive called \"DESKHOP\". All you need to do is copy the .uf2 file to it. Once image is verified, device will flash and reboot, then proceed to upgrade the other board. During this operation the led will blink. Once it's done, it will write flash and reboot, completing the operation.\n\n_Note_ - This is not an actual generic USB drive, you can't use it to copy files to it.\n\n**Option 2** - Using the ROM bootloader - hold the on-board button while connecting each Pico and copy the uf2 to the flash drive that appears. Images later than 0.6 support holding the button without having to fiddle around the power supply, but the \"hold button while plugging\" should always work, regardless of device state.\n\n**Option 3** - CDC Flash Command (Debug builds only) - If the firmware was built with `DH_DEBUG_CDC_FLASH=ON`, you can trigger bootloader mode via CDC serial command:\n```shell\necho -n 'flash' > /dev/tty.usbmodem11104\n```\nThis immediately resets the device into bootloader mode where it appears as \"RPI-RP2\" drive. This feature is intended for development workflows.\n\n## Misc features\n\n### Mouse slowdown\n\nEver tried to move that YT video slider to a specific position but your mouse moves too jumpy and suddenly you are moving your hand super-carefully like you're 5 and playing \"Operation\" all over again?\n\n**Press right CTRL + right ALT** to toggle a slow-mouse mode. The mouse pointer will slow down considerably, enabling you to get the finer precision work done and still have your mouse moving normally by quickly pressing the same keys again.\n\n### Switch Lock\n\nIf you want to lock yourself to one screen, use ```RIGHT CTRL + K```.\nThis will make sure you won't accidentally leave your current screen. To turn off, press the same key combo again.\n\n### Lock Both Screens\n\nYou can lock both computers at once by using ```RIGHT CTRL + L```.\nTo make use of this feature, first set up the OS for each output in config (since the shortcuts are different).\n\n### Gaming Mode\n\nIf you're gaming, there is a chance your game might not work properly with absolute mouse mode. To address that issue, a **gaming mode** is introduced, toggled by ```LEFT CTRL + RIGHT SHIFT + G```. When in gaming mode, you are locked to the current screen and your mouse behaves like a standard relative mouse. This should also fix various virtual machine issues, currently unsupported operating systems etc.\n\n### Screensaver\n\nSupposedly built in to prevent computer from entering standby, but truth be told - it is just fun to watch. **Off by default**, will make your mouse pointer bounce around the screen like a Pong ball. When enabled, it activates after a period of inactivity defined in user config header and automatically switches off as soon as you send any output towards that screen.\n\nPotential usage example - I have a buggy USB dock that won't resume video from standby, so not allowing it to sleep can be a handy workaround.\n\n## Hardware\n\n[The circuit](schematics/DeskHop_v1.1.pdf) is based on two Raspberry Pi Pico boards, chosen because they are cheap (4.10 € / pc), can be hand soldered and most suppliers have them in stock.\n\nThe Picos are connected using UART and separated by an Analog Devices ADuM1201 dual-channel digital isolator (~3€) or a much cheaper, faster and pin-compatible TI ISO7721DR (~1.5€) which is the preferred choice.\n\nWhile they normally don't have support for dual USB, thanks to an [amazing project](https://github.com/sekigon-gonnoc/Pico-PIO-USB) where USB is implemented using the programmable IO wizardry found in RP2040, there is support for it to act both as an USB host and device.\n\n## PCB [updated]\n\nTo keep things as simple as possible for DIY builds, the traces were kept on one side and the number of parts kept to a minimum.\n\n![PCB Image](img/plocica2.png)\n\nUSB D+/D- differential lines should be identical in length, but they are slightly asymmetrical on purpose to counter the length difference on the corresponding GPIO traces PICO PCB itself, so the overall lengths should match.\n\nZd (differential impedance) is aimed as 90 ohm (managed to get ~107, close enough :)).\n\nThe thickness is designed to be 1.6 mm for snap-fit to work as expected.\n\nThere are 2 versions of the PCB (no major differences for the user). Original (v1.0) is easier to solder and assemble, while v1.1 offers some upgrades like:\n\n- added ESD protection (TPD4E1U06DBVR)\n- added VBUS capacitor for the keyboard/mouse connectors\n- silkscreen orientation markings\n- holes for clone boards with headers pre-soldered and easier alignment\n- USB 27 ohm resistors\n\n  This version is slightly more difficult to hand solder due to the small transient voltage suppressor IC and 0805 resistors, but it's totally doable. TVS can in theory be omitted (not advised) and it will still work.\n\nUpcoming - board with bare rp2040s that doesn't need Picos, is smaller and more convenient.\n\n## Case\n\nSince I'm not very good with 3d, the case is [simple and basic](case/) but does the job. It should be easy to print, uses ~33g of filament and takes a couple of hours.\n\nHorizontal PCB movements are countered by pegs sliding through holes and vertical movements by snap-fit lugs on the sides - no screws required. The case was given a slight redesign to feature the logo and two additional snap-fit lugs, so it provides a better seal.\n\nMicro USB connectors on both boards are offset from the side of the case, so slightly larger holes should allow for ","default_branch":"main","files":583,"tree":[".github/workflows/build.yml",".gitignore","CMakeLists.txt","LICENSE","Pico-PIO-USB/CMakeLists.txt","Pico-PIO-USB/src/pio_usb.c","Pico-PIO-USB/src/pio_usb.h","Pico-PIO-USB/src/pio_usb_configuration.h","Pico-PIO-USB/src/pio_usb_device.c","Pico-PIO-USB/src/pio_usb_host.c","Pico-PIO-USB/src/pio_usb_ll.h","Pico-PIO-USB/src/usb_crc.c","Pico-PIO-USB/src/usb_crc.h","Pico-PIO-USB/src/usb_definitions.h","Pico-PIO-USB/src/usb_rx.pio","Pico-PIO-USB/src/usb_rx.pio.h","Pico-PIO-USB/src/usb_tx.pio","Pico-PIO-USB/src/usb_tx.pio.h","README.md","case/bottom.stl","case/deskhop_case.f3d","case/deskhop_case.step","case/top.stl","disk/create.sh","disk/disk.S","disk/disk.img","img/border_top_s.png","img/case_and_board.png","img/case_and_board_s.png","img/config-page-big.png","img/connect-dialog.png","img/demo-typing.gif","img/deskhop-case.gif","img/deskhop-demo.gif","img/deskhop-scr.png","img/impedance-calculation.png","img/oshw.svg","img/pcb_render.png","img/pcb_render_s.png","img/plocica2.png","img/polling_rate.png","img/yt-video-s.jpg","misc/.clang-format","misc/.editorconfig","misc/.markdownlint.yaml","misc/Dockerfile","misc/crc32.py","misc/docker.yml","misc/memory_map.ld","misc/user-manual.pdf","pcb/v1.0/DeskHop.kicad_pcb","pcb/v1.0/DeskHop.kicad_prl","pcb/v1.0/DeskHop.kicad_pro","pcb/v1.0/DeskHop.kicad_sch","pcb/v1.0/Gerber/DeskHop-B_Cu.gbr","pcb/v1.0/Gerber/DeskHop-B_Mask.gbr","pcb/v1.0/Gerber/DeskHop-B_Paste.gbr","pcb/v1.0/Gerber/DeskHop-B_Silkscreen.gbr","pcb/v1.0/Gerber/DeskHop-Edge_Cuts.gbr","pcb/v1.0/Gerber/DeskHop-F_Cu.gbr","pcb/v1.0/Gerber/DeskHop-F_Mask.gbr","pcb/v1.0/Gerber/DeskHop-F_Paste.gbr","pcb/v1.0/Gerber/DeskHop-F_Silkscreen.gbr","pcb/v1.0/Gerber/DeskHop-NPTH.drl","pcb/v1.0/Gerber/DeskHop-PTH.drl","pcb/v1.0/Gerber/DeskHop-job.gbrjob","pcb/v1.1/DeskHop_Rev1.kicad_pcb","pcb/v1.1/DeskHop_Rev1.kicad_pro","pcb/v1.1/DeskHop_Rev1.kicad_sch","pcb/v1.1/Gerber/DeskHop_Rev1-B_Cu.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-B_Mask.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-B_Silkscreen.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-Edge_Cuts.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-F_Cu.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-F_Mask.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-F_Paste.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-F_Silkscreen.gbr","pcb/v1.1/Gerber/DeskHop_Rev1-NPTH.drl","pcb/v1.1/Gerber/DeskHop_Rev1-PTH.drl","pcb/v1.1/Gerber/DeskHop_Rev1-job.gbrjob","pcb/v1.1/Gerber_DeskHop.zip","pico-sdk/CMakeLists.txt","pico-sdk/cmake/Platform/PICO.cmake","pico-sdk/cmake/pico_pre_load_platform.cmake","pico-sdk/cmake/pico_pre_load_toolchain.cmake","pico-sdk/cmake/pico_utils.cmake","pico-sdk/cmake/preload/platforms/host.cmake","pico-sdk/cmake/preload/platforms/pico/pico.cmake","pico-sdk/cmake/preload/platforms/rp2040.cmake","pico-sdk/cmake/preload/toolchains/find_compiler.cmake","pico-sdk/cmake/preload/toolchains/pico_arm_clang.cmake","pico-sdk/cmake/preload/toolchains/pico_arm_clang_arm.cmake","pico-sdk/cmake/preload/toolchains/pico_arm_gcc.cmake","pico-sdk/cmake/preload/toolchains/set_flags.cmake","pico-sdk/lib/tinyusb/LICENSE","pico-sdk/lib/tinyusb/hw/bsp/ansi_escape.h","pico-sdk/lib/tinyusb/hw/bsp/board.c","pico-sdk/lib/tinyusb/hw/bsp/board_api.h","pico-sdk/lib/tinyusb/hw/bsp/board_mcu.h","pico-sdk/lib/tinyusb/hw/bsp/family_support.cmake","pico-sdk/lib/tinyusb/hw/bsp/rp2040/board.h","pico-sdk/lib/tinyusb/hw/bsp/rp2040/boards/pico_sdk/board.cmake","pico-sdk/lib/tinyusb/hw/bsp/rp2040/boards/raspberry_pi_pico/board.cmake","pico-sdk/lib/tinyusb/hw/bsp/rp2040/family.c","pico-sdk/lib/tinyusb/hw/bsp/rp2040/family.cmake","pico-sdk/lib/tinyusb/hw/bsp/rp2040/family.mk","pico-sdk/lib/tinyusb/hw/bsp/rp2040/pico_sdk_import.cmake","pico-sdk/lib/tinyusb/hw/bsp/rp2040/rp2040-openocd.cfg","pico-sdk/lib/tinyusb/src/CMakeLists.txt","pico-sdk/lib/tinyusb/src/class/cdc/cdc.h","pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c","pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.h","pico-sdk/lib/tinyusb/src/class/cdc/serial/cp210x.h","pico-sdk/lib/tinyusb/src/class/cdc/serial/ftdi_sio.h","pico-sdk/lib/tinyusb/src/class/hid/hid.h","pico-sdk/lib/tinyusb/src/class/hid/hid_device.c","pico-sdk/lib/tinyusb/src/class/hid/hid_device.h","pico-sdk/lib/tinyusb/src/class/hid/hid_host.c","pico-sdk/lib/tinyusb/src/class/hid/hid_host.h","pico-sdk/lib/tinyusb/src/class/msc/msc.h","pico-sdk/lib/tinyusb/src/class/msc/msc_device.c","pico-sdk/lib/tinyusb/src/class/msc/msc_device.h","pico-sdk/lib/tinyusb/src/common/tusb_common.h","pico-sdk/lib/tinyusb/src/common/tusb_compiler.h","pico-sdk/lib/tinyusb/src/common/tusb_debug.h","pico-sdk/lib/tinyusb/src/common/tusb_fifo.c","pico-sdk/lib/tinyusb/src/common/tusb_fifo.h","pico-sdk/lib/tinyusb/src/common/tusb_mcu.h","pico-sdk/lib/tinyusb/src/common/tusb_private.h","pico-sdk/lib/tinyusb/src/common/tusb_types.h","pico-sdk/lib/tinyusb/src/common/tusb_verify.h","pico-sdk/lib/tinyusb/src/device/dcd.h","pico-sdk/lib/tinyusb/src/device/usbd.c","pico-sdk/lib/tinyusb/src/device/usbd.h","pico-sdk/lib/tinyusb/src/device/usbd_control.c","pico-sdk/lib/tinyusb/src/device/usbd_pvt.h","pico-sdk/lib/tinyusb/src/host/hcd.h","pico-sdk/lib/tinyusb/src/host/hub.c","pico-sdk/lib/tinyusb/src/host/hub.h","pico-sdk/lib/tinyusb/src/host/usbh.c","pico-sdk/lib/tinyusb/src/host/usbh.h","pico-sdk/lib/tinyusb/src/host/usbh_pvt.h","pico-sdk/lib/tinyusb/src/osal/osal.h","pico-sdk/lib/tinyusb/src/osal/osal_none.h","pico-sdk/lib/tinyusb/src/osal/osal_pico.h","pico-sdk/lib/tinyusb/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c","pico-sdk/lib/tinyusb/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c","pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c","pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/hcd_rp2040.c","pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c","pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.h","pico-sdk/lib/tinyusb/src/tinyusb.mk","pico-sdk/lib/tinyusb/src/tusb.c","pico-sdk/lib/tinyusb/src/tusb.h","pico-sdk/lib/tinyusb/src/tusb_option.h","pico-sdk/lib/tinyusb/src/typec/pd_types.h","pico-sdk/lib/tinyusb/src/typec/tcd.h","pico-sdk/lib/tinyusb/src/typec/usbc.c","pico-sdk/lib/tinyusb/src/typec/usbc.h","pico-sdk/pico_sdk_import.cmake","pico-sdk/pico_sdk_init.cmake","pico-sdk/pico_sdk_version.cmake","pico-sdk/src/CMakeLists.txt","pico-sdk/src/board_setup.cmake","pico-sdk/src/boards/generic_board.cmake","pico-sdk/src/boards/include/boards/none.h","pico-sdk/src/boards/include/boards/pico.h","pico-sdk/src/boards/include/boards/pico_w.h","pico-sdk/src/boards/pico_w.cmake","pico-sdk/src/common/CMakeLists.txt","pico-sdk/src/common/README.md","pico-sdk/src/common/boot_picoboot/CMakeLists.txt","pico-sdk/src/common/boot_picoboot/include/boot/picoboot.h","pico-sdk/src/common/boot_uf2/CMakeLists.txt","pico-sdk/src/common/boot_uf2/include/boot/uf2.h","pico-sdk/src/common/pico_base/CMakeLists.txt","pico-sdk/src/common/pico_base/generate_config_header.cmake","pico-sdk/src/common/pico_base/include/pico.h","pico-sdk/src/common/pico_base/include/pico/assert.h","pico-sdk/src/common/pico_base/include/pico/config.h","pico-sdk/src/common/pico_base/include/pico/error.h","pico-sdk/src/common/pico_base/include/pico/types.h","pico-sdk/src/common/pico_base/include/pico/version.h.in","pico-sdk/src/common/pico_binary_info/CMakeLists.txt","pico-sdk/src/common/pico_binary_info/include/pico/binary_info.h","pico-sdk/src/common/pico_binary_info/include/pico/binary_info/code.h","pico-sdk/src/common/pico_binary_info/include/pico/binary_info/defs.h","pico-sdk/src/common/pico_binary_info/include/pico/binary_info/structure.h","pico-sdk/src/common/pico_bit_ops/CMakeLists.txt","pico-sdk/src/common/pico_bit_ops/include/pico/bit_ops.h","pico-sdk/src/common/pico_divider/CMakeLists.txt","pico-sdk/src/common/pico_divider/include/pico/divider.h","pico-sdk/src/common/pico_stdlib/CMakeLists.txt","pico-sdk/src/common/pico_stdlib/include/pico/stdlib.h","pico-sdk/src/common/pico_sync/CMakeLists.txt","pico-sdk/src/common/pico_sync/critical_section.c","pico-sdk/src/common/pico_sync/include/pico/critical_section.h","pico-sdk/src/common/pico_sync/include/pico/lock_core.h","pico-sdk/src/common/pico_sync/include/pico/mutex.h","pico-sdk/src/common/pico_sync/include/pico/sem.h","pico-sdk/src/common/pico_sync/include/pico/sync.h","pico-sdk/src/common/pico_sync/lock_core.c","pico-sdk/src/common/pico_sync/mutex.c","pico-sdk/src/common/pico_sync/sem.c","pico-sdk/src/common/pico_time/CMakeLists.txt","pico-sdk/src/common/pico_time/include/pico/time.h","pico-sdk/src/common/pico_time/include/pico/timeout_helper.h","pico-sdk/src/common/pico_time/time.c","pico-sdk/src/common/pico_time/timeout_helper.c","pico-sdk/src/common/pico_usb_reset_interface/CMakeLists.txt","pico-sdk/src/common/pico_usb_reset_interface/include/pico/usb_reset_interface.h","pico-sdk/src/common/pico_util/CMakeLists.txt","pico-sdk/src/common/pico_util/datetime.c","pico-sdk/src/common/pico_util/doc.h","pico-sdk/src/common/pico_util/include/pico/util/datetime.h","pico-sdk/src/common/pico_util/include/pico/util/pheap.h","pico-sdk/src/common/pico_util/include/pico/util/queue.h","pico-sdk/src/common/pico_util/pheap.c","pico-sdk/src/common/pico_util/queue.c","pico-sdk/src/rp2040.cmake","pico-sdk/src/rp2040/CMakeLists.txt","pico-sdk/src/rp2040/README.md","pico-sdk/src/rp2040/hardware_regs/CMakeLists.txt","pico-sdk/src/rp2040/hardware_regs/include/hardware/platform_defs.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/adc.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/addressmap.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/busctrl.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/clocks.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dma.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/dreq.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/i2c.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/intctrl.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_bank0.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/io_qspi.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/m0plus.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_bank0.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pads_qspi.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pio.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pll.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/psm.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/pwm.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/resets.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/rosc.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/rtc.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sio.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/spi.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/ssi.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/syscfg.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/sysinfo.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/tbman.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/timer.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/uart.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/usb.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/usb_device_dpram.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/vreg_and_chip_reset.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/watchdog.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/xip.h","pico-sdk/src/rp2040/hardware_regs/include/hardware/regs/xosc.h","pico-sdk/src/rp2040/hardware_structs/CMakeLists.txt","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/adc.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/bus_ctrl.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/clocks.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/dma.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/i2c.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/interp.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/iobank0.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/ioqspi.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/mpu.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/nvic.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/pads_qspi.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/padsbank0.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/pio.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/pll.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/psm.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/pwm.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/resets.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/rosc.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/rtc.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/scb.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/sio.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/spi.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/ssi.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/syscfg.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/systick.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/timer.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/uart.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/usb.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/vreg_and_chip_reset.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/watchdog.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/xip_ctrl.h","pico-sdk/src/rp2040/hardware_structs/include/hardware/structs/xosc.h","pico-sdk/src/rp2_common.cmake","pico-sdk/src/rp2_common/CMakeLists.txt","pico-sdk/src/rp2_common/README.md","pico-sdk/src/rp2_common/boot_stage2/CMakeLists.txt","pico-sdk/src/rp2_common/boot_stage2/asminclude/boot2_helpers/exit_from_boot2.S","pico-sdk/src/rp2_common/boot_stage2/asminclude/boot2_helpers/read_flash_sreg.S","pico-sdk/src/rp2_common/boot_stage2/asminclude/boot2_helpers/wait_ssi_ready.S","pico-sdk/src/rp2_common/boot_stage2/boot2_at25sf128a.S","pico-sdk/src/rp2_common/boot_stage2/boot2_generic_03h.S","pico-sdk/src/rp2_common/boot_stage2/boot2_is25lp080.S","pico-sdk/src/rp2_common/boot_stage2/boot2_usb_blinky.S","pico-sdk/src/rp2_common/boot_stage2/boot2_w25q080.S","pico-sdk/src/rp2_common/boot_stage2/boot2_w25x10cl.S","pico-sdk/src/rp2_common/boot_stage2/boot_stage2.ld","pico-sdk/src/rp2_common/boot_stage2/compile_time_choice.S","pico-sdk/src/rp2_common/boot_stage2/doc.h","pico-sdk/src/rp2_common/boot_stage2/include/boot_stage2/config.h","pico-sdk/src/rp2_common/boot_stage2/pad_checksum","pico-sdk/src/rp2_common/cmsis/CMakeLists.txt","pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_armcc.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_armclang.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_armclang_ltm.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_compiler.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_gcc.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_iccarm.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/cmsis_version.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/core_cm0plus.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Core/Include/mpu_armv7.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Device/RaspberryPi/RP2040/Include/RP2040.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Device/RaspberryPi/RP2040/Include/system_RP2040.h","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/Device/RaspberryPi/RP2040/Source/system_RP2040.c","pico-sdk/src/rp2_common/cmsis/stub/CMSIS/LICENSE.txt","pico-sdk/src/rp2_common/hardware_adc/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_adc/adc.c","pico-sdk/src/rp2_common/hardware_adc/include/hardware/adc.h","pico-sdk/src/rp2_common/hardware_base/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_base/include/hardware/address_mapped.h","pico-sdk/src/rp2_common/hardware_claim/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_claim/claim.c","pico-sdk/src/rp2_common/hardware_claim/include/hardware/claim.h","pico-sdk/src/rp2_common/hardware_clocks/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_clocks/clocks.c","pico-sdk/src/rp2_common/hardware_clocks/include/hardware/clocks.h","pico-sdk/src/rp2_common/hardware_clocks/scripts/vcocalc.py","pico-sdk/src/rp2_common/hardware_divider/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_divider/divider.S","pico-sdk/src/rp2_common/hardware_divider/include/hardware/divider.h","pico-sdk/src/rp2_common/hardware_divider/include/hardware/divider_helper.S","pico-sdk/src/rp2_common/hardware_dma/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_dma/dma.c","pico-sdk/src/rp2_common/hardware_dma/include/hardware/dma.h","pico-sdk/src/rp2_common/hardware_exception/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_exception/exception.c","pico-sdk/src/rp2_common/hardware_exception/include/hardware/exception.h","pico-sdk/src/rp2_common/hardware_flash/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_flash/flash.c","pico-sdk/src/rp2_common/hardware_flash/include/hardware/flash.h","pico-sdk/src/rp2_common/hardware_gpio/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_gpio/gpio.c","pico-sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h","pico-sdk/src/rp2_common/hardware_i2c/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_i2c/i2c.c","pico-sdk/src/rp2_common/hardware_i2c/include/hardware/i2c.h","pico-sdk/src/rp2_common/hardware_interp/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_interp/include/hardware/interp.h","pico-sdk/src/rp2_common/hardware_interp/interp.c","pico-sdk/src/rp2_common/hardware_irq/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_irq/include/hardware/irq.h","pico-sdk/src/rp2_common/hardware_irq/irq.c","pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S","pico-sdk/src/rp2_common/hardware_pio/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_pio/include/hardware/pio.h","pico-sdk/src/rp2_common/hardware_pio/include/hardware/pio_instructions.h","pico-sdk/src/rp2_common/hardware_pio/pio.c","pico-sdk/src/rp2_common/hardware_pll/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_pll/include/hardware/pll.h","pico-sdk/src/rp2_common/hardware_pll/pll.c","pico-sdk/src/rp2_common/hardware_pwm/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_pwm/include/hardware/pwm.h","pico-sdk/src/rp2_common/hardware_resets/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_resets/include/hardware/resets.h","pico-sdk/src/rp2_common/hardware_rtc/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_rtc/include/hardware/rtc.h","pico-sdk/src/rp2_common/hardware_rtc/rtc.c","pico-sdk/src/rp2_common/hardware_spi/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_spi/include/hardware/spi.h","pico-sdk/src/rp2_common/hardware_spi/spi.c","pico-sdk/src/rp2_common/hardware_sync/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_sync/include/hardware/sync.h","pico-sdk/src/rp2_common/hardware_sync/sync.c","pico-sdk/src/rp2_common/hardware_timer/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h","pico-sdk/src/rp2_common/hardware_timer/timer.c","pico-sdk/src/rp2_common/hardware_uart/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_uart/include/hardware/uart.h","pico-sdk/src/rp2_common/hardware_uart/uart.c","pico-sdk/src/rp2_common/hardware_vreg/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_vreg/include/hardware/vreg.h","pico-sdk/src/rp2_common/hardware_vreg/vreg.c","pico-sdk/src/rp2_common/hardware_watchdog/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_watchdog/include/hardware/watchdog.h","pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c","pico-sdk/src/rp2_common/hardware_xosc/CMakeLists.txt","pico-sdk/src/rp2_common/hardware_xosc/include/hardware/xosc.h","pico-sdk/src/rp2_common/hardware_xosc/xosc.c","pico-sdk/src/rp2_common/pico_async_context/CMakeLists.txt","pico-sdk/src/rp2_common/pico_async_context/async_context_base.c","pico-sdk/src/rp2_common/pico_async_context/async_context_freertos.c"],"storefront":"/r/hrvach","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/hrvach/deskhop/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}