fan5405.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. #include <platform/mt_typedefs.h>
  2. #include <platform/mt_reg_base.h>
  3. #include <platform/mt_i2c.h>
  4. #include <platform/fan5405.h>
  5. #include <platform/mt_gpio.h>
  6. #include <printf.h>
  7. int g_fan5405_log_en=0;
  8. /**********************************************************
  9. *
  10. * [I2C Slave Setting]
  11. *
  12. *********************************************************/
  13. #define fan5405_SLAVE_ADDR_WRITE 0xd4 //0xD4
  14. #define fan5405_SLAVE_ADDR_Read 0xd5 //0xD5
  15. /**********************************************************
  16. *
  17. * [Global Variable]
  18. *
  19. *********************************************************/
  20. #define fan5405_REG_NUM 7
  21. kal_uint8 fan5405_reg[fan5405_REG_NUM] = {0};
  22. #define FAN5405_I2C_ID I2C3
  23. static struct mt_i2c_t fan5405_i2c;
  24. /**********************************************************
  25. *
  26. * [I2C Function For Read/Write fan5405]
  27. *
  28. *********************************************************/
  29. kal_uint32 fan5405_write_byte(kal_uint8 addr, kal_uint8 value)
  30. {
  31. kal_uint32 ret_code = I2C_OK;
  32. kal_uint8 write_data[2];
  33. kal_uint16 len;
  34. write_data[0]= addr;
  35. write_data[1] = value;
  36. fan5405_i2c.id = FAN5405_I2C_ID;
  37. /* Since i2c will left shift 1 bit, we need to set FAN5405 I2C address to >>1 */
  38. fan5405_i2c.addr = (fan5405_SLAVE_ADDR_WRITE >> 1);
  39. fan5405_i2c.mode = ST_MODE;
  40. fan5405_i2c.speed = 100;
  41. len = 2;
  42. ret_code = i2c_write(&fan5405_i2c, write_data, len);
  43. //printf("%s: i2c_write: ret_code: %d\n", __func__, ret_code);
  44. return ret_code;
  45. }
  46. kal_uint32 fan5405_read_byte (kal_uint8 addr, kal_uint8 *dataBuffer)
  47. {
  48. kal_uint32 ret_code = I2C_OK;
  49. kal_uint16 len;
  50. *dataBuffer = addr;
  51. fan5405_i2c.id = FAN5405_I2C_ID;
  52. /* Since i2c will left shift 1 bit, we need to set FAN5405 I2C address to >>1 */
  53. fan5405_i2c.addr = (fan5405_SLAVE_ADDR_WRITE >> 1);
  54. fan5405_i2c.mode = ST_MODE;
  55. fan5405_i2c.speed = 100;
  56. len = 1;
  57. ret_code = i2c_write_read(&fan5405_i2c, dataBuffer, len, len);
  58. //printf("%s: i2c_read: ret_code: %d\n", __func__, ret_code);
  59. return ret_code;
  60. }
  61. /**********************************************************
  62. *
  63. * [Read / Write Function]
  64. *
  65. *********************************************************/
  66. kal_uint32 fan5405_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT)
  67. {
  68. kal_uint8 fan5405_reg = 0;
  69. int ret = 0;
  70. printf("--------------------------------------------------LK\n");
  71. ret = fan5405_read_byte(RegNum, &fan5405_reg);
  72. printf("[fan5405_read_interface] Reg[%x]=0x%x\n", RegNum, fan5405_reg);
  73. fan5405_reg &= (MASK << SHIFT);
  74. *val = (fan5405_reg >> SHIFT);
  75. printf("[fan5405_read_interface] val=0x%x\n", *val);
  76. return ret;
  77. }
  78. kal_uint32 fan5405_config_interface (kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT)
  79. {
  80. kal_uint8 fan5405_reg = 0;
  81. int ret = 0;
  82. printf("--------------------------------------------------LK\n");
  83. ret = fan5405_read_byte(RegNum, &fan5405_reg);
  84. printf("[fan5405_config_interface] Reg[%x]=0x%x\n", RegNum, fan5405_reg);
  85. fan5405_reg &= ~(MASK << SHIFT);
  86. fan5405_reg |= (val << SHIFT);
  87. ret = fan5405_write_byte(RegNum, fan5405_reg);
  88. printf("[fan5405_config_interface] write Reg[%x]=0x%x\n", RegNum, fan5405_reg);
  89. // Check
  90. //fan5405_read_byte(RegNum, &fan5405_reg);
  91. //printf("[fan5405_config_interface] Check Reg[%x]=0x%x\n", RegNum, fan5405_reg);
  92. return ret;
  93. }
  94. /**********************************************************
  95. *
  96. * [fan5405 Function]
  97. *
  98. *********************************************************/
  99. //CON0----------------------------------------------------
  100. void fan5405_set_tmr_rst(kal_uint32 val)
  101. {
  102. kal_uint32 ret=0;
  103. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON0),
  104. (kal_uint8)(val),
  105. (kal_uint8)(CON0_TMR_RST_MASK),
  106. (kal_uint8)(CON0_TMR_RST_SHIFT)
  107. );
  108. if(g_fan5405_log_en>1)
  109. printf("%d\n", ret);
  110. }
  111. kal_uint32 fan5405_get_otg_status(void)
  112. {
  113. kal_uint32 ret=0;
  114. kal_uint8 val=0;
  115. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON0),
  116. (&val),
  117. (kal_uint8)(CON0_OTG_MASK),
  118. (kal_uint8)(CON0_OTG_SHIFT)
  119. );
  120. if(g_fan5405_log_en>1)
  121. printf("%d\n", ret);
  122. return val;
  123. }
  124. void fan5405_set_en_stat(kal_uint32 val)
  125. {
  126. kal_uint32 ret=0;
  127. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON0),
  128. (kal_uint8)(val),
  129. (kal_uint8)(CON0_EN_STAT_MASK),
  130. (kal_uint8)(CON0_EN_STAT_SHIFT)
  131. );
  132. if(g_fan5405_log_en>1)
  133. printf("%d\n", ret);
  134. }
  135. kal_uint32 fan5405_get_chip_status(void)
  136. {
  137. kal_uint32 ret=0;
  138. kal_uint8 val=0;
  139. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON0),
  140. (&val),
  141. (kal_uint8)(CON0_STAT_MASK),
  142. (kal_uint8)(CON0_STAT_SHIFT)
  143. );
  144. if(g_fan5405_log_en>1)
  145. printf("%d\n", ret);
  146. return val;
  147. }
  148. kal_uint32 fan5405_get_boost_status(void)
  149. {
  150. kal_uint32 ret=0;
  151. kal_uint8 val=0;
  152. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON0),
  153. (&val),
  154. (kal_uint8)(CON0_BOOST_MASK),
  155. (kal_uint8)(CON0_BOOST_SHIFT)
  156. );
  157. if(g_fan5405_log_en>1)
  158. printf("%d\n", ret);
  159. return val;
  160. }
  161. kal_uint32 fan5405_get_fault_status(void)
  162. {
  163. kal_uint32 ret=0;
  164. kal_uint8 val=0;
  165. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON0),
  166. (&val),
  167. (kal_uint8)(CON0_FAULT_MASK),
  168. (kal_uint8)(CON0_FAULT_SHIFT)
  169. );
  170. if(g_fan5405_log_en>1)
  171. printf("%d\n", ret);
  172. return val;
  173. }
  174. //CON1----------------------------------------------------
  175. void fan5405_set_input_charging_current(kal_uint32 val)
  176. {
  177. kal_uint32 ret=0;
  178. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON1),
  179. (kal_uint8)(val),
  180. (kal_uint8)(CON1_LIN_LIMIT_MASK),
  181. (kal_uint8)(CON1_LIN_LIMIT_SHIFT)
  182. );
  183. if(g_fan5405_log_en>1)
  184. printf("%d\n", ret);
  185. }
  186. void fan5405_set_v_low(kal_uint32 val)
  187. {
  188. kal_uint32 ret=0;
  189. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON1),
  190. (kal_uint8)(val),
  191. (kal_uint8)(CON1_LOW_V_MASK),
  192. (kal_uint8)(CON1_LOW_V_SHIFT)
  193. );
  194. if(g_fan5405_log_en>1)
  195. printf("%d\n", ret);
  196. }
  197. void fan5405_set_te(kal_uint32 val)
  198. {
  199. kal_uint32 ret=0;
  200. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON1),
  201. (kal_uint8)(val),
  202. (kal_uint8)(CON1_TE_MASK),
  203. (kal_uint8)(CON1_TE_SHIFT)
  204. );
  205. if(g_fan5405_log_en>1)
  206. printf("%d\n", ret);
  207. }
  208. void fan5405_set_ce(kal_uint32 val)
  209. {
  210. kal_uint32 ret=0;
  211. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON1),
  212. (kal_uint8)(val),
  213. (kal_uint8)(CON1_CE_MASK),
  214. (kal_uint8)(CON1_CE_SHIFT)
  215. );
  216. if(g_fan5405_log_en>1)
  217. printf("%d\n", ret);
  218. }
  219. void fan5405_set_hz_mode(kal_uint32 val)
  220. {
  221. kal_uint32 ret=0;
  222. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON1),
  223. (kal_uint8)(val),
  224. (kal_uint8)(CON1_HZ_MODE_MASK),
  225. (kal_uint8)(CON1_HZ_MODE_SHIFT)
  226. );
  227. if(g_fan5405_log_en>1)
  228. printf("%d\n", ret);
  229. }
  230. void fan5405_set_opa_mode(kal_uint32 val)
  231. {
  232. kal_uint32 ret=0;
  233. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON1),
  234. (kal_uint8)(val),
  235. (kal_uint8)(CON1_OPA_MODE_MASK),
  236. (kal_uint8)(CON1_OPA_MODE_SHIFT)
  237. );
  238. if(g_fan5405_log_en>1)
  239. printf("%d\n", ret);
  240. }
  241. //CON2----------------------------------------------------
  242. void fan5405_set_oreg(kal_uint32 val)
  243. {
  244. kal_uint32 ret=0;
  245. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON2),
  246. (kal_uint8)(val),
  247. (kal_uint8)(CON2_OREG_MASK),
  248. (kal_uint8)(CON2_OREG_SHIFT)
  249. );
  250. if(g_fan5405_log_en>1)
  251. printf("%d\n", ret);
  252. }
  253. void fan5405_set_otg_pl(kal_uint32 val)
  254. {
  255. kal_uint32 ret=0;
  256. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON2),
  257. (kal_uint8)(val),
  258. (kal_uint8)(CON2_OTG_PL_MASK),
  259. (kal_uint8)(CON2_OTG_PL_SHIFT)
  260. );
  261. if(g_fan5405_log_en>1)
  262. printf("%d\n", ret);
  263. }
  264. void fan5405_set_otg_en(kal_uint32 val)
  265. {
  266. kal_uint32 ret=0;
  267. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON2),
  268. (kal_uint8)(val),
  269. (kal_uint8)(CON2_OTG_EN_MASK),
  270. (kal_uint8)(CON2_OTG_EN_SHIFT)
  271. );
  272. if(g_fan5405_log_en>1)
  273. printf("%d\n", ret);
  274. }
  275. //CON3----------------------------------------------------
  276. kal_uint32 fan5405_get_vender_code(void)
  277. {
  278. kal_uint32 ret=0;
  279. kal_uint8 val=0;
  280. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON3),
  281. (&val),
  282. (kal_uint8)(CON3_VENDER_CODE_MASK),
  283. (kal_uint8)(CON3_VENDER_CODE_SHIFT)
  284. );
  285. if(g_fan5405_log_en>1)
  286. printf("%d\n", ret);
  287. return val;
  288. }
  289. kal_uint32 fan5405_get_pn(void)
  290. {
  291. kal_uint32 ret=0;
  292. kal_uint8 val=0;
  293. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON3),
  294. (&val),
  295. (kal_uint8)(CON3_PIN_MASK),
  296. (kal_uint8)(CON3_PIN_SHIFT)
  297. );
  298. if(g_fan5405_log_en>1)
  299. printf("%d\n", ret);
  300. return val;
  301. }
  302. kal_uint32 fan5405_get_revision(void)
  303. {
  304. kal_uint32 ret=0;
  305. kal_uint8 val=0;
  306. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON3),
  307. (&val),
  308. (kal_uint8)(CON3_REVISION_MASK),
  309. (kal_uint8)(CON3_REVISION_SHIFT)
  310. );
  311. if(g_fan5405_log_en>1)
  312. printf("%d\n", ret);
  313. return val;
  314. }
  315. //CON4----------------------------------------------------
  316. void fan5405_set_reset(kal_uint32 val)
  317. {
  318. kal_uint32 ret=0;
  319. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON4),
  320. (kal_uint8)(val),
  321. (kal_uint8)(CON4_RESET_MASK),
  322. (kal_uint8)(CON4_RESET_SHIFT)
  323. );
  324. if(g_fan5405_log_en>1)
  325. printf("%d\n", ret);
  326. }
  327. void fan5405_set_iocharge(kal_uint32 val)
  328. {
  329. kal_uint32 ret=0;
  330. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON4),
  331. (kal_uint8)(val),
  332. (kal_uint8)(CON4_I_CHR_MASK),
  333. (kal_uint8)(CON4_I_CHR_SHIFT)
  334. );
  335. if(g_fan5405_log_en>1)
  336. printf("%d\n", ret);
  337. }
  338. void fan5405_set_iterm(kal_uint32 val)
  339. {
  340. kal_uint32 ret=0;
  341. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON4),
  342. (kal_uint8)(val),
  343. (kal_uint8)(CON4_I_TERM_MASK),
  344. (kal_uint8)(CON4_I_TERM_SHIFT)
  345. );
  346. if(g_fan5405_log_en>1)
  347. printf("%d\n", ret);
  348. }
  349. //CON5----------------------------------------------------
  350. void fan5405_set_dis_vreg(kal_uint32 val)
  351. {
  352. kal_uint32 ret=0;
  353. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON5),
  354. (kal_uint8)(val),
  355. (kal_uint8)(CON5_DIS_VREG_MASK),
  356. (kal_uint8)(CON5_DIS_VREG_SHIFT)
  357. );
  358. if(g_fan5405_log_en>1)
  359. printf("%d\n", ret);
  360. }
  361. void fan5405_set_io_level(kal_uint32 val)
  362. {
  363. kal_uint32 ret=0;
  364. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON5),
  365. (kal_uint8)(val),
  366. (kal_uint8)(CON5_IO_LEVEL_MASK),
  367. (kal_uint8)(CON5_IO_LEVEL_SHIFT)
  368. );
  369. if(g_fan5405_log_en>1)
  370. printf("%d\n", ret);
  371. }
  372. kal_uint32 fan5405_get_sp_status(void)
  373. {
  374. kal_uint32 ret=0;
  375. kal_uint8 val=0;
  376. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON5),
  377. (&val),
  378. (kal_uint8)(CON5_SP_STATUS_MASK),
  379. (kal_uint8)(CON5_SP_STATUS_SHIFT)
  380. );
  381. if(g_fan5405_log_en>1)
  382. printf("%d\n", ret);
  383. return val;
  384. }
  385. kal_uint32 fan5405_get_en_level(void)
  386. {
  387. kal_uint32 ret=0;
  388. kal_uint8 val=0;
  389. ret=fan5405_read_interface( (kal_uint8)(fan5405_CON5),
  390. (&val),
  391. (kal_uint8)(CON5_EN_LEVEL_MASK),
  392. (kal_uint8)(CON5_EN_LEVEL_SHIFT)
  393. );
  394. if(g_fan5405_log_en>1)
  395. printf("%d\n", ret);
  396. return val;
  397. }
  398. void fan5405_set_vsp(kal_uint32 val)
  399. {
  400. kal_uint32 ret=0;
  401. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON5),
  402. (kal_uint8)(val),
  403. (kal_uint8)(CON5_VSP_MASK),
  404. (kal_uint8)(CON5_VSP_SHIFT)
  405. );
  406. if(g_fan5405_log_en>1)
  407. printf("%d\n", ret);
  408. }
  409. //CON6----------------------------------------------------
  410. void fan5405_set_i_safe(kal_uint32 val)
  411. {
  412. kal_uint32 ret=0;
  413. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON6),
  414. (kal_uint8)(val),
  415. (kal_uint8)(CON6_ISAFE_MASK),
  416. (kal_uint8)(CON6_ISAFE_SHIFT)
  417. );
  418. if(g_fan5405_log_en>1)
  419. printf("%d\n", ret);
  420. }
  421. void fan5405_set_v_safe(kal_uint32 val)
  422. {
  423. kal_uint32 ret=0;
  424. ret=fan5405_config_interface( (kal_uint8)(fan5405_CON6),
  425. (kal_uint8)(val),
  426. (kal_uint8)(CON6_VSAFE_MASK),
  427. (kal_uint8)(CON6_VSAFE_SHIFT)
  428. );
  429. if(g_fan5405_log_en>1)
  430. printf("%d\n", ret);
  431. }
  432. /**********************************************************
  433. *
  434. * [Internal Function]
  435. *
  436. *********************************************************/
  437. unsigned int fan5405_reg_config_interface (unsigned char RegNum, unsigned char val)
  438. {
  439. int ret = 0;
  440. ret = fan5405_write_byte(RegNum, val);
  441. if(g_fan5405_log_en>1)
  442. printf("%d\n", ret);
  443. return ret;
  444. }
  445. void fan5405_dump_register(void)
  446. {
  447. int i=0;
  448. printf("lk lk lk [fan5405] ");
  449. for (i=0;i<fan5405_REG_NUM;i++)
  450. {
  451. fan5405_read_byte(i, &fan5405_reg[i]);
  452. printf("fan5405[0x%x]=0x%x ", i, fan5405_reg[i]);
  453. }
  454. printf("\n");
  455. }
  456. void fan5405_read_register(int i)
  457. {
  458. fan5405_read_byte(i, &fan5405_reg[i]);
  459. printf("lk lk lk fan5405[0x%x]=0x%x\n", i, fan5405_reg[i]);
  460. }
  461. #if 1
  462. #include <cust_gpio_usage.h>
  463. int gpio_number = GPIO25 | 0x80000000; // GPIO64 | 0x80000000
  464. int gpio_off_mode = GPIO_MODE_00;
  465. int gpio_on_mode = GPIO_MODE_00;
  466. #else
  467. int gpio_number = (19 | 0x80000000);
  468. int gpio_off_mode = 0;
  469. int gpio_on_mode = 0;
  470. #endif
  471. int gpio_off_dir = GPIO_DIR_OUT;
  472. int gpio_off_out = GPIO_OUT_ONE;
  473. int gpio_on_dir = GPIO_DIR_OUT;
  474. int gpio_on_out = GPIO_OUT_ZERO;
  475. void fan5405_turn_on_charging(void)
  476. {
  477. #if 1
  478. mt_set_gpio_mode(gpio_number,gpio_on_mode);
  479. mt_set_gpio_dir(gpio_number,gpio_on_dir);
  480. mt_set_gpio_out(gpio_number,gpio_on_out);
  481. #endif
  482. fan5405_reg_config_interface(0x00,0xC0);
  483. fan5405_reg_config_interface(0x01,0xf8); //pj debug
  484. //fan5405_reg_config_interface(0x02,0x8e);
  485. fan5405_reg_config_interface(0x05,0x04);
  486. fan5405_reg_config_interface(0x04,0x5A); // 5A 1.46A
  487. printf("lk lk lk fan5405_turn_on_charging\n");
  488. }
  489. void fan5405_hw_init(void)
  490. {
  491. #if defined(HIGH_BATTERY_VOLTAGE_SUPPORT)
  492. printf("lk lk lk fan5405_hw_init (0x06,0x49)\n");
  493. fan5405_reg_config_interface(0x06,0x49); // set ISAFE and HW CV point (4.34)
  494. fan5405_reg_config_interface(0x02,0x94); // 4.34
  495. #else
  496. printf("lk lk lk fan5405_hw_init (0x06,0x40)\n");
  497. fan5405_reg_config_interface(0x06,0x40); // set ISAFE
  498. fan5405_reg_config_interface(0x02,0x8e); // 4.2
  499. #endif
  500. }