logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

drv2605l.h (13118B)


  1. /* Copyright 2018 ishtob
  2. * Driver for DRV2605L written for QMK
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #pragma once
  18. #include <stdint.h>
  19. /* Initialization settings
  20. * Feedback Control Settings */
  21. #ifndef DRV2605L_FB_ERM_LRA
  22. # define DRV2605L_FB_ERM_LRA 1 /* For ERM:0 or LRA:1*/
  23. #endif
  24. #ifndef DRV2605L_FB_BRAKEFACTOR
  25. # define DRV2605L_FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */
  26. #endif
  27. #ifndef DRV2605L_FB_LOOPGAIN
  28. # define DRV2605L_FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
  29. #endif
  30. /* LRA specific settings */
  31. #if DRV2605L_FB_ERM_LRA == 1
  32. # ifndef DRV2605L_V_RMS
  33. # define DRV2605L_V_RMS 2.0
  34. # endif
  35. # ifndef DRV2605L_V_PEAK
  36. # define DRV2605L_V_PEAK 2.1
  37. # endif
  38. # ifndef DRV2605L_F_LRA
  39. # define DRV2605L_F_LRA 205
  40. # endif
  41. # ifndef DRV2605L_RATED_VOLTAGE
  42. # define DRV2605L_RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
  43. # endif
  44. #endif
  45. #ifndef DRV2605L_RATED_VOLTAGE
  46. # define DRV2605L_RATED_VOLTAGE 2 /* 2v as safe range in case device voltage is not set */
  47. #endif
  48. #ifndef DRV2605L_V_PEAK
  49. # define DRV2605L_V_PEAK 2.8
  50. #endif
  51. /* Library Selection */
  52. #ifndef DRV2605L_LIBRARY
  53. # if DRV2605L_FB_ERM_LRA == 1
  54. # define DRV2605L_LIBRARY 6 /* For Empty:0' TS2200 library A to D:1-5, LRA Library: 6 */
  55. # else
  56. # define DRV2605L_LIBRARY 1
  57. # endif
  58. #endif
  59. #ifndef DRV2605L_GREETING
  60. # define DRV2605L_GREETING DRV2605L_EFFECT_750_MS_ALERT_100
  61. #endif
  62. #ifndef DRV2605L_DEFAULT_MODE
  63. # define DRV2605L_DEFAULT_MODE DRV2605L_EFFECT_STRONG_CLICK_1_100
  64. #endif
  65. /* Control 1 register settings */
  66. #ifndef DRV2605L_DRIVE_TIME
  67. # define DRV2605L_DRIVE_TIME 25
  68. #endif
  69. #ifndef DRV2605L_AC_COUPLE
  70. # define DRV2605L_AC_COUPLE 0
  71. #endif
  72. #ifndef DRV2605L_STARTUP_BOOST
  73. # define DRV2605L_STARTUP_BOOST 1
  74. #endif
  75. /* Control 2 Settings */
  76. #ifndef DRV2605L_BIDIR_INPUT
  77. # define DRV2605L_BIDIR_INPUT 1
  78. #endif
  79. #ifndef DRV2605L_BRAKE_STAB
  80. # define DRV2605L_BRAKE_STAB 1 /* Loopgain is reduced when braking is almost complete to improve stability */
  81. #endif
  82. #ifndef DRV2605L_SAMPLE_TIME
  83. # define DRV2605L_SAMPLE_TIME 3
  84. #endif
  85. #ifndef DRV2605L_BLANKING_TIME
  86. # define DRV2605L_BLANKING_TIME 1
  87. #endif
  88. #ifndef DRV2605L_IDISS_TIME
  89. # define DRV2605L_IDISS_TIME 1
  90. #endif
  91. /* Control 3 settings */
  92. #ifndef DRV2605L_NG_THRESH
  93. # define DRV2605L_NG_THRESH 2
  94. #endif
  95. #ifndef DRV2605L_ERM_OPEN_LOOP
  96. # define DRV2605L_ERM_OPEN_LOOP 1
  97. #endif
  98. #ifndef DRV2605L_SUPPLY_COMP_DIS
  99. # define DRV2605L_SUPPLY_COMP_DIS 0
  100. #endif
  101. #ifndef DRV2605L_DATA_FORMAT_RTO
  102. # define DRV2605L_DATA_FORMAT_RTO 0
  103. #endif
  104. #ifndef DRV2605L_LRA_DRIVE_MODE
  105. # define DRV2605L_LRA_DRIVE_MODE 0
  106. #endif
  107. #ifndef DRV2605L_N_PWM_ANALOG
  108. # define DRV2605L_N_PWM_ANALOG 0
  109. #endif
  110. #ifndef DRV2605L_LRA_OPEN_LOOP
  111. # define DRV2605L_LRA_OPEN_LOOP 0
  112. #endif
  113. /* Control 4 settings */
  114. #ifndef DRV2605L_ZC_DET_TIME
  115. # define DRV2605L_ZC_DET_TIME 0
  116. #endif
  117. #ifndef DRV2605L_AUTO_CAL_TIME
  118. # define DRV2605L_AUTO_CAL_TIME 3
  119. #endif
  120. #define DRV2605L_I2C_ADDRESS 0x5A
  121. #define DRV2605L_REG_STATUS 0x00
  122. #define DRV2605L_REG_MODE 0x01
  123. #define DRV2605L_REG_RTP_INPUT 0x02
  124. #define DRV2605L_REG_LIBRARY_SELECTION 0x03
  125. #define DRV2605L_REG_WAVEFORM_SEQUENCER_1 0x04
  126. #define DRV2605L_REG_WAVEFORM_SEQUENCER_2 0x05
  127. #define DRV2605L_REG_WAVEFORM_SEQUENCER_3 0x06
  128. #define DRV2605L_REG_WAVEFORM_SEQUENCER_4 0x07
  129. #define DRV2605L_REG_WAVEFORM_SEQUENCER_5 0x08
  130. #define DRV2605L_REG_WAVEFORM_SEQUENCER_6 0x09
  131. #define DRV2605L_REG_WAVEFORM_SEQUENCER_7 0x0A
  132. #define DRV2605L_REG_WAVEFORM_SEQUENCER_8 0x0B
  133. #define DRV2605L_REG_GO 0x0C
  134. #define DRV2605L_REG_OVERDRIVE_TIME_OFFSET 0x0D
  135. #define DRV2605L_REG_SUSTAIN_TIME_OFFSET_P 0x0E
  136. #define DRV2605L_REG_SUSTAIN_TIME_OFFSET_N 0x0F
  137. #define DRV2605L_REG_BRAKE_TIME_OFFSET 0x10
  138. #define DRV2605L_REG_AUDIO_TO_VIBE_CTRL 0x11
  139. #define DRV2605L_REG_AUDIO_TO_VIBE_MIN_INPUT 0x12
  140. #define DRV2605L_REG_AUDIO_TO_VIBE_MAX_INPUT 0x13
  141. #define DRV2605L_REG_AUDIO_TO_VIBE_MIN_OUTPUT_DRIVE 0x14
  142. #define DRV2605L_REG_AUDIO_TO_VIBE_MAX_OUTPUT_DRIVE 0x15
  143. #define DRV2605L_REG_RATED_VOLTAGE 0x16
  144. #define DRV2605L_REG_OVERDRIVE_CLAMP_VOLTAGE 0x17
  145. #define DRV2605L_REG_AUTO_CALIBRATION_COMPENSATION_RESULT 0x18
  146. #define DRV2605L_REG_AUTO_CALIBRATION_BACK_EMF_RESULT 0x19
  147. #define DRV2605L_REG_FEEDBACK_CTRL 0x1A
  148. #define DRV2605L_REG_CTRL1 0x1B
  149. #define DRV2605L_REG_CTRL2 0x1C
  150. #define DRV2605L_REG_CTRL3 0x1D
  151. #define DRV2605L_REG_CTRL4 0x1E
  152. #define DRV2605L_REG_CTRL5 0x1F
  153. #define DRV2605L_REG_LRA_OPEN_LOOP_PERIOD 0x20
  154. #define DRV2605L_REG_VBAT_VOLTAGE_MONITOR 0x21
  155. #define DRV2605L_REG_LRA_RESONANCE_PERIOD 0x22
  156. void drv2605l_init(void);
  157. void drv2605l_write(const uint8_t reg_addr, const uint8_t data);
  158. uint8_t drv2605l_read(const uint8_t reg_addr);
  159. void drv2605l_rtp_init(void);
  160. void drv2605l_amplitude(const uint8_t amplitude);
  161. void drv2605l_pulse(const uint8_t sequence);
  162. typedef enum drv2605l_effect_t {
  163. DRV2605L_EFFECT_CLEAR_SEQUENCE,
  164. DRV2605L_EFFECT_STRONG_CLICK_100,
  165. DRV2605L_EFFECT_STRONG_CLICK_60,
  166. DRV2605L_EFFECT_STRONG_CLICK_30,
  167. DRV2605L_EFFECT_SHARP_CLICK_100,
  168. DRV2605L_EFFECT_SHARP_CLICK_60,
  169. DRV2605L_EFFECT_SHARP_CLICK_30,
  170. DRV2605L_EFFECT_SOFT_BUMP_100,
  171. DRV2605L_EFFECT_SOFT_BUMP_60,
  172. DRV2605L_EFFECT_SOFT_BUMP_30,
  173. DRV2605L_EFFECT_DOUBLE_CLICK_100,
  174. DRV2605L_EFFECT_DOUBLE_CLICK_60,
  175. DRV2605L_EFFECT_TRIPLE_CLICK_100,
  176. DRV2605L_EFFECT_SOFT_FUZZ_60,
  177. DRV2605L_EFFECT_STRONG_BUZZ_100,
  178. DRV2605L_EFFECT_750_MS_ALERT_100,
  179. DRV2605L_EFFECT_1000_MS_ALERT_100,
  180. DRV2605L_EFFECT_STRONG_CLICK_1_100,
  181. DRV2605L_EFFECT_STRONG_CLICK_2_80,
  182. DRV2605L_EFFECT_STRONG_CLICK_3_60,
  183. DRV2605L_EFFECT_STRONG_CLICK_4_30,
  184. DRV2605L_EFFECT_MEDIUM_CLICK_1_100,
  185. DRV2605L_EFFECT_MEDIUM_CLICK_2_80,
  186. DRV2605L_EFFECT_MEDIUM_CLICK_3_60,
  187. DRV2605L_EFFECT_SHARP_TICK_1_100,
  188. DRV2605L_EFFECT_SHARP_TICK_2_80,
  189. DRV2605L_EFFECT_SHARP_TICK_3_60,
  190. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_STRONG_1_100,
  191. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_STRONG_2_80,
  192. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_STRONG_3_60,
  193. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_STRONG_4_30,
  194. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_MEDIUM_1_100,
  195. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_MEDIUM_2_80,
  196. DRV2605L_EFFECT_SHORT_DOUBLE_CLICK_MEDIUM_3_60,
  197. DRV2605L_EFFECT_SHORT_DOUBLE_SHARP_TICK_1_100,
  198. DRV2605L_EFFECT_SHORT_DOUBLE_SHARP_TICK_2_80,
  199. DRV2605L_EFFECT_SHORT_DOUBLE_SHARP_TICK_3_60,
  200. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_STRONG_1_100,
  201. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_STRONG_2_80,
  202. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_STRONG_3_60,
  203. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_STRONG_4_30,
  204. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_MEDIUM_1_100,
  205. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_MEDIUM_2_80,
  206. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_CLICK_MEDIUM_3_60,
  207. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_TICK_1_100,
  208. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_TICK_2_80,
  209. DRV2605L_EFFECT_LONG_DOUBLE_SHARP_TICK_3_60,
  210. DRV2605L_EFFECT_BUZZ_1_100,
  211. DRV2605L_EFFECT_BUZZ_2_80,
  212. DRV2605L_EFFECT_BUZZ_3_60,
  213. DRV2605L_EFFECT_BUZZ_4_40,
  214. DRV2605L_EFFECT_BUZZ_5_20,
  215. DRV2605L_EFFECT_PULSING_STRONG_1_100,
  216. DRV2605L_EFFECT_PULSING_STRONG_2_60,
  217. DRV2605L_EFFECT_PULSING_MEDIUM_1_100,
  218. DRV2605L_EFFECT_PULSING_MEDIUM_2_60,
  219. DRV2605L_EFFECT_PULSING_SHARP_1_100,
  220. DRV2605L_EFFECT_PULSING_SHARP_2_60,
  221. DRV2605L_EFFECT_TRANSITION_CLICK_1_100,
  222. DRV2605L_EFFECT_TRANSITION_CLICK_2_80,
  223. DRV2605L_EFFECT_TRANSITION_CLICK_3_60,
  224. DRV2605L_EFFECT_TRANSITION_CLICK_4_40,
  225. DRV2605L_EFFECT_TRANSITION_CLICK_5_20,
  226. DRV2605L_EFFECT_TRANSITION_CLICK_6_10,
  227. DRV2605L_EFFECT_TRANSITION_HUM_1_100,
  228. DRV2605L_EFFECT_TRANSITION_HUM_2_80,
  229. DRV2605L_EFFECT_TRANSITION_HUM_3_60,
  230. DRV2605L_EFFECT_TRANSITION_HUM_4_40,
  231. DRV2605L_EFFECT_TRANSITION_HUM_5_20,
  232. DRV2605L_EFFECT_TRANSITION_HUM_6_10,
  233. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SMOOTH_1_100,
  234. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SMOOTH_2_100,
  235. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SMOOTH_1_100,
  236. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SMOOTH_2_100,
  237. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SMOOTH_1_100,
  238. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SMOOTH_2_100,
  239. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SHARP_1_100,
  240. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SHARP_2_100,
  241. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SHARP_1_100,
  242. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SHARP_2_100,
  243. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SHARP_1_100,
  244. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SHARP_2_100,
  245. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SMOOTH_1_100,
  246. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SMOOTH_2_100,
  247. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SMOOTH_1_100,
  248. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SMOOTH_2_100,
  249. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SMOOTH_1_100,
  250. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SMOOTH_2_100,
  251. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SHARP_1_100,
  252. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SHARP_2_100,
  253. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SHARP_1_100,
  254. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SHARP_2_100,
  255. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SHARP_1_100,
  256. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SHARP_2_100,
  257. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SMOOTH_1_50,
  258. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SMOOTH_2_50,
  259. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SMOOTH_1_50,
  260. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SMOOTH_2_50,
  261. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SMOOTH_1_50,
  262. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SMOOTH_2_50,
  263. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SHARP_1_50,
  264. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_LONG_SHARP_2_50,
  265. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SHARP_1_50,
  266. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_MEDIUM_SHARP_2_50,
  267. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SHARP_1_50,
  268. DRV2605L_EFFECT_TRANSITION_RAMP_DOWN_SHORT_SHARP_2_50,
  269. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SMOOTH_1_50,
  270. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SMOOTH_2_50,
  271. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SMOOTH_1_50,
  272. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SMOOTH_2_50,
  273. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SMOOTH_1_50,
  274. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SMOOTH_2_50,
  275. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SHARP_1_50,
  276. DRV2605L_EFFECT_TRANSITION_RAMP_UP_LONG_SHARP_2_50,
  277. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SHARP_1_50,
  278. DRV2605L_EFFECT_TRANSITION_RAMP_UP_MEDIUM_SHARP_2_50,
  279. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SHARP_1_50,
  280. DRV2605L_EFFECT_TRANSITION_RAMP_UP_SHORT_SHARP_2_50,
  281. DRV2605L_EFFECT_LONG_BUZZ_FOR_PROGRAMMATIC_STOPPING,
  282. DRV2605L_EFFECT_SMOOTH_HUM_1_50,
  283. DRV2605L_EFFECT_SMOOTH_HUM_2_40,
  284. DRV2605L_EFFECT_SMOOTH_HUM_3_30,
  285. DRV2605L_EFFECT_SMOOTH_HUM_4_20,
  286. DRV2605L_EFFECT_SMOOTH_HUM_5_10,
  287. DRV2605L_EFFECT_COUNT
  288. } drv2605l_effect_t;
  289. /* Register bit array unions */
  290. typedef union { /* register 0x1A */
  291. uint8_t raw;
  292. struct {
  293. uint8_t BEMF_GAIN : 2;
  294. uint8_t LOOP_GAIN : 2;
  295. uint8_t BRAKE_FACTOR : 3;
  296. uint8_t ERM_LRA : 1;
  297. } bits;
  298. } drv2605l_reg_feedback_ctrl_t;
  299. typedef union { /* register 0x1B */
  300. uint8_t raw;
  301. struct {
  302. uint8_t C1_DRIVE_TIME : 5;
  303. uint8_t C1_AC_COUPLE : 1;
  304. uint8_t : 1;
  305. uint8_t C1_STARTUP_BOOST : 1;
  306. } bits;
  307. } drv2605l_reg_ctrl1_t;
  308. typedef union { /* register 0x1C */
  309. uint8_t raw;
  310. struct {
  311. uint8_t C2_IDISS_TIME : 2;
  312. uint8_t C2_BLANKING_TIME : 2;
  313. uint8_t C2_SAMPLE_TIME : 2;
  314. uint8_t C2_BRAKE_STAB : 1;
  315. uint8_t C2_BIDIR_INPUT : 1;
  316. } bits;
  317. } drv2605l_reg_ctrl2_t;
  318. typedef union { /* register 0x1D */
  319. uint8_t raw;
  320. struct {
  321. uint8_t C3_LRA_OPEN_LOOP : 1;
  322. uint8_t C3_N_PWM_ANALOG : 1;
  323. uint8_t C3_LRA_DRIVE_MODE : 1;
  324. uint8_t C3_DATA_FORMAT_RTO : 1;
  325. uint8_t C3_SUPPLY_COMP_DIS : 1;
  326. uint8_t C3_ERM_OPEN_LOOP : 1;
  327. uint8_t C3_NG_THRESH : 2;
  328. } bits;
  329. } drv2605l_reg_ctrl3_t;
  330. typedef union { /* register 0x1E */
  331. uint8_t raw;
  332. struct {
  333. uint8_t C4_OTP_PROGRAM : 1;
  334. uint8_t : 1;
  335. uint8_t C4_OTP_STATUS : 1;
  336. uint8_t : 1;
  337. uint8_t C4_AUTO_CAL_TIME : 2;
  338. uint8_t C4_ZC_DET_TIME : 2;
  339. } bits;
  340. } drv2605l_reg_ctrl4_t;