diff options
Diffstat (limited to 'drivers/sensors/pmw3360.c')
| -rw-r--r-- | drivers/sensors/pmw3360.c | 80 |
1 files changed, 56 insertions, 24 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 | } |
