00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "board.h"
00049 #include "compiler.h"
00050 #include "gpio.h"
00051 #include "conf_at42qt1060.h"
00052 #include "at42qt1060.h"
00053 #include "intc.h"
00054 #if BOARD == EVK1105
00055 #include "eic.h"
00056 #endif
00057 #include "cycle_counter.h"
00058
00059 # if (UC3A3 || UC3C || UC3L)
00060 #include "twim.h"
00061 #else
00062 #include "twi.h"
00063 #endif
00064
00066 static struct {
00067 void (*touch_detect_callback)(void);
00068 } at42qt1060 =
00069 {
00070 .touch_detect_callback = NULL
00071 };
00072
00073 static uint32_t cpu_hz;
00074
00080 void at42qt1060_write_reg(uint8_t reg_index, uint8_t data)
00081 {
00082 uint8_t pack[2];
00083 twi_package_t twi_package;
00084
00085 pack[0] = reg_index;
00086 pack[1] = data;
00087
00088 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00089 twi_package.addr_length = 0;
00090 twi_package.buffer = &pack;
00091 twi_package.length = sizeof(pack);
00092
00093 while(twi_master_write(AT42QT1060_TWI, &twi_package)!=TWI_SUCCESS);
00094
00095 return;
00096 }
00097
00103 uint8_t at42qt1060_read_reg(uint8_t reg_index)
00104 {
00105 uint8_t data;
00106 twi_package_t twi_package;
00107
00108 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00109 twi_package.addr_length = 0;
00110 twi_package.buffer = ®_index;
00111 twi_package.length = 1;
00112 while(twi_master_write(AT42QT1060_TWI, &twi_package)!=TWI_SUCCESS);
00113
00114
00115
00116
00117
00118
00119 cpu_delay_us(20, cpu_hz);
00120
00121 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00122 twi_package.addr_length = 0;
00123 twi_package.buffer = &data;
00124 twi_package.length = 1;
00125 while(twi_master_read(AT42QT1060_TWI, &twi_package)!=TWI_SUCCESS);
00126
00127
00128 return data;
00129 }
00130
00131 uint8_t at42qt1060_get_status(void)
00132 {
00133 twi_package_t twi_package;
00134 uint16_t status_data;
00135
00136 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00137 twi_package.addr_length = 0;
00138 twi_package.buffer = &status_data;
00139 twi_package.length = 2;
00140 twi_master_read(AT42QT1060_TWI, &twi_package);
00141
00142 return MSB(status_data);
00143 }
00144
00145 uint8_t at42qt1060_get_detect_status(void)
00146 {
00147 uint8_t status;
00148
00149 status = at42qt1060_read_reg(AT42QT1060_DETECTION_STATUS);
00150 at42qt1060_read_reg(AT42QT1060_INPUT_PORT_STATUS);
00151 return status;
00152 }
00153
00156 #if defined (__GNUC__)
00157 __attribute__ ((__interrupt__))
00158 #elif defined (__ICCAVR32__)
00159 __interrupt
00160 #endif
00161 void at42qt1060_detect_int_handler(void)
00162 {
00163 if(gpio_get_pin_interrupt_flag(AT42QT1060_DETECT_PIN))
00164 {
00165 gpio_clear_pin_interrupt_flag(AT42QT1060_DETECT_PIN);
00166 if(at42qt1060.touch_detect_callback)
00167 at42qt1060.touch_detect_callback();
00168 }
00169 }
00170
00171 #if BOARD == EVK1105
00172
00174 #if __GNUC__
00175 __attribute__ ((__interrupt__))
00176 #elif __ICCAVR32__
00177 __interrupt
00178 #endif
00179 void at42qt1060_detect_eic_int_handler(void)
00180 {
00181 eic_clear_interrupt_line(&AVR32_EIC, AT42QT1060_EIC_LINE);
00182 if(at42qt1060.touch_detect_callback)
00183 at42qt1060.touch_detect_callback();
00184 }
00185 #endif
00186
00190 void at42qt1060_register_int(void (*touch_detect_callback)(void))
00191 {
00192 at42qt1060.touch_detect_callback = touch_detect_callback;
00193
00194 Disable_global_interrupt();
00195
00196 INTC_register_interrupt(&at42qt1060_detect_int_handler, AVR32_GPIO_IRQ_0 + AT42QT1060_DETECT_PIN/8, 0 );
00197
00198
00199 gpio_enable_pin_interrupt(AT42QT1060_DETECT_PIN, GPIO_FALLING_EDGE);
00200 gpio_clear_pin_interrupt_flag(AT42QT1060_DETECT_PIN);
00201
00202 Enable_global_interrupt();
00203 return;
00204 }
00205
00206 #if BOARD == EVK1105
00207
00210 void at42qt1060_register_eic_int(void (*touch_detect_callback)(void))
00211 {
00212 eic_options_t eic_options[1];
00213
00214 at42qt1060.touch_detect_callback = touch_detect_callback;
00215
00216 gpio_enable_module_pin(AT42QT1060_DETECT_PIN, AT42QT1060_EIC_EXTINT_FUNCTION);
00217
00218 Disable_global_interrupt();
00219
00220 INTC_register_interrupt(&at42qt1060_detect_eic_int_handler, AT42QT1060_EIC_EXTINT_IRQ,
00221 AT42QT1060_EIC_EXTINT_LEVEL);
00222
00223 eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00224 eic_options[0].eic_level = EIC_EDGE_FALLING_EDGE;
00225 eic_options[0].eic_async = EIC_SYNCH_MODE;
00226 eic_options[0].eic_line = AT42QT1060_EIC_LINE;
00227
00228 eic_init(&AVR32_EIC, &eic_options[0], 1);
00229 eic_enable_lines(&AVR32_EIC, (1 << eic_options[0].eic_line));
00230 eic_enable_interrupt_lines(&AVR32_EIC, (1 << eic_options[0].eic_line));
00231
00232 Enable_global_interrupt();
00233
00234 return;
00235 }
00236 #endif
00237
00238 void at42qt1060_init(int32_t fcpu)
00239 {
00240 volatile uint8_t tmp1, tmp2, tmp3;
00241
00242
00243 cpu_hz = fcpu;
00244
00245
00246
00247
00248
00249 at42qt1060_write_reg(AT42QT1060_IO_MASK, 0xFF);
00250
00251
00252
00253 at42qt1060_write_reg(AT42QT1060_KEY_MASK, AT42QT1060_KEY_MASK_VALUE);
00254
00255 at42qt1060_write_reg(AT42QT1060_DI, AT42QT1060_DETECT_INTEGRATOR_VALUE);
00256
00257 at42qt1060_write_reg(AT42QT1060_KEY_0_NTHR,
00258 AT42QT1060_KEY_0_NTHR_VALUE);
00259 at42qt1060_write_reg(AT42QT1060_KEY_1_NTHR,
00260 AT42QT1060_KEY_1_NTHR_VALUE);
00261 at42qt1060_write_reg(AT42QT1060_KEY_2_NTHR,
00262 AT42QT1060_KEY_2_NTHR_VALUE);
00263 at42qt1060_write_reg(AT42QT1060_KEY_3_NTHR,
00264 AT42QT1060_KEY_3_NTHR_VALUE);
00265 at42qt1060_write_reg(AT42QT1060_KEY_4_NTHR,
00266 AT42QT1060_KEY_4_NTHR_VALUE);
00267 at42qt1060_write_reg(AT42QT1060_KEY_5_NTHR,
00268 AT42QT1060_KEY_5_NTHR_VALUE);
00269
00270 tmp1 = at42qt1060_read_reg(AT42QT1060_IO_MASK);
00271 tmp2 = at42qt1060_read_reg(AT42QT1060_KEY_MASK);
00272 tmp3 = at42qt1060_read_reg(AT42QT1060_LP_MODE);
00273
00274
00275 tmp1 = at42qt1060_get_detect_status();
00276 }
00277