00001
00083
00084 #include <avr32/io.h>
00085 #include "compiler.h"
00086 #include "print_funcs.h"
00087 #include "board.h"
00088 #include "power_clocks_lib.h"
00089
00090 #if BOARD == UC3C_EK
00091 #include "twim.h"
00092 #else
00093 #include "eic.h"
00094 #include "twi.h"
00095 #endif
00096 #include "gpio.h"
00097
00098 #include "intc.h"
00099 #include "cycle_counter.h"
00100 #include "flashc.h"
00101 #include "at42qt1060.h"
00102 #include "conf_at42qt1060.h"
00103 #include <stdio.h>
00104
00105 #if BOARD == UC3C_EK
00106 #define FCPU_HZ 60000000
00107 #define FPBA_HZ 60000000
00108 #else
00109 #define FCPU_HZ 66000000
00110 #define FPBA_HZ 66000000
00111 #endif
00112
00113
00114 volatile Bool touch_detect = FALSE;
00115
00116 struct at42qt1060_data {
00117 uint8_t detect_status;
00118 uint16_t key_signal[6];
00119 uint8_t key_threshold[6];
00120 uint16_t key_ref_value[6];
00121 };
00122
00123
00124
00125
00126
00127
00128
00129
00132
00133 static pcl_freq_param_t pcl_freq_param =
00134 {
00135 .cpu_f = FCPU_HZ,
00136 .pba_f = FPBA_HZ,
00137 .osc0_f = FOSC0,
00138 .osc0_startup = OSC0_STARTUP
00139 };
00141
00144 static void init_sys_clocks(void)
00145 {
00146
00147 if (pcl_configure_clocks(&pcl_freq_param) != PASS)
00148 while(1);
00149 }
00150
00151 static void twi_init(void)
00152 {
00153 const gpio_map_t AT42QT1060_TWI_GPIO_MAP =
00154 {
00155 {AT42QT1060_TWI_SCL_PIN, AT42QT1060_TWI_SCL_FUNCTION},
00156 {AT42QT1060_TWI_SDA_PIN, AT42QT1060_TWI_SDA_FUNCTION}
00157 };
00158
00159 const twi_options_t AT42QT1060_TWI_OPTIONS =
00160 {
00161 .pba_hz = FPBA_HZ,
00162 .speed = AT42QT1060_TWI_MASTER_SPEED,
00163 .chip = AT42QT1060_TWI_ADDRESS
00164 };
00165
00166
00167 gpio_enable_module(AT42QT1060_TWI_GPIO_MAP,
00168 sizeof(AT42QT1060_TWI_GPIO_MAP) / sizeof(AT42QT1060_TWI_GPIO_MAP[0]));
00169
00170 twi_master_init(AT42QT1060_TWI, &AT42QT1060_TWI_OPTIONS);
00171
00172 }
00173 void get_key_signal_values(struct at42qt1060_data *touch_data)
00174 {
00175 LSB(touch_data->key_signal[0]) =
00176 at42qt1060_read_reg(AT42QT1060_KEY_0_SIGNAL_LSB);
00177 MSB(touch_data->key_signal[0]) =
00178 at42qt1060_read_reg(AT42QT1060_KEY_0_SIGNAL_MSB);
00179 LSB(touch_data->key_signal[1]) =
00180 at42qt1060_read_reg(AT42QT1060_KEY_1_SIGNAL_LSB);
00181 MSB(touch_data->key_signal[1]) =
00182 at42qt1060_read_reg(AT42QT1060_KEY_1_SIGNAL_MSB);
00183 LSB(touch_data->key_signal[2]) =
00184 at42qt1060_read_reg(AT42QT1060_KEY_2_SIGNAL_LSB);
00185 MSB(touch_data->key_signal[2]) =
00186 at42qt1060_read_reg(AT42QT1060_KEY_2_SIGNAL_MSB);
00187 LSB(touch_data->key_signal[3]) =
00188 at42qt1060_read_reg(AT42QT1060_KEY_3_SIGNAL_LSB);
00189 MSB(touch_data->key_signal[3]) =
00190 at42qt1060_read_reg(AT42QT1060_KEY_3_SIGNAL_MSB);
00191 LSB(touch_data->key_signal[4]) =
00192 at42qt1060_read_reg(AT42QT1060_KEY_4_SIGNAL_LSB);
00193 MSB(touch_data->key_signal[4]) =
00194 at42qt1060_read_reg(AT42QT1060_KEY_4_SIGNAL_MSB);
00195 LSB(touch_data->key_signal[5]) =
00196 at42qt1060_read_reg(AT42QT1060_KEY_5_SIGNAL_LSB);
00197 MSB(touch_data->key_signal[5]) =
00198 at42qt1060_read_reg(AT42QT1060_KEY_5_SIGNAL_MSB);
00199 }
00200
00201 void get_key_ref_values(struct at42qt1060_data *touch_data)
00202 {
00203 LSB(touch_data->key_ref_value[0]) =
00204 at42qt1060_read_reg(AT42QT1060_KEY_0_REF_DATA_LSB);
00205 MSB(touch_data->key_ref_value[0]) =
00206 at42qt1060_read_reg(AT42QT1060_KEY_0_REF_DATA_MSB);
00207 LSB(touch_data->key_ref_value[1]) =
00208 at42qt1060_read_reg(AT42QT1060_KEY_1_REF_DATA_LSB);
00209 MSB(touch_data->key_ref_value[1]) =
00210 at42qt1060_read_reg(AT42QT1060_KEY_1_REF_DATA_MSB);
00211 LSB(touch_data->key_ref_value[2]) =
00212 at42qt1060_read_reg(AT42QT1060_KEY_2_REF_DATA_LSB);
00213 MSB(touch_data->key_ref_value[2]) =
00214 at42qt1060_read_reg(AT42QT1060_KEY_2_REF_DATA_MSB);
00215 LSB(touch_data->key_ref_value[3]) =
00216 at42qt1060_read_reg(AT42QT1060_KEY_3_REF_DATA_LSB);
00217 MSB(touch_data->key_ref_value[3]) =
00218 at42qt1060_read_reg(AT42QT1060_KEY_3_REF_DATA_MSB);
00219 LSB(touch_data->key_ref_value[4]) =
00220 at42qt1060_read_reg(AT42QT1060_KEY_4_REF_DATA_LSB);
00221 MSB(touch_data->key_ref_value[4]) =
00222 at42qt1060_read_reg(AT42QT1060_KEY_4_REF_DATA_MSB);
00223 LSB(touch_data->key_ref_value[5]) =
00224 at42qt1060_read_reg(AT42QT1060_KEY_5_REF_DATA_LSB);
00225 MSB(touch_data->key_ref_value[5]) =
00226 at42qt1060_read_reg(AT42QT1060_KEY_5_REF_DATA_MSB);
00227 }
00228
00237 void print_key_data(int key, const char *key_name,
00238 struct at42qt1060_data *touch_data)
00239 {
00240 char tmp[128];
00241 char detect = (touch_data->detect_status & (1 << key)) ?
00242 'T' : '-';
00243
00244 sprintf(tmp, "| %6s | %4u | %4u | %4d | %c |\n",
00245 key_name,
00246 touch_data->key_signal[key],
00247 touch_data->key_ref_value[key],
00248 (signed short) touch_data->key_ref_value[key] -
00249 touch_data->key_signal[key],
00250 detect
00251 );
00252 print_dbg(tmp);
00253 }
00254
00260 void print_touch_data(struct at42qt1060_data *touch_data)
00261 {
00262
00263 print_dbg("\f");
00264 print_dbg("| Key | signal | reference | delta | detect |\n");
00265 print_dbg("|----------------------------------------------|\n");
00266 #if BOARD == EVK1105
00267 print_key_data(0, "left", touch_data);
00268 print_key_data(1, "down", touch_data);
00269 print_key_data(2, "right", touch_data);
00270 print_key_data(3, "up", touch_data);
00271 print_key_data(4, "middle", touch_data);
00272 print_key_data(5, "home", touch_data);
00273 #elif BOARD == UC3C_EK
00274 print_key_data(0, "up", touch_data);
00275 print_key_data(1, "down", touch_data);
00276 print_key_data(2, "right", touch_data);
00277 print_key_data(3, "left", touch_data);
00278 print_key_data(4, "middle", touch_data);
00279 print_key_data(5, "home", touch_data);
00280 #endif
00281 }
00282
00285 void touch_detect_callback(void)
00286 {
00287 touch_detect = TRUE;
00288 gpio_tgl_gpio_pin(LED3_GPIO);
00289 }
00290
00291
00292 int main(void) {
00293
00294 struct at42qt1060_data touch_data;
00295 t_cpu_time timeout;
00296
00297
00298 init_sys_clocks();
00299 init_dbg_rs232(FPBA_HZ);
00300 print_dbg("AT42QT1060 Touch demo\n");
00301
00302 INTC_init_interrupts();
00303
00304
00305 gpio_set_gpio_pin(LED0_GPIO);
00306 gpio_set_gpio_pin(LED1_GPIO);
00307 gpio_set_gpio_pin(LED2_GPIO);
00308 gpio_set_gpio_pin(LED3_GPIO);
00309 twi_init();
00310
00311
00312
00313
00314
00315 cpu_delay_ms(230, FCPU_HZ);
00316
00317 at42qt1060_init(FCPU_HZ);
00318
00319 #if BOARD == EVK1105
00320
00321
00322
00323 at42qt1060_register_eic_int(&touch_detect_callback);
00324 #else
00325 at42qt1060_register_int(&touch_detect_callback);
00326 #endif
00327
00328 cpu_set_timeout( cpu_ms_2_cy(1000, FCPU_HZ), &timeout);
00329
00330 while(TRUE)
00331 {
00332
00333 if(touch_detect)
00334 {
00335 touch_data.detect_status =
00336 at42qt1060_read_reg(AT42QT1060_DETECTION_STATUS);
00337
00338 at42qt1060_read_reg(AT42QT1060_INPUT_PORT_STATUS);
00339 touch_detect = FALSE;
00340 }
00341 if(cpu_is_timeout(&timeout))
00342 {
00343 get_key_signal_values(&touch_data);
00344 get_key_ref_values(&touch_data);
00345 print_touch_data(&touch_data);
00346
00347 cpu_set_timeout(cpu_ms_2_cy(500, FCPU_HZ), &timeout);
00348 }
00349 }
00350
00351 return 0;
00352 }