goodix_brl_hw.c 38 KB

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