Trackball based on the NXP LPC11U24 and the ADNS-9500

Dependencies:   ADNS9500 USBDevice mbed 25LCxxx_SPI

Committer:
xxann5
Date:
Thu Mar 14 14:04:07 2013 +0000
Revision:
9:ee05aa95f5c9
Parent:
8:5674f5ab61cd
Updated USBDevice.lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xxann5 8:5674f5ab61cd 1 /*
xxann5 8:5674f5ab61cd 2 * loststone is free sofware: you can redistribute it and/or modify
xxann5 8:5674f5ab61cd 3 * it under the terms of the GNU General Public License 3 as published by
xxann5 8:5674f5ab61cd 4 * the Free Software Foundation.
xxann5 8:5674f5ab61cd 5 *
xxann5 8:5674f5ab61cd 6 * loststone is distributed in the hope that it will be useful,
xxann5 8:5674f5ab61cd 7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
xxann5 8:5674f5ab61cd 8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
xxann5 8:5674f5ab61cd 9 * GNU General Public License for more details.
xxann5 8:5674f5ab61cd 10 *
xxann5 8:5674f5ab61cd 11 * You should have received a copy of the GNU General Public License
xxann5 8:5674f5ab61cd 12 * along with loststone. If not, see <http://www.gnu.org/licenses/gpl.txt>.
xxann5 8:5674f5ab61cd 13 *
xxann5 8:5674f5ab61cd 14 * Copyright (c) 2012-2013 Chris Majoros(chris@majoros.us), GNU3
xxann5 8:5674f5ab61cd 15 */
xxann5 6:4cb2c9a3abcd 16
xxann5 5:c7056267daa7 17 #include "mbed.h"
xxann5 5:c7056267daa7 18 #include "USBHID.h"
xxann5 5:c7056267daa7 19 #include "USBMouse.h"
xxann5 5:c7056267daa7 20 #include "Ser25lcxxx.h"
xxann5 5:c7056267daa7 21
xxann5 8:5674f5ab61cd 22 #include <stdint.h>
xxann5 7:d6ee49a89009 23
xxann5 8:5674f5ab61cd 24 #define ADNS9500_SROM_91
xxann5 8:5674f5ab61cd 25 #define ADNS9500_CRCHI (0xBE)
xxann5 8:5674f5ab61cd 26 #define ADNS9500_CRCLO (0xEF)
xxann5 8:5674f5ab61cd 27 #define ADNS9500_ID (0x56)
xxann5 8:5674f5ab61cd 28 #define ADNS6010_FIRMWARE_CRC (0xBEEF)
xxann5 8:5674f5ab61cd 29 #define ADNS9500_FIRMWARE_LEN 3070
xxann5 7:d6ee49a89009 30
xxann5 8:5674f5ab61cd 31 #include "adns9500.hpp"
xxann5 5:c7056267daa7 32
xxann5 5:c7056267daa7 33
xxann5 7:d6ee49a89009 34 #define UINT16(ub, lb) (uint16_t)(((ub & 0xff) << 8) | (lb & 0xff))
xxann5 7:d6ee49a89009 35 #define INT16(ub, lb) (int16_t)(((ub & 0xff) << 8) | (lb & 0xff))
xxann5 8:5674f5ab61cd 36
xxann5 8:5674f5ab61cd 37 #define SETTINGS_BASE 0x00
xxann5 8:5674f5ab61cd 38 #define PROFILE_BASE 0xff
xxann5 8:5674f5ab61cd 39 #define PROFILE_LEN 0x13
xxann5 8:5674f5ab61cd 40
xxann5 8:5674f5ab61cd 41 #define MBED
xxann5 8:5674f5ab61cd 42
xxann5 8:5674f5ab61cd 43 typedef void (*fn)(void);
xxann5 8:5674f5ab61cd 44
xxann5 8:5674f5ab61cd 45 enum cli_actions {
xxann5 8:5674f5ab61cd 46 SET = 0x01,
xxann5 8:5674f5ab61cd 47 GET = 0x02,
xxann5 8:5674f5ab61cd 48 LOAD_DATA = 0x03,
xxann5 8:5674f5ab61cd 49 GET_DATA = 0x04,
xxann5 8:5674f5ab61cd 50 CLEAR = 0x05,
xxann5 8:5674f5ab61cd 51 INIT = 0x06
xxann5 8:5674f5ab61cd 52 };
xxann5 8:5674f5ab61cd 53
xxann5 8:5674f5ab61cd 54 enum cli_replies {
xxann5 8:5674f5ab61cd 55 retval = 0x01,
xxann5 8:5674f5ab61cd 56 message = 0x02
xxann5 8:5674f5ab61cd 57 };
xxann5 5:c7056267daa7 58
xxann5 8:5674f5ab61cd 59 enum buttons {
xxann5 8:5674f5ab61cd 60 BUTTON_LEFT = 0x00, //explisitly showing we start at zero
xxann5 8:5674f5ab61cd 61 BUTTON_MIDDLE,
xxann5 8:5674f5ab61cd 62 BUTTON_RIGHT,
xxann5 8:5674f5ab61cd 63 BUTTON_FORWORD,
xxann5 8:5674f5ab61cd 64 BUTTON_BACK,
xxann5 8:5674f5ab61cd 65 BUTTON_Z,
xxann5 8:5674f5ab61cd 66 BUTTON_HIGH_RES,
xxann5 8:5674f5ab61cd 67 };
xxann5 8:5674f5ab61cd 68 enum settings {
xxann5 8:5674f5ab61cd 69 CPI_X = 0x00, //explisitly showing we start at zero
xxann5 8:5674f5ab61cd 70 CPI_Y,
xxann5 8:5674f5ab61cd 71 CPI_X_MULITIPLYER,
xxann5 8:5674f5ab61cd 72 CPI_Y_MULITIPLYER,
xxann5 8:5674f5ab61cd 73 CPI_MAX, // Not currently used.
xxann5 8:5674f5ab61cd 74 CPI_MIN, // Not currently used.
xxann5 8:5674f5ab61cd 75 CPI_STEP, // Not currently used.
xxann5 8:5674f5ab61cd 76 CPI_Z,
xxann5 8:5674f5ab61cd 77 CPI_H,
xxann5 8:5674f5ab61cd 78 CPI_HR_X,
xxann5 8:5674f5ab61cd 79 CPI_HR_Y,
xxann5 8:5674f5ab61cd 80
xxann5 8:5674f5ab61cd 81 BTN_A,
xxann5 8:5674f5ab61cd 82 BTN_B,
xxann5 8:5674f5ab61cd 83 BTN_C,
xxann5 8:5674f5ab61cd 84 BTN_D,
xxann5 8:5674f5ab61cd 85 BTN_E,
xxann5 8:5674f5ab61cd 86 BTN_F,
xxann5 8:5674f5ab61cd 87 BTN_G,
xxann5 8:5674f5ab61cd 88
xxann5 8:5674f5ab61cd 89 LED_ACTION, // Not currently used
xxann5 8:5674f5ab61cd 90
xxann5 8:5674f5ab61cd 91 VID,
xxann5 8:5674f5ab61cd 92 PID,
xxann5 8:5674f5ab61cd 93 RELEASE,
xxann5 8:5674f5ab61cd 94
xxann5 8:5674f5ab61cd 95 PROFILE_DEFAULT,
xxann5 8:5674f5ab61cd 96 PROFILE_CURRENT,
xxann5 8:5674f5ab61cd 97
xxann5 8:5674f5ab61cd 98
xxann5 8:5674f5ab61cd 99
xxann5 8:5674f5ab61cd 100 ADNS_CRC,
xxann5 8:5674f5ab61cd 101 ADNS_ID,
xxann5 8:5674f5ab61cd 102 ADNS_FW_LEN,
xxann5 8:5674f5ab61cd 103 ADNS_FW_OFFSET,
xxann5 8:5674f5ab61cd 104 };
xxann5 8:5674f5ab61cd 105
xxann5 5:c7056267daa7 106
xxann5 8:5674f5ab61cd 107
xxann5 8:5674f5ab61cd 108
xxann5 8:5674f5ab61cd 109 #ifdef MBED
xxann5 8:5674f5ab61cd 110 DigitalIn run_mode(p36);
xxann5 8:5674f5ab61cd 111
xxann5 8:5674f5ab61cd 112 DigitalIn motion_in(p14);
xxann5 8:5674f5ab61cd 113
xxann5 8:5674f5ab61cd 114 DigitalOut activity(p35);
xxann5 8:5674f5ab61cd 115
xxann5 8:5674f5ab61cd 116 InterruptIn debug(p29);
xxann5 8:5674f5ab61cd 117
xxann5 8:5674f5ab61cd 118 InterruptIn btn_a(p21);
xxann5 8:5674f5ab61cd 119 InterruptIn btn_b(p22);
xxann5 8:5674f5ab61cd 120 InterruptIn btn_c(p23);
xxann5 8:5674f5ab61cd 121 InterruptIn btn_d(p24);
xxann5 8:5674f5ab61cd 122 InterruptIn btn_e(p25);
xxann5 8:5674f5ab61cd 123 InterruptIn btn_f(p26);
xxann5 8:5674f5ab61cd 124 InterruptIn btn_g(p27);
xxann5 6:4cb2c9a3abcd 125
xxann5 8:5674f5ab61cd 126 InterruptIn prfl_a(p20);
xxann5 8:5674f5ab61cd 127 InterruptIn prfl_b(p19);
xxann5 8:5674f5ab61cd 128 InterruptIn prfl_c(p18);
xxann5 8:5674f5ab61cd 129 InterruptIn prfl_d(p17);
xxann5 8:5674f5ab61cd 130 InterruptIn prfl_e(p16);
xxann5 8:5674f5ab61cd 131 #elif
xxann5 8:5674f5ab61cd 132 DigitalIn run_mode(P1_29);
xxann5 8:5674f5ab61cd 133
xxann5 8:5674f5ab61cd 134 DigitalIn motion_in(P0_22);
xxann5 8:5674f5ab61cd 135
xxann5 8:5674f5ab61cd 136 DigitalOut activity(P1_28);
xxann5 8:5674f5ab61cd 137
xxann5 8:5674f5ab61cd 138 InterruptIn btn_a(P0_18);
xxann5 8:5674f5ab61cd 139 InterruptIn btn_b(P0_16);
xxann5 8:5674f5ab61cd 140 InterruptIn btn_c(P0_17);
xxann5 8:5674f5ab61cd 141 InterruptIn btn_d(P0_23);
xxann5 8:5674f5ab61cd 142 InterruptIn btn_e(P1_15);
xxann5 8:5674f5ab61cd 143 InterruptIn btn_f(P1_??);
xxann5 8:5674f5ab61cd 144 InterruptIn btn_g(P1_??);
xxann5 8:5674f5ab61cd 145
xxann5 8:5674f5ab61cd 146 InterruptIn prfl_a(P0_4);
xxann5 8:5674f5ab61cd 147 InterruptIn prfl_b(P0_5);
xxann5 8:5674f5ab61cd 148 InterruptIn prfl_c(P0_21);
xxann5 8:5674f5ab61cd 149 InterruptIn prfl_d(P1_23);
xxann5 8:5674f5ab61cd 150 InterruptIn prfl_e(P1_24);
xxann5 8:5674f5ab61cd 151 #endif
xxann5 8:5674f5ab61cd 152
xxann5 8:5674f5ab61cd 153 // We are global for the callbacks
xxann5 6:4cb2c9a3abcd 154 USBMouse *mouse;
xxann5 5:c7056267daa7 155
xxann5 8:5674f5ab61cd 156 bool motion_triggered = true;
xxann5 8:5674f5ab61cd 157 bool z_axis_active = false;
xxann5 8:5674f5ab61cd 158 bool high_rez_active = false;
xxann5 8:5674f5ab61cd 159 bool profile_load = true; // Always inishally load the profile even if it might be the same.
xxann5 8:5674f5ab61cd 160 bool set_res_hr = false;
xxann5 8:5674f5ab61cd 161 bool set_res_z = false;
xxann5 8:5674f5ab61cd 162 bool set_res_default = false;
xxann5 8:5674f5ab61cd 163 //uint32_t rest_counter;
xxann5 5:c7056267daa7 164
xxann5 8:5674f5ab61cd 165 uint16_t s[28] = {
xxann5 8:5674f5ab61cd 166 540, // CPI_X
xxann5 8:5674f5ab61cd 167 540, // CPI_Y
xxann5 8:5674f5ab61cd 168 40, // CPI_X_MULITIPLYER
xxann5 8:5674f5ab61cd 169 40, // CPI_Y_MULITIPLYER
xxann5 7:d6ee49a89009 170 5040, // CPI_MAX
xxann5 7:d6ee49a89009 171 0, // CPI_MIN
xxann5 7:d6ee49a89009 172 90, // CPI_STEP
xxann5 8:5674f5ab61cd 173 0, // CPI_Z
xxann5 8:5674f5ab61cd 174 0, // CPI_H
xxann5 8:5674f5ab61cd 175 360, // CPI_HR_X
xxann5 8:5674f5ab61cd 176 360, // CPI_HR_Y
xxann5 8:5674f5ab61cd 177 BUTTON_LEFT,
xxann5 8:5674f5ab61cd 178 BUTTON_MIDDLE,
xxann5 8:5674f5ab61cd 179 BUTTON_RIGHT,
xxann5 8:5674f5ab61cd 180 BUTTON_Z,
xxann5 8:5674f5ab61cd 181 BUTTON_HIGH_RES,
xxann5 8:5674f5ab61cd 182 BUTTON_FORWORD,
xxann5 8:5674f5ab61cd 183 BUTTON_BACK,
xxann5 8:5674f5ab61cd 184 0x00, // LED_ACTION
xxann5 8:5674f5ab61cd 185 0x192f, // VID (No default, must be set)
xxann5 8:5674f5ab61cd 186 0x0000, // PID (No default, must be set)
xxann5 8:5674f5ab61cd 187 0x00, // PROFILE_DEFAULT
xxann5 8:5674f5ab61cd 188 0x00, // PROFILE_CURRENT
xxann5 8:5674f5ab61cd 189 0x0000, // RELEASE
xxann5 8:5674f5ab61cd 190 0xffff, // ADNS_CRC (No default, must be set)
xxann5 8:5674f5ab61cd 191 0xffff, // ADNS_ID (No default, must be set)
xxann5 8:5674f5ab61cd 192 0xffff, // ADNS_FW_LEN (No default, must be set)
xxann5 8:5674f5ab61cd 193 0xea60 // ADNS_FW_OFFSET
xxann5 7:d6ee49a89009 194 };
xxann5 7:d6ee49a89009 195
xxann5 8:5674f5ab61cd 196
xxann5 5:c7056267daa7 197
xxann5 8:5674f5ab61cd 198 void track( Ser25LCxxx *eeprom );
xxann5 8:5674f5ab61cd 199 void program( Ser25LCxxx *eeprom );
xxann5 5:c7056267daa7 200
xxann5 6:4cb2c9a3abcd 201 void motionCallback( void );
xxann5 6:4cb2c9a3abcd 202
xxann5 6:4cb2c9a3abcd 203 void btn_hr_press( void );
xxann5 6:4cb2c9a3abcd 204 void btn_hr_release( void );
xxann5 5:c7056267daa7 205
xxann5 6:4cb2c9a3abcd 206 void btn_z_press( void );
xxann5 6:4cb2c9a3abcd 207 void btn_z_release( void );
xxann5 5:c7056267daa7 208
xxann5 6:4cb2c9a3abcd 209 void btn_l_press(void);
xxann5 6:4cb2c9a3abcd 210 void btn_l_release( void );
xxann5 6:4cb2c9a3abcd 211
xxann5 6:4cb2c9a3abcd 212 void btn_m_press( void );
xxann5 6:4cb2c9a3abcd 213 void btn_m_release( void );
xxann5 6:4cb2c9a3abcd 214
xxann5 6:4cb2c9a3abcd 215 void btn_r_press( void );
xxann5 6:4cb2c9a3abcd 216 void btn_r_release( void );
xxann5 5:c7056267daa7 217
xxann5 8:5674f5ab61cd 218 void btn_f_press( void );
xxann5 8:5674f5ab61cd 219 void btn_f_release( void );
xxann5 8:5674f5ab61cd 220
xxann5 8:5674f5ab61cd 221 void btn_b_press( void );
xxann5 8:5674f5ab61cd 222 void btn_b_release( void );
xxann5 7:d6ee49a89009 223
xxann5 8:5674f5ab61cd 224 void prfl_a_set( void );
xxann5 8:5674f5ab61cd 225 void prfl_b_set( void );
xxann5 8:5674f5ab61cd 226 void prfl_c_set( void );
xxann5 8:5674f5ab61cd 227 void prfl_d_set( void );
xxann5 8:5674f5ab61cd 228 void prfl_e_set( void );
xxann5 7:d6ee49a89009 229
xxann5 8:5674f5ab61cd 230 void prfl_stub( void );
xxann5 8:5674f5ab61cd 231 void debug_out(void);
xxann5 8:5674f5ab61cd 232
xxann5 8:5674f5ab61cd 233 int set_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t val, uint16_t base_address );
xxann5 8:5674f5ab61cd 234 uint16_t get_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address );
xxann5 8:5674f5ab61cd 235 void clear_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address );
xxann5 8:5674f5ab61cd 236
xxann5 8:5674f5ab61cd 237 void load_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len, const uint8_t* data );
xxann5 8:5674f5ab61cd 238
xxann5 8:5674f5ab61cd 239 uint8_t* get_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len );