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); |
