summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2022-01-10 14:57:36 -0800
committerGitHub <noreply@github.com>2022-01-10 14:57:36 -0800
commitec7c3ac12dbc355218bae9c392e96b8d513fb95d (patch)
tree0c38c1b28697c242fc3b8c573dbd7625cf18aba2
parent2fbdfae4b740a7b274ceb73cd29de76755fe1542 (diff)
downloadqmk_firmware-ec7c3ac12dbc355218bae9c392e96b8d513fb95d.tar.gz
qmk_firmware-ec7c3ac12dbc355218bae9c392e96b8d513fb95d.zip
Optimize initialization of PMW3360 Sensor (#15821)
-rw-r--r--docs/feature_pointing_device.md15
-rw-r--r--drivers/sensors/pmw3360.c4
2 files changed, 12 insertions, 7 deletions
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index b1015f3cd3..ecf6d5c6d4 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -144,13 +144,14 @@ The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for su
| Setting | Description | Default |
|-----------------------------|--------------------------------------------------------------------------------------------|---------------|
-|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
-|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
-|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
-|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
-|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
-|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
-|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
+|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
+|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
+|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
+|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
+|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
+|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
+|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 127 degrees directly in the sensor. | `0` |
+|`PMW3360_LEGACY_FIRMWARE_UPLOAD` | (Optional) Switches to older, manual upload of firmware, for compatibility. | _not defined_ |
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
diff --git a/drivers/sensors/pmw3360.c b/drivers/sensors/pmw3360.c
index ad0a724ee4..4712f6015c 100644
--- a/drivers/sensors/pmw3360.c
+++ b/drivers/sensors/pmw3360.c
@@ -209,12 +209,16 @@ void pmw3360_upload_firmware(void) {
spi_write(REG_SROM_Load_Burst | 0x80);
wait_us(15);
+#ifdef PMW3360_LEGACY_FIRMWARE_UPLOAD
unsigned char c;
for (int i = 0; i < FIRMWARE_LENGTH; i++) {
c = (unsigned char)pgm_read_byte(firmware_data + i);
spi_write(c);
wait_us(15);
}
+#else
+ spi_transmit(firmware_data, sizeof(firmware_data));
+#endif
wait_us(200);
pmw3360_read(REG_SROM_ID);