haptic: naming cleanups (#21551)
parent
b20b360404
commit
b090354143
@ -1,122 +0,0 @@ |
|||||||
/* Copyright 2018 ishtob
|
|
||||||
* Driver for DRV2605L written for QMK |
|
||||||
* |
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU General Public License as published by |
|
||||||
* the Free Software Foundation, either version 2 of the License, or |
|
||||||
* (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
#include "DRV2605L.h" |
|
||||||
#include "print.h" |
|
||||||
#include <stdlib.h> |
|
||||||
#include <stdio.h> |
|
||||||
#include <math.h> |
|
||||||
|
|
||||||
uint8_t DRV2605L_transfer_buffer[2]; |
|
||||||
uint8_t DRV2605L_read_register; |
|
||||||
|
|
||||||
void DRV_write(uint8_t drv_register, uint8_t settings) { |
|
||||||
DRV2605L_transfer_buffer[0] = drv_register; |
|
||||||
DRV2605L_transfer_buffer[1] = settings; |
|
||||||
i2c_transmit(DRV2605L_BASE_ADDRESS << 1, DRV2605L_transfer_buffer, 2, 100); |
|
||||||
} |
|
||||||
|
|
||||||
uint8_t DRV_read(uint8_t regaddress) { |
|
||||||
i2c_readReg(DRV2605L_BASE_ADDRESS << 1, regaddress, &DRV2605L_read_register, 1, 100); |
|
||||||
|
|
||||||
return DRV2605L_read_register; |
|
||||||
} |
|
||||||
|
|
||||||
void DRV_init(void) { |
|
||||||
i2c_init(); |
|
||||||
/* 0x07 sets DRV2605 into calibration mode */ |
|
||||||
DRV_write(DRV_MODE, 0x07); |
|
||||||
|
|
||||||
// DRV_write(DRV_FEEDBACK_CTRL,0xB6);
|
|
||||||
|
|
||||||
#if FB_ERM_LRA == 0 |
|
||||||
/* ERM settings */ |
|
||||||
DRV_write(DRV_RATED_VOLT, (RATED_VOLTAGE / 21.33) * 1000); |
|
||||||
# if ERM_OPEN_LOOP == 0 |
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (((V_PEAK * (DRIVE_TIME + BLANKING_TIME + IDISS_TIME)) / 0.02133) / (DRIVE_TIME - 0.0003))); |
|
||||||
# elif ERM_OPEN_LOOP == 1 |
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK / 0.02196)); |
|
||||||
# endif |
|
||||||
#elif FB_ERM_LRA == 1 |
|
||||||
DRV_write(DRV_RATED_VOLT, ((V_RMS * sqrt(1 - ((4 * ((150 + (SAMPLE_TIME * 50)) * 0.000001)) + 0.0003) * F_LRA) / 0.02071))); |
|
||||||
# if LRA_OPEN_LOOP == 0 |
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, ((V_PEAK / sqrt(1 - (F_LRA * 0.0008)) / 0.02133))); |
|
||||||
# elif LRA_OPEN_LOOP == 1 |
|
||||||
DRV_write(DRV_OVERDRIVE_CLAMP_VOLT, (V_PEAK / 0.02196)); |
|
||||||
# endif |
|
||||||
#endif |
|
||||||
|
|
||||||
DRVREG_FBR FB_SET; |
|
||||||
FB_SET.Bits.ERM_LRA = FB_ERM_LRA; |
|
||||||
FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR; |
|
||||||
FB_SET.Bits.LOOP_GAIN = FB_LOOPGAIN; |
|
||||||
FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/ |
|
||||||
DRV_write(DRV_FEEDBACK_CTRL, (uint8_t)FB_SET.Byte); |
|
||||||
DRVREG_CTRL1 C1_SET; |
|
||||||
C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME; |
|
||||||
C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE; |
|
||||||
C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST; |
|
||||||
DRV_write(DRV_CTRL_1, (uint8_t)C1_SET.Byte); |
|
||||||
DRVREG_CTRL2 C2_SET; |
|
||||||
C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT; |
|
||||||
C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB; |
|
||||||
C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME; |
|
||||||
C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME; |
|
||||||
C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME; |
|
||||||
DRV_write(DRV_CTRL_2, (uint8_t)C2_SET.Byte); |
|
||||||
DRVREG_CTRL3 C3_SET; |
|
||||||
C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP; |
|
||||||
C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG; |
|
||||||
C3_SET.Bits.C3_LRA_DRIVE_MODE = LRA_DRIVE_MODE; |
|
||||||
C3_SET.Bits.C3_DATA_FORMAT_RTO = DATA_FORMAT_RTO; |
|
||||||
C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS; |
|
||||||
C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP; |
|
||||||
C3_SET.Bits.C3_NG_THRESH = NG_THRESH; |
|
||||||
DRV_write(DRV_CTRL_3, (uint8_t)C3_SET.Byte); |
|
||||||
DRVREG_CTRL4 C4_SET; |
|
||||||
C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME; |
|
||||||
C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME; |
|
||||||
DRV_write(DRV_CTRL_4, (uint8_t)C4_SET.Byte); |
|
||||||
DRV_write(DRV_LIB_SELECTION, LIB_SELECTION); |
|
||||||
|
|
||||||
DRV_write(DRV_GO, 0x01); |
|
||||||
|
|
||||||
/* 0x00 sets DRV2605 out of standby and to use internal trigger
|
|
||||||
* 0x01 sets DRV2605 out of standby and to use external trigger */ |
|
||||||
DRV_write(DRV_MODE, 0x00); |
|
||||||
|
|
||||||
// Play greeting sequence
|
|
||||||
DRV_write(DRV_GO, 0x00); |
|
||||||
DRV_write(DRV_WAVEFORM_SEQ_1, DRV_GREETING); |
|
||||||
DRV_write(DRV_GO, 0x01); |
|
||||||
} |
|
||||||
|
|
||||||
void DRV_rtp_init(void) { |
|
||||||
DRV_write(DRV_GO, 0x00); |
|
||||||
DRV_write(DRV_RTP_INPUT, 20); // 20 is the lowest value I've found where haptics can still be felt.
|
|
||||||
DRV_write(DRV_MODE, 0x05); |
|
||||||
DRV_write(DRV_GO, 0x01); |
|
||||||
} |
|
||||||
|
|
||||||
void DRV_amplitude(uint8_t amplitude) { |
|
||||||
DRV_write(DRV_RTP_INPUT, amplitude); |
|
||||||
} |
|
||||||
|
|
||||||
void DRV_pulse(uint8_t sequence) { |
|
||||||
DRV_write(DRV_GO, 0x00); |
|
||||||
DRV_write(DRV_WAVEFORM_SEQ_1, sequence); |
|
||||||
DRV_write(DRV_GO, 0x01); |
|
||||||
} |
|
@ -1,406 +0,0 @@ |
|||||||
/* Copyright 2018 ishtob
|
|
||||||
* Driver for DRV2605L written for QMK |
|
||||||
* |
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU General Public License as published by |
|
||||||
* the Free Software Foundation, either version 2 of the License, or |
|
||||||
* (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#pragma once |
|
||||||
#include "i2c_master.h" |
|
||||||
|
|
||||||
/* Initialization settings
|
|
||||||
|
|
||||||
* Feedback Control Settings */ |
|
||||||
#ifndef FB_ERM_LRA |
|
||||||
# define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/ |
|
||||||
#endif |
|
||||||
#ifndef FB_BRAKEFACTOR |
|
||||||
# define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */ |
|
||||||
#endif |
|
||||||
#ifndef FB_LOOPGAIN |
|
||||||
# define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */ |
|
||||||
#endif |
|
||||||
|
|
||||||
/* LRA specific settings */ |
|
||||||
#if FB_ERM_LRA == 1 |
|
||||||
# ifndef V_RMS |
|
||||||
# define V_RMS 2.0 |
|
||||||
# endif |
|
||||||
# ifndef V_PEAK |
|
||||||
# define V_PEAK 2.1 |
|
||||||
# endif |
|
||||||
# ifndef F_LRA |
|
||||||
# define F_LRA 205 |
|
||||||
# endif |
|
||||||
# ifndef RATED_VOLTAGE |
|
||||||
# define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ |
|
||||||
# endif |
|
||||||
#endif |
|
||||||
|
|
||||||
#ifndef RATED_VOLTAGE |
|
||||||
# define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ |
|
||||||
#endif |
|
||||||
#ifndef V_PEAK |
|
||||||
# define V_PEAK 2.8 |
|
||||||
#endif |
|
||||||
|
|
||||||
/* Library Selection */ |
|
||||||
#ifndef LIB_SELECTION |
|
||||||
# if FB_ERM_LRA == 1 |
|
||||||
# define LIB_SELECTION 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ |
|
||||||
# else |
|
||||||
# define LIB_SELECTION 1 |
|
||||||
# endif |
|
||||||
#endif |
|
||||||
|
|
||||||
#ifndef DRV_GREETING |
|
||||||
# define DRV_GREETING alert_750ms |
|
||||||
#endif |
|
||||||
#ifndef DRV_MODE_DEFAULT |
|
||||||
# define DRV_MODE_DEFAULT strong_click1 |
|
||||||
#endif |
|
||||||
|
|
||||||
/* Control 1 register settings */ |
|
||||||
#ifndef DRIVE_TIME |
|
||||||
# define DRIVE_TIME 25 |
|
||||||
#endif |
|
||||||
#ifndef AC_COUPLE |
|
||||||
# define AC_COUPLE 0 |
|
||||||
#endif |
|
||||||
#ifndef STARTUP_BOOST |
|
||||||
# define STARTUP_BOOST 1 |
|
||||||
#endif |
|
||||||
|
|
||||||
/* Control 2 Settings */ |
|
||||||
#ifndef BIDIR_INPUT |
|
||||||
# define BIDIR_INPUT 1 |
|
||||||
#endif |
|
||||||
#ifndef BRAKE_STAB |
|
||||||
# define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */ |
|
||||||
#endif |
|
||||||
#ifndef SAMPLE_TIME |
|
||||||
# define SAMPLE_TIME 3 |
|
||||||
#endif |
|
||||||
#ifndef BLANKING_TIME |
|
||||||
# define BLANKING_TIME 1 |
|
||||||
#endif |
|
||||||
#ifndef IDISS_TIME |
|
||||||
# define IDISS_TIME 1 |
|
||||||
#endif |
|
||||||
|
|
||||||
/* Control 3 settings */ |
|
||||||
#ifndef NG_THRESH |
|
||||||
# define NG_THRESH 2 |
|
||||||
#endif |
|
||||||
#ifndef ERM_OPEN_LOOP |
|
||||||
# define ERM_OPEN_LOOP 1 |
|
||||||
#endif |
|
||||||
#ifndef SUPPLY_COMP_DIS |
|
||||||
# define SUPPLY_COMP_DIS 0 |
|
||||||
#endif |
|
||||||
#ifndef DATA_FORMAT_RTO |
|
||||||
# define DATA_FORMAT_RTO 0 |
|
||||||
#endif |
|
||||||
#ifndef LRA_DRIVE_MODE |
|
||||||
# define LRA_DRIVE_MODE 0 |
|
||||||
#endif |
|
||||||
#ifndef N_PWM_ANALOG |
|
||||||
# define N_PWM_ANALOG 0 |
|
||||||
#endif |
|
||||||
#ifndef LRA_OPEN_LOOP |
|
||||||
# define LRA_OPEN_LOOP 0 |
|
||||||
#endif |
|
||||||
|
|
||||||
/* Control 4 settings */ |
|
||||||
#ifndef ZC_DET_TIME |
|
||||||
# define ZC_DET_TIME 0 |
|
||||||
#endif |
|
||||||
#ifndef AUTO_CAL_TIME |
|
||||||
# define AUTO_CAL_TIME 3 |
|
||||||
#endif |
|
||||||
|
|
||||||
/* register defines -------------------------------------------------------- */ |
|
||||||
#define DRV2605L_BASE_ADDRESS 0x5A /* DRV2605L Base address */ |
|
||||||
#define DRV_STATUS 0x00 |
|
||||||
#define DRV_MODE 0x01 |
|
||||||
#define DRV_RTP_INPUT 0x02 |
|
||||||
#define DRV_LIB_SELECTION 0x03 |
|
||||||
#define DRV_WAVEFORM_SEQ_1 0x04 |
|
||||||
#define DRV_WAVEFORM_SEQ_2 0x05 |
|
||||||
#define DRV_WAVEFORM_SEQ_3 0x06 |
|
||||||
#define DRV_WAVEFORM_SEQ_4 0x07 |
|
||||||
#define DRV_WAVEFORM_SEQ_5 0x08 |
|
||||||
#define DRV_WAVEFORM_SEQ_6 0x09 |
|
||||||
#define DRV_WAVEFORM_SEQ_7 0x0A |
|
||||||
#define DRV_WAVEFORM_SEQ_8 0x0B |
|
||||||
#define DRV_GO 0x0C |
|
||||||
#define DRV_OVERDRIVE_TIME_OFFSET 0x0D |
|
||||||
#define DRV_SUSTAIN_TIME_OFFSET_P 0x0E |
|
||||||
#define DRV_SUSTAIN_TIME_OFFSET_N 0x0F |
|
||||||
#define DRV_BRAKE_TIME_OFFSET 0x10 |
|
||||||
#define DRV_AUDIO_2_VIBE_CTRL 0x11 |
|
||||||
#define DRV_AUDIO_2_VIBE_MIN_IN 0x12 |
|
||||||
#define DRV_AUDIO_2_VIBE_MAX_IN 0x13 |
|
||||||
#define DRV_AUDIO_2_VIBE_MIN_OUTDRV 0x14 |
|
||||||
#define DRV_AUDIO_2_VIBE_MAX_OUTDRV 0x15 |
|
||||||
#define DRV_RATED_VOLT 0x16 |
|
||||||
#define DRV_OVERDRIVE_CLAMP_VOLT 0x17 |
|
||||||
#define DRV_AUTO_CALIB_COMP_RESULT 0x18 |
|
||||||
#define DRV_AUTO_CALIB_BEMF_RESULT 0x19 |
|
||||||
#define DRV_FEEDBACK_CTRL 0x1A |
|
||||||
#define DRV_CTRL_1 0x1B |
|
||||||
#define DRV_CTRL_2 0x1C |
|
||||||
#define DRV_CTRL_3 0x1D |
|
||||||
#define DRV_CTRL_4 0x1E |
|
||||||
#define DRV_CTRL_5 0x1F |
|
||||||
#define DRV_OPEN_LOOP_PERIOD 0x20 |
|
||||||
#define DRV_VBAT_VOLT_MONITOR 0x21 |
|
||||||
#define DRV_LRA_RESONANCE_PERIOD 0x22 |
|
||||||
|
|
||||||
void DRV_init(void); |
|
||||||
void DRV_write(const uint8_t drv_register, const uint8_t settings); |
|
||||||
uint8_t DRV_read(const uint8_t regaddress); |
|
||||||
void DRV_rtp_init(void); |
|
||||||
void DRV_amplitude(const uint8_t amplitude); |
|
||||||
void DRV_pulse(const uint8_t sequence); |
|
||||||
|
|
||||||
typedef enum DRV_EFFECT { |
|
||||||
clear_sequence = 0, |
|
||||||
strong_click = 1, |
|
||||||
strong_click_60 = 2, |
|
||||||
strong_click_30 = 3, |
|
||||||
sharp_click = 4, |
|
||||||
sharp_click_60 = 5, |
|
||||||
sharp_click_30 = 6, |
|
||||||
soft_bump = 7, |
|
||||||
soft_bump_60 = 8, |
|
||||||
soft_bump_30 = 9, |
|
||||||
dbl_click = 10, |
|
||||||
dbl_click_60 = 11, |
|
||||||
trp_click = 12, |
|
||||||
soft_fuzz = 13, |
|
||||||
strong_buzz = 14, |
|
||||||
alert_750ms = 15, |
|
||||||
alert_1000ms = 16, |
|
||||||
strong_click1 = 17, |
|
||||||
strong_click2_80 = 18, |
|
||||||
strong_click3_60 = 19, |
|
||||||
strong_click4_30 = 20, |
|
||||||
medium_click1 = 21, |
|
||||||
medium_click2_80 = 22, |
|
||||||
medium_click3_60 = 23, |
|
||||||
sharp_tick1 = 24, |
|
||||||
sharp_tick2_80 = 25, |
|
||||||
sharp_tick3_60 = 26, |
|
||||||
sh_dblclick_str = 27, |
|
||||||
sh_dblclick_str_80 = 28, |
|
||||||
sh_dblclick_str_60 = 29, |
|
||||||
sh_dblclick_str_30 = 30, |
|
||||||
sh_dblclick_med = 31, |
|
||||||
sh_dblclick_med_80 = 32, |
|
||||||
sh_dblclick_med_60 = 33, |
|
||||||
sh_dblsharp_tick = 34, |
|
||||||
sh_dblsharp_tick_80 = 35, |
|
||||||
sh_dblsharp_tick_60 = 36, |
|
||||||
lg_dblclick_str = 37, |
|
||||||
lg_dblclick_str_80 = 38, |
|
||||||
lg_dblclick_str_60 = 39, |
|
||||||
lg_dblclick_str_30 = 40, |
|
||||||
lg_dblclick_med = 41, |
|
||||||
lg_dblclick_med_80 = 42, |
|
||||||
lg_dblclick_med_60 = 43, |
|
||||||
lg_dblsharp_tick = 44, |
|
||||||
lg_dblsharp_tick_80 = 45, |
|
||||||
lg_dblsharp_tick_60 = 46, |
|
||||||
buzz = 47, |
|
||||||
buzz_80 = 48, |
|
||||||
buzz_60 = 49, |
|
||||||
buzz_40 = 50, |
|
||||||
buzz_20 = 51, |
|
||||||
pulsing_strong = 52, |
|
||||||
pulsing_strong_80 = 53, |
|
||||||
pulsing_medium = 54, |
|
||||||
pulsing_medium_80 = 55, |
|
||||||
pulsing_sharp = 56, |
|
||||||
pulsing_sharp_80 = 57, |
|
||||||
transition_click = 58, |
|
||||||
transition_click_80 = 59, |
|
||||||
transition_click_60 = 60, |
|
||||||
transition_click_40 = 61, |
|
||||||
transition_click_20 = 62, |
|
||||||
transition_click_10 = 63, |
|
||||||
transition_hum = 64, |
|
||||||
transition_hum_80 = 65, |
|
||||||
transition_hum_60 = 66, |
|
||||||
transition_hum_40 = 67, |
|
||||||
transition_hum_20 = 68, |
|
||||||
transition_hum_10 = 69, |
|
||||||
transition_rampdown_long_smooth1 = 70, |
|
||||||
transition_rampdown_long_smooth2 = 71, |
|
||||||
transition_rampdown_med_smooth1 = 72, |
|
||||||
transition_rampdown_med_smooth2 = 73, |
|
||||||
transition_rampdown_short_smooth1 = 74, |
|
||||||
transition_rampdown_short_smooth2 = 75, |
|
||||||
transition_rampdown_long_sharp1 = 76, |
|
||||||
transition_rampdown_long_sharp2 = 77, |
|
||||||
transition_rampdown_med_sharp1 = 78, |
|
||||||
transition_rampdown_med_sharp2 = 79, |
|
||||||
transition_rampdown_short_sharp1 = 80, |
|
||||||
transition_rampdown_short_sharp2 = 81, |
|
||||||
transition_rampup_long_smooth1 = 82, |
|
||||||
transition_rampup_long_smooth2 = 83, |
|
||||||
transition_rampup_med_smooth1 = 84, |
|
||||||
transition_rampup_med_smooth2 = 85, |
|
||||||
transition_rampup_short_smooth1 = 86, |
|
||||||
transition_rampup_short_smooth2 = 87, |
|
||||||
transition_rampup_long_sharp1 = 88, |
|
||||||
transition_rampup_long_sharp2 = 89, |
|
||||||
transition_rampup_med_sharp1 = 90, |
|
||||||
transition_rampup_med_sharp2 = 91, |
|
||||||
transition_rampup_short_sharp1 = 92, |
|
||||||
transition_rampup_short_sharp2 = 93, |
|
||||||
transition_rampdown_long_smooth1_50 = 94, |
|
||||||
transition_rampdown_long_smooth2_50 = 95, |
|
||||||
transition_rampdown_med_smooth1_50 = 96, |
|
||||||
transition_rampdown_med_smooth2_50 = 97, |
|
||||||
transition_rampdown_short_smooth1_50 = 98, |
|
||||||
transition_rampdown_short_smooth2_50 = 99, |
|
||||||
transition_rampdown_long_sharp1_50 = 100, |
|
||||||
transition_rampdown_long_sharp2_50 = 101, |
|
||||||
transition_rampdown_med_sharp1_50 = 102, |
|
||||||
transition_rampdown_med_sharp2_50 = 103, |
|
||||||
transition_rampdown_short_sharp1_50 = 104, |
|
||||||
transition_rampdown_short_sharp2_50 = 105, |
|
||||||
transition_rampup_long_smooth1_50 = 106, |
|
||||||
transition_rampup_long_smooth2_50 = 107, |
|
||||||
transition_rampup_med_smooth1_50 = 108, |
|
||||||
transition_rampup_med_smooth2_50 = 109, |
|
||||||
transition_rampup_short_smooth1_50 = 110, |
|
||||||
transition_rampup_short_smooth2_50 = 111, |
|
||||||
transition_rampup_long_sharp1_50 = 112, |
|
||||||
transition_rampup_long_sharp2_50 = 113, |
|
||||||
transition_rampup_med_sharp1_50 = 114, |
|
||||||
transition_rampup_med_sharp2_50 = 115, |
|
||||||
transition_rampup_short_sharp1_50 = 116, |
|
||||||
transition_rampup_short_sharp2_50 = 117, |
|
||||||
long_buzz_for_programmatic_stopping = 118, |
|
||||||
smooth_hum1_50 = 119, |
|
||||||
smooth_hum2_40 = 120, |
|
||||||
smooth_hum3_30 = 121, |
|
||||||
smooth_hum4_20 = 122, |
|
||||||
smooth_hum5_10 = 123, |
|
||||||
drv_effect_max = 124, |
|
||||||
} DRV_EFFECT; |
|
||||||
|
|
||||||
/* Register bit array unions */ |
|
||||||
|
|
||||||
typedef union DRVREG_STATUS { /* register 0x00 */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t OC_DETECT : 1; /* set to 1 when overcurrent event is detected */ |
|
||||||
uint8_t OVER_TEMP : 1; /* set to 1 when device exceeds temp threshold */ |
|
||||||
uint8_t FB_STS : 1; /* set to 1 when feedback controller has timed out */ |
|
||||||
/* auto-calibration routine and diagnostic result
|
|
||||||
* result | auto-calibation | diagnostic | |
|
||||||
* 0 | passed | actuator func normal | |
|
||||||
* 1 | failed | actuator func fault* | |
|
||||||
* * actuator is not present or is shorted, timing out, or giving out–of-range back-EMF */ |
|
||||||
uint8_t DIAG_RESULT : 1; |
|
||||||
uint8_t : 1; |
|
||||||
uint8_t DEVICE_ID : 3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */ |
|
||||||
} Bits; |
|
||||||
} DRVREG_STATUS; |
|
||||||
|
|
||||||
typedef union DRVREG_MODE { /* register 0x01 */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t MODE : 3; /* Mode setting */ |
|
||||||
uint8_t : 3; |
|
||||||
uint8_t STANDBY : 1; /* 0:standby 1:ready */ |
|
||||||
} Bits; |
|
||||||
} DRVREG_MODE; |
|
||||||
|
|
||||||
typedef union DRVREG_WAIT { |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t WAIT_MODE : 1; /* Set to 1 to interpret as wait for next 7 bits x10ms */ |
|
||||||
uint8_t WAIT_TIME : 7; |
|
||||||
} Bits; |
|
||||||
} DRVREG_WAIT; |
|
||||||
|
|
||||||
typedef union DRVREG_FBR { /* register 0x1A */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t BEMF_GAIN : 2; |
|
||||||
uint8_t LOOP_GAIN : 2; |
|
||||||
uint8_t BRAKE_FACTOR : 3; |
|
||||||
uint8_t ERM_LRA : 1; |
|
||||||
} Bits; |
|
||||||
} DRVREG_FBR; |
|
||||||
|
|
||||||
typedef union DRVREG_CTRL1 { /* register 0x1B */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t C1_DRIVE_TIME : 5; |
|
||||||
uint8_t C1_AC_COUPLE : 1; |
|
||||||
uint8_t : 1; |
|
||||||
uint8_t C1_STARTUP_BOOST : 1; |
|
||||||
} Bits; |
|
||||||
} DRVREG_CTRL1; |
|
||||||
|
|
||||||
typedef union DRVREG_CTRL2 { /* register 0x1C */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t C2_IDISS_TIME : 2; |
|
||||||
uint8_t C2_BLANKING_TIME : 2; |
|
||||||
uint8_t C2_SAMPLE_TIME : 2; |
|
||||||
uint8_t C2_BRAKE_STAB : 1; |
|
||||||
uint8_t C2_BIDIR_INPUT : 1; |
|
||||||
} Bits; |
|
||||||
} DRVREG_CTRL2; |
|
||||||
|
|
||||||
typedef union DRVREG_CTRL3 { /* register 0x1D */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t C3_LRA_OPEN_LOOP : 1; |
|
||||||
uint8_t C3_N_PWM_ANALOG : 1; |
|
||||||
uint8_t C3_LRA_DRIVE_MODE : 1; |
|
||||||
uint8_t C3_DATA_FORMAT_RTO : 1; |
|
||||||
uint8_t C3_SUPPLY_COMP_DIS : 1; |
|
||||||
uint8_t C3_ERM_OPEN_LOOP : 1; |
|
||||||
uint8_t C3_NG_THRESH : 2; |
|
||||||
} Bits; |
|
||||||
} DRVREG_CTRL3; |
|
||||||
|
|
||||||
typedef union DRVREG_CTRL4 { /* register 0x1E */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t C4_OTP_PROGRAM : 1; |
|
||||||
uint8_t : 1; |
|
||||||
uint8_t C4_OTP_STATUS : 1; |
|
||||||
uint8_t : 1; |
|
||||||
uint8_t C4_AUTO_CAL_TIME : 2; |
|
||||||
uint8_t C4_ZC_DET_TIME : 2; |
|
||||||
} Bits; |
|
||||||
} DRVREG_CTRL4; |
|
||||||
|
|
||||||
typedef union DRVREG_CTRL5 { /* register 0x1F */ |
|
||||||
uint8_t Byte; |
|
||||||
struct { |
|
||||||
uint8_t C5_IDISS_TIME : 2; |
|
||||||
uint8_t C5_BLANKING_TIME : 2; |
|
||||||
uint8_t C5_PLAYBACK_INTERVAL : 1; |
|
||||||
uint8_t C5_LRA_AUTO_OPEN_LOOP : 1; |
|
||||||
uint8_t C5_AUTO_OL_CNT : 2; |
|
||||||
} Bits; |
|
||||||
} DRVREG_CTRL5; |
|
@ -0,0 +1,126 @@ |
|||||||
|
/* Copyright 2018 ishtob
|
||||||
|
* Driver for DRV2605L written for QMK |
||||||
|
* |
||||||
|
* This program is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation, either version 2 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "drv2605l.h" |
||||||
|
#include "i2c_master.h" |
||||||
|
#include <math.h> |
||||||
|
|
||||||
|
uint8_t drv2605l_write_buffer[2]; |
||||||
|
uint8_t drv2605l_read_buffer; |
||||||
|
|
||||||
|
void drv2605l_write(uint8_t reg_addr, uint8_t data) { |
||||||
|
drv2605l_write_buffer[0] = reg_addr; |
||||||
|
drv2605l_write_buffer[1] = data; |
||||||
|
i2c_transmit(DRV2605L_I2C_ADDRESS << 1, drv2605l_write_buffer, 2, 100); |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t drv2605l_read(uint8_t reg_addr) { |
||||||
|
i2c_readReg(DRV2605L_I2C_ADDRESS << 1, reg_addr, &drv2605l_read_buffer, 1, 100); |
||||||
|
|
||||||
|
return drv2605l_read_buffer; |
||||||
|
} |
||||||
|
|
||||||
|
void drv2605l_init(void) { |
||||||
|
i2c_init(); |
||||||
|
/* 0x07 sets DRV2605 into calibration mode */ |
||||||
|
drv2605l_write(DRV2605L_REG_MODE, 0x07); |
||||||
|
|
||||||
|
// drv2605l_write(DRV2605L_REG_FEEDBACK_CTRL,0xB6);
|
||||||
|
|
||||||
|
#if FB_ERM_LRA == 0 |
||||||
|
/* ERM settings */ |
||||||
|
drv2605l_write(DRV2605L_REG_RATED_VOLTAGE, (RATED_VOLTAGE / 21.33) * 1000); |
||||||
|
# if ERM_OPEN_LOOP == 0 |
||||||
|
drv2605l_write(DRV2605L_REG_OVERDRIVE_CLAMP_VOLTAGE, (((V_PEAK * (DRIVE_TIME + BLANKING_TIME + IDISS_TIME)) / 0.02133) / (DRIVE_TIME - 0.0003))); |
||||||
|
# elif ERM_OPEN_LOOP == 1 |
||||||
|
drv2605l_write(DRV2605L_REG_OVERDRIVE_CLAMP_VOLTAGE, (V_PEAK / 0.02196)); |
||||||
|
# endif |
||||||
|
#elif FB_ERM_LRA == 1 |
||||||
|
drv2605l_write(DRV2605L_REG_RATED_VOLTAGE, ((V_RMS * sqrt(1 - ((4 * ((150 + (SAMPLE_TIME * 50)) * 0.000001)) + 0.0003) * F_LRA) / 0.02071))); |
||||||
|
# if LRA_OPEN_LOOP == 0 |
||||||
|
drv2605l_write(DRV2605L_REG_OVERDRIVE_CLAMP_VOLTAGE, ((V_PEAK / sqrt(1 - (F_LRA * 0.0008)) / 0.02133))); |
||||||
|
# elif LRA_OPEN_LOOP == 1 |
||||||
|
drv2605l_write(DRV2605L_REG_OVERDRIVE_CLAMP_VOLTAGE, (V_PEAK / 0.02196)); |
||||||
|
# endif |
||||||
|
#endif |
||||||
|
|
||||||
|
DRVREG_FBR FB_SET; |
||||||
|
FB_SET.Bits.ERM_LRA = FB_ERM_LRA; |
||||||
|
FB_SET.Bits.BRAKE_FACTOR = FB_BRAKEFACTOR; |
||||||
|
FB_SET.Bits.LOOP_GAIN = FB_LOOPGAIN; |
||||||
|
FB_SET.Bits.BEMF_GAIN = 0; /* auto-calibration populates this field*/ |
||||||
|
drv2605l_write(DRV2605L_REG_FEEDBACK_CTRL, (uint8_t)FB_SET.Byte); |
||||||
|
|
||||||
|
DRVREG_CTRL1 C1_SET; |
||||||
|
C1_SET.Bits.C1_DRIVE_TIME = DRIVE_TIME; |
||||||
|
C1_SET.Bits.C1_AC_COUPLE = AC_COUPLE; |
||||||
|
C1_SET.Bits.C1_STARTUP_BOOST = STARTUP_BOOST; |
||||||
|
drv2605l_write(DRV2605L_REG_CTRL1, (uint8_t)C1_SET.Byte); |
||||||
|
|
||||||
|
DRVREG_CTRL2 C2_SET; |
||||||
|
C2_SET.Bits.C2_BIDIR_INPUT = BIDIR_INPUT; |
||||||
|
C2_SET.Bits.C2_BRAKE_STAB = BRAKE_STAB; |
||||||
|
C2_SET.Bits.C2_SAMPLE_TIME = SAMPLE_TIME; |
||||||
|
C2_SET.Bits.C2_BLANKING_TIME = BLANKING_TIME; |
||||||
|
C2_SET.Bits.C2_IDISS_TIME = IDISS_TIME; |
||||||
|
drv2605l_write(DRV2605L_REG_CTRL2, (uint8_t)C2_SET.Byte); |
||||||
|
|
||||||
|
DRVREG_CTRL3 C3_SET; |
||||||
|
C3_SET.Bits.C3_LRA_OPEN_LOOP = LRA_OPEN_LOOP; |
||||||
|
C3_SET.Bits.C3_N_PWM_ANALOG = N_PWM_ANALOG; |
||||||
|
C3_SET.Bits.C3_LRA_DRIVE_MODE = LRA_DRIVE_MODE; |
||||||
|
C3_SET.Bits.C3_DATA_FORMAT_RTO = DATA_FORMAT_RTO; |
||||||
|
C3_SET.Bits.C3_SUPPLY_COMP_DIS = SUPPLY_COMP_DIS; |
||||||
|
C3_SET.Bits.C3_ERM_OPEN_LOOP = ERM_OPEN_LOOP; |
||||||
|
C3_SET.Bits.C3_NG_THRESH = NG_THRESH; |
||||||
|
drv2605l_write(DRV2605L_REG_CTRL3, (uint8_t)C3_SET.Byte); |
||||||
|
|
||||||
|
DRVREG_CTRL4 C4_SET; |
||||||
|
C4_SET.Bits.C4_ZC_DET_TIME = ZC_DET_TIME; |
||||||
|
C4_SET.Bits.C4_AUTO_CAL_TIME = AUTO_CAL_TIME; |
||||||
|
drv2605l_write(DRV2605L_REG_CTRL4, (uint8_t)C4_SET.Byte); |
||||||
|
|
||||||
|
drv2605l_write(DRV2605L_REG_LIBRARY_SELECTION, DRV2605L_LIBRARY); |
||||||
|
|
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x01); |
||||||
|
|
||||||
|
/* 0x00 sets DRV2605 out of standby and to use internal trigger
|
||||||
|
* 0x01 sets DRV2605 out of standby and to use external trigger */ |
||||||
|
drv2605l_write(DRV2605L_REG_MODE, 0x00); |
||||||
|
|
||||||
|
// Play greeting sequence
|
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x00); |
||||||
|
drv2605l_write(DRV2605L_REG_WAVEFORM_SEQUENCER_1, DRV2605L_GREETING); |
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x01); |
||||||
|
} |
||||||
|
|
||||||
|
void drv2605l_rtp_init(void) { |
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x00); |
||||||
|
drv2605l_write(DRV2605L_REG_RTP_INPUT, 20); // 20 is the lowest value I've found where haptics can still be felt.
|
||||||
|
drv2605l_write(DRV2605L_REG_MODE, 0x05); |
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x01); |
||||||
|
} |
||||||
|
|
||||||
|
void drv2605l_amplitude(uint8_t amplitude) { |
||||||
|
drv2605l_write(DRV2605L_REG_RTP_INPUT, amplitude); |
||||||
|
} |
||||||
|
|
||||||
|
void drv2605l_pulse(uint8_t sequence) { |
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x00); |
||||||
|
drv2605l_write(DRV2605L_REG_WAVEFORM_SEQUENCER_1, sequence); |
||||||
|
drv2605l_write(DRV2605L_REG_GO, 0x01); |
||||||
|
} |
@ -0,0 +1,407 @@ |
|||||||
|
/* Copyright 2018 ishtob
|
||||||
|
* Driver for DRV2605L written for QMK |
||||||
|
* |
||||||
|
* This program is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation, either version 2 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
/* Initialization settings
|
||||||
|
|
||||||
|
* Feedback Control Settings */ |
||||||
|
#ifndef FB_ERM_LRA |
||||||
|
# define FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/ |
||||||
|
#endif |
||||||
|
#ifndef FB_BRAKEFACTOR |
||||||
|
# define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */ |
||||||
|
#endif |
||||||
|
#ifndef FB_LOOPGAIN |
||||||
|
# define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */ |
||||||
|
#endif |
||||||
|
|
||||||
|
/* LRA specific settings */ |
||||||
|
#if FB_ERM_LRA == 1 |
||||||
|
# ifndef V_RMS |
||||||
|
# define V_RMS 2.0 |
||||||
|
# endif |
||||||
|
# ifndef V_PEAK |
||||||
|
# define V_PEAK 2.1 |
||||||
|
# endif |
||||||
|
# ifndef F_LRA |
||||||
|
# define F_LRA 205 |
||||||
|
# endif |
||||||
|
# ifndef RATED_VOLTAGE |
||||||
|
# define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ |
||||||
|
# endif |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifndef RATED_VOLTAGE |
||||||
|
# define RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */ |
||||||
|
#endif |
||||||
|
#ifndef V_PEAK |
||||||
|
# define V_PEAK 2.8 |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Library Selection */ |
||||||
|
#ifndef DRV2605L_LIBRARY |
||||||
|
# if FB_ERM_LRA == 1 |
||||||
|
# define DRV2605L_LIBRARY 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */ |
||||||
|
# else |
||||||
|
# define DRV2605L_LIBRARY 1 |
||||||
|
# endif |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifndef DRV2605L_GREETING |
||||||
|
# define DRV2605L_GREETING alert_750ms |
||||||
|
#endif |
||||||
|
#ifndef DRV2605L_DEFAULT_MODE |
||||||
|
# define DRV2605L_DEFAULT_MODE strong_click1 |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Control 1 register settings */ |
||||||
|
#ifndef DRIVE_TIME |
||||||
|
# define DRIVE_TIME 25 |
||||||
|
#endif |
||||||
|
#ifndef AC_COUPLE |
||||||
|
# define AC_COUPLE 0 |
||||||
|
#endif |
||||||
|
#ifndef STARTUP_BOOST |
||||||
|
# define STARTUP_BOOST 1 |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Control 2 Settings */ |
||||||
|
#ifndef BIDIR_INPUT |
||||||
|
# define BIDIR_INPUT 1 |
||||||
|
#endif |
||||||
|
#ifndef BRAKE_STAB |
||||||
|
# define BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */ |
||||||
|
#endif |
||||||
|
#ifndef SAMPLE_TIME |
||||||
|
# define SAMPLE_TIME 3 |
||||||
|
#endif |
||||||
|
#ifndef BLANKING_TIME |
||||||
|
# define BLANKING_TIME 1 |
||||||
|
#endif |
||||||
|
#ifndef IDISS_TIME |
||||||
|
# define IDISS_TIME 1 |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Control 3 settings */ |
||||||
|
#ifndef NG_THRESH |
||||||
|
# define NG_THRESH 2 |
||||||
|
#endif |
||||||
|
#ifndef ERM_OPEN_LOOP |
||||||
|
# define ERM_OPEN_LOOP 1 |
||||||
|
#endif |
||||||
|
#ifndef SUPPLY_COMP_DIS |
||||||
|
# define SUPPLY_COMP_DIS 0 |
||||||
|
#endif |
||||||
|
#ifndef DATA_FORMAT_RTO |
||||||
|
# define DATA_FORMAT_RTO 0 |
||||||
|
#endif |
||||||
|
#ifndef LRA_DRIVE_MODE |
||||||
|
# define LRA_DRIVE_MODE 0 |
||||||
|
#endif |
||||||
|
#ifndef N_PWM_ANALOG |
||||||
|
# define N_PWM_ANALOG 0 |
||||||
|
#endif |
||||||
|
#ifndef LRA_OPEN_LOOP |
||||||
|
# define LRA_OPEN_LOOP 0 |
||||||
|
#endif |
||||||
|
|
||||||
|
/* Control 4 settings */ |
||||||
|
#ifndef ZC_DET_TIME |
||||||
|
# define ZC_DET_TIME 0 |
||||||
|
#endif |
||||||
|
#ifndef AUTO_CAL_TIME |
||||||
|
# define AUTO_CAL_TIME 3 |
||||||
|
#endif |
||||||
|
|
||||||
|
#define DRV2605L_I2C_ADDRESS 0x5A |
||||||
|
|
||||||
|
#define DRV2605L_REG_STATUS 0x00 |
||||||
|
#define DRV2605L_REG_MODE 0x01 |
||||||
|
#define DRV2605L_REG_RTP_INPUT 0x02 |
||||||
|
#define DRV2605L_REG_LIBRARY_SELECTION 0x03 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_1 0x04 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_2 0x05 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_3 0x06 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_4 0x07 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_5 0x08 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_6 0x09 |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_7 0x0A |
||||||
|
#define DRV2605L_REG_WAVEFORM_SEQUENCER_8 0x0B |
||||||
|
#define DRV2605L_REG_GO 0x0C |
||||||
|
#define DRV2605L_REG_OVERDRIVE_TIME_OFFSET 0x0D |
||||||
|
#define DRV2605L_REG_SUSTAIN_TIME_OFFSET_P 0x0E |
||||||
|
#define DRV2605L_REG_SUSTAIN_TIME_OFFSET_N 0x0F |
||||||
|
#define DRV2605L_REG_BRAKE_TIME_OFFSET 0x10 |
||||||
|
#define DRV2605L_REG_AUDIO_TO_VIBE_CTRL 0x11 |
||||||
|
#define DRV2605L_REG_AUDIO_TO_VIBE_MIN_INPUT 0x12 |
||||||
|
#define DRV2605L_REG_AUDIO_TO_VIBE_MAX_INPUT 0x13 |
||||||
|
#define DRV2605L_REG_AUDIO_TO_VIBE_MIN_OUTPUT_DRIVE 0x14 |
||||||
|
#define DRV2605L_REG_AUDIO_TO_VIBE_MAX_OUTPUT_DRIVE 0x15 |
||||||
|
#define DRV2605L_REG_RATED_VOLTAGE 0x16 |
||||||
|
#define DRV2605L_REG_OVERDRIVE_CLAMP_VOLTAGE 0x17 |
||||||
|
#define DRV2605L_REG_AUTO_CALIBRATION_COMPENSATION_RESULT 0x18 |
||||||
|
#define DRV2605L_REG_AUTO_CALIBRATION_BACK_EMF_RESULT 0x19 |
||||||
|
#define DRV2605L_REG_FEEDBACK_CTRL 0x1A |
||||||
|
#define DRV2605L_REG_CTRL1 0x1B |
||||||
|
#define DRV2605L_REG_CTRL2 0x1C |
||||||
|
#define DRV2605L_REG_CTRL3 0x1D |
||||||
|
#define DRV2605L_REG_CTRL4 0x1E |
||||||
|
#define DRV2605L_REG_CTRL5 0x1F |
||||||
|
#define DRV2605L_REG_LRA_OPEN_LOOP_PERIOD 0x20 |
||||||
|
#define DRV2605L_REG_VBAT_VOLTAGE_MONITOR 0x21 |
||||||
|
#define DRV2605L_REG_LRA_RESONANCE_PERIOD 0x22 |
||||||
|
|
||||||
|
void drv2605l_init(void); |
||||||
|
void drv2605l_write(const uint8_t reg_addr, const uint8_t data); |
||||||
|
uint8_t drv2605l_read(const uint8_t reg_addr); |
||||||
|
void drv2605l_rtp_init(void); |
||||||
|
void drv2605l_amplitude(const uint8_t amplitude); |
||||||
|
void drv2605l_pulse(const uint8_t sequence); |
||||||
|
|
||||||
|
typedef enum DRV_EFFECT { |
||||||
|
clear_sequence, |
||||||
|
strong_click, |
||||||
|
strong_click_60, |
||||||
|
strong_click_30, |
||||||
|
sharp_click, |
||||||
|
sharp_click_60, |
||||||
|
sharp_click_30, |
||||||
|
soft_bump, |
||||||
|
soft_bump_60, |
||||||
|
soft_bump_30, |
||||||
|
dbl_click, |
||||||
|
dbl_click_60, |
||||||
|
trp_click, |
||||||
|
soft_fuzz, |
||||||
|
strong_buzz, |
||||||
|
alert_750ms, |
||||||
|
alert_1000ms, |
||||||
|
strong_click1, |
||||||
|
strong_click2_80, |
||||||
|
strong_click3_60, |
||||||
|
strong_click4_30, |
||||||
|
medium_click1, |
||||||
|
medium_click2_80, |
||||||
|
medium_click3_60, |
||||||
|
sharp_tick1, |
||||||
|
sharp_tick2_80, |
||||||
|
sharp_tick3_60, |
||||||
|
sh_dblclick_str, |
||||||
|
sh_dblclick_str_80, |
||||||
|
sh_dblclick_str_60, |
||||||
|
sh_dblclick_str_30, |
||||||
|
sh_dblclick_med, |
||||||
|
sh_dblclick_med_80, |
||||||
|
sh_dblclick_med_60, |
||||||
|
sh_dblsharp_tick, |
||||||
|
sh_dblsharp_tick_80, |
||||||
|
sh_dblsharp_tick_60, |
||||||
|
lg_dblclick_str, |
||||||
|
lg_dblclick_str_80, |
||||||
|
lg_dblclick_str_60, |
||||||
|
lg_dblclick_str_30, |
||||||
|
lg_dblclick_med, |
||||||
|
lg_dblclick_med_80, |
||||||
|
lg_dblclick_med_60, |
||||||
|
lg_dblsharp_tick, |
||||||
|
lg_dblsharp_tick_80, |
||||||
|
lg_dblsharp_tick_60, |
||||||
|
buzz, |
||||||
|
buzz_80, |
||||||
|
buzz_60, |
||||||
|
buzz_40, |
||||||
|
buzz_20, |
||||||
|
pulsing_strong, |
||||||
|
pulsing_strong_80, |
||||||
|
pulsing_medium, |
||||||
|
pulsing_medium_80, |
||||||
|
pulsing_sharp, |
||||||
|
pulsing_sharp_80, |
||||||
|
transition_click, |
||||||
|
transition_click_80, |
||||||
|
transition_click_60, |
||||||
|
transition_click_40, |
||||||
|
transition_click_20, |
||||||
|
transition_click_10, |
||||||
|
transition_hum, |
||||||
|
transition_hum_80, |
||||||
|
transition_hum_60, |
||||||
|
transition_hum_40, |
||||||
|
transition_hum_20, |
||||||
|
transition_hum_10, |
||||||
|
transition_rampdown_long_smooth1, |
||||||
|
transition_rampdown_long_smooth2, |
||||||
|
transition_rampdown_med_smooth1, |
||||||
|
transition_rampdown_med_smooth2, |
||||||
|
transition_rampdown_short_smooth1, |
||||||
|
transition_rampdown_short_smooth2, |
||||||
|
transition_rampdown_long_sharp1, |
||||||
|
transition_rampdown_long_sharp2, |
||||||
|
transition_rampdown_med_sharp1, |
||||||
|
transition_rampdown_med_sharp2, |
||||||
|
transition_rampdown_short_sharp1, |
||||||
|
transition_rampdown_short_sharp2, |
||||||
|
transition_rampup_long_smooth1, |
||||||
|
transition_rampup_long_smooth2, |
||||||
|
transition_rampup_med_smooth1, |
||||||
|
transition_rampup_med_smooth2, |
||||||
|
transition_rampup_short_smooth1, |
||||||
|
transition_rampup_short_smooth2, |
||||||
|
transition_rampup_long_sharp1, |
||||||
|
transition_rampup_long_sharp2, |
||||||
|
transition_rampup_med_sharp1, |
||||||
|
transition_rampup_med_sharp2, |
||||||
|
transition_rampup_short_sharp1, |
||||||
|
transition_rampup_short_sharp2, |
||||||
|
transition_rampdown_long_smooth1_50, |
||||||
|
transition_rampdown_long_smooth2_50, |
||||||
|
transition_rampdown_med_smooth1_50, |
||||||
|
transition_rampdown_med_smooth2_50, |
||||||
|
transition_rampdown_short_smooth1_50, |
||||||
|
transition_rampdown_short_smooth2_50, |
||||||
|
transition_rampdown_long_sharp1_50, |
||||||
|
transition_rampdown_long_sharp2_50, |
||||||
|
transition_rampdown_med_sharp1_50, |
||||||
|
transition_rampdown_med_sharp2_50, |
||||||
|
transition_rampdown_short_sharp1_50, |
||||||
|
transition_rampdown_short_sharp2_50, |
||||||
|
transition_rampup_long_smooth1_50, |
||||||
|
transition_rampup_long_smooth2_50, |
||||||
|
transition_rampup_med_smooth1_50, |
||||||
|
transition_rampup_med_smooth2_50, |
||||||
|
transition_rampup_short_smooth1_50, |
||||||
|
transition_rampup_short_smooth2_50, |
||||||
|
transition_rampup_long_sharp1_50, |
||||||
|
transition_rampup_long_sharp2_50, |
||||||
|
transition_rampup_med_sharp1_50, |
||||||
|
transition_rampup_med_sharp2_50, |
||||||
|
transition_rampup_short_sharp1_50, |
||||||
|
transition_rampup_short_sharp2_50, |
||||||
|
long_buzz_for_programmatic_stopping, |
||||||
|
smooth_hum1_50, |
||||||
|
smooth_hum2_40, |
||||||
|
smooth_hum3_30, |
||||||
|
smooth_hum4_20, |
||||||
|
smooth_hum5_10, |
||||||
|
drv_effect_max |
||||||
|
} DRV_EFFECT; |
||||||
|
|
||||||
|
/* Register bit array unions */ |
||||||
|
|
||||||
|
typedef union DRVREG_STATUS { /* register 0x00 */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t OC_DETECT : 1; /* set to 1 when overcurrent event is detected */ |
||||||
|
uint8_t OVER_TEMP : 1; /* set to 1 when device exceeds temp threshold */ |
||||||
|
uint8_t FB_STS : 1; /* set to 1 when feedback controller has timed out */ |
||||||
|
/* auto-calibration routine and diagnostic result
|
||||||
|
* result | auto-calibation | diagnostic | |
||||||
|
* 0 | passed | actuator func normal | |
||||||
|
* 1 | failed | actuator func fault* | |
||||||
|
* * actuator is not present or is shorted, timing out, or giving out–of-range back-EMF */ |
||||||
|
uint8_t DIAG_RESULT : 1; |
||||||
|
uint8_t : 1; |
||||||
|
uint8_t DEVICE_ID : 3; /* Device IDs 3: DRV2605 4: DRV2604 5: DRV2604L 6: DRV2605L */ |
||||||
|
} Bits; |
||||||
|
} DRVREG_STATUS; |
||||||
|
|
||||||
|
typedef union DRVREG_MODE { /* register 0x01 */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t MODE : 3; /* Mode setting */ |
||||||
|
uint8_t : 3; |
||||||
|
uint8_t STANDBY : 1; /* 0:standby 1:ready */ |
||||||
|
} Bits; |
||||||
|
} DRVREG_MODE; |
||||||
|
|
||||||
|
typedef union DRVREG_WAIT { |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t WAIT_MODE : 1; /* Set to 1 to interpret as wait for next 7 bits x10ms */ |
||||||
|
uint8_t WAIT_TIME : 7; |
||||||
|
} Bits; |
||||||
|
} DRVREG_WAIT; |
||||||
|
|
||||||
|
typedef union DRVREG_FBR { /* register 0x1A */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t BEMF_GAIN : 2; |
||||||
|
uint8_t LOOP_GAIN : 2; |
||||||
|
uint8_t BRAKE_FACTOR : 3; |
||||||
|
uint8_t ERM_LRA : 1; |
||||||
|
} Bits; |
||||||
|
} DRVREG_FBR; |
||||||
|
|
||||||
|
typedef union DRVREG_CTRL1 { /* register 0x1B */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t C1_DRIVE_TIME : 5; |
||||||
|
uint8_t C1_AC_COUPLE : 1; |
||||||
|
uint8_t : 1; |
||||||
|
uint8_t C1_STARTUP_BOOST : 1; |
||||||
|
} Bits; |
||||||
|
} DRVREG_CTRL1; |
||||||
|
|
||||||
|
typedef union DRVREG_CTRL2 { /* register 0x1C */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t C2_IDISS_TIME : 2; |
||||||
|
uint8_t C2_BLANKING_TIME : 2; |
||||||
|
uint8_t C2_SAMPLE_TIME : 2; |
||||||
|
uint8_t C2_BRAKE_STAB : 1; |
||||||
|
uint8_t C2_BIDIR_INPUT : 1; |
||||||
|
} Bits; |
||||||
|
} DRVREG_CTRL2; |
||||||
|
|
||||||
|
typedef union DRVREG_CTRL3 { /* register 0x1D */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t C3_LRA_OPEN_LOOP : 1; |
||||||
|
uint8_t C3_N_PWM_ANALOG : 1; |
||||||
|
uint8_t C3_LRA_DRIVE_MODE : 1; |
||||||
|
uint8_t C3_DATA_FORMAT_RTO : 1; |
||||||
|
uint8_t C3_SUPPLY_COMP_DIS : 1; |
||||||
|
uint8_t C3_ERM_OPEN_LOOP : 1; |
||||||
|
uint8_t C3_NG_THRESH : 2; |
||||||
|
} Bits; |
||||||
|
} DRVREG_CTRL3; |
||||||
|
|
||||||
|
typedef union DRVREG_CTRL4 { /* register 0x1E */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t C4_OTP_PROGRAM : 1; |
||||||
|
uint8_t : 1; |
||||||
|
uint8_t C4_OTP_STATUS : 1; |
||||||
|
uint8_t : 1; |
||||||
|
uint8_t C4_AUTO_CAL_TIME : 2; |
||||||
|
uint8_t C4_ZC_DET_TIME : 2; |
||||||
|
} Bits; |
||||||
|
} DRVREG_CTRL4; |
||||||
|
|
||||||
|
typedef union DRVREG_CTRL5 { /* register 0x1F */ |
||||||
|
uint8_t Byte; |
||||||
|
struct { |
||||||
|
uint8_t C5_IDISS_TIME : 2; |
||||||
|
uint8_t C5_BLANKING_TIME : 2; |
||||||
|
uint8_t C5_PLAYBACK_INTERVAL : 1; |
||||||
|
uint8_t C5_LRA_AUTO_OPEN_LOOP : 1; |
||||||
|
uint8_t C5_AUTO_OL_CNT : 2; |
||||||
|
} Bits; |
||||||
|
} DRVREG_CTRL5; |
@ -1,4 +1,4 @@ |
|||||||
VIA_ENABLE = yes
|
VIA_ENABLE = yes
|
||||||
HAPTIC_ENABLE = yes
|
HAPTIC_ENABLE = yes
|
||||||
HAPTIC_DRIVER += SOLENOID
|
HAPTIC_DRIVER = solenoid
|
||||||
ENCODER_MAP_ENABLE = yes # Encoder mapping functionality
|
ENCODER_MAP_ENABLE = yes # Encoder mapping functionality
|
@ -1,4 +1,4 @@ |
|||||||
VIA_ENABLE = yes
|
VIA_ENABLE = yes
|
||||||
LTO_ENABLE = yes
|
LTO_ENABLE = yes
|
||||||
HAPTIC_ENABLE = yes
|
HAPTIC_ENABLE = yes
|
||||||
HAPTIC_DRIVER += SOLENOID
|
HAPTIC_DRIVER = solenoid
|
@ -1,7 +1,7 @@ |
|||||||
OLED_ENABLE = yes # uncomment if you are using an OLED display
|
OLED_ENABLE = yes # uncomment if you are using an OLED display
|
||||||
|
|
||||||
#HAPTIC_ENABLE = yes # uncomment only on the master side if you are using a Pimoroni haptic buzz
|
#HAPTIC_ENABLE = yes # uncomment only on the master side if you are using a Pimoroni haptic buzz
|
||||||
#HAPTIC_DRIVER = DRV2605L # uncomment only on the master side if you are using a Pimoroni haptic buzz
|
#HAPTIC_DRIVER = drv2605l # uncomment only on the master side if you are using a Pimoroni haptic buzz
|
||||||
|
|
||||||
#PS2_MOUSE_ENABLE = yes # uncomment only on the master side if you are usin a TrackPoint
|
#PS2_MOUSE_ENABLE = yes # uncomment only on the master side if you are usin a TrackPoint
|
||||||
MOUSEKEY_ENABLE = yes
|
MOUSEKEY_ENABLE = yes
|
@ -1 +0,0 @@ |
|||||||
#pragma once |
|
@ -1,2 +1,2 @@ |
|||||||
HAPTIC_ENABLE = yes
|
HAPTIC_ENABLE = yes
|
||||||
HAPTIC_DRIVER = SOLENOID
|
HAPTIC_DRIVER = solenoid
|
||||||
|
@ -1,2 +1 @@ |
|||||||
AUDIO_ENABLE = yes
|
AUDIO_ENABLE = yes
|
||||||
HAPTIC_ENABLE += SOLENOID
|
|
@ -1,5 +1,4 @@ |
|||||||
VIA_ENABLE = yes
|
VIA_ENABLE = yes
|
||||||
#HAPTIC_ENABLE += SOLENOID
|
|
||||||
AUDIO_ENABLE = yes
|
AUDIO_ENABLE = yes
|
||||||
#either solenoid or audio not both can be enabled
|
#either solenoid or audio not both can be enabled
|
||||||
LTO_ENABLE = yes
|
LTO_ENABLE = yes
|
||||||
|
@ -1 +1 @@ |
|||||||
HAPTIC_DRIVER += SOLENOID
|
HAPTIC_DRIVER = solenoid
|
||||||
|
Loading…
Reference in new issue