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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Pixart_OTS_Task.cpp Source File

Pixart_OTS_Task.cpp

00001 /* PixArt Optical Finger Navigation, OFN, sensor driver.
00002  * By PixArt Imaging Inc.
00003  * Primary Engineer: Hill Chen (PixArt USA)
00004  *
00005  * License: Apache-2.0; http://www.apache.org/licenses/LICENSE-2.0
00006  */
00007  
00008 #include "Pixart_OTS_Task.h"
00009 
00010 Pixart_OTS_Task_5101::Pixart_OTS_Task_5101(DigitalOut &ldp_enl_pin)
00011     : LD2LED_TH(0x700)
00012     , LED2LD_TH(0x500)
00013     , FIQ_AVG(0)
00014     , FIQt(0)
00015     , EXTLED_ON(0)
00016     , m_ldp_enl(ldp_enl_pin)
00017 {
00018     m_ldp_enl = 0;
00019 }
00020 
00021 void Pixart_OTS_Task_5101::reset_task(Pixart_ComPort &com_port)
00022 {
00023     com_port.writeRegister(0x7F, 0x00);
00024     com_port.writeRegister(0x08, 0x01);
00025 }
00026 
00027 void Pixart_OTS_Task_5101::pre_task(Pixart_ComPort &com_port)
00028 {
00029     com_port.writeRegister(0x5D, 0x3E);
00030     wait_ms(10); // 10ms delay
00031     com_port.writeRegister(0x5D, 0x3F);
00032     PAA5101_LD_MODE(com_port); // LD mode is default
00033     com_port.writeRegister(0x09, 0x00); // enable write protect
00034 }
00035 
00036 void Pixart_OTS_Task_5101::periodic_task(Pixart_ComPort &com_port)
00037 {
00038     uint8_t loopi = 0;
00039     FIQ_AVG = 0;
00040     
00041     uint8_t data_msb = com_port.readRegister(0x75);
00042     uint8_t data_lsb = com_port.readRegister(0x76);
00043     FIQ[FIQt] = ((uint16_t)(data_msb))*256 + (uint16_t)data_lsb;
00044     
00045     if(FIQt==7) //every 8 sampling to decide LD/LED mode
00046     {
00047         for(loopi=0;loopi<8;loopi++)
00048         {
00049             FIQ_AVG = FIQ_AVG + FIQ[loopi];
00050         }
00051         
00052         if(EXTLED_ON == 1 && FIQ_AVG < LED2LD_TH) // Check if change to LD MODE
00053         {
00054             PAA5101_LD_MODE(com_port);
00055             wait_ms(40); // delay for light source change
00056             com_port.writeRegister(0x03,0x00);
00057         }
00058         else if(EXTLED_ON == 0 && FIQ_AVG < LD2LED_TH) // Check if change to external LED MODE
00059         {
00060             PAA5101_EXTLED_MODE(com_port);
00061             wait_ms(40); // delay for light source change
00062             com_port.writeRegister(0x03,0x00);
00063         }
00064     }
00065     FIQt = (FIQt+1) & 0x07;
00066     // LD/LED switch process END
00067 }
00068 
00069 void Pixart_OTS_Task_5101::PAA5101_LD_MODE(Pixart_ComPort &com_port)
00070 {
00071     EXTLED_ON = 0; // Mode index: LD
00072     
00073     com_port.writeRegister(0x7F, 0x00); // Bank0
00074     com_port.writeRegister(0x09, 0x5A); // disable write protect
00075     com_port.writeRegister(0x53, 0x01);
00076     com_port.writeRegister(0x07, 0xCC);
00077     com_port.writeRegister(0x0D, 0x05);
00078     com_port.writeRegister(0x0E, 0x05);
00079     com_port.writeRegister(0x19, 0x24);
00080     com_port.writeRegister(0x7F, 0x01); // Bank1
00081     com_port.writeRegister(0x1D, 0x18);
00082     com_port.writeRegister(0x1F, 0x12);
00083     com_port.writeRegister(0x42, 0x40);
00084     com_port.writeRegister(0x37, 0x60);
00085     com_port.writeRegister(0x43, 0x0A);
00086     com_port.writeRegister(0x7F, 0x04); // Bank4
00087     com_port.writeRegister(0x06, 0x03);
00088     com_port.writeRegister(0x7F, 0x05); // Bank5
00089     com_port.writeRegister(0x2E, 0x02);
00090     com_port.writeRegister(0x48, 0x00);
00091     com_port.writeRegister(0x3E, 0x05);
00092     com_port.writeRegister(0x7F, 0x06); // Bank6
00093     com_port.writeRegister(0x34, 0x01);
00094     com_port.writeRegister(0x7F, 0x00); // Bank0
00095     com_port.writeRegister(0x09, 0x00); // enable write protect
00096     
00097     m_ldp_enl = 0; // GPIO controls PMOS to low (i.e. turn on LD power)
00098 }
00099 
00100 void Pixart_OTS_Task_5101::PAA5101_EXTLED_MODE(Pixart_ComPort &com_port)
00101 {
00102     EXTLED_ON = 1; // Mode index: LED
00103     m_ldp_enl = 1; // GPIO controls PMOS to high (i.e. turn off LD power)
00104     
00105     com_port.writeRegister(0x7F, 0x00); // Bank0
00106     com_port.writeRegister(0x09, 0x5A); // disable write protect
00107     com_port.writeRegister(0x07, 0x55);
00108     com_port.writeRegister(0x0D, 0x7D);
00109     com_port.writeRegister(0x0E, 0x7D);
00110     com_port.writeRegister(0x19, 0x3C);
00111     com_port.writeRegister(0x7F, 0x01); // Bank1
00112     com_port.writeRegister(0x1D, 0x00);
00113     com_port.writeRegister(0x1F, 0x00);
00114     com_port.writeRegister(0x42, 0x20);
00115     com_port.writeRegister(0x37, 0x18);
00116     com_port.writeRegister(0x43, 0x02);
00117     com_port.writeRegister(0x7F, 0x04); // Bank4
00118     com_port.writeRegister(0x06, 0x00);
00119     com_port.writeRegister(0x7F, 0x05); // Bank5
00120     com_port.writeRegister(0x2E, 0x08);
00121     com_port.writeRegister(0x48, 0x02);
00122     com_port.writeRegister(0x3E, 0x85);
00123     com_port.writeRegister(0x7F, 0x06); // Bank6
00124     com_port.writeRegister(0x34, 0x09);
00125     com_port.writeRegister(0x7F, 0x00); // Bank0
00126     com_port.writeRegister(0x53, 0x00);
00127     com_port.writeRegister(0x09, 0x00); // enable write protect
00128 }