goodix_brl_hw.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434
  1. /*
  2. * Goodix Touchscreen Driver
  3. * Copyright (C) 2020 - 2021 Goodix, Inc.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be a reference
  11. * to you, when you are integrating the GOODiX's CTP IC into your system,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. */
  17. #include "goodix_ts_core.h"
  18. /* berlin_A SPI mode setting */
  19. #define GOODIX_SPI_MODE_REG 0xC900
  20. #define GOODIX_SPI_NORMAL_MODE_0 0x01
  21. /* berlin_A D12 setting */
  22. #define GOODIX_REG_CLK_STA0 0xD807
  23. #define GOODIX_CLK_STA0_ENABLE 0xFF
  24. #define GOODIX_REG_CLK_STA1 0xD806
  25. #define GOODIX_CLK_STA1_ENABLE 0x77
  26. #define GOODIX_REG_TRIM_D12 0xD006
  27. #define GOODIX_TRIM_D12_LEVEL 0x3C
  28. #define GOODIX_REG_RESET 0xD808
  29. #define GOODIX_RESET_EN 0xFA
  30. #define HOLD_CPU_REG_W 0x0002
  31. #define HOLD_CPU_REG_R 0x2000
  32. #define DEV_CONFIRM_VAL 0xAA
  33. #define BOOTOPTION_ADDR 0x10000
  34. #define FW_VERSION_INFO_ADDR_BRA 0x1000C
  35. #define FW_VERSION_INFO_ADDR 0x10014
  36. #define GOODIX_IC_INFO_MAX_LEN 1024
  37. #define GOODIX_IC_INFO_ADDR_BRA 0x10068
  38. #define GOODIX_IC_INFO_ADDR 0x10070
  39. enum brl_request_code {
  40. BRL_REQUEST_CODE_CONFIG = 0x01,
  41. BRL_REQUEST_CODE_REF_ERR = 0x02,
  42. BRL_REQUEST_CODE_RESET = 0x03,
  43. BRL_REQUEST_CODE_CLOCK = 0x04,
  44. };
  45. static int brl_select_spi_mode(struct goodix_ts_core *cd)
  46. {
  47. int ret;
  48. int i;
  49. u8 w_value = GOODIX_SPI_NORMAL_MODE_0;
  50. u8 r_value;
  51. if (cd->bus->bus_type == GOODIX_BUS_TYPE_I2C ||
  52. cd->bus->ic_type != IC_TYPE_BERLIN_A)
  53. return 0;
  54. for (i = 0; i < GOODIX_RETRY_5; i++) {
  55. cd->hw_ops->write(cd, GOODIX_SPI_MODE_REG,
  56. &w_value, 1);
  57. ret = cd->hw_ops->read(cd, GOODIX_SPI_MODE_REG,
  58. &r_value, 1);
  59. if (!ret && r_value == w_value)
  60. return 0;
  61. }
  62. ts_err("failed switch SPI mode after reset, ret:%d r_value:%02x", ret, r_value);
  63. return -EINVAL;
  64. }
  65. static int brl_dev_confirm(struct goodix_ts_core *cd)
  66. {
  67. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  68. int ret = 0;
  69. int retry = GOODIX_RETRY_3;
  70. u8 tx_buf[8] = {0};
  71. u8 rx_buf[8] = {0};
  72. memset(tx_buf, DEV_CONFIRM_VAL, sizeof(tx_buf));
  73. while (retry--) {
  74. ret = hw_ops->write(cd, BOOTOPTION_ADDR,
  75. tx_buf, sizeof(tx_buf));
  76. if (ret < 0)
  77. return ret;
  78. ret = hw_ops->read(cd, BOOTOPTION_ADDR,
  79. rx_buf, sizeof(rx_buf));
  80. if (ret < 0)
  81. return ret;
  82. if (!memcmp(tx_buf, rx_buf, sizeof(tx_buf)))
  83. break;
  84. usleep_range(5000, 5100);
  85. }
  86. if (retry < 0) {
  87. ret = -EINVAL;
  88. ts_err("device confirm failed, rx_buf:%*ph", 8, rx_buf);
  89. }
  90. ts_info("device connected");
  91. return ret;
  92. }
  93. static int brl_reset_after(struct goodix_ts_core *cd)
  94. {
  95. u8 reg_val[2] = {0};
  96. u8 temp_buf[12] = {0};
  97. int ret;
  98. int retry;
  99. if (cd->bus->ic_type != IC_TYPE_BERLIN_A)
  100. return 0;
  101. ts_info("IN");
  102. /* select spi mode */
  103. ret = brl_select_spi_mode(cd);
  104. if (ret < 0)
  105. return ret;
  106. /* hold cpu */
  107. retry = GOODIX_RETRY_10;
  108. while (retry--) {
  109. reg_val[0] = 0x01;
  110. reg_val[1] = 0x00;
  111. ret = cd->hw_ops->write(cd, HOLD_CPU_REG_W, reg_val, 2);
  112. ret |= cd->hw_ops->read(cd, HOLD_CPU_REG_R, &temp_buf[0], 4);
  113. ret |= cd->hw_ops->read(cd, HOLD_CPU_REG_R, &temp_buf[4], 4);
  114. ret |= cd->hw_ops->read(cd, HOLD_CPU_REG_R, &temp_buf[8], 4);
  115. if (!ret && !memcmp(&temp_buf[0], &temp_buf[4], 4) &&
  116. !memcmp(&temp_buf[4], &temp_buf[8], 4) &&
  117. !memcmp(&temp_buf[0], &temp_buf[8], 4)) {
  118. break;
  119. }
  120. }
  121. if (retry < 0) {
  122. ts_err("failed to hold cpu, status:%*ph", 12, temp_buf);
  123. return -EINVAL;
  124. }
  125. /* enable sta0 clk */
  126. retry = GOODIX_RETRY_5;
  127. while (retry--) {
  128. reg_val[0] = GOODIX_CLK_STA0_ENABLE;
  129. ret = cd->hw_ops->write(cd, GOODIX_REG_CLK_STA0, reg_val, 1);
  130. ret |= cd->hw_ops->read(cd, GOODIX_REG_CLK_STA0, temp_buf, 1);
  131. if (!ret && temp_buf[0] == GOODIX_CLK_STA0_ENABLE)
  132. break;
  133. }
  134. if (retry < 0) {
  135. ts_err("failed to enable group0 clock, ret:%d status:%02x", ret, temp_buf[0]);
  136. return -EINVAL;
  137. }
  138. /* enable sta1 clk */
  139. retry = GOODIX_RETRY_5;
  140. while (retry--) {
  141. reg_val[0] = GOODIX_CLK_STA1_ENABLE;
  142. ret = cd->hw_ops->write(cd, GOODIX_REG_CLK_STA1, reg_val, 1);
  143. ret |= cd->hw_ops->read(cd, GOODIX_REG_CLK_STA1, temp_buf, 1);
  144. if (!ret && temp_buf[0] == GOODIX_CLK_STA1_ENABLE)
  145. break;
  146. }
  147. if (retry < 0) {
  148. ts_err("failed to enable group1 clock, ret:%d status:%02x", ret, temp_buf[0]);
  149. return -EINVAL;
  150. }
  151. /* set D12 level */
  152. retry = GOODIX_RETRY_5;
  153. while (retry--) {
  154. reg_val[0] = GOODIX_TRIM_D12_LEVEL;
  155. ret = cd->hw_ops->write(cd, GOODIX_REG_TRIM_D12, reg_val, 1);
  156. ret |= cd->hw_ops->read(cd, GOODIX_REG_TRIM_D12, temp_buf, 1);
  157. if (!ret && temp_buf[0] == GOODIX_TRIM_D12_LEVEL)
  158. break;
  159. }
  160. if (retry < 0) {
  161. ts_err("failed to set D12, ret:%d status:%02x", ret, temp_buf[0]);
  162. return -EINVAL;
  163. }
  164. usleep_range(5000, 5100);
  165. /* soft reset */
  166. reg_val[0] = GOODIX_RESET_EN;
  167. ret = cd->hw_ops->write(cd, GOODIX_REG_RESET, reg_val, 1);
  168. if (ret < 0)
  169. return ret;
  170. /* select spi mode */
  171. ret = brl_select_spi_mode(cd);
  172. if (ret < 0)
  173. return ret;
  174. ts_info("OUT");
  175. return 0;
  176. }
  177. static int brl_power_on(struct goodix_ts_core *cd, bool on)
  178. {
  179. int ret = 0;
  180. int iovdd_gpio = cd->board_data.iovdd_gpio;
  181. int avdd_gpio = cd->board_data.avdd_gpio;
  182. int reset_gpio = cd->board_data.reset_gpio;
  183. if (on) {
  184. if (iovdd_gpio > 0) {
  185. gpio_direction_output(iovdd_gpio, 1);
  186. } else if (cd->iovdd) {
  187. ret = regulator_enable(cd->iovdd);
  188. if (ret < 0) {
  189. ts_err("Failed to enable iovdd:%d", ret);
  190. goto power_off;
  191. }
  192. }
  193. usleep_range(3000, 3100);
  194. if (avdd_gpio > 0) {
  195. gpio_direction_output(avdd_gpio, 1);
  196. } else if (cd->avdd) {
  197. ret = regulator_enable(cd->avdd);
  198. if (ret < 0) {
  199. ts_err("Failed to enable avdd:%d", ret);
  200. goto power_off;
  201. }
  202. }
  203. usleep_range(15000, 15100);
  204. gpio_direction_output(reset_gpio, 1);
  205. usleep_range(4000, 4100);
  206. ret = brl_dev_confirm(cd);
  207. if (ret < 0)
  208. goto power_off;
  209. ret = brl_reset_after(cd);
  210. if (ret < 0)
  211. goto power_off;
  212. msleep(GOODIX_NORMAL_RESET_DELAY_MS);
  213. return 0;
  214. }
  215. power_off:
  216. gpio_direction_output(reset_gpio, 0);
  217. if (iovdd_gpio > 0)
  218. gpio_direction_output(iovdd_gpio, 0);
  219. else if (cd->iovdd)
  220. regulator_disable(cd->iovdd);
  221. if (avdd_gpio > 0)
  222. gpio_direction_output(avdd_gpio, 0);
  223. else if (cd->avdd)
  224. regulator_disable(cd->avdd);
  225. return ret;
  226. }
  227. #define GOODIX_SLEEP_CMD 0x84
  228. int brl_suspend(struct goodix_ts_core *cd)
  229. {
  230. struct goodix_ts_cmd sleep_cmd;
  231. sleep_cmd.cmd = GOODIX_SLEEP_CMD;
  232. sleep_cmd.len = 4;
  233. if (cd->hw_ops->send_cmd(cd, &sleep_cmd))
  234. ts_err("failed send sleep cmd");
  235. return 0;
  236. }
  237. int brl_resume(struct goodix_ts_core *cd)
  238. {
  239. return cd->hw_ops->reset(cd, GOODIX_NORMAL_RESET_DELAY_MS);
  240. }
  241. #define GOODIX_GESTURE_CMD 0x12
  242. int brl_gesture(struct goodix_ts_core *cd, int gesture_type)
  243. {
  244. struct goodix_ts_cmd cmd;
  245. cmd.cmd = GOODIX_GESTURE_CMD;
  246. cmd.len = 5;
  247. cmd.data[0] = gesture_type;
  248. if (cd->hw_ops->send_cmd(cd, &cmd))
  249. ts_err("failed send gesture cmd");
  250. return 0;
  251. }
  252. static int brl_reset(struct goodix_ts_core *cd, int delay)
  253. {
  254. ts_info("chip_reset");
  255. gpio_direction_output(cd->board_data.reset_gpio, 0);
  256. usleep_range(2000, 2100);
  257. gpio_direction_output(cd->board_data.reset_gpio, 1);
  258. if (delay < 20)
  259. usleep_range(delay * 1000, delay * 1000 + 100);
  260. else
  261. msleep(delay);
  262. return brl_select_spi_mode(cd);
  263. }
  264. static int brl_irq_enbale(struct goodix_ts_core *cd, bool enable)
  265. {
  266. if (enable && !atomic_cmpxchg(&cd->irq_enabled, 0, 1)) {
  267. enable_irq(cd->irq);
  268. ts_debug("Irq enabled");
  269. return 0;
  270. }
  271. if (!enable && atomic_cmpxchg(&cd->irq_enabled, 1, 0)) {
  272. disable_irq(cd->irq);
  273. ts_debug("Irq disabled");
  274. return 0;
  275. }
  276. ts_info("warnning: irq deepth inbalance!");
  277. return 0;
  278. }
  279. static int brl_read(struct goodix_ts_core *cd, unsigned int addr,
  280. unsigned char *data, unsigned int len)
  281. {
  282. struct goodix_bus_interface *bus = cd->bus;
  283. return bus->read(bus->dev, addr, data, len);
  284. }
  285. static int brl_write(struct goodix_ts_core *cd, unsigned int addr,
  286. unsigned char *data, unsigned int len)
  287. {
  288. struct goodix_bus_interface *bus = cd->bus;
  289. return bus->write(bus->dev, addr, data, len);
  290. }
  291. /* command ack info */
  292. #define CMD_ACK_IDLE 0x01
  293. #define CMD_ACK_BUSY 0x02
  294. #define CMD_ACK_BUFFER_OVERFLOW 0x03
  295. #define CMD_ACK_CHECKSUM_ERROR 0x04
  296. #define CMD_ACK_OK 0x80
  297. #define GOODIX_CMD_RETRY 6
  298. static int brl_send_cmd(struct goodix_ts_core *cd,
  299. struct goodix_ts_cmd *cmd)
  300. {
  301. int ret, retry, i;
  302. struct goodix_ts_cmd cmd_ack;
  303. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  304. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  305. cmd->state = 0;
  306. cmd->ack = 0;
  307. goodix_append_checksum(&(cmd->buf[2]), cmd->len - 2,
  308. CHECKSUM_MODE_U8_LE);
  309. ts_debug("cmd data %*ph", cmd->len, &(cmd->buf[2]));
  310. retry = 0;
  311. while (retry++ < GOODIX_CMD_RETRY) {
  312. ret = hw_ops->write(cd, misc->cmd_addr,
  313. cmd->buf, sizeof(*cmd));
  314. if (ret < 0) {
  315. ts_err("failed write command");
  316. return ret;
  317. }
  318. for (i = 0; i < GOODIX_CMD_RETRY; i++) {
  319. /* check command result */
  320. ret = hw_ops->read(cd, misc->cmd_addr,
  321. cmd_ack.buf, sizeof(cmd_ack));
  322. if (ret < 0) {
  323. ts_err("failed read command ack, %d", ret);
  324. return ret;
  325. }
  326. ts_debug("cmd ack data %*ph",
  327. (int)sizeof(cmd_ack), cmd_ack.buf);
  328. if (cmd_ack.ack == CMD_ACK_OK) {
  329. usleep_range(2000, 2100);
  330. return 0;
  331. }
  332. if (cmd_ack.ack == CMD_ACK_BUSY ||
  333. cmd_ack.ack == 0x00) {
  334. usleep_range(1000, 1100);
  335. continue;
  336. }
  337. if (cmd_ack.ack == CMD_ACK_BUFFER_OVERFLOW)
  338. usleep_range(10000, 11000);
  339. usleep_range(1000, 1100);
  340. break;
  341. }
  342. }
  343. ts_err("failed get valid cmd ack");
  344. return -EINVAL;
  345. }
  346. #pragma pack(1)
  347. struct goodix_config_head {
  348. union {
  349. struct {
  350. u8 panel_name[8];
  351. u8 fw_pid[8];
  352. u8 fw_vid[4];
  353. u8 project_name[8];
  354. u8 file_ver[2];
  355. u32 cfg_id;
  356. u8 cfg_ver;
  357. u8 cfg_time[8];
  358. u8 reserved[15];
  359. u8 flag;
  360. u16 cfg_len;
  361. u8 cfg_num;
  362. u16 checksum;
  363. };
  364. u8 buf[64];
  365. };
  366. };
  367. #pragma pack()
  368. #define CONFIG_CND_LEN 4
  369. #define CONFIG_CMD_START 0x04
  370. #define CONFIG_CMD_WRITE 0x05
  371. #define CONFIG_CMD_EXIT 0x06
  372. #define CONFIG_CMD_READ_START 0x07
  373. #define CONFIG_CMD_READ_EXIT 0x08
  374. #define CONFIG_CMD_STATUS_PASS 0x80
  375. #define CONFIG_CMD_WAIT_RETRY 20
  376. static int wait_cmd_status(struct goodix_ts_core *cd,
  377. u8 target_status, int retry)
  378. {
  379. struct goodix_ts_cmd cmd_ack;
  380. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  381. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  382. int i, ret;
  383. for (i = 0; i < retry; i++) {
  384. ret = hw_ops->read(cd, misc->cmd_addr, cmd_ack.buf,
  385. sizeof(cmd_ack));
  386. if (!ret && cmd_ack.state == target_status) {
  387. ts_debug("status check pass");
  388. return 0;
  389. }
  390. ts_debug("cmd buf %*ph", (int)sizeof(cmd_ack), cmd_ack.buf);
  391. msleep(20);
  392. }
  393. ts_err("cmd status not ready, retry %d, ack 0x%x, status 0x%x, ret %d",
  394. i, cmd_ack.ack, cmd_ack.state, ret);
  395. return -EINVAL;
  396. }
  397. static int send_cfg_cmd(struct goodix_ts_core *cd,
  398. struct goodix_ts_cmd *cfg_cmd)
  399. {
  400. int ret;
  401. ret = cd->hw_ops->send_cmd(cd, cfg_cmd);
  402. if (ret) {
  403. ts_err("failed write cfg prepare cmd %d", ret);
  404. return ret;
  405. }
  406. ret = wait_cmd_status(cd, CONFIG_CMD_STATUS_PASS,
  407. CONFIG_CMD_WAIT_RETRY);
  408. if (ret) {
  409. ts_err("failed wait for fw ready for config, %d", ret);
  410. return ret;
  411. }
  412. return 0;
  413. }
  414. static int brl_send_config(struct goodix_ts_core *cd, u8 *cfg, int len)
  415. {
  416. int ret;
  417. u8 *tmp_buf;
  418. struct goodix_ts_cmd cfg_cmd;
  419. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  420. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  421. if (len > misc->fw_buffer_max_len) {
  422. ts_err("config len exceed limit %d > %d",
  423. len, misc->fw_buffer_max_len);
  424. return -EINVAL;
  425. }
  426. tmp_buf = kzalloc(len, GFP_KERNEL);
  427. if (!tmp_buf)
  428. return -ENOMEM;
  429. cfg_cmd.len = CONFIG_CND_LEN;
  430. cfg_cmd.cmd = CONFIG_CMD_START;
  431. ret = send_cfg_cmd(cd, &cfg_cmd);
  432. if (ret) {
  433. ts_err("failed write cfg prepare cmd %d", ret);
  434. goto exit;
  435. }
  436. ts_debug("try send config to 0x%x, len %d", misc->fw_buffer_addr, len);
  437. ret = hw_ops->write(cd, misc->fw_buffer_addr, cfg, len);
  438. if (ret) {
  439. ts_err("failed write config data, %d", ret);
  440. goto exit;
  441. }
  442. ret = hw_ops->read(cd, misc->fw_buffer_addr, tmp_buf, len);
  443. if (ret) {
  444. ts_err("failed read back config data");
  445. goto exit;
  446. }
  447. if (memcmp(cfg, tmp_buf, len)) {
  448. ts_err("config data read back compare file");
  449. ret = -EINVAL;
  450. goto exit;
  451. }
  452. /* notify fw for recive config */
  453. memset(cfg_cmd.buf, 0, sizeof(cfg_cmd));
  454. cfg_cmd.len = CONFIG_CND_LEN;
  455. cfg_cmd.cmd = CONFIG_CMD_WRITE;
  456. ret = send_cfg_cmd(cd, &cfg_cmd);
  457. if (ret)
  458. ts_err("failed send config data ready cmd %d", ret);
  459. exit:
  460. memset(cfg_cmd.buf, 0, sizeof(cfg_cmd));
  461. cfg_cmd.len = CONFIG_CND_LEN;
  462. cfg_cmd.cmd = CONFIG_CMD_EXIT;
  463. if (send_cfg_cmd(cd, &cfg_cmd)) {
  464. ts_err("failed send config write end command");
  465. ret = -EINVAL;
  466. }
  467. if (!ret) {
  468. ts_info("success send config");
  469. msleep(100);
  470. }
  471. kfree(tmp_buf);
  472. return ret;
  473. }
  474. /*
  475. * return: return config length on succes, other wise return < 0
  476. **/
  477. static int brl_read_config(struct goodix_ts_core *cd, u8 *cfg, int size)
  478. {
  479. int ret;
  480. struct goodix_ts_cmd cfg_cmd;
  481. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  482. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  483. struct goodix_config_head cfg_head;
  484. if (!cfg)
  485. return -EINVAL;
  486. cfg_cmd.len = CONFIG_CND_LEN;
  487. cfg_cmd.cmd = CONFIG_CMD_READ_START;
  488. ret = send_cfg_cmd(cd, &cfg_cmd);
  489. if (ret) {
  490. ts_err("failed send config read prepare command");
  491. return ret;
  492. }
  493. ret = hw_ops->read(cd, misc->fw_buffer_addr,
  494. cfg_head.buf, sizeof(cfg_head));
  495. if (ret) {
  496. ts_err("failed read config head %d", ret);
  497. goto exit;
  498. }
  499. if (checksum_cmp(cfg_head.buf, sizeof(cfg_head), CHECKSUM_MODE_U8_LE)) {
  500. ts_err("config head checksum error");
  501. ret = -EINVAL;
  502. goto exit;
  503. }
  504. cfg_head.cfg_len = le16_to_cpu(cfg_head.cfg_len);
  505. if (cfg_head.cfg_len > misc->fw_buffer_max_len ||
  506. cfg_head.cfg_len > size) {
  507. ts_err("cfg len exceed buffer size %d > %d", cfg_head.cfg_len,
  508. misc->fw_buffer_max_len);
  509. ret = -EINVAL;
  510. goto exit;
  511. }
  512. memcpy(cfg, cfg_head.buf, sizeof(cfg_head));
  513. ret = hw_ops->read(cd, misc->fw_buffer_addr + sizeof(cfg_head),
  514. cfg + sizeof(cfg_head), cfg_head.cfg_len);
  515. if (ret) {
  516. ts_err("failed read cfg pack, %d", ret);
  517. goto exit;
  518. }
  519. ts_info("config len %d", cfg_head.cfg_len);
  520. if (checksum_cmp(cfg + sizeof(cfg_head),
  521. cfg_head.cfg_len, CHECKSUM_MODE_U16_LE)) {
  522. ts_err("config body checksum error");
  523. ret = -EINVAL;
  524. goto exit;
  525. }
  526. ts_info("success read config data: len %zu",
  527. cfg_head.cfg_len + sizeof(cfg_head));
  528. exit:
  529. memset(cfg_cmd.buf, 0, sizeof(cfg_cmd));
  530. cfg_cmd.len = CONFIG_CND_LEN;
  531. cfg_cmd.cmd = CONFIG_CMD_READ_EXIT;
  532. if (send_cfg_cmd(cd, &cfg_cmd)) {
  533. ts_err("failed send config read finish command");
  534. ret = -EINVAL;
  535. }
  536. if (ret)
  537. return -EINVAL;
  538. return cfg_head.cfg_len + sizeof(cfg_head);
  539. }
  540. /*
  541. * return: 0 for no error.
  542. * GOODIX_EBUS when encounter a bus error
  543. * GOODIX_ECHECKSUM version checksum error
  544. * GOODIX_EVERSION patch ID compare failed,
  545. * in this case the sensorID is valid.
  546. */
  547. static int brl_read_version(struct goodix_ts_core *cd,
  548. struct goodix_fw_version *version)
  549. {
  550. int ret, i;
  551. u32 fw_addr;
  552. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  553. u8 buf[sizeof(struct goodix_fw_version)] = {0};
  554. u8 temp_pid[8] = {0};
  555. if (cd->bus->ic_type == IC_TYPE_BERLIN_A)
  556. fw_addr = FW_VERSION_INFO_ADDR_BRA;
  557. else
  558. fw_addr = FW_VERSION_INFO_ADDR;
  559. for (i = 0; i < 2; i++) {
  560. ret = hw_ops->read(cd, fw_addr, buf, sizeof(buf));
  561. if (ret) {
  562. ts_info("read fw version: %d, retry %d", ret, i);
  563. ret = -GOODIX_EBUS;
  564. usleep_range(5000, 5100);
  565. continue;
  566. }
  567. if (!checksum_cmp(buf, sizeof(buf), CHECKSUM_MODE_U8_LE))
  568. break;
  569. ts_info("invalid fw version: checksum error!");
  570. ts_info("fw version:%*ph", (int)sizeof(buf), buf);
  571. ret = -GOODIX_ECHECKSUM;
  572. usleep_range(10000, 11000);
  573. }
  574. if (ret) {
  575. ts_err("failed get valied fw version");
  576. return ret;
  577. }
  578. memcpy(version, buf, sizeof(*version));
  579. memcpy(temp_pid, version->rom_pid, sizeof(version->rom_pid));
  580. ts_info("rom_pid:%s", temp_pid);
  581. ts_info("rom_vid:%*ph", (int)sizeof(version->rom_vid),
  582. version->rom_vid);
  583. ts_info("pid:%s", version->patch_pid);
  584. ts_info("vid:%*ph", (int)sizeof(version->patch_vid),
  585. version->patch_vid);
  586. ts_info("sensor_id:%d", version->sensor_id);
  587. return 0;
  588. }
  589. #define LE16_TO_CPU(x) (x = le16_to_cpu(x))
  590. #define LE32_TO_CPU(x) (x = le32_to_cpu(x))
  591. static int convert_ic_info(struct goodix_ic_info *info, const u8 *data)
  592. {
  593. int i;
  594. struct goodix_ic_info_version *version = &info->version;
  595. struct goodix_ic_info_feature *feature = &info->feature;
  596. struct goodix_ic_info_param *parm = &info->parm;
  597. struct goodix_ic_info_misc *misc = &info->misc;
  598. info->length = le16_to_cpup((__le16 *)data);
  599. data += 2;
  600. memcpy(version, data, sizeof(*version));
  601. version->config_id = le32_to_cpu(version->config_id);
  602. data += sizeof(struct goodix_ic_info_version);
  603. memcpy(feature, data, sizeof(*feature));
  604. feature->freqhop_feature =
  605. le16_to_cpu(feature->freqhop_feature);
  606. feature->calibration_feature =
  607. le16_to_cpu(feature->calibration_feature);
  608. feature->gesture_feature =
  609. le16_to_cpu(feature->gesture_feature);
  610. feature->side_touch_feature =
  611. le16_to_cpu(feature->side_touch_feature);
  612. feature->stylus_feature =
  613. le16_to_cpu(feature->stylus_feature);
  614. data += sizeof(struct goodix_ic_info_feature);
  615. parm->drv_num = *(data++);
  616. parm->sen_num = *(data++);
  617. parm->button_num = *(data++);
  618. parm->force_num = *(data++);
  619. parm->active_scan_rate_num = *(data++);
  620. if (parm->active_scan_rate_num > MAX_SCAN_RATE_NUM) {
  621. ts_err("invalid scan rate num %d > %d",
  622. parm->active_scan_rate_num, MAX_SCAN_RATE_NUM);
  623. return -EINVAL;
  624. }
  625. for (i = 0; i < parm->active_scan_rate_num; i++)
  626. parm->active_scan_rate[i] =
  627. le16_to_cpup((__le16 *)(data + i * 2));
  628. data += parm->active_scan_rate_num * 2;
  629. parm->mutual_freq_num = *(data++);
  630. if (parm->mutual_freq_num > MAX_SCAN_FREQ_NUM) {
  631. ts_err("invalid mntual freq num %d > %d",
  632. parm->mutual_freq_num, MAX_SCAN_FREQ_NUM);
  633. return -EINVAL;
  634. }
  635. for (i = 0; i < parm->mutual_freq_num; i++)
  636. parm->mutual_freq[i] =
  637. le16_to_cpup((__le16 *)(data + i * 2));
  638. data += parm->mutual_freq_num * 2;
  639. parm->self_tx_freq_num = *(data++);
  640. if (parm->self_tx_freq_num > MAX_SCAN_FREQ_NUM) {
  641. ts_err("invalid tx freq num %d > %d",
  642. parm->self_tx_freq_num, MAX_SCAN_FREQ_NUM);
  643. return -EINVAL;
  644. }
  645. for (i = 0; i < parm->self_tx_freq_num; i++)
  646. parm->self_tx_freq[i] =
  647. le16_to_cpup((__le16 *)(data + i * 2));
  648. data += parm->self_tx_freq_num * 2;
  649. parm->self_rx_freq_num = *(data++);
  650. if (parm->self_rx_freq_num > MAX_SCAN_FREQ_NUM) {
  651. ts_err("invalid rx freq num %d > %d",
  652. parm->self_rx_freq_num, MAX_SCAN_FREQ_NUM);
  653. return -EINVAL;
  654. }
  655. for (i = 0; i < parm->self_rx_freq_num; i++)
  656. parm->self_rx_freq[i] =
  657. le16_to_cpup((__le16 *)(data + i * 2));
  658. data += parm->self_rx_freq_num * 2;
  659. parm->stylus_freq_num = *(data++);
  660. if (parm->stylus_freq_num > MAX_FREQ_NUM_STYLUS) {
  661. ts_err("invalid stylus freq num %d > %d",
  662. parm->stylus_freq_num, MAX_FREQ_NUM_STYLUS);
  663. return -EINVAL;
  664. }
  665. for (i = 0; i < parm->stylus_freq_num; i++)
  666. parm->stylus_freq[i] =
  667. le16_to_cpup((__le16 *)(data + i * 2));
  668. data += parm->stylus_freq_num * 2;
  669. memcpy(misc, data, sizeof(*misc));
  670. misc->cmd_addr = le32_to_cpu(misc->cmd_addr);
  671. misc->cmd_max_len = le16_to_cpu(misc->cmd_max_len);
  672. misc->cmd_reply_addr = le32_to_cpu(misc->cmd_reply_addr);
  673. misc->cmd_reply_len = le16_to_cpu(misc->cmd_reply_len);
  674. misc->fw_state_addr = le32_to_cpu(misc->fw_state_addr);
  675. misc->fw_state_len = le16_to_cpu(misc->fw_state_len);
  676. misc->fw_buffer_addr = le32_to_cpu(misc->fw_buffer_addr);
  677. misc->fw_buffer_max_len = le16_to_cpu(misc->fw_buffer_max_len);
  678. misc->frame_data_addr = le32_to_cpu(misc->frame_data_addr);
  679. misc->frame_data_head_len = le16_to_cpu(misc->frame_data_head_len);
  680. misc->fw_attr_len = le16_to_cpu(misc->fw_attr_len);
  681. misc->fw_log_len = le16_to_cpu(misc->fw_log_len);
  682. misc->stylus_struct_len = le16_to_cpu(misc->stylus_struct_len);
  683. misc->mutual_struct_len = le16_to_cpu(misc->mutual_struct_len);
  684. misc->self_struct_len = le16_to_cpu(misc->self_struct_len);
  685. misc->noise_struct_len = le16_to_cpu(misc->noise_struct_len);
  686. misc->touch_data_addr = le32_to_cpu(misc->touch_data_addr);
  687. misc->touch_data_head_len = le16_to_cpu(misc->touch_data_head_len);
  688. misc->point_struct_len = le16_to_cpu(misc->point_struct_len);
  689. LE32_TO_CPU(misc->mutual_rawdata_addr);
  690. LE32_TO_CPU(misc->mutual_diffdata_addr);
  691. LE32_TO_CPU(misc->mutual_refdata_addr);
  692. LE32_TO_CPU(misc->self_rawdata_addr);
  693. LE32_TO_CPU(misc->self_diffdata_addr);
  694. LE32_TO_CPU(misc->self_refdata_addr);
  695. LE32_TO_CPU(misc->iq_rawdata_addr);
  696. LE32_TO_CPU(misc->iq_refdata_addr);
  697. LE32_TO_CPU(misc->im_rawdata_addr);
  698. LE16_TO_CPU(misc->im_readata_len);
  699. LE32_TO_CPU(misc->noise_rawdata_addr);
  700. LE16_TO_CPU(misc->noise_rawdata_len);
  701. LE32_TO_CPU(misc->stylus_rawdata_addr);
  702. LE16_TO_CPU(misc->stylus_rawdata_len);
  703. LE32_TO_CPU(misc->noise_data_addr);
  704. LE32_TO_CPU(misc->esd_addr);
  705. return 0;
  706. }
  707. static void print_ic_info(struct goodix_ic_info *ic_info)
  708. {
  709. struct goodix_ic_info_version *version = &ic_info->version;
  710. struct goodix_ic_info_feature *feature = &ic_info->feature;
  711. struct goodix_ic_info_param *parm = &ic_info->parm;
  712. struct goodix_ic_info_misc *misc = &ic_info->misc;
  713. ts_info("ic_info_length: %d",
  714. ic_info->length);
  715. ts_info("info_customer_id: 0x%01X",
  716. version->info_customer_id);
  717. ts_info("info_version_id: 0x%01X",
  718. version->info_version_id);
  719. ts_info("ic_die_id: 0x%01X",
  720. version->ic_die_id);
  721. ts_info("ic_version_id: 0x%01X",
  722. version->ic_version_id);
  723. ts_info("config_id: 0x%4X",
  724. version->config_id);
  725. ts_info("config_version: 0x%01X",
  726. version->config_version);
  727. ts_info("frame_data_customer_id: 0x%01X",
  728. version->frame_data_customer_id);
  729. ts_info("frame_data_version_id: 0x%01X",
  730. version->frame_data_version_id);
  731. ts_info("touch_data_customer_id: 0x%01X",
  732. version->touch_data_customer_id);
  733. ts_info("touch_data_version_id: 0x%01X",
  734. version->touch_data_version_id);
  735. ts_info("freqhop_feature: 0x%04X",
  736. feature->freqhop_feature);
  737. ts_info("calibration_feature: 0x%04X",
  738. feature->calibration_feature);
  739. ts_info("gesture_feature: 0x%04X",
  740. feature->gesture_feature);
  741. ts_info("side_touch_feature: 0x%04X",
  742. feature->side_touch_feature);
  743. ts_info("stylus_feature: 0x%04X",
  744. feature->stylus_feature);
  745. ts_info("Drv*Sen,Button,Force num: %d x %d, %d, %d",
  746. parm->drv_num, parm->sen_num,
  747. parm->button_num, parm->force_num);
  748. ts_info("Cmd: 0x%04X, %d",
  749. misc->cmd_addr, misc->cmd_max_len);
  750. ts_info("Cmd-Reply: 0x%04X, %d",
  751. misc->cmd_reply_addr, misc->cmd_reply_len);
  752. ts_info("FW-State: 0x%04X, %d",
  753. misc->fw_state_addr, misc->fw_state_len);
  754. ts_info("FW-Buffer: 0x%04X, %d",
  755. misc->fw_buffer_addr, misc->fw_buffer_max_len);
  756. ts_info("Touch-Data: 0x%04X, %d",
  757. misc->touch_data_addr, misc->touch_data_head_len);
  758. ts_info("point_struct_len: %d",
  759. misc->point_struct_len);
  760. ts_info("mutual_rawdata_addr: 0x%04X",
  761. misc->mutual_rawdata_addr);
  762. ts_info("mutual_diffdata_addr: 0x%04X",
  763. misc->mutual_diffdata_addr);
  764. ts_info("self_rawdata_addr: 0x%04X",
  765. misc->self_rawdata_addr);
  766. ts_info("self_diffdata_addr: 0x%04X",
  767. misc->self_diffdata_addr);
  768. ts_info("stylus_rawdata_addr: 0x%04X, %d",
  769. misc->stylus_rawdata_addr, misc->stylus_rawdata_len);
  770. ts_info("esd_addr: 0x%04X",
  771. misc->esd_addr);
  772. }
  773. static int brl_get_ic_info(struct goodix_ts_core *cd,
  774. struct goodix_ic_info *ic_info)
  775. {
  776. int ret, i;
  777. u16 length = 0;
  778. u32 ic_addr;
  779. u8 afe_data[GOODIX_IC_INFO_MAX_LEN] = {0};
  780. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  781. if (cd->bus->ic_type == IC_TYPE_BERLIN_A)
  782. ic_addr = GOODIX_IC_INFO_ADDR_BRA;
  783. else
  784. ic_addr = GOODIX_IC_INFO_ADDR;
  785. for (i = 0; i < GOODIX_RETRY_3; i++) {
  786. ret = hw_ops->read(cd, ic_addr,
  787. (u8 *)&length, sizeof(length));
  788. if (ret) {
  789. ts_info("failed get ic info length, %d", ret);
  790. usleep_range(5000, 5100);
  791. continue;
  792. }
  793. length = le16_to_cpu(length);
  794. if (length >= GOODIX_IC_INFO_MAX_LEN) {
  795. ts_info("invalid ic info length %d, retry %d",
  796. length, i);
  797. continue;
  798. }
  799. ret = hw_ops->read(cd, ic_addr, afe_data, length);
  800. if (ret) {
  801. ts_info("failed get ic info data, %d", ret);
  802. usleep_range(5000, 5100);
  803. continue;
  804. }
  805. /* judge whether the data is valid */
  806. if (is_risk_data((const uint8_t *)afe_data, length)) {
  807. ts_info("fw info data invalid");
  808. usleep_range(5000, 5100);
  809. continue;
  810. }
  811. if (checksum_cmp((const uint8_t *)afe_data,
  812. length, CHECKSUM_MODE_U8_LE)) {
  813. ts_info("fw info checksum error!");
  814. usleep_range(5000, 5100);
  815. continue;
  816. }
  817. break;
  818. }
  819. if (i == GOODIX_RETRY_3) {
  820. ts_err("failed get ic info");
  821. return -EINVAL;
  822. }
  823. ret = convert_ic_info(ic_info, afe_data);
  824. if (ret) {
  825. ts_err("convert ic info encounter error");
  826. return ret;
  827. }
  828. print_ic_info(ic_info);
  829. /* check some key info */
  830. if (!ic_info->misc.cmd_addr || !ic_info->misc.fw_buffer_addr ||
  831. !ic_info->misc.touch_data_addr) {
  832. ts_err("cmd_addr fw_buf_addr and touch_data_addr is null");
  833. return -EINVAL;
  834. }
  835. return 0;
  836. }
  837. #define GOODIX_ESD_TICK_WRITE_DATA 0xAA
  838. static int brl_esd_check(struct goodix_ts_core *cd)
  839. {
  840. int ret;
  841. u32 esd_addr;
  842. u8 esd_value;
  843. if (!cd->ic_info.misc.esd_addr)
  844. return 0;
  845. esd_addr = cd->ic_info.misc.esd_addr;
  846. ret = cd->hw_ops->read(cd, esd_addr, &esd_value, 1);
  847. if (ret) {
  848. ts_err("failed get esd value, %d", ret);
  849. return ret;
  850. }
  851. if (esd_value == GOODIX_ESD_TICK_WRITE_DATA) {
  852. ts_err("esd check failed, 0x%x", esd_value);
  853. return -EINVAL;
  854. }
  855. esd_value = GOODIX_ESD_TICK_WRITE_DATA;
  856. ret = cd->hw_ops->write(cd, esd_addr, &esd_value, 1);
  857. if (ret) {
  858. ts_err("failed refrash esd value");
  859. return ret;
  860. }
  861. return 0;
  862. }
  863. #define IRQ_EVENT_HEAD_LEN 8
  864. #define BYTES_PER_POINT 8
  865. #define COOR_DATA_CHECKSUM_SIZE 2
  866. #define GOODIX_TOUCH_EVENT 0x80
  867. #define GOODIX_REQUEST_EVENT 0x40
  868. #define GOODIX_GESTURE_EVENT 0x20
  869. #define POINT_TYPE_STYLUS_HOVER 0x01
  870. #define POINT_TYPE_STYLUS 0x03
  871. static void goodix_parse_finger(struct goodix_touch_data *touch_data,
  872. u8 *buf, int touch_num)
  873. {
  874. unsigned int id = 0, x = 0, y = 0, w = 0;
  875. u8 *coor_data;
  876. int i;
  877. coor_data = &buf[IRQ_EVENT_HEAD_LEN];
  878. for (i = 0; i < touch_num; i++) {
  879. id = (coor_data[0] >> 4) & 0x0F;
  880. if (id >= GOODIX_MAX_TOUCH) {
  881. ts_info("invalid finger id =%d", id);
  882. touch_data->touch_num = 0;
  883. return;
  884. }
  885. x = le16_to_cpup((__le16 *)(coor_data + 2));
  886. y = le16_to_cpup((__le16 *)(coor_data + 4));
  887. w = le16_to_cpup((__le16 *)(coor_data + 6));
  888. touch_data->coords[id].status = TS_TOUCH;
  889. touch_data->coords[id].x = x;
  890. touch_data->coords[id].y = y;
  891. touch_data->coords[id].w = w;
  892. coor_data += BYTES_PER_POINT;
  893. }
  894. touch_data->touch_num = touch_num;
  895. }
  896. static unsigned int goodix_pen_btn_code[] = {BTN_STYLUS, BTN_STYLUS2};
  897. static void goodix_parse_pen(struct goodix_pen_data *pen_data,
  898. u8 *buf, int touch_num)
  899. {
  900. unsigned int id = 0;
  901. u8 cur_key_map = 0;
  902. u8 *coor_data;
  903. int16_t x_angle, y_angle;
  904. int i;
  905. pen_data->coords.tool_type = BTN_TOOL_PEN;
  906. if (touch_num) {
  907. pen_data->coords.status = TS_TOUCH;
  908. coor_data = &buf[IRQ_EVENT_HEAD_LEN];
  909. id = (coor_data[0] >> 4) & 0x0F;
  910. pen_data->coords.x = le16_to_cpup((__le16 *)(coor_data + 2));
  911. pen_data->coords.y = le16_to_cpup((__le16 *)(coor_data + 4));
  912. pen_data->coords.p = le16_to_cpup((__le16 *)(coor_data + 6));
  913. x_angle = le16_to_cpup((__le16 *)(coor_data + 8));
  914. y_angle = le16_to_cpup((__le16 *)(coor_data + 10));
  915. pen_data->coords.tilt_x = x_angle / 100;
  916. pen_data->coords.tilt_y = y_angle / 100;
  917. } else {
  918. pen_data->coords.status = TS_RELEASE;
  919. }
  920. cur_key_map = (buf[3] & 0x0F) >> 1;
  921. for (i = 0; i < GOODIX_MAX_PEN_KEY; i++) {
  922. pen_data->keys[i].code = goodix_pen_btn_code[i];
  923. if (!(cur_key_map & (1 << i)))
  924. continue;
  925. pen_data->keys[i].status = TS_TOUCH;
  926. }
  927. }
  928. static int goodix_touch_handler(struct goodix_ts_core *cd,
  929. struct goodix_ts_event *ts_event,
  930. u8 *pre_buf, u32 pre_buf_len)
  931. {
  932. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  933. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  934. struct goodix_touch_data *touch_data = &ts_event->touch_data;
  935. struct goodix_pen_data *pen_data = &ts_event->pen_data;
  936. static u8 buffer[IRQ_EVENT_HEAD_LEN +
  937. BYTES_PER_POINT * GOODIX_MAX_TOUCH + 2];
  938. u8 touch_num = 0;
  939. int ret = 0;
  940. u8 point_type = 0;
  941. static u8 pre_finger_num;
  942. static u8 pre_pen_num;
  943. /* clean event buffer */
  944. memset(ts_event, 0, sizeof(*ts_event));
  945. /* copy pre-data to buffer */
  946. memcpy(buffer, pre_buf, pre_buf_len);
  947. touch_num = buffer[2] & 0x0F;
  948. if (touch_num > GOODIX_MAX_TOUCH) {
  949. ts_debug("invalid touch num %d", touch_num);
  950. return -EINVAL;
  951. }
  952. if (unlikely(touch_num > 2)) {
  953. ret = hw_ops->read(cd,
  954. misc->touch_data_addr + pre_buf_len,
  955. &buffer[pre_buf_len],
  956. (touch_num - 2) * BYTES_PER_POINT);
  957. if (ret) {
  958. ts_debug("failed get touch data");
  959. return ret;
  960. }
  961. }
  962. if (touch_num > 0) {
  963. point_type = buffer[IRQ_EVENT_HEAD_LEN] & 0x0F;
  964. if (point_type == POINT_TYPE_STYLUS ||
  965. point_type == POINT_TYPE_STYLUS_HOVER) {
  966. ret = checksum_cmp(&buffer[IRQ_EVENT_HEAD_LEN],
  967. BYTES_PER_POINT * 2 + 2, CHECKSUM_MODE_U8_LE);
  968. if (ret) {
  969. ts_debug("touch data checksum error");
  970. ts_debug("data:%*ph", BYTES_PER_POINT * 2 + 2,
  971. &buffer[IRQ_EVENT_HEAD_LEN]);
  972. return -EINVAL;
  973. }
  974. } else {
  975. ret = checksum_cmp(&buffer[IRQ_EVENT_HEAD_LEN],
  976. touch_num * BYTES_PER_POINT + 2, CHECKSUM_MODE_U8_LE);
  977. if (ret) {
  978. ts_debug("touch data checksum error");
  979. ts_debug("data:%*ph", touch_num * BYTES_PER_POINT + 2,
  980. &buffer[IRQ_EVENT_HEAD_LEN]);
  981. return -EINVAL;
  982. }
  983. }
  984. }
  985. if (touch_num > 0 && (point_type == POINT_TYPE_STYLUS
  986. || point_type == POINT_TYPE_STYLUS_HOVER)) {
  987. /* stylus info */
  988. if (pre_finger_num) {
  989. ts_event->event_type = EVENT_TOUCH;
  990. goodix_parse_finger(touch_data, buffer, 0);
  991. pre_finger_num = 0;
  992. } else {
  993. pre_pen_num = 1;
  994. ts_event->event_type = EVENT_PEN;
  995. goodix_parse_pen(pen_data, buffer, touch_num);
  996. }
  997. } else {
  998. /* finger info */
  999. if (pre_pen_num) {
  1000. ts_event->event_type = EVENT_PEN;
  1001. goodix_parse_pen(pen_data, buffer, 0);
  1002. pre_pen_num = 0;
  1003. } else {
  1004. ts_event->event_type = EVENT_TOUCH;
  1005. goodix_parse_finger(touch_data,
  1006. buffer, touch_num);
  1007. pre_finger_num = touch_num;
  1008. }
  1009. }
  1010. /* process custom info */
  1011. if (buffer[3] & 0x01)
  1012. ts_debug("TODO add custom info process function");
  1013. return 0;
  1014. }
  1015. static int brl_event_handler(struct goodix_ts_core *cd,
  1016. struct goodix_ts_event *ts_event)
  1017. {
  1018. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  1019. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  1020. int pre_read_len;
  1021. u8 pre_buf[32];
  1022. u8 event_status;
  1023. int ret;
  1024. pre_read_len = IRQ_EVENT_HEAD_LEN +
  1025. BYTES_PER_POINT * 2 + COOR_DATA_CHECKSUM_SIZE;
  1026. ret = hw_ops->read(cd, misc->touch_data_addr,
  1027. pre_buf, pre_read_len);
  1028. if (ret) {
  1029. ts_debug("failed get event head data");
  1030. return ret;
  1031. }
  1032. if (checksum_cmp(pre_buf, IRQ_EVENT_HEAD_LEN, CHECKSUM_MODE_U8_LE)) {
  1033. ts_debug("touch head checksum err");
  1034. ts_debug("touch_head %*ph", IRQ_EVENT_HEAD_LEN, pre_buf);
  1035. ts_event->retry = 1;
  1036. return -EINVAL;
  1037. }
  1038. event_status = pre_buf[0];
  1039. if (event_status & GOODIX_TOUCH_EVENT)
  1040. return goodix_touch_handler(cd, ts_event,
  1041. pre_buf, pre_read_len);
  1042. if (event_status & GOODIX_REQUEST_EVENT) {
  1043. ts_event->event_type = EVENT_REQUEST;
  1044. if (pre_buf[2] == BRL_REQUEST_CODE_CONFIG)
  1045. ts_event->request_code = REQUEST_TYPE_CONFIG;
  1046. else if (pre_buf[2] == BRL_REQUEST_CODE_RESET)
  1047. ts_event->request_code = REQUEST_TYPE_RESET;
  1048. else
  1049. ts_debug("unsupported request code 0x%x", pre_buf[2]);
  1050. }
  1051. if (event_status & GOODIX_GESTURE_EVENT) {
  1052. ts_event->event_type = EVENT_GESTURE;
  1053. ts_event->gesture_type = pre_buf[4];
  1054. }
  1055. return 0;
  1056. }
  1057. static int brl_after_event_handler(struct goodix_ts_core *cd)
  1058. {
  1059. struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
  1060. struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
  1061. u8 sync_clean = 0;
  1062. return hw_ops->write(cd, misc->touch_data_addr,
  1063. &sync_clean, 1);
  1064. }
  1065. static int brld_get_framedata(struct goodix_ts_core *cd,
  1066. struct ts_rawdata_info *info)
  1067. {
  1068. int ret;
  1069. unsigned char val;
  1070. int retry = 20;
  1071. struct frame_head *frame_head;
  1072. unsigned char frame_buf[GOODIX_MAX_FRAMEDATA_LEN];
  1073. unsigned char *cur_ptr;
  1074. unsigned int flag_addr = cd->ic_info.misc.frame_data_addr;
  1075. /* clean touch event flag */
  1076. val = 0;
  1077. ret = brl_write(cd, flag_addr, &val, 1);
  1078. if (ret < 0) {
  1079. ts_err("clean touch event failed, exit!");
  1080. return ret;
  1081. }
  1082. while (retry--) {
  1083. usleep_range(2000, 2100);
  1084. ret = brl_read(cd, flag_addr, &val, 1);
  1085. if (!ret && (val & GOODIX_TOUCH_EVENT))
  1086. break;
  1087. }
  1088. if (retry < 0) {
  1089. ts_err("framedata is not ready val:0x%02x, exit!", val);
  1090. return -EINVAL;
  1091. }
  1092. ret = brl_read(cd, flag_addr, frame_buf, GOODIX_MAX_FRAMEDATA_LEN);
  1093. if (ret < 0) {
  1094. ts_err("read frame data failed");
  1095. return ret;
  1096. }
  1097. if (checksum_cmp(frame_buf, cd->ic_info.misc.frame_data_head_len, CHECKSUM_MODE_U8_LE)) {
  1098. ts_err("frame head checksum error");
  1099. return -EINVAL;
  1100. }
  1101. frame_head = (struct frame_head *)frame_buf;
  1102. if (checksum_cmp(frame_buf, frame_head->cur_frame_len, CHECKSUM_MODE_U16_LE)) {
  1103. ts_err("frame body checksum error");
  1104. return -EINVAL;
  1105. }
  1106. cur_ptr = frame_buf;
  1107. cur_ptr += cd->ic_info.misc.frame_data_head_len;
  1108. cur_ptr += cd->ic_info.misc.fw_attr_len;
  1109. cur_ptr += cd->ic_info.misc.fw_log_len;
  1110. memcpy((u8 *)(info->buff + info->used_size), cur_ptr + 8,
  1111. cd->ic_info.misc.mutual_struct_len - 8);
  1112. return 0;
  1113. }
  1114. static int brld_get_cap_data(struct goodix_ts_core *cd,
  1115. struct ts_rawdata_info *info)
  1116. {
  1117. struct goodix_ts_cmd temp_cmd;
  1118. int tx = cd->ic_info.parm.drv_num;
  1119. int rx = cd->ic_info.parm.sen_num;
  1120. int size = tx * rx;
  1121. int ret;
  1122. /* disable irq & close esd */
  1123. brl_irq_enbale(cd, false);
  1124. goodix_ts_blocking_notify(NOTIFY_ESD_OFF, NULL);
  1125. info->buff[0] = rx;
  1126. info->buff[1] = tx;
  1127. info->used_size = 2;
  1128. temp_cmd.cmd = 0x90;
  1129. temp_cmd.data[0] = 0x81;
  1130. temp_cmd.len = 5;
  1131. ret = brl_send_cmd(cd, &temp_cmd);
  1132. if (ret < 0) {
  1133. ts_err("report rawdata failed, exit!");
  1134. goto exit;
  1135. }
  1136. ret = brld_get_framedata(cd, info);
  1137. if (ret < 0) {
  1138. ts_err("brld get rawdata failed");
  1139. goto exit;
  1140. }
  1141. goodix_rotate_abcd2cbad(tx, rx, &info->buff[info->used_size]);
  1142. info->used_size += size;
  1143. temp_cmd.cmd = 0x90;
  1144. temp_cmd.data[0] = 0x82;
  1145. temp_cmd.len = 5;
  1146. ret = brl_send_cmd(cd, &temp_cmd);
  1147. if (ret < 0) {
  1148. ts_err("report diffdata failed, exit!");
  1149. goto exit;
  1150. }
  1151. ret = brld_get_framedata(cd, info);
  1152. if (ret < 0) {
  1153. ts_err("brld get diffdata failed");
  1154. goto exit;
  1155. }
  1156. goodix_rotate_abcd2cbad(tx, rx, &info->buff[info->used_size]);
  1157. info->used_size += size;
  1158. exit:
  1159. temp_cmd.cmd = 0x90;
  1160. temp_cmd.data[0] = 0;
  1161. temp_cmd.len = 5;
  1162. brl_send_cmd(cd, &temp_cmd);
  1163. /* enable irq & esd */
  1164. brl_irq_enbale(cd, true);
  1165. goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL);
  1166. return ret;
  1167. }
  1168. #define GOODIX_CMD_RAWDATA 2
  1169. #define GOODIX_CMD_COORD 0
  1170. static int brl_get_capacitance_data(struct goodix_ts_core *cd,
  1171. struct ts_rawdata_info *info)
  1172. {
  1173. int ret;
  1174. int retry = 20;
  1175. struct goodix_ts_cmd temp_cmd;
  1176. u32 flag_addr = cd->ic_info.misc.touch_data_addr;
  1177. u32 raw_addr = cd->ic_info.misc.mutual_rawdata_addr;
  1178. u32 diff_addr = cd->ic_info.misc.mutual_diffdata_addr;
  1179. int tx = cd->ic_info.parm.drv_num;
  1180. int rx = cd->ic_info.parm.sen_num;
  1181. int size = tx * rx;
  1182. u8 val;
  1183. if (!info) {
  1184. ts_err("input null ptr");
  1185. return -EIO;
  1186. }
  1187. if (cd->bus->ic_type == IC_TYPE_BERLIN_D)
  1188. return brld_get_cap_data(cd, info);
  1189. /* disable irq & close esd */
  1190. brl_irq_enbale(cd, false);
  1191. goodix_ts_blocking_notify(NOTIFY_ESD_OFF, NULL);
  1192. /* switch rawdata mode */
  1193. temp_cmd.cmd = GOODIX_CMD_RAWDATA;
  1194. temp_cmd.len = 4;
  1195. ret = brl_send_cmd(cd, &temp_cmd);
  1196. if (ret < 0) {
  1197. ts_err("switch rawdata mode failed, exit!");
  1198. goto exit;
  1199. }
  1200. /* clean touch event flag */
  1201. val = 0;
  1202. ret = brl_write(cd, flag_addr, &val, 1);
  1203. if (ret < 0) {
  1204. ts_err("clean touch event failed, exit!");
  1205. goto exit;
  1206. }
  1207. while (retry--) {
  1208. usleep_range(5000, 5100);
  1209. ret = brl_read(cd, flag_addr, &val, 1);
  1210. if (!ret && (val & GOODIX_TOUCH_EVENT))
  1211. break;
  1212. }
  1213. if (retry < 0) {
  1214. ts_err("rawdata is not ready val:0x%02x, exit!", val);
  1215. goto exit;
  1216. }
  1217. /* obtain rawdata & diff_rawdata */
  1218. info->buff[0] = rx;
  1219. info->buff[1] = tx;
  1220. info->used_size = 2;
  1221. ret = brl_read(cd, raw_addr, (u8 *)&info->buff[info->used_size],
  1222. size * sizeof(s16));
  1223. if (ret < 0) {
  1224. ts_err("obtian raw_data failed, exit!");
  1225. goto exit;
  1226. }
  1227. goodix_rotate_abcd2cbad(tx, rx, &info->buff[info->used_size]);
  1228. info->used_size += size;
  1229. ret = brl_read(cd, diff_addr, (u8 *)&info->buff[info->used_size],
  1230. size * sizeof(s16));
  1231. if (ret < 0) {
  1232. ts_err("obtian diff_data failed, exit!");
  1233. goto exit;
  1234. }
  1235. goodix_rotate_abcd2cbad(tx, rx, &info->buff[info->used_size]);
  1236. info->used_size += size;
  1237. exit:
  1238. /* switch coor mode */
  1239. temp_cmd.cmd = GOODIX_CMD_COORD;
  1240. temp_cmd.len = 4;
  1241. brl_send_cmd(cd, &temp_cmd);
  1242. /* clean touch event flag */
  1243. val = 0;
  1244. brl_write(cd, flag_addr, &val, 1);
  1245. /* enable irq & esd */
  1246. brl_irq_enbale(cd, true);
  1247. goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL);
  1248. return ret;
  1249. }
  1250. static struct goodix_ts_hw_ops brl_hw_ops = {
  1251. .power_on = brl_power_on,
  1252. .resume = brl_resume,
  1253. .suspend = brl_suspend,
  1254. .gesture = brl_gesture,
  1255. .reset = brl_reset,
  1256. .irq_enable = brl_irq_enbale,
  1257. .read = brl_read,
  1258. .write = brl_write,
  1259. .send_cmd = brl_send_cmd,
  1260. .send_config = brl_send_config,
  1261. .read_config = brl_read_config,
  1262. .read_version = brl_read_version,
  1263. .get_ic_info = brl_get_ic_info,
  1264. .esd_check = brl_esd_check,
  1265. .event_handler = brl_event_handler,
  1266. .after_event_handler = brl_after_event_handler,
  1267. .get_capacitance_data = brl_get_capacitance_data,
  1268. };
  1269. struct goodix_ts_hw_ops *goodix_get_hw_ops(void)
  1270. {
  1271. return &brl_hw_ops;
  1272. }