forked from mfulz_github/qmk_firmware
		
	[Bug][Core] Fix optical sensor firmware upload (#15919)
This commit is contained in:
		
							parent
							
								
									24324378a8
								
							
						
					
					
						commit
						6ebb44f17e
					
				@ -41,7 +41,7 @@ POINTING_DEVICE_DRIVER = adns9800
 | 
				
			|||||||
The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking. 
 | 
					The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Setting                        | Description                                                            | Default       |
 | 
					| Setting                        | Description                                                            | Default       |
 | 
				
			||||||
|------------------------|------------------------------------------------------------------------|---------------|
 | 
					|--------------------------------|------------------------------------------------------------------------|---------------|
 | 
				
			||||||
|`ADNS9800_CLOCK_SPEED`          | (Optional) Sets the clock speed that the sensor runs at.               | `2000000`     |
 | 
					|`ADNS9800_CLOCK_SPEED`          | (Optional) Sets the clock speed that the sensor runs at.               | `2000000`     |
 | 
				
			||||||
|`ADNS9800_SPI_LSBFIRST`         | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false`       |
 | 
					|`ADNS9800_SPI_LSBFIRST`         | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false`       |
 | 
				
			||||||
|`ADNS9800_SPI_MODE`             | (Optional) Sets the SPI Mode for the sensor.                           | `3`           |
 | 
					|`ADNS9800_SPI_MODE`             | (Optional) Sets the SPI Mode for the sensor.                           | `3`           |
 | 
				
			||||||
@ -150,8 +150,8 @@ The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for su
 | 
				
			|||||||
|`PMW3360_SPI_MODE`               | (Optional) Sets the SPI Mode for the sensor.                                               | `3`           |
 | 
					|`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_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`        |
 | 
					|`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`           |
 | 
					|`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_     |
 | 
					|`PMW3360_FIRMWARE_UPLOAD_FAST`   | (Optional) Skips the 15us wait between firmware blocks.                                    | _not defined_ |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
 | 
					The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -174,6 +174,7 @@ The PMW 3389 is an SPI driven optical sensor, that uses a built in IR LED for su
 | 
				
			|||||||
|`PMW3389_SPI_DIVISOR`            | (Optional) Sets the SPI Divisor used for SPI communication.                                | _varies_      |
 | 
					|`PMW3389_SPI_DIVISOR`            | (Optional) Sets the SPI Divisor used for SPI communication.                                | _varies_      |
 | 
				
			||||||
|`PMW3389_LIFTOFF_DISTANCE`       | (Optional) Sets the lift off distance at run time                                          | `0x02`        |
 | 
					|`PMW3389_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`           |
 | 
					|`ROTATIONAL_TRANSFORM_ANGLE`     | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0`           |
 | 
				
			||||||
 | 
					|`PMW3389_FIRMWARE_UPLOAD_FAST`   | (Optional) Skips the 15us wait between firmware blocks.                                    | _not defined_ |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
 | 
					The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -135,10 +135,8 @@ void adns9800_init() {
 | 
				
			|||||||
    wait_us(15);
 | 
					    wait_us(15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // send all bytes of the firmware
 | 
					    // send all bytes of the firmware
 | 
				
			||||||
    unsigned char c;
 | 
					    for (uint16_t i = 0; i < FIRMWARE_LENGTH; i++) {
 | 
				
			||||||
    for (int i = 0; i < FIRMWARE_LENGTH; i++) {
 | 
					        spi_write(pgm_read_byte(firmware_data + i));
 | 
				
			||||||
        c = (unsigned char)pgm_read_byte(adns9800_firmware_data + i);
 | 
					 | 
				
			||||||
        spi_write(c);
 | 
					 | 
				
			||||||
        wait_us(15);
 | 
					        wait_us(15);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// clang-format off
 | 
					// clang-format off
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const uint8_t adns9800_firmware_data[FIRMWARE_LENGTH] PROGMEM = {
 | 
					const uint8_t firmware_data[FIRMWARE_LENGTH] PROGMEM = {
 | 
				
			||||||
    0x03, 0xA6, 0x68, 0x1E, 0x7D, 0x10, 0x7E, 0x7E, 0x5F, 0x1C, 0xB8, 0xF2, 0x47, 0x0C, 0x7B, 0x74,
 | 
					    0x03, 0xA6, 0x68, 0x1E, 0x7D, 0x10, 0x7E, 0x7E, 0x5F, 0x1C, 0xB8, 0xF2, 0x47, 0x0C, 0x7B, 0x74,
 | 
				
			||||||
    0x4B, 0x14, 0x8B, 0x75, 0x66, 0x51, 0x0B, 0x8C, 0x76, 0x74, 0x4B, 0x14, 0xAA, 0xD6, 0x0F, 0x9C,
 | 
					    0x4B, 0x14, 0x8B, 0x75, 0x66, 0x51, 0x0B, 0x8C, 0x76, 0x74, 0x4B, 0x14, 0xAA, 0xD6, 0x0F, 0x9C,
 | 
				
			||||||
    0xBA, 0xF6, 0x6E, 0x3F, 0xDD, 0x38, 0xD5, 0x02, 0x80, 0x9B, 0x82, 0x6D, 0x58, 0x13, 0xA4, 0xAB,
 | 
					    0xBA, 0xF6, 0x6E, 0x3F, 0xDD, 0x38, 0xD5, 0x02, 0x80, 0x9B, 0x82, 0x6D, 0x58, 0x13, 0xA4, 0xAB,
 | 
				
			||||||
 | 
				
			|||||||
@ -206,16 +206,12 @@ void pmw3360_upload_firmware(void) {
 | 
				
			|||||||
    spi_write(REG_SROM_Load_Burst | 0x80);
 | 
					    spi_write(REG_SROM_Load_Burst | 0x80);
 | 
				
			||||||
    wait_us(15);
 | 
					    wait_us(15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PMW3360_LEGACY_FIRMWARE_UPLOAD
 | 
					    for (uint16_t i = 0; i < FIRMWARE_LENGTH; i++) {
 | 
				
			||||||
    unsigned char c;
 | 
					        spi_write(pgm_read_byte(firmware_data + i));
 | 
				
			||||||
    for (int i = 0; i < FIRMWARE_LENGTH; i++) {
 | 
					#ifndef PMW3360_FIRMWARE_UPLOAD_FAST
 | 
				
			||||||
        c = (unsigned char)pgm_read_byte(firmware_data + i);
 | 
					 | 
				
			||||||
        spi_write(c);
 | 
					 | 
				
			||||||
        wait_us(15);
 | 
					        wait_us(15);
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    spi_transmit(firmware_data, sizeof(firmware_data));
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    wait_us(200);
 | 
					    wait_us(200);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pmw3360_read(REG_SROM_ID);
 | 
					    pmw3360_read(REG_SROM_ID);
 | 
				
			||||||
 | 
				
			|||||||
@ -210,14 +210,12 @@ void pmw3389_upload_firmware(void) {
 | 
				
			|||||||
    spi_write(REG_SROM_Load_Burst | 0x80);
 | 
					    spi_write(REG_SROM_Load_Burst | 0x80);
 | 
				
			||||||
    wait_us(15);
 | 
					    wait_us(15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // legacy only for PMW3389 spi_transmit failed to load firmware
 | 
					    for (uint16_t i = 0; i < FIRMWARE_LENGTH; i++) {
 | 
				
			||||||
    unsigned char c;
 | 
					        spi_write(pgm_read_byte(firmware_data + i));
 | 
				
			||||||
    for (int i = 0; i < FIRMWARE_LENGTH; i++) {
 | 
					#ifndef PMW3389_FIRMWARE_UPLOAD_FAST
 | 
				
			||||||
        c = (unsigned char)pgm_read_byte(firmware_data + i);
 | 
					 | 
				
			||||||
        spi_write(c);
 | 
					 | 
				
			||||||
        wait_us(15);
 | 
					        wait_us(15);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    wait_us(200);
 | 
					    wait_us(200);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pmw3389_read(REG_SROM_ID);
 | 
					    pmw3389_read(REG_SROM_ID);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user