Skip to content

Commit

Permalink
wip: esp32 firmware
Browse files Browse the repository at this point in the history
  • Loading branch information
heiso committed Dec 11, 2024
1 parent 70e646c commit 83b3115
Show file tree
Hide file tree
Showing 169 changed files with 7,693 additions and 67 deletions.
10 changes: 8 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
[submodule "firmware/tinyusb"]
path = firmware/tinyusb
[submodule "firmware/stm32f4xx/tinyusb"]
path = firmware/stm32f4xx/tinyusb
url = [email protected]:hathach/tinyusb.git
[submodule "firmware/esp32s3/esp-idf"]
path = firmware/esp32s3/esp-idf
url = [email protected]:espressif/esp-idf.git
[submodule "firmware/common/tinyusb"]
path = firmware/common/tinyusb
url = [email protected]:hathach/tinyusb.git
18 changes: 0 additions & 18 deletions .vscode/c_cpp_properties.json

This file was deleted.

4 changes: 1 addition & 3 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
"recommendations": [
"bradlc.vscode-tailwindcss",
"leathong.openscad-language-support",
"esbenp.prettier-vscode",
"ms-vscode.cpptools",
"xaver.clang-format"
"esbenp.prettier-vscode"
]
}
14 changes: 0 additions & 14 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,6 @@
"enabled": true,
"samplesPerSecond": 4
}
},
{
"name": "Cortex Debug (no livewatch)",
"cwd": "${workspaceRoot}/firmware",
"executable": "${workspaceRoot}/firmware/build/${workspaceFolderBasename}.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "stlink",
"preLaunchTask": "flash",
"showDevDebugOutput": "raw",
"svdFile": "${workspaceRoot}/firmware/debug-files/STM32F411.svd",
"liveWatch": {
"enabled": false
}
}
]
}
39 changes: 39 additions & 0 deletions .vscode/macrolev.code-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"folders": [
{
"path": ".."
},
{
"path": "../firmware/esp32-s3"
},
{
"path": "../firmware/stm32f4xx"
},
{
"path": "../firmware/common"
}
],
"settings": {
"files.associations": {
"hid.h": "c",
"keyboard.h": "c",
"freertos.h": "c",
"task.h": "c",
"string.h": "c",
"stdio.h": "c",
"sdkconfig.h": "c",
"semphr.h": "c",
"freertosconfig.h": "c",
"portable.h": "c",
"adc_continuous.h": "c",
"stdlib.h": "c",
"soc_caps.h": "c",
"adc_cali_scheme.h": "c",
"adc_cali.h": "c",
"gpio.h": "c",
"drv2605l.h": "c",
"main.h": "c",
"adc_oneshot.h": "c"
}
}
}
29 changes: 0 additions & 29 deletions .vscode/tasks.json

This file was deleted.

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
1 change: 1 addition & 0 deletions firmware/common/tinyusb
Submodule tinyusb added at 7c7b30
File renamed without changes.
17 changes: 17 additions & 0 deletions firmware/esp32-s3/.vscode/c_cpp_properties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"configurations": [
{
"name": "Firmware",
"includePath": [
"${workspaceFolder}/main/**",

"~/esp/esp-idf/components/**",

// "${workspaceFolder}/../common/src/**",

"${workspaceFolder}/../common/tinyusb/src/**"
],
}
],
"version": 4
}
3 changes: 3 additions & 0 deletions firmware/esp32-s3/.vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"recommendations": ["ms-vscode.cpptools", "xaver.clang-format"]
}
3 changes: 3 additions & 0 deletions firmware/esp32-s3/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"editor.formatOnSave": true
}
6 changes: 6 additions & 0 deletions firmware/esp32-s3/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(macrolev)
27 changes: 27 additions & 0 deletions firmware/esp32-s3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## Configure the project

Install idf.py cmd [https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html]

```bash
mkdir ~/esp
cd ~/esp
git clone [email protected]:espressif/esp-idf.git
cd esp-idf
git submodule update --init --recursive
./esp-idf/install.sh
```

Then in your project `. ~/esp/esp-idf/export.sh`

Before project configuration and build, make sure to set the correct chip target using `idf.py set-target TARGET` command.

## Erase the NVRAM

Before flash it to the board, it is recommended to erase NVRAM if user doesn't want to keep the previous examples or other projects stored info
using `idf.py -p PORT erase-flash`

## Build and Flash

Build the project, flash it to the board, and start the monitor tool to view the serial output by running `idf.py -p PORT flash monitor`.

(To exit the serial monitor, type `Ctrl-T + Ctrl-X`)
4 changes: 4 additions & 0 deletions firmware/esp32-s3/main/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
idf_component_register(
SRCS "main.c" "keyboard.c" "config.c" "hid.c"
INCLUDE_DIRS "." "../../common/tinyusb/src"
)
196 changes: 196 additions & 0 deletions firmware/esp32-s3/main/DRV2605L.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
#ifndef _DRV2605_H
#define _DRV2605_H

#include <stdio.h>

#define DRV2605_ADDR 0x5A ///< Device I2C address

#define DRV2605_REG_STATUS 0x00 ///< Status register
#define DRV2605_REG_MODE 0x01 ///< Mode register
#define DRV2605_MODE_INTTRIG 0x00 ///< Internal trigger mode
#define DRV2605_MODE_EXTTRIGEDGE 0x01 ///< External edge trigger mode
#define DRV2605_MODE_EXTTRIGLVL 0x02 ///< External level trigger mode
#define DRV2605_MODE_PWMANALOG 0x03 ///< PWM/Analog input mode
#define DRV2605_MODE_AUDIOVIBE 0x04 ///< Audio-to-vibe mode
#define DRV2605_MODE_REALTIME 0x05 ///< Real-time playback (RTP) mode
#define DRV2605_MODE_DIAGNOS 0x06 ///< Diagnostics mode
#define DRV2605_MODE_AUTOCAL 0x07 ///< Auto calibration mode

#define DRV2605_REG_RTPIN 0x02 ///< Real-time playback input register
#define DRV2605_REG_LIBRARY 0x03 ///< Waveform library selection register
#define DRV2605_REG_WAVESEQ1 0x04 ///< Waveform sequence register 1
#define DRV2605_REG_WAVESEQ2 0x05 ///< Waveform sequence register 2
#define DRV2605_REG_WAVESEQ3 0x06 ///< Waveform sequence register 3
#define DRV2605_REG_WAVESEQ4 0x07 ///< Waveform sequence register 4
#define DRV2605_REG_WAVESEQ5 0x08 ///< Waveform sequence register 5
#define DRV2605_REG_WAVESEQ6 0x09 ///< Waveform sequence register 6
#define DRV2605_REG_WAVESEQ7 0x0A ///< Waveform sequence register 7
#define DRV2605_REG_WAVESEQ8 0x0B ///< Waveform sequence register 8

#define DRV2605_REG_GO 0x0C ///< Go register
#define DRV2605_REG_OVERDRIVE 0x0D ///< Overdrive time offset register
#define DRV2605_REG_SUSTAINPOS 0x0E ///< Sustain time offset, positive register
#define DRV2605_REG_SUSTAINNEG 0x0F ///< Sustain time offset, negative register
#define DRV2605_REG_BREAK 0x10 ///< Brake time offset register
#define DRV2605_REG_AUDIOCTRL 0x11 ///< Audio-to-vibe control register
#define DRV2605_REG_AUDIOLVL 0x12 ///< Audio-to-vibe minimum input level register
#define DRV2605_REG_AUDIOMAX 0x13 ///< Audio-to-vibe maximum input level register
#define DRV2605_REG_AUDIOOUTMIN 0x14 ///< Audio-to-vibe minimum output drive register
#define DRV2605_REG_AUDIOOUTMAX 0x15 ///< Audio-to-vibe maximum output drive register
#define DRV2605_REG_RATEDV 0x16 ///< Rated voltage register
#define DRV2605_REG_CLAMPV 0x17 ///< Overdrive clamp voltage register
#define DRV2605_REG_AUTOCALCOMP 0x18 ///< Auto-calibration compensation result register
#define DRV2605_REG_AUTOCALEMP 0x19 ///< Auto-calibration back-EMF result register
#define DRV2605_REG_FEEDBACK 0x1A ///< Feedback control register
#define DRV2605_REG_CONTROL1 0x1B ///< Control1 Register
#define DRV2605_REG_CONTROL2 0x1C ///< Control2 Register
#define DRV2605_REG_CONTROL3 0x1D ///< Control3 Register
#define DRV2605_REG_CONTROL4 0x1E ///< Control4 Register
#define DRV2605_REG_VBAT 0x21 ///< Vbat voltage-monitor register
#define DRV2605_REG_LRARESON 0x22 ///< LRA resonance-period register

// Effects:
// 1 − Strong Click - 100%
// 2 − Strong Click - 60%
// 3 − Strong Click - 30%
// 4 − Sharp Click - 100%
// 5 − Sharp Click - 60%
// 6 − Sharp Click - 30%
// 7 − Soft Bump - 100%
// 8 − Soft Bump - 60%
// 9 − Soft Bump - 30%
// 10 − Double Click - 100%
// 11 − Double Click - 60%
// 12 − Triple Click - 100%
// 13 − Soft Fuzz - 60%
// 14 − Strong Buzz - 100%
// 15 − 750 ms Alert 100%
// 16 − 1000 ms Alert 100%
// 17 − Strong Click 1 - 100%
// 18 − Strong Click 2 - 80%
// 19 − Strong Click 3 - 60%
// 20 − Strong Click 4 - 30%
// 21 − Medium Click 1 - 100%
// 22 − Medium Click 2 - 80%
// 23 − Medium Click 3 - 60%
// 24 − Sharp Tick 1 - 100%
// 25 − Sharp Tick 2 - 80%
// 26 − Sharp Tick 3 – 60%
// 27 − Short Double Click Strong 1 – 100%
// 28 − Short Double Click Strong 2 – 80%
// 29 − Short Double Click Strong 3 – 60%
// 30 − Short Double Click Strong 4 – 30%
// 31 − Short Double Click Medium 1 – 100%
// 32 − Short Double Click Medium 2 – 80%
// 33 − Short Double Click Medium 3 – 60%
// 34 − Short Double Sharp Tick 1 – 100%
// 35 − Short Double Sharp Tick 2 – 80%
// 36 − Short Double Sharp Tick 3 – 60%
// 37 − Long Double Sharp Click Strong 1 – 100%
// 38 − Long Double Sharp Click Strong 2 – 80%
// 39 − Long Double Sharp Click Strong 3 – 60%
// 40 − Long Double Sharp Click Strong 4 – 30%
// 41 − Long Double Sharp Click Medium 1 – 100%
// 42 − Long Double Sharp Click Medium 2 – 80%
// 43 − Long Double Sharp Click Medium 3 – 60%
// 44 − Long Double Sharp Tick 1 – 100%
// 45 − Long Double Sharp Tick 2 – 80%
// 46 − Long Double Sharp Tick 3 – 60%
// 47 − Buzz 1 – 100%
// 48 − Buzz 2 – 80%
// 49 − Buzz 3 – 60%
// 50 − Buzz 4 – 40%
// 51 − Buzz 5 – 20%
// 52 − Pulsing Strong 1 – 100%
// 53 − Pulsing Strong 2 – 60%
// 54 − Pulsing Medium 1 – 100%
// 55 − Pulsing Medium 2 – 60%
// 56 − Pulsing Sharp 1 – 100%
// 57 − Pulsing Sharp 2 – 60%
// 58 − Transition Click 1 – 100%
// 59 − Transition Click 2 – 80%
// 60 − Transition Click 3 – 60%
// 61 − Transition Click 4 – 40%
// 62 − Transition Click 5 – 20%
// 63 − Transition Click 6 – 10%
// 64 − Transition Hum 1 – 100%
// 65 − Transition Hum 2 – 80%
// 66 − Transition Hum 3 – 60%
// 67 − Transition Hum 4 – 40%
// 68 − Transition Hum 5 – 20%
// 69 − Transition Hum 6 – 10%
// 70 − Transition Ramp Down Long Smooth 1 – 100 to 0%
// 71 − Transition Ramp Down Long Smooth 2 – 100 to 0%
// 72 − Transition Ramp Down Medium Smooth 1 – 100 to 0%
// 73 − Transition Ramp Down Medium Smooth 2 – 100 to 0%
// 74 − Transition Ramp Down Short Smooth 1 – 100 to 0%
// 75 − Transition Ramp Down Short Smooth 2 – 100 to 0%
// 76 − Transition Ramp Down Long Sharp 1 – 100 to 0%
// 77 − Transition Ramp Down Long Sharp 2 – 100 to 0%
// 78 − Transition Ramp Down Medium Sharp 1 – 100 to 0%
// 79 − Transition Ramp Down Medium Sharp 2 – 100 to 0%
// 80 − Transition Ramp Down Short Sharp 1 – 100 to 0%
// 81 − Transition Ramp Down Short Sharp 2 – 100 to 0%
// 82 − Transition Ramp Up Long Smooth 1 – 0 to 100%
// 83 − Transition Ramp Up Long Smooth 2 – 0 to 100%
// 84 − Transition Ramp Up Medium Smooth 1 – 0 to 100%
// 85 − Transition Ramp Up Medium Smooth 2 – 0 to 100%
// 86 − Transition Ramp Up Short Smooth 1 – 0 to 100%
// 87 − Transition Ramp Up Short Smooth 2 – 0 to 100%
// 88 − Transition Ramp Up Long Sharp 1 – 0 to 100%
// 89 − Transition Ramp Up Long Sharp 2 – 0 to 100%
// 90 − Transition Ramp Up Medium Sharp 1 – 0 to 100%
// 91 − Transition Ramp Up Medium Sharp 2 – 0 to 100%
// 92 − Transition Ramp Up Short Sharp 1 – 0 to 100%
// 93 − Transition Ramp Up Short Sharp 2 – 0 to 100%
// 94 − Transition Ramp Down Long Smooth 1 – 50 to 0%
// 95 − Transition Ramp Down Long Smooth 2 – 50 to 0%
// 96 − Transition Ramp Down Medium Smooth 1 – 50 to 0%
// 97 − Transition Ramp Down Medium Smooth 2 – 50 to 0%
// 98 − Transition Ramp Down Short Smooth 1 – 50 to 0%
// 99 − Transition Ramp Down Short Smooth 2 – 50 to 0%
// 100 − Transition Ramp Down Long Sharp 1 – 50 to 0%
// 101 − Transition Ramp Down Long Sharp 2 – 50 to 0%
// 102 − Transition Ramp Down Medium Sharp 1 – 50 to 0%
// 103 − Transition Ramp Down Medium Sharp 2 – 50 to 0%
// 104 − Transition Ramp Down Short Sharp 1 – 50 to 0%
// 105 − Transition Ramp Down Short Sharp 2 – 50 to 0%
// 106 − Transition Ramp Up Long Smooth 1 – 0 to 50%
// 107 − Transition Ramp Up Long Smooth 2 – 0 to 50%
// 108 − Transition Ramp Up Medium Smooth 1 – 0 to 50%
// 109 − Transition Ramp Up Medium Smooth 2 – 0 to 50%
// 110 − Transition Ramp Up Short Smooth 1 – 0 to 50%
// 111 − Transition Ramp Up Short Smooth 2 – 0 to 50%
// 112 − Transition Ramp Up Long Sharp 1 – 0 to 50%
// 113 − Transition Ramp Up Long Sharp 2 – 0 to 50%
// 114 − Transition Ramp Up Medium Sharp 1 – 0 to 50%
// 115 − Transition Ramp Up Medium Sharp 2 – 0 to 50%
// 116 − Transition Ramp Up Short Sharp 1 – 0 to 50%
// 117 − Transition Ramp Up Short Sharp 2 – 0 to 50%
// 118 − Long buzz for programmatic stopping – 100%
// 119 − Smooth Hum 1 (No kick or brake pulse) – 50%
// 120 − Smooth Hum 2 (No kick or brake pulse) – 40%
// 121 − Smooth Hum 3 (No kick or brake pulse) – 30%
// 122 − Smooth Hum 4 (No kick or brake pulse) – 20%
// 123 − Smooth Hum 5 (No kick or brake pulse) – 10%

/**************************************************************************/
/*!
@brief The DRV2605 driver class.
*/
/**************************************************************************/
void drv2605l_init();
void writeRegister8(uint8_t reg, uint8_t val);
uint8_t readRegister8(uint8_t reg);
void drv2605l_setWaveform(uint8_t slot, uint8_t w);
void drv2605l_selectLibrary(uint8_t lib);
void drv2605l_go(void);
void drv2605l_stop(void);
void drv2605l_setMode(uint8_t mode);
void drv2605l_setRealtimeValue(uint8_t rtp);
// Select ERM (Eccentric Rotating Mass) or LRA (Linear Resonant Actuator)
// vibration motor The default is ERM, which is more common
void drv2605l_useERM();
void drv2605l_useLRA();

#endif
Loading

0 comments on commit 83b3115

Please sign in to comment.