A bare metal SDK for the ESP32 & ESP32C3

Overview

MDK (Minimal Development Kit) - a baremetal ESP32/ESP32C3 SDK

An bare metal, make-based SDK for the ESP32, ESP32C3 chips. It is written from scratch using datasheets ( ESP32 C3 TRM, ESP32 TRM ). It is completely independent from the ESP-IDF and does not use any ESP-IDF tools or files. The only tool required is a GCC crosscompiler.

A screenshot below demonstrates a examples/c3ws2812 RGB LED firmware flashed on a ESP32-C3-DevKitM-1 board. It takes < 2 seconds for a full firmware rebuild and flash:

Environment setup

Install a GCC RISCV compiler and export environment variables:

  • Using Docker on Linux or Mac. Slower builds, but works off-the-shelf:
    $ export MDK=/path/to/mdk                 # Points to MDK directory
    $ export PATH=$PATH:$MDK/tools            # Add $MDK/tools to $PATH
    $ export PORT=/dev/cu.usb*                # Serial port for flashing
  • Native MacOS (installation takes time):
    $ brew tap riscv/riscv
    $ brew install riscv-gnu-toolchain --with-multilib
    $ export MDK=/path/to/mdk                 # Points to MDK directory
    $ export PATH=$PATH:$MDK/tools            # Add $MDK/tools to $PATH
    $ export TOOLCHAIN=riscv64-unknown-elf    # $TOOLCHAIN-gcc must run GCC
    $ export ARCH=ESP32C3                     # Choices: ESP32C3, ESP32
    $ export PORT=/dev/cu.usb*                # Serial port for flashing
  • Native Linux: install GCC, e.g. from https://github.com/espressif/crosstool-NG, then
    $ export MDK=/path/to/mdk                 # Points to MDK directory
    $ export PATH=$PATH:$MDK/tools            # Add $MDK/tools to $PATH
    $ export TOOLCHAIN=riscv32-esp-elf        # $TOOLCHAIN-gcc must run GCC
    $ export ARCH=ESP32C3                     # Choices: ESP32C3, ESP32
    $ export PORT=/dev/ttyUSB0                # Serial port for flashing

Verify setup by building and flashing a blinky example firmware. From repository root, execute:

$ make -C examples/blinky clean build flash monitor

Firmware Makefile

Firmware Makefile should look like this:

SOURCES = main.c another_file.c

EXTRA_CFLAGS ?=
EXTRA_LINKFLAGS ?=

include $(MDK)/make/build.mk

Environment reference

Environment / Makefile variables:

Name Description
ARCH Architecture. Possible values: ESP32C3, ESP32. Default: ESP32C3
TOOLCHAIN GCC binary prefix. Default: riscv64-unknown-elf
PORT Serial port. Default: /dev/ttyUSB0
FPARAMS Flash parameters, see below. Default: 0x21f
EXTRA_CFLAGS Extra compiler flags. Default: empty
EXTRA_LINKFLAGS Extra linker flags. Default: empty

Makefile targets:

Name Description
clean Clean up build artifacts
build Build firmware in a project's build/ directory
flash Flash firmware. Needs PORT variable set
monitor Run serial monitor. Needs PORT variable set
unix Build Mac/Linux executable firmware, see "UNIX mode" section below

Preprocessor definitions

Name Description
LED1 User LED pin. Default: 2
BTN1 User button pin. Default: 9

API reference

API support matrix:

Name GPIO SPI I2C UART WiFi Timer System RTOS
ESP32C3 yes yes - yes - yes yes -
ESP32 yes yes - - - yes yes -
  • GPIO src/gpio.h
    void gpio_output(int pin);              // Set pin mode to OUTPUT
    void gpio_input(int pin);               // Set pin mode to INPUT
    void gpio_write(int pin, bool value);   // Set pin to low (false) or high
    void gpio_toggle(int pin);              // Toggle pin value
    bool gpio_read(int pin);                // Read pin value
  • SPI src/spi.h, src/spi.c
    // SPI descriptor. Specifies pins for MISO, MOSI, CLK and chip select
    struct spi { int miso, mosi, clk, cs[3]; };
    
    bool spi_init(struct spi *spi);           // Init SPI
    void spi_begin(struct spi *spi, int cs);  // Start SPI transaction
    void spi_end(struct spi *spi, int cs);    // End SPI transaction
    unsigned char spi_txn(struct spi *spi, unsigned char);   // Do SPI transaction
  • UART src/uart.h, src/uart.c
    void uart_init(int no, int tx, int rx, int baud);   // Initialise UART
    bool uart_read(int no, uint8_t *c);   // Read byte. Return true on success
    void uart_write(int no, uint8_t c);   // Write byte. Block if FIFO is full
  • LEDC
  • WDT src/wdt.h
    void wdt_disable(void);   // Disable watchdog
  • Timer src/timer.h
    struct timer {
      uint64_t period;       // Timer period in micros
      uint64_t expire;       // Expiration timestamp in micros
      void (*fn)(void *);    // Function to call
      void *arg;             // Function argument
      struct timer *next;    // Linkage
    };
    
    #define TIMER_ADD(head_, p_, fn_, arg_)
    void timers_poll(struct timer *head, uint64_t now);
  • System src/sys.h
    int sdk_ram_used(void);           // Return used RAM in bytes
    int sdk_ram_free(void);           // Return free RAM in bytes
    unsigned long time_us(void);      // Return uptime in microseconds
    void delay_us(unsigned long us);  // Block for "us" microseconds
    void delay_ms(unsigned long ms);  // Block for "ms" milliseconds
    void spin(unsigned long count);   // Execute "count" no-op instructions
  • Log src/log.h, src/log.c
    void sdk_log(const char *fmt, ...);   // Log message to UART 0
                                          // Supported specifiers:
                                          // %d, %x, %s, %p
    void sdk_hexdump(const void *buf, size_t len);  // Hexdump buffer
  • TCP/IP

UNIX mode

Firmware examples could be built on Mac/Linux as normal UNIX binaries. In the firmware directory, type

make unix

That builds a build/firmware executable. To support that, all hardware API are mocked out. The typical API implementation looks like:

#if defined(ESP32C3)
...
#elif defined(ESP32)
...
#elif defined(__unix) || defined(__unix__) || defined(__APPLE__)
...  <-- Here goes a mocked-out hardware API implementation
#endif

esputil

esputil is a command line tool for managing Espressif devices. It is a replacement of esptool.py. esputil is written in C, its source code is in tools/esputil.c. Below is a quick reference:

$ esputil -h
Defaults: BAUD=115200, PORT=/dev/ttyUSB0
Usage:
  esputil [-v] [-b BAUD] [-p PORT] monitor
  esputil [-v] [-b BAUD] [-p PORT] info
  esputil [-v] [-b BAUD] [-p PORT] [-fp FLASH_PARAMS] [-fspi FLASH_SPI] flash OFFSET BINFILE ...
  esputil mkbin OUTPUT.BIN ENTRYADDR SECTION_ADDR SECTION.BIN ...
  esputil mkhex ADDRESS1 BINFILE1 ADDRESS2 BINFILE2 ...
  esputil [-tmp TMP_DIR] unhex HEXFILE

Example: flash MDK-built ESP32C3 firmware:

$ esputil flash 0 ./build/firmware.bin

Example: flash ESP-IDF built firmware on ESP32-PICO-Kit board:

$ esputil -fspi 6,17,8,11,16 flash 
  0x1000 build/bootloader/bootloader.bin \
  0x8000 build/partitions.bin \
  0xe000 build/ota_data_initial.bin \
  0x10000 build/firmware.bin

Build esputil

Linux, macOS:

$ make -C tools esputil

Windows:
Choose one of the below compilers, and use the provided command from the mdk root folder. Check to make sure the path points to where you installed the compiler.

Clang: (From PowerShell)

& 'C:\Program Files\LLVM\bin\clang.exe' -v -o esputil.exe tools\esputil.c

TCC: (From PowerShell)

& 'C:\Program Files\tcc\tcc.exe' -v -o esputil.exe tools\esputil.c

MSVC: (From Developer Command Prompt)

cl tools\esputil.c

ESP32 flashing

Flashing ESP32 chips is done via UART. In order to do so, ESP32 should be rebooted in the flashing mode, by pulling IO0 low during boot. Then, a ROM bootloader uses SLIP framing for a simple serial protocol, which is described at https://github.com/espressif/esptool/wiki/Serial-Protocol.

Using that SLIP protocol, it is possible to write images to flash at any offset. That is what tools/esputil.c implements. The image should be of the following format:

  • COMMON HEADER - 4 bytes, contains number of segments in the image and flash params
  • ENTRY POINT ADDRESS - 4 bytes, the beginning of the image code
  • EXTENDED HEADER - 16 bytes, contains chip ID and extra flash params
  • One or more SEGMENTS, which are padded to 16 bytes
 | COMMON HEADER |  ENTRY  |           EXTENDED HEADER          | SEGM1 | ... | 
 | 0xe9 N F1 F2  | X X X X | 0xee 0 0 0 C 0 V 0 0 0 0 0 0 0 0 1 |       | ... | 

   0xe9 - Espressif image magic number. All images must start with 0xe9
   N    - a number of segments in the image
   F1  - flash mode. 0: QIO, 1: QOUT, 2: DIO, 3: DOUT
   F2  - flash size (high 4 bits) and flash frequency (low 4 bits):
            size: 0: 1MB, 0x10: 2MB, 0x20: 4MB, 0x30: 8MB, 0x40: 16MB
            freq: 0: 40m, 1: 26m, 2: 20m, 0xf: 80m
   ENTRY - 4-byte entry point address in little endian
   C     - Chip ID. 0: ESP32, 5: ESP32C3
   V     - Chip revision

Flash parameters

Image header format includes two bytes, F1 and F2, which desribe SPI flash parameters that ROM bootloader uses to load the rest of the firmware. Those two bytes encode three parameters:

  • Flash mode (F1 byte - can be 0, 1, 2, 3)
  • FLash size (hight 4 bits of F2 byte - can be 0, 1, 2, 3, 4)
  • Flash frequency (low 4 bits of F2 byte - can be 0, 1, 2, f)

By default, esputil fetches flash params F1 and F2 from the existing bootloader by reading first 4 bytes of the bootloader from flash. It is possible to manually set flash params via the -fp flag, which is an integer value that represent 3 hex nimbles. For example fp 0x22f sets flash to DIO, 4MB, 80MHz:

$ esputil -fp 0x22f flash 0 build/firmware.bin

FLash SPI pin settings

Some boards fail to talk to flash: when you attempt to esputil flash them, they'll time out with the flash_begin/erase failed, for example trying to flash a bootloader on a ESP32-PICO-D4-Kit:

$ esputil flash 4096 build/bootloader/bootloader.bin 
Error: can't read bootloader @ addr 0x1000
Erasing 24736 bytes @ 0x1000
flash_begin/erase failed

This is because ROM bootloader on such boards have wrong SPI pins settings. Espressif's esptool.py alleviates that by uploading its own piece of software into ESP32 RAM, which does the right thing. esputil uses ROM bootloader, and in order to fix an issue, a -fspi FLASH_PARAMS parameter can be set which manually sets flash SPI pins. The format of the FLASH_PARAMS is five comma-separated integers for CLK,Q,D,HD,CS pins.

A previously failed ESP32-PICO-D4-Kit example can be fixed by passing a correct SPI pin settings:

$ esputil -fspi 6,17,8,11,16 flash 4096 build/bootloader/bootloader.bin 
Written build/bootloader/bootloader.bin, 24736 bytes @ 0x1000
Issues
  • SHA-256 comparison failed (and LED not blinking)

    SHA-256 comparison failed (and LED not blinking)

    When I run make -C examples/blinky build flash monitor

    It seems to fail at some point with a SHA-256 comparison failed error:

    $ make -C examples/blinky build flash monitor
    make: Entering directory '/home/adumont/esp32c3/mdk/examples/blinky'
    make: Nothing to be done for 'build'.
    /home/adumont/esp32c3/mdk/tools/esputil flash 0   ./build/firmware.bin
    Using flash params 0x21f
    Written ./build/firmware.bin, 1280 bytes @ 0              
    /home/adumont/esp32c3/mdk/tools/esputil monitor
    ESP-ROM:esp32c3-20200918
    Build:Sep 18 2020
    rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
    SPIWP:0xee
    mode:DIO, clock div:1
    load:0x3fc88000,len:0xc0
    load:0x40380400,len:0x410
    SHA-256 comparison failed:
    Calculated: 808377b4141e41be658a7a3283ccc87337eb7aeca2ff23288867817da5ec1e02
    Expected: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    Attempting to boot anyway...
    entry 0x40380400
    1
    0
    1
    0
    1
    

    And the LED isn't blinking. Anything I could try?

    opened by adumont 2
  • error: dereferencing type-punned pointer will break strict-aliasing rules

    error: dereferencing type-punned pointer will break strict-aliasing rules

    I've exported the variables:

    $ export MDK=/home/adumont/esp32c3/mdk
    $ export PATH=$PATH:$MDK/tools
    $ export TOOLCHAIN=riscv32-esp-elf
    $ export ARCH=ESP32C3
    $ export PORT=/dev/ttyUSB0
    $ export PATH=$PATH:/home/adumont/.espressif/tools/riscv32-esp-elf/1.24.0.123_64eb9ff-8.4.0/riscv32-esp-elf/bin/
    
    

    When I run the command to make the blinky example, I get an error when making esputil. Do you know how I could fix it?

    $ make -C examples/blinky clean build flash monitor
    make: Entering directory '/home/adumont/esp32c3/mdk/examples/blinky'
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c main.c -o build/main.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/boot/boot_ESP32C3.s -o build//home/adumont/esp32c3/mdk/src/boot/boot_ESP32C3.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/init.c -o build//home/adumont/esp32c3/mdk/src/init.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/uart.c -o build//home/adumont/esp32c3/mdk/src/uart.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/log.c -o build//home/adumont/esp32c3/mdk/src/log.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/spi.c -o build//home/adumont/esp32c3/mdk/src/spi.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/tcpip.c -o build//home/adumont/esp32c3/mdk/src/tcpip.o
    riscv32-esp-elf-gcc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -fno-common -Wconversion -Os -g3 -ffunction-sections -fdata-sections -march=rv32imc -mabi=ilp32 -I. -I/home/adumont/esp32c3/mdk/src -DESP32C3   -c /home/adumont/esp32c3/mdk/src/malloc.c -o build//home/adumont/esp32c3/mdk/src/malloc.o
    riscv32-esp-elf-gcc -Xlinker ./build/main.o ./build//home/adumont/esp32c3/mdk/src/boot/boot_ESP32C3.o ./build//home/adumont/esp32c3/mdk/src/init.o ./build//home/adumont/esp32c3/mdk/src/uart.o ./build//home/adumont/esp32c3/mdk/src/log.o ./build//home/adumont/esp32c3/mdk/src/spi.o ./build//home/adumont/esp32c3/mdk/src/tcpip.o ./build//home/adumont/esp32c3/mdk/src/malloc.o -march=rv32imc -mabi=ilp32 -T/home/adumont/esp32c3/mdk/make/ESP32C3.ld -nostdlib -nostartfiles -Wl,--gc-sections  -o build/firmware.elf
    riscv32-esp-elf-size build/firmware.elf
       text	   data	    bss	    dec	    hex	filename
       1040	    192	  32784	  34016	   84e0	build/firmware.elf
    make -C /home/adumont/esp32c3/mdk/tools esputil
    make[1]: Entering directory '/home/adumont/esp32c3/mdk/tools'
    cc -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion -Os esputil.c -o ./esputil
    esputil.c: In function ‘flash’:
    esputil.c:581:7: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
           *(uint32_t *) &buf[0] = n;      // Populate initial bytes - size
           ^
    esputil.c:582:7: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
           *(uint32_t *) &buf[4] = seq++;  // And sequence numner
           ^
    cc1: all warnings being treated as errors
    Makefile:11: recipe for target 'esputil' failed
    make[1]: *** [esputil] Error 1
    make[1]: Leaving directory '/home/adumont/esp32c3/mdk/tools'
    ../../make/build.mk:40: recipe for target '/home/adumont/esp32c3/mdk/tools/esputil' failed
    make: *** [/home/adumont/esp32c3/mdk/tools/esputil] Error 2
    make: Leaving directory '/home/adumont/esp32c3/mdk/examples/blinky'
    
    

    riscv32-esp-elf-gcc -v:

    $ /home/adumont/.espressif/tools/riscv32-esp-elf/1.24.0.123_64eb9ff-8.4.0/riscv32-esp-elf/bin/riscv32-esp-elf-gcc -v
    Using built-in specs.
    COLLECT_GCC=/home/adumont/.espressif/tools/riscv32-esp-elf/1.24.0.123_64eb9ff-8.4.0/riscv32-esp-elf/bin/riscv32-esp-elf-gcc
    COLLECT_LTO_WRAPPER=/home/adumont/.espressif/tools/riscv32-esp-elf/1.24.0.123_64eb9ff-8.4.0/riscv32-esp-elf/bin/../libexec/gcc/riscv32-esp-elf/8.4.0/lto-wrapper
    Target: riscv32-esp-elf
    Configured with: /builds/idf/crosstool-NG/.build/riscv32-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=riscv32-esp-elf --prefix=/builds/idf/crosstool-NG/builds/riscv32-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/riscv32-esp-elf/riscv32-esp-elf --with-headers=/builds/idf/crosstool-NG/builds/riscv32-esp-elf/riscv32-esp-elf/include --with-newlib --enable-threads=no --disable-shared --with-arch=rv32imc --with-abi=ilp32 --with-pkgversion='crosstool-NG 1.24.0.123_64eb9ff' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/builds/idf/crosstool-NG/.build/riscv32-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/riscv32-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/riscv32-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/riscv32-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes
    Thread model: posix
    gcc version 8.4.0 (crosstool-NG 1.24.0.123_64eb9ff) 
    
    
    opened by adumont 2
  • README: Update serial protocol description link

    README: Update serial protocol description link

    Hello @cpq,

    great job developing the MDK!

    We have recently launched a new esptool documentation and moved all of the GH wiki information there. This PR is to keep the README link updated.

    opened by radimkarnis 0
Releases(0.0.2)
Owner
Sergey Lyubka
Now: CTO at Cesanta. Before: Engineering Manager at Google, CTO at NetFort
Sergey Lyubka
A C++ bare metal environment for Raspberry Pi with USB (32 and 64 bit)

A C++ bare metal environment for Raspberry Pi with USB (32 and 64 bit)

Rene Stange 1.4k Aug 2, 2022
Microshell - a lightweight pure C implementation of shell emulator dedicated for embedded bare-metal systems.

MicroShell Lightweight pure C implementation of virtual shell, compatible with VT100 terminal. Support root tree, run-time mounting paths, global comm

Marcin Borowicz 90 Aug 4, 2022
Dexed FM synthesizer similar to DX7 running on a bare metal Raspberry Pi

Dexed is a FM synthesizer closely modeled on the famous DX7 by a well-known Japanese manufacturer. MiniDexed is a port to run it on a bare metal Raspberry Pi (without a Linux kernel or operating system).

null 600 Aug 9, 2022
ESP32-Skid-Steer - Bruder Catepillar Skid Steer model converted to RC, controlled by an ESP32 with 2 analog joysticks and a receiver that is an ESP32 on the model.

ESP32-Skid-Steer Bruder Catepillar Skid Steer model converted to RC, controlled by an ESP32 with 2 analog joysticks and a receiver that is an ESP32 on

null 5 Feb 4, 2022
The Raspberry Pi Pico SDK (henceforth the SDK) provides the headers, libraries and build system necessary

The Raspberry Pi Pico SDK (henceforth the SDK) provides the headers, libraries and build system necessary to write programs for the RP2040-based devices such as the Raspberry Pi Pico in C, C++ or assembly language.

Raspberry Pi 1.6k Aug 3, 2022
The Gecko SDK (GSDK) combines all Silicon Labs 32-bit IoT product software development kits (SDKs) based on Gecko Platform into a single, integrated SDK.

Silicon Labs Gecko SDK (GSDK) The Gecko SDK (GSDK) combines Silicon Labs wireless software development kits (SDKs) and Gecko Platform into a single, i

Silicon Labs 104 Aug 3, 2022
null 251 Aug 5, 2022
Allows for multiple SwitchBot buttons and curtains to be controlled via MQTT sent to ESP32. ESP32 will send BLE commands to switchbots and return MQTT responses to the broker. Also supports Meter/Temp Sensor

SwitchBot-MQTT-BLE-ESP32 Switchbot local control using ESP32. no switchbot hub used/required. works with any smarthub that supports MQTT https://githu

null 278 Aug 10, 2022
AnalogWrite for ESP32 and ESP32-S2 with LEDC PWM. Includes PWM Phase Control, DAC and Smart GPIO resource management.

analogWrite() ESP32 Installation Instructions This library was tested using using the ESP32 Arduino IDE Boards Manager installation method. Stable rel

null 22 Jun 18, 2022
ESP32 + GitHub Actions + Husarnet. A boilerplate project for ESP32 allowing in-field firmware update using GitHub Actions workflow.

esp32-internet-ota ESP32 + GitHub Actions + Husarnet. A boilerplate project for ESP32 allowing in-field firmware update using GitHub Actions workflow.

Husarnet 29 Aug 4, 2022
A python library to run metal compute kernels on MacOS

metalcompute for Python A python library to run metal compute kernels on MacOS Usage Example execution from M1-based Mac running MacOS 12.0: > ./build

Andrew Baldwin 11 Jun 23, 2022
Metal lathe electronic lead screw project built on top of Russian-speaking DigitalFeed ELS system by Oleg A. and contributors from ChipMaker.ru

This software and instructions are provided as is, without warranty of any kind. This is a hobby project. Using this might damage your equipment, caus

Maxim Kachurovskiy 20 Jul 18, 2022
Signed - a 3D modeling and construction language based on Lua and SDFs. Signed will be available for macOS and iOS and is heavily optimized for Metal.

Signed - A 3D modeling language Abstract Signed is a Lua based 3D modeling language, it provides a unique way to create high quality 3D content for yo

Markus Moenig 89 Jul 4, 2022
glslcc: Cross-compiler for GLSL shader language (GLSL->HLSL,METAL,GLES,GLSLv3)

glslcc: Cross-compiler for GLSL shader language (GLSL->HLSL,METAL,GLES,GLSLv3) @septag glslcc is a command line tool that converts GLSL code to HLSL,

Sepehr Taghdisian 414 Aug 8, 2022
⚔️ A tool for cross compiling shaders. Convert between GLSL, HLSL, Metal Shader Language, or older versions of GLSL.

A cross compiler for shader languages. Convert between SPIR-V, GLSL / GLSL ES, HLSL, Metal Shader Language, or older versions of a given language. Cross Shader wraps glslang and SPIRV-Cross, exposing a simpler interface to transpile shaders.

Alain Galvan 161 Aug 2, 2022
The old Windows NT OpenGL samples/SDK from an MSDN CD.

The OpenGL API is supported on a variety of graphics hardware; the software in this release provides support for graphics hardware including basic emulation on any video adapter that is supported with the operating system, and accelerated graphics hardware that is supported by an OpenGL mini-client driver (MCD) or an OpenGL installable client driver (ICD).

Ian Hanschen 18 Jan 9, 2022
Poc to test my little friend features without any sdk

poc.vic-hack POC to test my little friend "vector" features without any sdk Ultimate goal - being able to write own firmware components without propri

Oleg Lytvynenko 8 Feb 26, 2022
A SDK with a built-in cheat for Garry's Mod.

GMod-SDK This is a module for Garry's Mod that works based on a SDK. I've spent the past few days reversing a few modules of the game, in order to get

null 57 Jul 26, 2022
Portal 2/Portal Reloaded internal cheat sdk with imgui-based menu

portal2-internal A simple Portal 2/Portal Reloaded internal cheat base with imgui-based menu coded in a few days because why not Features: simple menu

es3n1n 23 Aug 2, 2022