Avago ADNS6010 mouse chip library This class referred to ADNS5020EN library http://mbed.org/users/IPAB/programs/ADNS5020EN/5zwdp

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ADNS6010.cpp Source File

ADNS6010.cpp

00001 #include "ADNS6010.h"
00002 
00003 ADNS6010::ADNS6010(PinName mosi, PinName miso, PinName sclk, PinName ncs, PinName reset,PinName npd)
00004         : spi_(mosi, miso, sclk), npd_(npd),reset_(reset), ncs_(ncs) {
00005     spi_.format(8,3);
00006     spi_.frequency(500000);
00007 
00008     // Chip Reset
00009     creset();
00010     start();
00011    
00012     npd_ =1;
00013     wait_ms(1);
00014 
00015     int prod_id = cread(REGISTER_PRODUCTID); // read Product ID register
00016     int rev_id = cread(REGISTER_REVISONID); // read Revision ID register
00017 
00018     if ((prod_id!=ADNS6010_PRODUCTID)||(rev_id!=ADNS6010_REVISIONID)) {
00019         error("The connection with the ADNS-6010 is not established\n");
00020     } 
00021     
00022 }
00023 
00024 // write data to a register
00025 void ADNS6010::cwrite(unsigned char caddress, unsigned char cdata) {
00026     ncs_=0;
00027     // send the command to read the register
00028     caddress |= 0x80;
00029     spi_.write(caddress);
00030     // send dummy byte
00031     spi_.write(cdata);
00032     ncs_=1;
00033     
00034     wait_us(10); // more than the minimum for safety
00035 }
00036 
00037 
00038 // mouse chip - change resolurion
00039 void ADNS6010::changeCPI(int cpi) {
00040     int config = 0x49;//resolution reset(=default=400)
00041     
00042     switch (cpi) {
00043         case 400:
00044             //config = config & 0x49
00045             break;
00046             
00047         case 800: // Change cpi to 800
00048             config |= 0x10;
00049             break;
00050 
00051         case 1600: // Change cpi to 1600
00052             config |= 0x04;
00053             break;
00054 
00055         case 2000: // Change cpi to 2000
00056             config |= 0x14;
00057             break;
00058 
00059         default:
00060             error("setting fault\n cpi setting is only 400 or 800 or 1600 or 2000\n\r");
00061             break;
00062     }
00063     
00064     cwrite(REGISTER_CONFIGURATION_BITS,config);
00065 }
00066 
00067 
00068 void ADNS6010::end()
00069 {
00070     npd_=0;
00071 }
00072 
00073 void ADNS6010::start()
00074 {
00075     npd_=1;
00076 }
00077 
00078 void ADNS6010::creset()
00079 {
00080     reset_ = 1;
00081     wait_us(10);
00082     reset_ = 0;
00083 }
00084 
00085 void ADNS6010::set_freq(int freq)
00086 {
00087     if(freq>=500000&&freq<=2000000)
00088     {
00089         spi_.frequency(freq);
00090     }
00091 }
00092 
00093 int ADNS6010::read_squal()
00094 {
00095     return cread(REGISTER_SQUAL)*4;
00096 }
00097 
00098 // read the delta_X and delta_Y of the chip
00099 void ADNS6010::read_deltas(int* a_dx, int* a_dy) {
00100 
00101     int * dx, * dy;
00102     dx=(int*)a_dx;
00103     dy=(int*)a_dy;
00104     *dx = 0;
00105     *dy = 0;
00106 
00107     int motion = cread(REGISTER_MOTION); // read Motion register
00108     
00109     if ((motion&0x80)==0x80) {
00110         *dx = MChipMotion(cread(REGISTER_DELTAX));
00111         *dy = MChipMotion(cread(REGISTER_DELTAY));
00112     }
00113 }
00114 
00115 // read a register
00116 int ADNS6010::cread(unsigned char cregister) {
00117 
00118     ncs_=0;
00119     // send the command to read the register
00120     spi_.write(cregister);
00121     
00122     if(cregister==REGISTER_MOTION)  wait_us(DELAY_TRAD_MOT);
00123     else                            wait_us(DELAY_TRAD);
00124     
00125     // send dummy byte
00126     int reply = spi_.write(0x00);
00127     ncs_=1;
00128     
00129     return reply;
00130 }
00131 
00132 // Transform the reading of the mouse Delta register to actual motion
00133 int ADNS6010::MChipMotion(int reading) {
00134 
00135     int displacement;
00136     if (reading <= 0x7f) {
00137         displacement = reading;
00138     } else {
00139         displacement = reading - 256;
00140     }
00141     return displacement;
00142 }