PixArt Optical Track Sensor, OTS, library initial release v1.0. Supports PAT9125, PAT9126, PAT9130, PAA5101. Future to support PAT9150.
Fork of Pixart_OTS by
Pixart_OTS_Task.cpp@1:95917b856631, 2019-03-26 (annotated)
- Committer:
- PixArtHC
- Date:
- Tue Mar 26 22:32:06 2019 +0000
- Revision:
- 1:95917b856631
* V1.1 library changes:; * Add support to 5101 LD/LED switching.; * Add support to PAT9150.; * Fixed bug on loading initialization setting.; * Optimized register read timing.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PixArtHC | 1:95917b856631 | 1 | /* PixArt Optical Finger Navigation, OFN, sensor driver. |
PixArtHC | 1:95917b856631 | 2 | * By PixArt Imaging Inc. |
PixArtHC | 1:95917b856631 | 3 | * Primary Engineer: Hill Chen (PixArt USA) |
PixArtHC | 1:95917b856631 | 4 | * |
PixArtHC | 1:95917b856631 | 5 | * License: Apache-2.0; http://www.apache.org/licenses/LICENSE-2.0 |
PixArtHC | 1:95917b856631 | 6 | */ |
PixArtHC | 1:95917b856631 | 7 | |
PixArtHC | 1:95917b856631 | 8 | #include "Pixart_OTS_Task.h" |
PixArtHC | 1:95917b856631 | 9 | |
PixArtHC | 1:95917b856631 | 10 | Pixart_OTS_Task_5101::Pixart_OTS_Task_5101(DigitalOut &ldp_enl_pin) |
PixArtHC | 1:95917b856631 | 11 | : LD2LED_TH(0x700) |
PixArtHC | 1:95917b856631 | 12 | , LED2LD_TH(0x500) |
PixArtHC | 1:95917b856631 | 13 | , FIQ_AVG(0) |
PixArtHC | 1:95917b856631 | 14 | , FIQt(0) |
PixArtHC | 1:95917b856631 | 15 | , EXTLED_ON(0) |
PixArtHC | 1:95917b856631 | 16 | , m_ldp_enl(ldp_enl_pin) |
PixArtHC | 1:95917b856631 | 17 | { |
PixArtHC | 1:95917b856631 | 18 | m_ldp_enl = 0; |
PixArtHC | 1:95917b856631 | 19 | } |
PixArtHC | 1:95917b856631 | 20 | |
PixArtHC | 1:95917b856631 | 21 | void Pixart_OTS_Task_5101::reset_task(Pixart_ComPort &com_port) |
PixArtHC | 1:95917b856631 | 22 | { |
PixArtHC | 1:95917b856631 | 23 | com_port.writeRegister(0x7F, 0x00); |
PixArtHC | 1:95917b856631 | 24 | com_port.writeRegister(0x08, 0x01); |
PixArtHC | 1:95917b856631 | 25 | } |
PixArtHC | 1:95917b856631 | 26 | |
PixArtHC | 1:95917b856631 | 27 | void Pixart_OTS_Task_5101::pre_task(Pixart_ComPort &com_port) |
PixArtHC | 1:95917b856631 | 28 | { |
PixArtHC | 1:95917b856631 | 29 | com_port.writeRegister(0x5D, 0x3E); |
PixArtHC | 1:95917b856631 | 30 | wait_ms(10); // 10ms delay |
PixArtHC | 1:95917b856631 | 31 | com_port.writeRegister(0x5D, 0x3F); |
PixArtHC | 1:95917b856631 | 32 | PAA5101_LD_MODE(com_port); // LD mode is default |
PixArtHC | 1:95917b856631 | 33 | com_port.writeRegister(0x09, 0x00); // enable write protect |
PixArtHC | 1:95917b856631 | 34 | } |
PixArtHC | 1:95917b856631 | 35 | |
PixArtHC | 1:95917b856631 | 36 | void Pixart_OTS_Task_5101::periodic_task(Pixart_ComPort &com_port) |
PixArtHC | 1:95917b856631 | 37 | { |
PixArtHC | 1:95917b856631 | 38 | uint8_t loopi = 0; |
PixArtHC | 1:95917b856631 | 39 | FIQ_AVG = 0; |
PixArtHC | 1:95917b856631 | 40 | |
PixArtHC | 1:95917b856631 | 41 | uint8_t data_msb = com_port.readRegister(0x75); |
PixArtHC | 1:95917b856631 | 42 | uint8_t data_lsb = com_port.readRegister(0x76); |
PixArtHC | 1:95917b856631 | 43 | FIQ[FIQt] = ((uint16_t)(data_msb))*256 + (uint16_t)data_lsb; |
PixArtHC | 1:95917b856631 | 44 | |
PixArtHC | 1:95917b856631 | 45 | if(FIQt==7) //every 8 sampling to decide LD/LED mode |
PixArtHC | 1:95917b856631 | 46 | { |
PixArtHC | 1:95917b856631 | 47 | for(loopi=0;loopi<8;loopi++) |
PixArtHC | 1:95917b856631 | 48 | { |
PixArtHC | 1:95917b856631 | 49 | FIQ_AVG = FIQ_AVG + FIQ[loopi]; |
PixArtHC | 1:95917b856631 | 50 | } |
PixArtHC | 1:95917b856631 | 51 | |
PixArtHC | 1:95917b856631 | 52 | if(EXTLED_ON == 1 && FIQ_AVG < LED2LD_TH) // Check if change to LD MODE |
PixArtHC | 1:95917b856631 | 53 | { |
PixArtHC | 1:95917b856631 | 54 | PAA5101_LD_MODE(com_port); |
PixArtHC | 1:95917b856631 | 55 | wait_ms(40); // delay for light source change |
PixArtHC | 1:95917b856631 | 56 | com_port.writeRegister(0x03,0x00); |
PixArtHC | 1:95917b856631 | 57 | } |
PixArtHC | 1:95917b856631 | 58 | else if(EXTLED_ON == 0 && FIQ_AVG < LD2LED_TH) // Check if change to external LED MODE |
PixArtHC | 1:95917b856631 | 59 | { |
PixArtHC | 1:95917b856631 | 60 | PAA5101_EXTLED_MODE(com_port); |
PixArtHC | 1:95917b856631 | 61 | wait_ms(40); // delay for light source change |
PixArtHC | 1:95917b856631 | 62 | com_port.writeRegister(0x03,0x00); |
PixArtHC | 1:95917b856631 | 63 | } |
PixArtHC | 1:95917b856631 | 64 | } |
PixArtHC | 1:95917b856631 | 65 | FIQt = (FIQt+1) & 0x07; |
PixArtHC | 1:95917b856631 | 66 | // LD/LED switch process END |
PixArtHC | 1:95917b856631 | 67 | } |
PixArtHC | 1:95917b856631 | 68 | |
PixArtHC | 1:95917b856631 | 69 | void Pixart_OTS_Task_5101::PAA5101_LD_MODE(Pixart_ComPort &com_port) |
PixArtHC | 1:95917b856631 | 70 | { |
PixArtHC | 1:95917b856631 | 71 | EXTLED_ON = 0; // Mode index: LD |
PixArtHC | 1:95917b856631 | 72 | |
PixArtHC | 1:95917b856631 | 73 | com_port.writeRegister(0x7F, 0x00); // Bank0 |
PixArtHC | 1:95917b856631 | 74 | com_port.writeRegister(0x09, 0x5A); // disable write protect |
PixArtHC | 1:95917b856631 | 75 | com_port.writeRegister(0x53, 0x01); |
PixArtHC | 1:95917b856631 | 76 | com_port.writeRegister(0x07, 0xCC); |
PixArtHC | 1:95917b856631 | 77 | com_port.writeRegister(0x0D, 0x05); |
PixArtHC | 1:95917b856631 | 78 | com_port.writeRegister(0x0E, 0x05); |
PixArtHC | 1:95917b856631 | 79 | com_port.writeRegister(0x19, 0x24); |
PixArtHC | 1:95917b856631 | 80 | com_port.writeRegister(0x7F, 0x01); // Bank1 |
PixArtHC | 1:95917b856631 | 81 | com_port.writeRegister(0x1D, 0x18); |
PixArtHC | 1:95917b856631 | 82 | com_port.writeRegister(0x1F, 0x12); |
PixArtHC | 1:95917b856631 | 83 | com_port.writeRegister(0x42, 0x40); |
PixArtHC | 1:95917b856631 | 84 | com_port.writeRegister(0x37, 0x60); |
PixArtHC | 1:95917b856631 | 85 | com_port.writeRegister(0x43, 0x0A); |
PixArtHC | 1:95917b856631 | 86 | com_port.writeRegister(0x7F, 0x04); // Bank4 |
PixArtHC | 1:95917b856631 | 87 | com_port.writeRegister(0x06, 0x03); |
PixArtHC | 1:95917b856631 | 88 | com_port.writeRegister(0x7F, 0x05); // Bank5 |
PixArtHC | 1:95917b856631 | 89 | com_port.writeRegister(0x2E, 0x02); |
PixArtHC | 1:95917b856631 | 90 | com_port.writeRegister(0x48, 0x00); |
PixArtHC | 1:95917b856631 | 91 | com_port.writeRegister(0x3E, 0x05); |
PixArtHC | 1:95917b856631 | 92 | com_port.writeRegister(0x7F, 0x06); // Bank6 |
PixArtHC | 1:95917b856631 | 93 | com_port.writeRegister(0x34, 0x01); |
PixArtHC | 1:95917b856631 | 94 | com_port.writeRegister(0x7F, 0x00); // Bank0 |
PixArtHC | 1:95917b856631 | 95 | com_port.writeRegister(0x09, 0x00); // enable write protect |
PixArtHC | 1:95917b856631 | 96 | |
PixArtHC | 1:95917b856631 | 97 | m_ldp_enl = 0; // GPIO controls PMOS to low (i.e. turn on LD power) |
PixArtHC | 1:95917b856631 | 98 | } |
PixArtHC | 1:95917b856631 | 99 | |
PixArtHC | 1:95917b856631 | 100 | void Pixart_OTS_Task_5101::PAA5101_EXTLED_MODE(Pixart_ComPort &com_port) |
PixArtHC | 1:95917b856631 | 101 | { |
PixArtHC | 1:95917b856631 | 102 | EXTLED_ON = 1; // Mode index: LED |
PixArtHC | 1:95917b856631 | 103 | m_ldp_enl = 1; // GPIO controls PMOS to high (i.e. turn off LD power) |
PixArtHC | 1:95917b856631 | 104 | |
PixArtHC | 1:95917b856631 | 105 | com_port.writeRegister(0x7F, 0x00); // Bank0 |
PixArtHC | 1:95917b856631 | 106 | com_port.writeRegister(0x09, 0x5A); // disable write protect |
PixArtHC | 1:95917b856631 | 107 | com_port.writeRegister(0x07, 0x55); |
PixArtHC | 1:95917b856631 | 108 | com_port.writeRegister(0x0D, 0x7D); |
PixArtHC | 1:95917b856631 | 109 | com_port.writeRegister(0x0E, 0x7D); |
PixArtHC | 1:95917b856631 | 110 | com_port.writeRegister(0x19, 0x3C); |
PixArtHC | 1:95917b856631 | 111 | com_port.writeRegister(0x7F, 0x01); // Bank1 |
PixArtHC | 1:95917b856631 | 112 | com_port.writeRegister(0x1D, 0x00); |
PixArtHC | 1:95917b856631 | 113 | com_port.writeRegister(0x1F, 0x00); |
PixArtHC | 1:95917b856631 | 114 | com_port.writeRegister(0x42, 0x20); |
PixArtHC | 1:95917b856631 | 115 | com_port.writeRegister(0x37, 0x18); |
PixArtHC | 1:95917b856631 | 116 | com_port.writeRegister(0x43, 0x02); |
PixArtHC | 1:95917b856631 | 117 | com_port.writeRegister(0x7F, 0x04); // Bank4 |
PixArtHC | 1:95917b856631 | 118 | com_port.writeRegister(0x06, 0x00); |
PixArtHC | 1:95917b856631 | 119 | com_port.writeRegister(0x7F, 0x05); // Bank5 |
PixArtHC | 1:95917b856631 | 120 | com_port.writeRegister(0x2E, 0x08); |
PixArtHC | 1:95917b856631 | 121 | com_port.writeRegister(0x48, 0x02); |
PixArtHC | 1:95917b856631 | 122 | com_port.writeRegister(0x3E, 0x85); |
PixArtHC | 1:95917b856631 | 123 | com_port.writeRegister(0x7F, 0x06); // Bank6 |
PixArtHC | 1:95917b856631 | 124 | com_port.writeRegister(0x34, 0x09); |
PixArtHC | 1:95917b856631 | 125 | com_port.writeRegister(0x7F, 0x00); // Bank0 |
PixArtHC | 1:95917b856631 | 126 | com_port.writeRegister(0x53, 0x00); |
PixArtHC | 1:95917b856631 | 127 | com_port.writeRegister(0x09, 0x00); // enable write protect |
PixArtHC | 1:95917b856631 | 128 | } |