goodix_brl_hw.c 40 KB

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