aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2021-08-20 21:14:23 -0700
committerGitHub <noreply@github.com>2021-08-20 21:14:23 -0700
commitda1c011afc67dab0049b30a4c021dc38a36cb9aa (patch)
tree8d4f3a4c46113c6a2dc5aed8fb79f2eca4bae51c /drivers
parent3452c89c8b5e652ff957123151ca0bbdfcbf3927 (diff)
downloadqmk_firmware-da1c011afc67dab0049b30a4c021dc38a36cb9aa.tar.gz
qmk_firmware-da1c011afc67dab0049b30a4c021dc38a36cb9aa.zip
Improve pmw3360 sensor and make it more hardware agnostic (#14097)
Diffstat (limited to 'drivers')
-rw-r--r--drivers/sensors/pmw3360.c80
-rw-r--r--drivers/sensors/pmw3360.h81
2 files changed, 87 insertions, 74 deletions
diff --git a/drivers/sensors/pmw3360.c b/drivers/sensors/pmw3360.c
index 13c5bdea2..17c4675ff 100644
--- a/drivers/sensors/pmw3360.c
+++ b/drivers/sensors/pmw3360.c
@@ -16,37 +16,69 @@
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */ 17 */
18 18
19#include "pmw3360.h"
19#include "wait.h" 20#include "wait.h"
20#include "debug.h" 21#include "debug.h"
21#include "print.h" 22#include "print.h"
22#include "pmw3360.h"
23#include "pmw3360_firmware.h" 23#include "pmw3360_firmware.h"
24 24
25bool _inBurst = false; 25// Registers
26#define REG_Product_ID 0x00
27#define REG_Revision_ID 0x01
28#define REG_Motion 0x02
29#define REG_Delta_X_L 0x03
30#define REG_Delta_X_H 0x04
31#define REG_Delta_Y_L 0x05
32#define REG_Delta_Y_H 0x06
33#define REG_SQUAL 0x07
34#define REG_Raw_Data_Sum 0x08
35#define REG_Maximum_Raw_data 0x09
36#define REG_Minimum_Raw_data 0x0A
37#define REG_Shutter_Lower 0x0B
38#define REG_Shutter_Upper 0x0C
39#define REG_Control 0x0D
40#define REG_Config1 0x0F
41#define REG_Config2 0x10
42#define REG_Angle_Tune 0x11
43#define REG_Frame_Capture 0x12
44#define REG_SROM_Enable 0x13
45#define REG_Run_Downshift 0x14
46#define REG_Rest1_Rate_Lower 0x15
47#define REG_Rest1_Rate_Upper 0x16
48#define REG_Rest1_Downshift 0x17
49#define REG_Rest2_Rate_Lower 0x18
50#define REG_Rest2_Rate_Upper 0x19
51#define REG_Rest2_Downshift 0x1A
52#define REG_Rest3_Rate_Lower 0x1B
53#define REG_Rest3_Rate_Upper 0x1C
54#define REG_Observation 0x24
55#define REG_Data_Out_Lower 0x25
56#define REG_Data_Out_Upper 0x26
57#define REG_Raw_Data_Dump 0x29
58#define REG_SROM_ID 0x2A
59#define REG_Min_SQ_Run 0x2B
60#define REG_Raw_Data_Threshold 0x2C
61#define REG_Config5 0x2F
62#define REG_Power_Up_Reset 0x3A
63#define REG_Shutdown 0x3B
64#define REG_Inverse_Product_ID 0x3F
65#define REG_LiftCutoff_Tune3 0x41
66#define REG_Angle_Snap 0x42
67#define REG_LiftCutoff_Tune1 0x4A
68#define REG_Motion_Burst 0x50
69#define REG_LiftCutoff_Tune_Timeout 0x58
70#define REG_LiftCutoff_Tune_Min_Length 0x5A
71#define REG_SROM_Load_Burst 0x62
72#define REG_Lift_Config 0x63
73#define REG_Raw_Data_Burst 0x64
74#define REG_LiftCutoff_Tune2 0x65
26 75
27#ifndef PMW_CPI 76bool _inBurst = false;
28# define PMW_CPI 1600
29#endif
30#ifndef PMW_CLOCK_SPEED
31# define PMW_CLOCK_SPEED 70000000
32#endif
33#ifndef SPI_MODE
34# define SPI_MODE 3
35#endif
36#ifndef SPI_DIVISOR
37# define SPI_DIVISOR (F_CPU / PMW_CLOCK_SPEED)
38#endif
39#ifndef ROTATIONAL_TRANSFORM_ANGLE
40# define ROTATIONAL_TRANSFORM_ANGLE 0x00
41#endif
42#ifndef PMW_CS_PIN
43# define PMW_CS_PIN SPI_SS_PIN
44#endif
45 77
46void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); } 78void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); }
47 79
48bool spi_start_adv(void) { 80bool spi_start_adv(void) {
49 bool status = spi_start(PMW_CS_PIN, false, SPI_MODE, SPI_DIVISOR); 81 bool status = spi_start(PMW3360_CS_PIN, PMW3360_SPI_LSBFIRST, PMW3360_SPI_MODE, PMW3360_SPI_DIVISOR);
50 wait_us(1); 82 wait_us(1);
51 return status; 83 return status;
52} 84}
@@ -106,7 +138,7 @@ uint16_t pmw_get_cpi(void) {
106} 138}
107 139
108bool pmw_spi_init(void) { 140bool pmw_spi_init(void) {
109 setPinOutput(PMW_CS_PIN); 141 setPinOutput(PMW3360_CS_PIN);
110 142
111 spi_init(); 143 spi_init();
112 _inBurst = false; 144 _inBurst = false;
@@ -137,7 +169,7 @@ bool pmw_spi_init(void) {
137 spi_stop_adv(); 169 spi_stop_adv();
138 170
139 wait_ms(10); 171 wait_ms(10);
140 pmw_set_cpi(PMW_CPI); 172 pmw_set_cpi(PMW3360_CPI);
141 173
142 wait_ms(1); 174 wait_ms(1);
143 175
@@ -147,7 +179,7 @@ bool pmw_spi_init(void) {
147 179
148 bool init_success = pmw_check_signature(); 180 bool init_success = pmw_check_signature();
149 181
150 writePinLow(PMW_CS_PIN); 182 writePinLow(PMW3360_CS_PIN);
151 183
152 return init_success; 184 return init_success;
153} 185}
diff --git a/drivers/sensors/pmw3360.h b/drivers/sensors/pmw3360.h
index d5b174179..3a2a536e5 100644
--- a/drivers/sensors/pmw3360.h
+++ b/drivers/sensors/pmw3360.h
@@ -20,56 +20,37 @@
20 20
21#include "spi_master.h" 21#include "spi_master.h"
22 22
23// Registers 23#ifndef PMW3360_CPI
24#define REG_Product_ID 0x00 24# define PMW3360_CPI 1600
25#define REG_Revision_ID 0x01 25#endif
26#define REG_Motion 0x02 26
27#define REG_Delta_X_L 0x03 27#ifndef PMW3360_CLOCK_SPEED
28#define REG_Delta_X_H 0x04 28# define PMW3360_CLOCK_SPEED 70000000
29#define REG_Delta_Y_L 0x05 29#endif
30#define REG_Delta_Y_H 0x06 30
31#define REG_SQUAL 0x07 31#ifndef PMW3360_SPI_LSBFIRST
32#define REG_Raw_Data_Sum 0x08 32# define PMW3360_SPI_LSBFIRST false
33#define REG_Maximum_Raw_data 0x09 33#endif
34#define REG_Minimum_Raw_data 0x0A 34
35#define REG_Shutter_Lower 0x0B 35#ifndef PMW3360_SPI_MODE
36#define REG_Shutter_Upper 0x0C 36# define PMW3360_SPI_MODE 3
37#define REG_Control 0x0D 37#endif
38#define REG_Config1 0x0F 38
39#define REG_Config2 0x10 39#ifndef PMW3360_SPI_DIVISOR
40#define REG_Angle_Tune 0x11 40# ifdef __AVR__
41#define REG_Frame_Capture 0x12 41# define PMW3360_SPI_DIVISOR (F_CPU / PMW3360_CLOCK_SPEED)
42#define REG_SROM_Enable 0x13 42# else
43#define REG_Run_Downshift 0x14 43# define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64
44#define REG_Rest1_Rate_Lower 0x15 44# endif
45#define REG_Rest1_Rate_Upper 0x16 45#endif
46#define REG_Rest1_Downshift 0x17 46
47#define REG_Rest2_Rate_Lower 0x18 47#ifndef ROTATIONAL_TRANSFORM_ANGLE
48#define REG_Rest2_Rate_Upper 0x19 48# define ROTATIONAL_TRANSFORM_ANGLE 0x00
49#define REG_Rest2_Downshift 0x1A 49#endif
50#define REG_Rest3_Rate_Lower 0x1B 50
51#define REG_Rest3_Rate_Upper 0x1C 51#ifndef PMW3360_CS_PIN
52#define REG_Observation 0x24 52# error "No chip select pin defined -- missing PMW3360_CS_PIN"
53#define REG_Data_Out_Lower 0x25 53#endif
54#define REG_Data_Out_Upper 0x26
55#define REG_Raw_Data_Dump 0x29
56#define REG_SROM_ID 0x2A
57#define REG_Min_SQ_Run 0x2B
58#define REG_Raw_Data_Threshold 0x2C
59#define REG_Config5 0x2F
60#define REG_Power_Up_Reset 0x3A
61#define REG_Shutdown 0x3B
62#define REG_Inverse_Product_ID 0x3F
63#define REG_LiftCutoff_Tune3 0x41
64#define REG_Angle_Snap 0x42
65#define REG_LiftCutoff_Tune1 0x4A
66#define REG_Motion_Burst 0x50
67#define REG_LiftCutoff_Tune_Timeout 0x58
68#define REG_LiftCutoff_Tune_Min_Length 0x5A
69#define REG_SROM_Load_Burst 0x62
70#define REG_Lift_Config 0x63
71#define REG_Raw_Data_Burst 0x64
72#define REG_LiftCutoff_Tune2 0x65
73 54
74#ifdef CONSOLE_ENABLE 55#ifdef CONSOLE_ENABLE
75void print_byte(uint8_t byte); 56void print_byte(uint8_t byte);