fpc1020_common.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /* FPC1020 Touch sensor driver
  2. *
  3. * Copyright (c) 2013,2014 Fingerprint Cards AB <tech@fingerprints.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License Version 2
  7. * as published by the Free Software Foundation.
  8. */
  9. #ifndef LINUX_SPI_FPC1020_COMMON_H
  10. #define LINUX_SPI_FPC1020_COMMON_H
  11. #define DEBUG
  12. #include <linux/cdev.h>
  13. #include <linux/gpio.h>
  14. #include <linux/delay.h>
  15. #include <linux/module.h>
  16. #include <linux/semaphore.h>
  17. #include <linux/spi/spi.h>
  18. #include <linux/wait.h>
  19. #ifndef CONFIG_OF
  20. #include <linux/spi/fpc1020.h>
  21. #include <linux/spi/fpc1020_regs.h>
  22. #else
  23. #include "fpc1020.h"
  24. #include "fpc1020_regs.h"
  25. #endif
  26. /* -------------------------------------------------------------------- */
  27. /* fpc1020 driver constants */
  28. /* -------------------------------------------------------------------- */
  29. extern const bool target_little_endian;
  30. #define FPC1020_DEV_NAME "fpc1020"
  31. /* set '0' for dynamic assignment, or '> 0' for static assignment */
  32. #define FPC1020_MAJOR 0
  33. #define FPC1020_BUFFER_MAX_IMAGES 3
  34. #define FPC1020_MAX_ADC_SETTINGS (FPC1020_BUFFER_MAX_IMAGES + 1)
  35. #define FPC1020_DEFAULT_IRQ_TIMEOUT_MS (100 * HZ / 1000)
  36. #define FPC1020_STATUS_REG_RESET_VALUE 0x1e
  37. #define FPC1020_STATUS_REG_MODE_MASK ( \
  38. FPC_1020_STATUS_REG_BIT_MAIN_IDLE_CMD | \
  39. FPC_1020_STATUS_REG_BIT_SYNC_PWR_IDLE | \
  40. FPC_1020_STATUS_REG_BIT_PWR_DWN_OSC_HIN)
  41. #define FPC1020_STATUS_REG_IN_DEEP_SLEEP_MODE 0
  42. #define FPC1020_STATUS_REG_IN_SLEEP_MODE 0
  43. #define FPC1020_STATUS_REG_IN_IDLE_MODE ( \
  44. FPC_1020_STATUS_REG_BIT_MAIN_IDLE_CMD | \
  45. FPC_1020_STATUS_REG_BIT_SYNC_PWR_IDLE | \
  46. FPC_1020_STATUS_REG_BIT_PWR_DWN_OSC_HIN)
  47. #define FPC1020_SLEEP_RETRIES 5
  48. #define FPC1020_SLEEP_RETRY_TIME_US 1000
  49. #define FPC1020_RESET_RETRIES 2
  50. #define FPC1020_RESET_LOW_US 1000
  51. #define FPC1020_RESET_HIGH1_US 100
  52. #define FPC1020_RESET_HIGH2_US 1250
  53. #define FPC1020_CAPTURE_WAIT_FINGER_DELAY_MS 20
  54. #define FPC1020_WAKEUP_DETECT_ZONE_COUNT 2
  55. #define FPC1020_WAKEUP_DETECT_ROWS 8
  56. #define FPC1020_WAKEUP_DETECT_COLS 8
  57. #define FPC1020_PXL_BIAS_CTRL 0x0F00
  58. /* -------------------------------------------------------------------- */
  59. /* fpc1020 data types */
  60. /* -------------------------------------------------------------------- */
  61. typedef enum {
  62. FPC_1020_STATUS_REG_BIT_IRQ = 1 << 0,
  63. FPC_1020_STATUS_REG_BIT_MAIN_IDLE_CMD = 1 << 1,
  64. FPC_1020_STATUS_REG_BIT_SYNC_PWR_IDLE = 1 << 2,
  65. FPC_1020_STATUS_REG_BIT_PWR_DWN_OSC_HIN = 1 << 3,
  66. FPC_1020_STATUS_REG_BIT_FIFO_EMPTY = 1 << 4,
  67. FPC_1020_STATUS_REG_BIT_FIFO_FULL = 1 << 5,
  68. FPC_1020_STATUS_REG_BIT_MISO_EDGRE_RISE_EN = 1 << 6
  69. } fpc1020_status_reg_t;
  70. typedef enum {
  71. FPC1020_CMD_FINGER_PRESENT_QUERY = 32,
  72. FPC1020_CMD_WAIT_FOR_FINGER_PRESENT = 36,
  73. FPC1020_CMD_ACTIVATE_SLEEP_MODE = 40,
  74. FPC1020_CMD_ACTIVATE_DEEP_SLEEP_MODE = 44,
  75. FPC1020_CMD_ACTIVATE_IDLE_MODE = 52,
  76. FPC1020_CMD_CAPTURE_IMAGE = 192,
  77. FPC1020_CMD_READ_IMAGE = 196,
  78. FPC1020_CMD_SOFT_RESET = 248
  79. } fpc1020_cmd_t;
  80. typedef enum {
  81. FPC_1020_IRQ_REG_BIT_FINGER_DOWN = 1 << 0,
  82. FPC_1020_IRQ_REG_BIT_ERROR = 1 << 2,
  83. FPC_1020_IRQ_REG_BIT_FIFO_NEW_DATA = 1 << 5,
  84. FPC_1020_IRQ_REG_BIT_COMMAND_DONE = 1 << 7,
  85. FPC_1020_IRQ_REG_BITS_REBOOT = 0xff
  86. } fpc1020_irq_reg_t;
  87. typedef enum {
  88. FPC1020_CAPTURE_STATE_IDLE = 0,
  89. FPC1020_CAPTURE_STATE_STARTED,
  90. FPC1020_CAPTURE_STATE_PENDING,
  91. FPC1020_CAPTURE_STATE_WRITE_SETTINGS,
  92. FPC1020_CAPTURE_STATE_WAIT_FOR_FINGER_DOWN,
  93. FPC1020_CAPTURE_STATE_ACQUIRE,
  94. FPC1020_CAPTURE_STATE_FETCH,
  95. FPC1020_CAPTURE_STATE_WAIT_FOR_FINGER_UP,
  96. FPC1020_CAPTURE_STATE_COMPLETED,
  97. FPC1020_CAPTURE_STATE_FAILED,
  98. } fpc1020_capture_state_t;
  99. typedef struct fpc1020_worker_struct {
  100. struct task_struct *thread;
  101. struct semaphore sem_idle;
  102. wait_queue_head_t wq_wait_job;
  103. int req_mode;
  104. bool stop_request;
  105. } fpc1020_worker_t;
  106. typedef struct fpc1020_capture_struct {
  107. fpc1020_capture_mode_t current_mode;
  108. fpc1020_capture_state_t state;
  109. u32 read_offset;
  110. u32 available_bytes;
  111. wait_queue_head_t wq_data_avail;
  112. int last_error;
  113. bool read_pending_eof;
  114. bool deferred_finger_up;
  115. } fpc1020_capture_task_t;
  116. typedef struct fpc1020_input_struct {
  117. bool enabled;
  118. } fpc1020_input_task_t;
  119. typedef struct fpc1020_setup {
  120. u8 adc_gain[FPC1020_MAX_ADC_SETTINGS];
  121. u8 adc_shift[FPC1020_MAX_ADC_SETTINGS];
  122. u16 pxl_ctrl[FPC1020_MAX_ADC_SETTINGS];
  123. u8 capture_settings_mux;
  124. u8 capture_count;
  125. fpc1020_capture_mode_t capture_mode;
  126. u8 capture_row_start; /* Row 0-191 */
  127. u8 capture_row_count; /* Rows <= 192 */
  128. u8 capture_col_start; /* ADC group 0-23 */
  129. u8 capture_col_groups; /* ADC groups, 1-24 */
  130. u8 capture_finger_up_threshold;
  131. u8 capture_finger_down_threshold;
  132. u8 finger_detect_threshold;
  133. u8 wakeup_detect_rows[FPC1020_WAKEUP_DETECT_ZONE_COUNT];
  134. u8 wakeup_detect_cols[FPC1020_WAKEUP_DETECT_ZONE_COUNT];
  135. } fpc1020_setup_t;
  136. typedef struct fpc1020_diag {
  137. const char *chip_id; /* RO */
  138. u8 selftest; /* RO */
  139. u16 spi_register; /* RW */
  140. u8 spi_regsize; /* RO */
  141. u8 spi_data; /* RW */
  142. u16 last_capture_time; /* RO*/
  143. u16 finger_present_status; /* RO*/
  144. } fpc1020_diag_t;
  145. typedef struct fpc1020_chip_info {
  146. fpc1020_chip_t type;
  147. u8 revision;
  148. u8 pixel_rows;
  149. u8 pixel_columns;
  150. u8 adc_group_size;
  151. u16 spi_max_khz;
  152. } fpc1020_chip_info_t;
  153. typedef struct {
  154. struct spi_device *spi;
  155. struct class *class;
  156. struct device *device;
  157. struct cdev cdev;
  158. dev_t devno;
  159. fpc1020_chip_info_t chip;
  160. u32 cs_gpio;
  161. u32 reset_gpio;
  162. u32 irq_gpio;
  163. int irq;
  164. wait_queue_head_t wq_irq_return;
  165. bool interrupt_done;
  166. struct semaphore mutex;
  167. u8 *huge_buffer;
  168. size_t huge_buffer_size;
  169. fpc1020_worker_t worker;
  170. fpc1020_capture_task_t capture;
  171. fpc1020_setup_t setup;
  172. fpc1020_diag_t diag;
  173. bool soft_reset_enabled;
  174. struct regulator *vcc_spi;
  175. struct regulator *vdd_ana;
  176. struct regulator *vdd_io;
  177. struct regulator *vdd_tx;
  178. bool power_enabled;
  179. int vddtx_mv;
  180. bool txout_boost;
  181. u16 force_hwid;
  182. bool use_regulator_for_bezel;
  183. u16 spi_freq_khz;
  184. struct input_dev *input_dev;
  185. fpc1020_input_task_t input;
  186. bool use_fpc2050;
  187. } fpc1020_data_t;
  188. typedef struct {
  189. fpc1020_reg_t reg;
  190. bool write;
  191. u16 reg_size;
  192. u8 *dataptr;
  193. } fpc1020_reg_access_t;
  194. /* -------------------------------------------------------------------- */
  195. /* function prototypes */
  196. /* -------------------------------------------------------------------- */
  197. extern int mt_set_gpio_dir(unsigned long pin, unsigned long dir);
  198. extern int mt_get_gpio_dir(unsigned long pin);
  199. extern int mt_set_gpio_out(unsigned long pin, unsigned long output);
  200. extern int mt_get_gpio_out(unsigned long pin);
  201. extern int mt_set_gpio_mode(unsigned long pin, unsigned long mode);
  202. extern int mt_get_gpio_mode(unsigned long pin);
  203. extern int mt_set_gpio_pull_enable(unsigned long pin, unsigned long enable);
  204. extern int mt_gpio_set_debounce(unsigned gpio, unsigned debounce);
  205. extern size_t fpc1020_calc_huge_buffer_minsize(fpc1020_data_t *fpc1020);
  206. extern int fpc1020_manage_huge_buffer(fpc1020_data_t *fpc1020,
  207. size_t new_size);
  208. extern int fpc1020_setup_defaults(fpc1020_data_t *fpc1020);
  209. extern int fpc1020_gpio_reset(fpc1020_data_t *fpc1020);
  210. extern int fpc1020_spi_reset(fpc1020_data_t *fpc1020);
  211. extern int fpc1020_reset(fpc1020_data_t *fpc1020);
  212. extern int fpc1020_check_hw_id(fpc1020_data_t *fpc1020);
  213. extern const char *fpc1020_hw_id_text(fpc1020_data_t *fpc1020);
  214. extern int fpc1020_write_sensor_setup(fpc1020_data_t *fpc1020);
  215. extern int fpc1020_wait_for_irq(fpc1020_data_t *fpc1020, int timeout);
  216. extern int fpc1020_read_irq(fpc1020_data_t *fpc1020, bool clear_irq);
  217. extern int fpc1020_read_status_reg(fpc1020_data_t *fpc1020);
  218. extern int fpc1020_reg_access(fpc1020_data_t *fpc1020,
  219. fpc1020_reg_access_t *reg_data);
  220. extern int fpc1020_cmd(fpc1020_data_t *fpc1020, fpc1020_cmd_t cmd,
  221. u8 wait_irq_mask);
  222. extern int fpc1020_wait_finger_present(fpc1020_data_t *fpc1020);
  223. extern int fpc1020_get_finger_present_status(fpc1020_data_t *fpc1020);
  224. extern int fpc1020_check_finger_present_raw(fpc1020_data_t *fpc1020);
  225. extern int fpc1020_check_finger_present_sum(fpc1020_data_t *fpc1020);
  226. extern int fpc1020_wake_up(fpc1020_data_t *fpc1020);
  227. extern int fpc1020_sleep(fpc1020_data_t *fpc1020, bool deep_sleep);
  228. extern int fpc1020_fetch_image(fpc1020_data_t *fpc1020,
  229. u8 *buffer,
  230. int offset,
  231. size_t image_size_bytes,
  232. size_t buff_size);
  233. extern bool fpc1020_check_in_range_u64(u64 val, u64 min, u64 max);
  234. extern int fpc1020_calc_finger_detect_threshold_min(fpc1020_data_t *fpc1020);
  235. extern int fpc1020_set_finger_detect_threshold(fpc1020_data_t *fpc1020,
  236. int measured_val);
  237. int fpc1020_gpio_set(int cmd);
  238. irqreturn_t fpc1020_interrupt(int irq, void *_fpc1020);
  239. #define FPC1020_MK_REG_READ_BYTES(__dst, __reg, __count, __ptr) { \
  240. (__dst).reg = FPC1020_REG_TO_ACTUAL((__reg)); \
  241. (__dst).reg_size = (__count); \
  242. (__dst).write = false; \
  243. (__dst).dataptr = (__ptr); }
  244. #define FPC1020_MK_REG_READ(__dst, __reg, __ptr) { \
  245. (__dst).reg = FPC1020_REG_TO_ACTUAL((__reg)); \
  246. (__dst).reg_size = FPC1020_REG_SIZE((__reg)); \
  247. (__dst).write = false; \
  248. (__dst).dataptr = (u8 *)(__ptr); }
  249. #define FPC1020_MK_REG_WRITE_BYTES(__dst, __reg, __count, __ptr) { \
  250. (__dst).reg = FPC1020_REG_TO_ACTUAL((__reg)); \
  251. (__dst).reg_size = (__count); \
  252. (__dst).write = true; \
  253. (__dst).dataptr = (__ptr); }
  254. #define FPC1020_MK_REG_WRITE(__dst, __reg, __ptr) { \
  255. (__dst).reg = FPC1020_REG_TO_ACTUAL((__reg)); \
  256. (__dst).reg_size = FPC1020_REG_SIZE((__reg)); \
  257. (__dst).write = true; \
  258. (__dst).dataptr = (u8 *)(__ptr); }
  259. #define FPC1020_FINGER_DETECT_ZONE_MASK 0x0FFFU
  260. #endif /* LINUX_SPI_FPC1020_COMMON_H */