diff options
author | Drashna Jaelre <drashna@live.com> | 2021-08-20 21:14:23 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-20 21:14:23 -0700 |
commit | da1c011afc67dab0049b30a4c021dc38a36cb9aa (patch) | |
tree | 8d4f3a4c46113c6a2dc5aed8fb79f2eca4bae51c /drivers | |
parent | 3452c89c8b5e652ff957123151ca0bbdfcbf3927 (diff) | |
download | qmk_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.c | 80 | ||||
-rw-r--r-- | drivers/sensors/pmw3360.h | 81 |
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 | ||
25 | bool _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 | 76 | bool _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 | ||
46 | void 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')); } | 78 | void 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 | ||
48 | bool spi_start_adv(void) { | 80 | bool 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 | ||
108 | bool pmw_spi_init(void) { | 140 | bool 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 |
75 | void print_byte(uint8_t byte); | 56 | void print_byte(uint8_t byte); |