LUNA: a USB multitool & nMigen library

Related tags

Hardwareluna
Overview

LUNA: a USB multitool & nMigen library Simulation Status Documentation Status

LUNA r0.2 side view

LUNA Library

LUNA is a full toolkit for working with USB using FPGA technology; and provides hardware, gateware, and software to enable USB applications.

Some things you can use LUNA for, currently:

  • Protocol analysis for Low-, Full-, or High- speed USB. LUNA provides both hardware designs and gateware that allow passive USB monitoring. When combined with the ViewSB USB analyzer toolkit, LUNA hardware+gateware can be used as a full-featured USB analyzer.
  • Creating your own Low-, Full-, High-, or (experimentally) Super- speed USB device. LUNA provides a collection of nMigen gateware that allows you to easily create USB devices in gateware, software, or a combination of the two.
  • Building USB functionality into a new or existing System-on-a-Chip (SoC). LUNA is capable of generating custom peripherals targeting the common Wishbone bus; allowing it to easily be integrated into SoC designs; and the library provides simple automation for developing simple SoC designs.

Some things you'll be able to use LUNA for in the future:

  • Man-in-the-middle'ing USB communications. The LUNA toolkit will be able to act as a USB proxy, transparently modifying USB data as it flows between a host and a device.
  • USB reverse engineering and security research. The LUNA toolkit will serve as an ideal backend for tools like FaceDancer; allowing easy emulation and rapid prototyping of compliant and non-compliant USB devices.

LUNA Hardware

The LUNA project also includes eponymous multi-tool hardware. This hardware isn't yet suited for end-users; but hardware development has reached a point where current-revision boards (r0.2+) make good development platforms for early community developers.

Building this board yourself isn't for the faint of heart -- as it requires placing two BGA components, including a large FPGA. Still, if you're proficient with rework and FPGA development, feel free to join in the fun!

Project Structure

This project is broken down into several directories:

  • luna -- the primary LUNA python toolkit; generates gateware and provides USB functionality
    • luna/gateware -- the core gateware components for LUNA; and utilities for stitching them together
  • examples -- simple LUNA-related examples; mostly gateware-targeted, currently
  • docs -- sources for the LUNA Sphinx documentation
  • contrib -- contributed/non-core components; such as udev rules
  • applets -- pre-made gateware applications that provide useful functionality on their own (e.g., are more than examples)

Project Documentation

LUNA's documentation is captured on Read the Docs. Raw documentation sources are in the docs folder.

Related Projects

LUNA hardware is supported by two firmware projects:

  • Apollo, the firmware that runs on LUNA hardware's debug controller, and which is responsible for configuring its FPGA.
  • Saturn-V, a DFU bootloader created for LUNA hardware.
Comments
  • Enumeration trouble, part 1

    Enumeration trouble, part 1

    I'm having trouble with a long USB 2.0 configuration descriptor -- 75 bytes.

    Initially, I was seeing my Linux host complaining in dmesg about being unable to read the descriptor, after I'd added another interface with two alternate settings. Here's how the problematic descriptor looks:

    with descriptors.DeviceDescriptor() as d:
        d.idVendor  = 0x16d0
        d.idProduct = 0x0f3b
        d.iManufacturer = "ShareBrained"
        d.iProduct      = "Tedium X8"
        d.iSerialNumber = "deadbeef"
        d.bNumConfigurations = 1
    
    with descriptors.ConfigurationDescriptor() as c:
    
        with c.InterfaceDescriptor() as i:
            i.bInterfaceNumber = 0
    
            with i.EndpointDescriptor() as e:
                e.bEndpointAddress = USBDirection.IN.to_endpoint_address(1)
                e.wMaxPacketSize   = 64
                e.bmAttributes     = USBTransferType.INTERRUPT
                e.bInterval        = 4
    
        with c.InterfaceDescriptor() as i:
            i.bInterfaceNumber = 1
            i.bAlternateSetting = 0
    
        with c.InterfaceDescriptor() as i:
            i.bInterfaceNumber = 1
            i.bAlternateSetting = 1
    
            with i.EndpointDescriptor() as e:
                e.bEndpointAddress = USBDirection.IN.to_endpoint_address(2)
                e.wMaxPacketSize   = (1 << 11) | 24
                e.bmAttributes     = USBTransferType.ISOCHRONOUS
                e.bInterval        = 1
    
        with c.InterfaceDescriptor() as i:
            i.bInterfaceNumber = 2
            i.bAlternateSetting = 0
    
        with c.InterfaceDescriptor() as i:
            i.bInterfaceNumber = 2
            i.bAlternateSetting = 1
    
            with i.EndpointDescriptor() as e:
                e.bEndpointAddress = USBDirection.OUT.to_endpoint_address(3)
                e.wMaxPacketSize   = (1 << 11) | 24
                e.bmAttributes     = USBTransferType.ISOCHRONOUS
                e.bInterval        = 1
    

    I built a test case based on FullDeviceTest that demonstrates the problem in simulation:

    # Read our configuration descriptor (with subordinates).
    try_config_length = 33
    handshake, data = yield from self.get_descriptor(DescriptorTypes.CONFIGURATION, length=try_config_length)
    self.assertEqual(handshake, USBPacketID.ACK)
    self.assertEqual(bytes(data), self.descriptors.get_descriptor_bytes(DescriptorTypes.CONFIGURATION)[:try_config_length])
    

    If I set try_config_length to 32 or less, the test case passes. If 33 or larger, it fails. Examining the simulation output in GTKWave, I tracked the apparent culprit to this line in ConstantStreamGenerator, which appears to be sized wrong (5 bits wide) for the intent of max_length_width, which I take to express the number of bits used to represent max_length. Indeed, if I change that line from:

    bytes_sent     = Signal.like(self._max_length_width)
    

    ...to:

    bytes_sent     = Signal(self._max_length_width)
    

    ...the test case passes. That is, until I reach try_config_length of 64, which fails for a different reason which I imagine is a separate issue.

    ...
      File "./enumerate_test.py", line 155, in test_enumeration
        handshake, data = yield from self.get_descriptor(DescriptorTypes.CONFIGURATION, length=try_config_length)
      File "/home/jboone/src/fpga/luna/luna/gateware/test/usb2.py", line 512, in get_descriptor
        descriptor = yield from self.control_request_in(0x80,
      File "/home/jboone/src/fpga/luna/luna/gateware/test/usb2.py", line 434, in control_request_in
        pid, packet = yield from self.in_transfer(data_pid=USBPacketID.DATA1)
      File "/home/jboone/src/fpga/luna/luna/gateware/test/usb2.py", line 350, in in_transfer
        pid, packet = yield from self.in_transaction(
      File "/home/jboone/src/fpga/luna/luna/gateware/test/usb2.py", line 323, in in_transaction
        self.assertEqual(pid, data_pid.byte())
    AssertionError: 75 != <USBPacketID.128|64|DATA0|ACK|OUT: 195>
    

    If I were to guess, this is a wMaxPacketSize0 issue, but that's just intuition speaking, not real data.

    I'm holding off submitting a pull request, because I'm skeptical my ConstantStreamGenerator change is the extent of what's necessary. I just don't grasp the code well enough yet to know that the change I made was the appropriate one, as the meaning of max_length and max_length_width seem a bit muddled in my brain...

    bug 
    opened by jboone 17
  • Question: alternate protocol support

    Question: alternate protocol support

    Could LUNA be extended with other protocol analysis (SPI, I2C,MIPI etc..) using the 16 user defined I/O ports as generic I/O ports and bring those pins to the outside of the enclusure on a header ? This would make LUNA a very lucrative alternative to other $1000+ USB2.0 and multiprotocol analyzers. Not being familair with LUNA yet, suppose this would be grabbing a bunch of samples into the buffer and send them to the host software that for example Sigrok/PulseView or other open source software could analyze ?

    question 
    opened by symdeb 10
  • Case silkscreen feedback

    Case silkscreen feedback

    Yesterday, a photo of the case that was posted in the Discord channel. I was told to post my feedback regarding the silkscreen design here, so I'm doing that now.

    I'll preface these statements by saying that I'm not a designer and don't have any experience in that area--these are just the issues that I, as a (future) user, had with the design. So, please don't grant these statements any undue authority. Also, these are just my opinions, so please feel free to ignore them if you think they're wrong.

    Issues

    Text orientation

    My first issue is that the text is oriented in three directions, and somewhat inconsistently so. For instance, the "Host" and "Sideband" labels are rotated 90 degrees clockwise, and the "Target" label is rotated 90 degrees in the opposite direction. That all makes sense, since it means you can easily read the labels while looking at the ports you're plugging cables into. But then the labels for the "DFU" and "Reset" buttons have no rotation, despite the buttons being on the same sides of the case as those ports whose labels are rotated 90 degrees. I can understand the thought process behind that--the expectation is that the device would primarily be oriented with the ports on the left and right sides, and the user can easily read the "DFU" and "Reset" labels in that orientation and then just feel for the buttons. But to have text that's so close together oriented perpendicularly, as in the case of the "Sideband" and "DFU" labels, is somewhat confusing, and doesn't look very good. But then rotating "DFU" to be in line with "Host and "Sideband" would put it in conflict with the "Debug" LED labels, so something would need to be done about those, too.

    Indicators for each port's size

    Without port width indicators like the "Target" label has (the lines the the left and right of the text), it's non-obvious where each port starts and ends. e.g., it'd be nice to see something like ┌──Host──┐┌Sideband┐ (or ┌──Host──┬Sideband┐ or whatever) to make that more clear.

    LED labeling

    Similarly, the "Debug" and "FPGA" labels could use some separation from and better indication of what LEDs they cover. For instance, maybe the LED spots could have a line covering all them, and then put the "Debug"/"FPGA" labels above that line. Maybe something like this (but with the text actually underlined as well):

    __Debug__   ___FPGA____
    ● ● ● ● ●   ● ● ● ● ● ●
    A B C D E   5 4 3 2 1 0
    

    Or, if labels start to get cluttered, the LED labels could be put in a "call out" (I don't know if that's the right term), where a line goes over the top of the LED spaces and links to a different area where the actual labels are. Kind of like what you might see on some PCBs with densely-packed clusters of components.

    Clutter

    The design is simultaneously "too cluttered" and "has too much negative space". What I mean by that is, first, it seems the logos for the Luna itself and GSG were placed to fill as much of the space as they could, while leaving a large empty space in the middle. That's not to say I'd like to see that space filled--rather, I think it would be better to decrease the sizes of both logos, and also possibly even condense them into one (GSG logo plus "LUNA" text, and nothing else) or put them on the back of the case. Speaking of which...

    The CE mark should not be on the front of the case. I realize that it was probably placed there since it may cost less to only mark the top side of the case, but whether or not something is CE-certified is generally not something I need to stare at every day. Instead, what I as a user find useful to see are the following (in no particular order):

    • The port labels (so I know what to plug where, without having to consult the manual).
    • The LED labels (again, so I don't have to consult the manual to know what they mean).

    So if it's at all possible, I would suggest putting the full Luna logo and the CE mark on the back of the case, and then, since the GSG name is already a part of the Luna logo, skip the GSG gears entirely. Or, the GSG logo could be kept on the front side, but centered.

    Design mockup

    A picture's worth a thousand words, so here's a sloppy mockup I did of a "fixed" design:

    Luna-Silkscreen

    The two big circles are where the GSG logo would go. The design is not to scale (again, it's a sloppy mockup), and so maybe some of these design decisions might not work exactly, but I think this does a decent job illustrating my suggestions. I'm still not really happy with the labeling for the FPGA LEDs, since having all the digits in a horizontal line makes me want to read them like a single number, but I can't really think of a much better way to do that that wouldn't end up making some other aspect of the design worse.

    Anyways, I'm eager to hear what people think about my comments/mockup.

    enhancement user experience 
    opened by cyrozap 8
  • (Fomu) examples/soc/:

    (Fomu) examples/soc/: "nmigen.build.res.ResourceError: Resource uart#0 does not exist"

    This may well be a user error, but this is what I attempted:

    With LUNA_PLATFORM=luna.gateware.platform.fomu:FomuPVT

    In luna/examples/soc/hello/

    $ python3 -m hello_world_soc
    module: luna.gateware.platform.fomu  name: FomuPVT
    INFO    | __init__    | Building and uploading gateware to attached Fomu PVT/Production...
    INFO    | simplesoc   | Physical address allocations:
    INFO    | simplesoc   |     00000000-00001000: <luna.gateware.soc.memory.WishboneROM object at 0x7f026399c5b0>
    INFO    | simplesoc   |     00001000-00002000: <luna.gateware.soc.memory.WishboneRAM object at 0x7f026399c910>
    INFO    | simplesoc   |     00002000-00002004: (rec uart_divisor r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002004-00002008: (rec uart_rx_data r_data r_stb)
    INFO    | simplesoc   |     00002008-0000200c: (rec uart_rx_rdy r_data r_stb)
    INFO    | simplesoc   |     0000200c-00002010: (rec uart_rx_err r_data r_stb)
    INFO    | simplesoc   |     00002010-00002014: (rec uart_tx_data w_data w_stb)
    INFO    | simplesoc   |     00002014-00002018: (rec uart_tx_rdy r_data r_stb)
    INFO    | simplesoc   |     00002020-00002024: (rec uart_ev_status r_data r_stb)
    INFO    | simplesoc   |     00002024-00002028: (rec uart_ev_pending r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002028-0000202c: (rec uart_ev_enable r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002040-00002044: (rec timer_reload r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002044-00002048: (rec timer_en r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002048-0000204c: (rec timer_ctr r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002050-00002054: (rec timer_ev_status r_data r_stb)
    INFO    | simplesoc   |     00002054-00002058: (rec timer_ev_pending r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002058-0000205c: (rec timer_ev_enable r_data r_stb w_data w_stb)
    INFO    | simplesoc   |     00002060-00002064: (rec leds_output r_data r_stb w_data w_stb)
    INFO    | simplesoc   | 
    INFO    | simplesoc   | IRQ allocations:
    INFO    | simplesoc   |     0: uart
    INFO    | simplesoc   |     1: timer
    INFO    | simplesoc   | 
    INFO    | simplesoc   | 
    Traceback (most recent call last):
      File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
        exec(code, run_globals)
      File "/home/tim/greatscottgadgets/luna/examples/soc/hello/hello_world_soc.py", line 103, in <module>
        top_level_cli(design, cli_soc=design.soc)
      File "/home/tim/greatscottgadgets/luna/luna/__init__.py", line 140, in top_level_cli
        products = platform.build(fragment,
      File "/home/tim/icebreaker/icebreaker-nmigen-examples/env/src/nmigen/nmigen/build/plat.py", line 95, in build
        plan = self.prepare(elaboratable, name, **kwargs)
      File "/home/tim/icebreaker/icebreaker-nmigen-examples/env/src/nmigen/nmigen/build/plat.py", line 135, in prepare
        fragment = Fragment.get(elaboratable, self)
      File "/home/tim/icebreaker/icebreaker-nmigen-examples/env/src/nmigen/nmigen/hdl/ir.py", line 39, in get
        obj = obj.elaborate(platform)
      File "/home/tim/greatscottgadgets/luna/examples/soc/hello/hello_world_soc.py", line 92, in elaborate
        uart_io = platform.request("uart", 0)
      File "/home/tim/icebreaker/icebreaker-nmigen-examples/env/src/nmigen/nmigen/build/res.py", line 62, in request
        resource = self.lookup(name, number)
      File "/home/tim/icebreaker/icebreaker-nmigen-examples/env/src/nmigen/nmigen/build/res.py", line 57, in lookup
        raise ResourceError("Resource {}#{} does not exist"
    nmigen.build.res.ResourceError: Resource uart#0 does not exist
    
    software technical support 
    opened by tcal-x 6
  • usb2.control: Support PING protocol in data OUT and status OUT stages.

    usb2.control: Support PING protocol in data OUT and status OUT stages.

    USB2.0 8.5.1 states:

    High-speed devices must support an improved NAK mechanism for Bulk OUT and Control endpoints and transactions. Control endpoints must support this protocol for an OUT transaction in the data and status stages. The control Setup stage must not support the PING protocol.

    We observe that hosts running Linux 5.18 sometimes issues PING tokens during control requests, and not handling them means those requests are unable to complete, resulting in the device failing to enumerate correctly.

    This patch solves the issue by always returning ACK to PING tokens received during data OUT and status OUT stages. In most cases ACK is the correct response since we're ready to handle data, and in the few cases it's not, we'll just fall back to letting the request handler return a NAK to the following data packet.

    opened by zyp 5
  • Add GetDescriptorHandlerSingleMemory

    Add GetDescriptorHandlerSingleMemory

    GetDescriptorHandlerSingleMemory handles GET_DESCRIPTOR calls and stores all descriptors in a single memory. It uses the same interface as GetDescriptorHandler and is a drop-in replacement.

    opened by twam 5
  •  Implement Isochronous OUT Endpoint / Add Examples for USB Audio 2 (Audio + MIDI)

    Implement Isochronous OUT Endpoint / Add Examples for USB Audio 2 (Audio + MIDI)

    The MIDI example works if I restrict it to one output only, otherwise the descriptor would get too large (see https://github.com/greatscottgadgets/luna/issues/86)

    opened by hansfbaier 5
  • add pip depends support

    add pip depends support

    Just a thought, but by adding git repositories to setup.py, downstream projects can simply specify luna as a dependency, and pip install will take care of the rest.

    Here is an example of a use case I have in mind. https://github.com/BracketMaster/nmigen-tinyfpgabx/blob/master/requirements.txt#L1

    opened by BracketMaster 5
  • design an r0.3

    design an r0.3

    Some potential changes for r0.3:

    • [x] Re-spec 3V3 regulator to reduce ripple; or at the least, remove its bypass capacitor.
    • [x] Improve grounding / thermal connections for the USB PHYs.
    • [x] Potentially switch between the active-high and active-low versions of our load switches / switch the load configuration to reduce leakage.
    • [x] Replace the USB PHY pull-up resistors with pull-down ones.
    • [x] Replace the 60MHz oscillator with the cheaper / lower-jitter SIT1602BC-73-33E-60.000000E.
    • [x] Re-evaluate availability and see if switching the 1V1 regulator to its larger package (EF vs EE) makes sense.
    • [x] Clean up redundant input caps (C6, C40, C47) on 3V3 regulator (U3).
    • [x] Remove redundant C45.
    • [x] Change R17, R19, R21 to 5%.
    • [x] Add TC2030-NL footprint for SWD.
    • [x] Improve pin 1 marking of oscillator Y1 footprint.
    • [x] Add "Substitution" BOM field ("any equivalent" for most passives).
    • [x] Select LED components and matching series resistors.
    • [x] Move LED silkscreen labels closer to LEDs.
    • [x] Connect PROGRAM_N to a nearby 3V3 FPGA I/O to allow for easier Debug Controller-less operation.
    • [x] Potentially swap the SAMD21 with a SAMD11, for cost reduction.
    • [x] Potentially move to USB-C connectors, instead of microUSB.
    documentation enhancement hardware 
    opened by ktemkin 5
  • USBInTransferManager does not toggle DATA when sending ZLP

    USBInTransferManager does not toggle DATA when sending ZLP

    ZLP is sent with the DATAX PID, which is supposed to be toggled from the previous value. It seems USBInTransferManager is not doing that.

    When sending ZLP, we do need to toggle DATA, but we don't need to swap the buffers. Right now, these two functions are done by the same signal. Hence we need to split them.

    bug 
    opened by ronyrus 4
  • Trying to run interactive-test.py on r0.2 luna board

    Trying to run interactive-test.py on r0.2 luna board

    There's a non-zero chance of user error here. This is what I attempted (from memory):

    • I created and entered a virtual environment (python -m venv)
    • In nmigen/nmigen/, I ran python3 ./setup.py install
    • In greatscottgadgets/luna/, I ran pip3 install poetry, poetry install
    • I connected a cable from my laptop's USB port to the Luna board's "Debug/Alt Port"
      • There was a slow-blinking green LED, and a row of dim red (w/ one green) LEDs
    • I ran poetry run applets/interactive-test.py
      • The green LED(s) momentarily ran a bouncing back and forth pattern
      • The row of red LEDs got brighter
      • This output was returned on the terminal:
    INFO    | __init__    | Building and uploading gateware to attached LUNA r0.2...
    INFO    | __init__    | Upload complete.
    INFO    | selftest    | Connected to onboard debugger; hardware revision r0.2 (s/n: eebbd5a905b435050213e29382f031ff).
    INFO    | selftest    | Running tests...
    
    
    Automated tests:
            Debug module:   ✗ FAILED        (register 1 was 63, not expected 1413829460)
            Host PHY:       ✗ FAILED        (PHY register 0 was 3182280431, not expected 36)
            HyperRAM:       ✗ FAILED        (RAM register 0 was 3182280431, not one of expected (3201, 3206))
            Sideband PHY:   ✗ FAILED        (PHY register 0 was 3182280431, not expected 36)
            Target PHY:     ✗ FAILED        (PHY register 0 was 3182280431, not expected 36)
    
    opened by tcal-x 4
  • design r0.6

    design r0.6

    • [ ] change IC1 (FPGA) from 256 caBGA to 381 caBGA package, retaining ability to switch back to 256 caBGA later
    • [ ] change U8, U9, U11 (USB PHYs) to USB3320
    • [ ] rename Sideband port to "Control" and use as primary port for control of both FPGA and Apollo)
    • [ ] rename Host port to "Aux" for auxiliary functions including MitM
    • [ ] enhance Target-C PD/CC I/O with FUSB302B or similar Type-C controller
    • [ ] connect shields of all USB connectors together
    • [ ] disconnect USB shields from GND except through ferrites or 0 ohm resistors (populated by default)
    • [ ] replace U1, U12, U13 (Target VBUS switches) with FET solution
    • [ ] add Target VBUS voltage and current monitoring
    • [ ] replace d1, D8 (5V diode OR) with FET solution
    • [ ] move HyperRAM to FPGA pins in a DQS group if possible for both 381 caBGA and 256 caBGA variants
    • [ ] increase clearance around U6 (microcontroller) to allow future replacement if necessary
    • [ ] restore 1.8 V supply as an assembly option, supporting either 1.8 V or 3.3 V HyperRAM
    • [ ] add pin straps for hardware version detection
    • [ ] increase LED spacing
    • [ ] add USB switch to Control port
    • [ ] improve microcontroller D+/D- routing/reference plane
    • [ ] maybe remove J5 (FPGA JTAG) if it is in the way
    • [ ] maybe move Pmod connectors to the same side to support 24-pin Pmods
    • [ ] maybe remove unpopulated SMA connectors
    • [ ] maybe replace SMA connectors with high speed edge connector
    • [ ] maybe add test points for DFU button, SBU signals
    enhancement hardware 
    opened by mossmann 0
  • Failed to run command poetry install

    Failed to run command poetry install

    I followed the documentation and installed the dependencies, but an error was reported when I ran the command poetry install. It seems that the version of lambdasoc cannot match. What should I do?

    [email protected]:~/workspace/luna$ poetry install Installing dependencies from lock file

    Because lambdasoc (0.1.dev27+gefd5442) @ git+https://github.com/ktemkin/[email protected] depends on nmigen (*) which doesn't match any versions, lambdasoc is forbidden. So, because luna depends on lambdasoc (0.1.dev27+gefd5442) @ git+https://github.com/ktemkin/lambdasoc.git, version solving failed.

    opened by bigniudiy 1
  • Question: Luna as a USB-UART bridge

    Question: Luna as a USB-UART bridge

    Hello! I was wondering if Luna can be used out of the box as USB-UART bridge with an example. Do you think it's possible to generate a DTR and a RTS signals? Essencially I want to use the ECP5 to act like a USB-UART bridge to interface a ESP32 with a computer. It'd be amazing if it'd be possible to flash firmware via the USB-UART bridge to the ESP32 too! And the ESP32 can use DTR and RTS signals to put itself it bootloader mode, like so: image Do you think it's possible? Thanks a lot ;)

    question 
    opened by francis2tm 1
  • Find Substitution for AP22811, as it is FAULTY

    Find Substitution for AP22811, as it is FAULTY

    The AP22811 have been marked as NOT RECOMMENDED FOR NEW DESIGN by Diodes lately, shall we consider use its successor, AP22818, as USB power switch at U1, U12, U13? Edit: both of them are NOT suitable for luna's design, see my latter comment.

    bug hardware 
    opened by Seas0 11
Releases(hw-r0.4)
Owner
Great Scott Gadgets
Great Scott Gadgets
Get input from OLED Joystick, Runs command, Displays output on OLED Screen (Great for P4wnP1)

p4wnsolo-joyterm Gets text input from OLED Joystick Runs the command you typed Displays output on OLED Screen (Great for P4wnP1 - even better on Raspb

PawnSolo 7 Dec 19, 2022
A simple Picobot project implemented in Python

Python-Picobot A simple Picobot project implemented in Python About Explanation This is my first programming project. Picobot use rules.txt file which

Shayan Shiravani 0 Apr 03, 2022
I made this so I can control my Tapo L510 light bulb and Govee H6159 light strip using the PyP100 module and the Govee public API

TAPO-And-Govee-Controller I made this so I can control my Tapo L510 light bulb and Govee H6159 light strip using the PyP100 module and the Govee publi

James Westhead 0 Nov 23, 2021
Poupool is an overflow swimming pool control software

Poupool - The swimming pool controller Poupool is a swimming pool control software. It is based on Transitions, Pykka and Paho MQTT. The user interfac

Cyril Jaquier 8 Jul 18, 2022
Automate gate/garage door opening via 433.92MHz emitter with Raspberry Pi, Home Assistant and Homekit.

Automate opening your garage door / gate Summary This project sums up how I automated opening my garage door using a Raspberry PI, a 433Mhz emitter, H

Julien Fouilhé 29 Nov 30, 2022
A low power 1U Raspberry Pi cluster server for inexpensive colocation.

Raspberry Pi 1U Server There are server colocation providers that allow hosting a 1U server for as low as $30/month, but there's a catch: There are re

Paul Brown 627 Dec 31, 2022
A custom mechanical keyboard inspired by the CFTKB Mysterium

Env-KB A custom mechanical keyboard inspired by the CFTKB Mysterium Build Guide and Parts List What is to do? Right now for the first 5 PCBs I have, i

EnviousData 203 Jan 04, 2023
a fork of the OnionShare software better optimized for lower spec lightweight machines and ARM processors

OnionShare-Optimized A fork of the OnionShare software better optimized for lower spec lightweight machines and ARM processors such as Raspberry Pi or

ALTPORT 4 Aug 05, 2021
DOS-like OS for RP2040 basic microcontroller boards

Micropython DOS-like OS for RP2040 microcontroller boards. Check out the demo video at https://www.youtube.com/watch?v=Az_oiq8GE4Y To start the OS typ

RetiredWizard 58 Dec 27, 2022
A python script for macOS to enable scrolling with the 3M ergonomic mouse EM500GPS in any application.

A python script for macOS to enable scrolling with the 3M ergonomic mouse EM500GPS in any application.

3 Feb 19, 2022
Universal Xiaomi MIoT integration for Home Assistant

Xiaomi MIoT Raw 简体中文 | English MIoT 协议是小米智能家居从 2018 年起推行的智能设备通信协议规范,此后凡是可接入米家的设备均通过此协议进行通信。此插件按照 MIoT 协议规范与设备通信,实现对设备的状态读取及控制。

1.9k Jan 02, 2023
A python module for interacting with rolimon's, a roblox value site.

rpi - rolimon's python interaction rpi is an open source python-based rolimon's api wrapper. It provides an end-to-end pipeline in which each componen

Acier 11 Nov 08, 2022
A module for cross-platform control of the mouse and keyboard in python that is simple to install and use.

PyUserInput PyUserInput is a group project so we've moved the project over to a group organization: https://github.com/PyUserInput/PyUserInput . That

Paul Barton 1k Dec 27, 2022
PBA: Pleco Breeding Assistant

A small monitor that reports the external, fishroom and water change parameters to have suitable water parameters and induce breeding. These two features already represent 50% of the "reproductive su

Mirko Mancin 1 Jan 19, 2022
A python script for Homeassistant that counts down the days to birthdays, anniversaries etc

Date Countdown A python script for Homeassistant that counts down the days to birthdays, anniversaries etc Important note I no longer use homeassistan

Marc Forth 21 Mar 12, 2022
Baseline model for Augmented Home Assistant

Dataset Preparation Step 1. Rename the Virtual-Home output directory to 'vh.[name]', for example: 'vh.door' Make sure the directory contains 100+ fram

Stanford HCI 1 Aug 24, 2022
A script that publishes power usage data of iDrac enabled servers to an MQTT broker for integration into automation and power monitoring systems

iDracPowerMonitorMQTT This script publishes iDrac power draw data for iDrac 6 enabled servers to an MQTT broker. This can be used to integrate the pow

Lucas Zanchetta 10 Oct 06, 2022
Python library for the Phomemo m02s bluetooth thermal printer

Phomemo M02S Python library This is a basic Python library for controlling the Phomemo M02S bluetooth thermal printer. It probably only works on Mac &

Stargirl Flowers 28 Nov 07, 2022
Home Assistant custom integration for Yi cameras: yi-hack-MStar, yi-hack-Allwinner and yi-hack-Allwinner-v2

yi-hack Home Assistant integration Overview yi-hack Home Assistant is a custom integration for Yi cameras (or Sonoff camera) with one of the following

roleo 131 Jan 03, 2023
从零开始打造一个智能家居系统

SweetHome 从零开始打造智能家居系统的尝试,主要的实现有 可以扫码添加设备并控制设备的Android App 可以控制亮灭的灯,并可以设置在Android App连接到指定Wifi后自动亮起 可以控制开关的窗帘,机械结构部分自己设计并3D打印出来 树莓派主控,实现Http请求接口和ZigBe

金榜 5 May 01, 2022