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 #ifndef _QT60168_C_
00049 #define _QT60168_C_
00050
00051 #include "board.h"
00052 #include "compiler.h"
00053 #include "gpio.h"
00054 #include "cycle_counter.h"
00055 #include "conf_qt60168.h"
00056 #include "qt60168.h"
00057 #include "spi.h"
00058 #include "print_funcs.h"
00059
00060
00063
00064 #if !defined(QT60168_NTHR) || \
00065 !defined(QT60168_NDRIFT) || \
00066 !defined(QT60168_NDIL) || \
00067 !defined(QT60168_FDIL) || \
00068 !defined(QT60168_NDIL) || \
00069 !defined(QT60168_NRD) || \
00070 !defined(QT60168_BL) || \
00071 !defined(QT60168_AKS) || \
00072 !defined(QT60168_SSYNC) || \
00073 !defined(QT60168_MSYNC) || \
00074 !defined(QT60168_BS) || \
00075 !defined(QT60168_LSL) || \
00076 !defined(QT60168_EEPROM_CRC)
00077 # warning The QT60168 setups configuration to use in the driver is missing. Default configuration is used.
00078 #define QT60168_NTHR 0x06
00079 #define QT60168_NDRIFT 0x0F
00080 #define QT60168_NDIL 0x01
00081 #define QT60168_FDIL 0x05
00082 #define QT60168_NRD 0x14
00083 #define QT60168_BL 0x01
00084 #define QT60168_AKS 0x01
00085 #define QT60168_SSYNC 0x00
00086 #define QT60168_MSYNC 0x00
00087 #define QT60168_BS 0x01
00088 #define QT60168_LSL 0x0064
00089 #define QT60168_EEPROM_CRC 0x0A
00090 #endif
00092
00093
00094
00095
00096 U32 g_cpu_hz;
00097
00098
00099
00100
00101
00104 static void qt60168_setup( void );
00105
00109 void qt60168_wait_cmd_received(void);
00110
00111
00112
00113
00114 Bool qt60168_is_no_key_pressed( void )
00115 {
00116 unsigned short dataread, crc;
00117
00118 qt60168_send_cmd(QT60168_CMD_REPORT_1ST_KEY);
00119 qt60168_get_reply(&dataread);
00120 qt60168_get_reply(&crc);
00121
00122 if((dataread&0x1F)==0x1F) return TRUE;
00123 else return FALSE;
00124 }
00125
00126 Bool qt60168_is_key_pressed(U8 key_id)
00127 {
00128 unsigned short dataread, crc;
00129
00130 qt60168_send_cmd(QT60168_CMD_STATUS_FOR_KEY_K | (key_id &0x1F));
00131 qt60168_get_reply(&dataread);
00132 qt60168_get_reply(&crc);
00133
00134 if(dataread & QT60168_KEY_STATUS_DETECTED) return TRUE;
00135 else return FALSE;
00136 }
00137
00138 int qt60168_report_all_key(void)
00139 {
00140 unsigned short dataread, crc;
00141
00142 int allKey=0;
00143 qt60168_send_cmd(QT60168_CMD_REPORT_ALL_KEYS);
00144 qt60168_get_reply(&dataread);
00145 allKey=dataread;
00146 qt60168_get_reply(&dataread);
00147 allKey|=dataread<<8;
00148 qt60168_get_reply(&dataread);
00149 allKey|=dataread<<16;
00150 qt60168_get_reply(&crc);
00151
00152 return allKey;
00153
00154 }
00155
00156 void qt60168_init(U32 cpu_hz)
00157 {
00158 unsigned short dataread;
00159 g_cpu_hz = cpu_hz;
00160
00161
00162 qt60168_send_cmd(QT60168_CMD_EEPROM_CRC);
00163 qt60168_get_reply(&dataread);
00164 if(dataread != qt60168_setups_block.crc)
00165 {
00166
00167 qt60168_setup();
00168
00169
00170 do
00171 {
00172
00173
00174 qt60168_send_cmd(QT60168_CMD_FORCE_RESET);
00175 qt60168_send_cmd(QT60168_CMD_FORCE_RESET);
00176 qt60168_get_reply(&dataread);
00177 }
00178 while(dataread != QT60168_REPLY_FORCE_RESET);
00179 }
00180
00181
00182
00183
00184 qt60168_send_cmd(QT60168_CMD_CAL_ALL);
00185 qt60168_send_cmd(QT60168_CMD_CAL_ALL);
00186 qt60168_get_reply(&dataread);
00187
00188
00189 do
00190 {
00191 qt60168_send_cmd(QT60168_CMD_GENERAL_STATUS);
00192 qt60168_get_reply(&dataread);
00193
00194 }
00195 while(dataread & QT60168_STATUS_KEY_IN_CALIBRATION_MASK);
00196 return;
00197 }
00198
00199 void qt60168_send_cmd(unsigned char cmd)
00200 {
00201
00202 spi_selectChip(QT60168_SPI,QT60168_SPI_NCPS);
00203
00204
00205 spi_write(QT60168_SPI, cmd);
00206
00207
00208 qt60168_wait_cmd_received();
00209
00210
00211 spi_unselectChip(QT60168_SPI,QT60168_SPI_NCPS);
00212
00213 return;
00214 }
00215
00216 void qt60168_get_reply(unsigned short *data)
00217 {
00218
00219 spi_selectChip(QT60168_SPI,QT60168_SPI_NCPS);
00220
00221
00222 spi_write(QT60168_SPI, QT60168_CMD_NULL_COMMAND);
00223
00224
00225 qt60168_wait_cmd_received();
00226
00227
00228 spi_read(QT60168_SPI, data);
00229
00230
00231 spi_unselectChip(QT60168_SPI,QT60168_SPI_NCPS);
00232
00233 return;
00234 }
00235
00236
00237
00238
00239
00240 static void qt60168_setup( void )
00241 {
00242 unsigned short dataread;
00243 int i;
00244
00245
00246
00247 qt60168_send_cmd(QT60168_CMD_ENTER_SETUPS_MODE);
00248 qt60168_send_cmd(QT60168_CMD_ENTER_SETUPS_MODE);
00249
00250 qt60168_get_reply(&dataread);
00251
00252 if(dataread != QT60168_REPLY_ENTER_SETUPS_MODE) return;
00253
00254
00255 for( i=0 ; i<QT60168_MAX_NUMBER_OF_KEYS ; i++ )
00256 {
00257 qt60168_send_cmd(qt60168_setups_block.key_cfg[i].ndrift_nthr);
00258 }
00259
00260 for( i=0 ; i<QT60168_MAX_NUMBER_OF_KEYS ; i++)
00261 {
00262 qt60168_send_cmd(qt60168_setups_block.key_cfg[i].fdil_ndil);
00263 }
00264
00265
00266 for( i=0 ; i<QT60168_MAX_NUMBER_OF_KEYS ; i++)
00267 {
00268 qt60168_send_cmd(qt60168_setups_block.key_cfg[i].nrd);
00269 }
00270
00271
00272 for( i=0 ; i<QT60168_MAX_NUMBER_OF_KEYS ; i++)
00273 {
00274 qt60168_send_cmd(qt60168_setups_block.key_cfg[i].ssync_aks_bl);
00275 }
00276
00277
00278 qt60168_send_cmd(qt60168_setups_block.msync);
00279
00280
00281 qt60168_send_cmd(qt60168_setups_block.bs);
00282
00283
00284 qt60168_send_cmd(qt60168_setups_block.lsl & 0xFF);
00285 qt60168_send_cmd(qt60168_setups_block.lsl >> 8);
00286
00287 qt60168_get_reply(&dataread);
00288 qt60168_get_reply(&dataread);
00289 return;
00290 }
00291
00292 int qt60168_check_device_ready()
00293 {
00294 #ifndef QT60168_DISABLE_DRDY
00295 int value;
00296 static const gpio_map_t SDRAMC_EBI_GPIO_MAP =
00297 {
00298 {AVR32_EBI_NWE1_0_PIN,AVR32_EBI_NWE1_0_FUNCTION}
00299 };
00300 gpio_enable_gpio_pin(QT60168_DRDY_PIN);
00301
00302 cpu_delay_cy( cpu_us_2_cy(1, g_cpu_hz) );
00303
00304 value=gpio_get_pin_value(QT60168_DRDY_PIN);
00305
00306 gpio_enable_module(SDRAMC_EBI_GPIO_MAP, sizeof(SDRAMC_EBI_GPIO_MAP) / sizeof(SDRAMC_EBI_GPIO_MAP[0]));
00307 return value;
00308 #else
00309
00310 cpu_delay_cy( cpu_us_2_cy(26000, g_cpu_hz) );
00311 return 1;
00312 #endif
00313 }
00314
00315 void qt60168_wait_cmd_received(void)
00316 {
00317
00318
00319
00320 cpu_delay_cy( cpu_us_2_cy(40, g_cpu_hz) );
00321 while(!qt60168_check_device_ready());
00322
00323 return;
00324 }
00325
00326
00327
00328
00329 #endif // _QT60168_C_