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 ( defined (__GNUC__) && ( defined (__AVR32_UC3C064C__) || defined (__AVR32_UC3C0128C__) || defined (__AVR32_UC3C0256C__) || defined (__AVR32_UC3C0512CREVC__) || defined (__AVR32_UC3C164C__) || defined (__AVR32_UC3C1128C__) || defined (__AVR32_UC3C1256C__) || defined (__AVR32_UC3C1512CREVC__) || defined (__AVR32_UC3C264C__) || defined (__AVR32_UC3C2128C__) || defined (__AVR32_UC3C2256C__) || defined (__AVR32_UC3C2512CREVC__))) \
00060 ||( defined (__ICCAVR32__) && ( defined (__AT32UC3C064C__) || defined (__AT32UC3C0128C__) || defined (__AT32UC3C0256C__) || defined (__AT32UC3C0512C__) || defined (__AT32UC3C164C__) || defined (__AT32UC3C1128C__) || defined (__AT32UC3C1256C__) || defined (__AT32UC3C1512C__) || defined (__AT32UC3C264C__) || defined (__AT32UC3C2128C__) || defined (__AT32UC3C2256C__) || defined (__AT32UC3C2512C__)))
00061 #include "twim.h"
00062 #else
00063 #include "twi.h"
00064 #endif
00065
00067 static struct {
00068 void (*touch_detect_callback)(void);
00069 } at42qt1060 =
00070 {
00071 .touch_detect_callback = NULL
00072 };
00073
00074 static uint32_t cpu_hz;
00075
00081 void at42qt1060_write_reg(uint8_t reg_index, uint8_t data)
00082 {
00083 uint8_t pack[2];
00084 twi_package_t twi_package;
00085
00086 pack[0] = reg_index;
00087 pack[1] = data;
00088
00089 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00090 twi_package.addr_length = 0;
00091 twi_package.buffer = &pack;
00092 twi_package.length = sizeof(pack);
00093
00094 while(twi_master_write(AT42QT1060_TWI, &twi_package)!=TWI_SUCCESS);
00095
00096 return;
00097 }
00098
00104 uint8_t at42qt1060_read_reg(uint8_t reg_index)
00105 {
00106 uint8_t data;
00107 twi_package_t twi_package;
00108
00109 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00110 twi_package.addr_length = 0;
00111 twi_package.buffer = ®_index;
00112 twi_package.length = 1;
00113 while(twi_master_write(AT42QT1060_TWI, &twi_package)!=TWI_SUCCESS);
00114
00115
00116
00117
00118
00119
00120 cpu_delay_us(20, cpu_hz);
00121
00122 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00123 twi_package.addr_length = 0;
00124 twi_package.buffer = &data;
00125 twi_package.length = 1;
00126 while(twi_master_read(AT42QT1060_TWI, &twi_package)!=TWI_SUCCESS);
00127
00128
00129 return data;
00130 }
00131
00132 uint8_t at42qt1060_get_status(void)
00133 {
00134 twi_package_t twi_package;
00135 uint16_t status_data;
00136
00137 twi_package.chip = AT42QT1060_TWI_ADDRESS;
00138 twi_package.addr_length = 0;
00139 twi_package.buffer = &status_data;
00140 twi_package.length = 2;
00141 twi_master_read(AT42QT1060_TWI, &twi_package);
00142
00143 return MSB(status_data);
00144 }
00145
00146 uint8_t at42qt1060_get_detect_status(void)
00147 {
00148 uint8_t status;
00149
00150 status = at42qt1060_read_reg(AT42QT1060_DETECTION_STATUS);
00151 at42qt1060_read_reg(AT42QT1060_INPUT_PORT_STATUS);
00152 return status;
00153 }
00154
00157 #if defined (__GNUC__)
00158 __attribute__ ((__interrupt__))
00159 #elif defined (__ICCAVR32__)
00160 __interrupt
00161 #endif
00162 void at42qt1060_detect_int_handler(void)
00163 {
00164 if(gpio_get_pin_interrupt_flag(AT42QT1060_DETECT_PIN))
00165 {
00166 gpio_clear_pin_interrupt_flag(AT42QT1060_DETECT_PIN);
00167 if(at42qt1060.touch_detect_callback)
00168 at42qt1060.touch_detect_callback();
00169 }
00170 }
00171
00172 #if BOARD == EVK1105
00173
00175 #if __GNUC__
00176 __attribute__ ((__interrupt__))
00177 #elif __ICCAVR32__
00178 __interrupt
00179 #endif
00180 void at42qt1060_detect_eic_int_handler(void)
00181 {
00182 eic_clear_interrupt_line(&AVR32_EIC, AT42QT1060_EIC_LINE);
00183 if(at42qt1060.touch_detect_callback)
00184 at42qt1060.touch_detect_callback();
00185 }
00186 #endif
00187
00191 void at42qt1060_register_int(void (*touch_detect_callback)(void))
00192 {
00193 at42qt1060.touch_detect_callback = touch_detect_callback;
00194
00195 Disable_global_interrupt();
00196
00197 INTC_register_interrupt(&at42qt1060_detect_int_handler, AVR32_GPIO_IRQ_0 + AT42QT1060_DETECT_PIN/8, 0 );
00198
00199
00200 gpio_enable_pin_interrupt(AT42QT1060_DETECT_PIN, GPIO_FALLING_EDGE);
00201 gpio_clear_pin_interrupt_flag(AT42QT1060_DETECT_PIN);
00202
00203 Enable_global_interrupt();
00204 return;
00205 }
00206
00207 #if BOARD == EVK1105
00208
00211 void at42qt1060_register_eic_int(void (*touch_detect_callback)(void))
00212 {
00213 eic_options_t eic_options[1];
00214
00215 at42qt1060.touch_detect_callback = touch_detect_callback;
00216
00217 gpio_enable_module_pin(AT42QT1060_DETECT_PIN, AT42QT1060_EIC_EXTINT_FUNCTION);
00218
00219 Disable_global_interrupt();
00220
00221 INTC_register_interrupt(&at42qt1060_detect_eic_int_handler, AT42QT1060_EIC_EXTINT_IRQ,
00222 AT42QT1060_EIC_EXTINT_LEVEL);
00223
00224 eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00225 eic_options[0].eic_level = EIC_EDGE_FALLING_EDGE;
00226 eic_options[0].eic_async = EIC_SYNCH_MODE;
00227 eic_options[0].eic_line = AT42QT1060_EIC_LINE;
00228
00229 eic_init(&AVR32_EIC, &eic_options[0], 1);
00230 eic_enable_lines(&AVR32_EIC, (1 << eic_options[0].eic_line));
00231 eic_enable_interrupt_lines(&AVR32_EIC, (1 << eic_options[0].eic_line));
00232
00233 Enable_global_interrupt();
00234
00235 return;
00236 }
00237 #endif
00238
00239 void at42qt1060_init(int32_t fcpu)
00240 {
00241 volatile uint8_t tmp1, tmp2, tmp3;
00242
00243
00244 cpu_hz = fcpu;
00245
00246
00247
00248
00249
00250 at42qt1060_write_reg(AT42QT1060_IO_MASK, 0xFF);
00251
00252
00253
00254 at42qt1060_write_reg(AT42QT1060_KEY_MASK, AT42QT1060_KEY_MASK_VALUE);
00255
00256 at42qt1060_write_reg(AT42QT1060_DI, AT42QT1060_DETECT_INTEGRATOR_VALUE);
00257
00258 at42qt1060_write_reg(AT42QT1060_KEY_0_NTHR,
00259 AT42QT1060_KEY_0_NTHR_VALUE);
00260 at42qt1060_write_reg(AT42QT1060_KEY_1_NTHR,
00261 AT42QT1060_KEY_1_NTHR_VALUE);
00262 at42qt1060_write_reg(AT42QT1060_KEY_2_NTHR,
00263 AT42QT1060_KEY_2_NTHR_VALUE);
00264 at42qt1060_write_reg(AT42QT1060_KEY_3_NTHR,
00265 AT42QT1060_KEY_3_NTHR_VALUE);
00266 at42qt1060_write_reg(AT42QT1060_KEY_4_NTHR,
00267 AT42QT1060_KEY_4_NTHR_VALUE);
00268 at42qt1060_write_reg(AT42QT1060_KEY_5_NTHR,
00269 AT42QT1060_KEY_5_NTHR_VALUE);
00270
00271 tmp1 = at42qt1060_read_reg(AT42QT1060_IO_MASK);
00272 tmp2 = at42qt1060_read_reg(AT42QT1060_KEY_MASK);
00273 tmp3 = at42qt1060_read_reg(AT42QT1060_LP_MODE);
00274
00275
00276 tmp1 = at42qt1060_get_detect_status();
00277 }
00278