goodix_brl_hw.c 38 KB

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