PixArt Optical Track Sensor, OTS, library initial release v1.0. Supports PAT9125, PAT9126, PAT9130, PAA5101. Future to support PAT9150.

Fork of Pixart_OTS by Hill Chen

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?

UserRevisionLine numberNew 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 }