bq24261.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. #include <platform/mt_typedefs.h>
  2. #include <platform/mt_reg_base.h>
  3. #include <platform/mt_i2c.h>
  4. #include <platform/mt_pmic.h>
  5. #include <platform/bq24261.h>
  6. #include <printf.h>
  7. #if !defined(CONFIG_POWER_EXT)
  8. #include <platform/upmu_common.h>
  9. #endif
  10. int g_bq24261_log_en=0;
  11. /**********************************************************
  12. *
  13. * [I2C Slave Setting]
  14. *
  15. *********************************************************/
  16. #define BQ24261_SLAVE_ADDR_WRITE 0xD6
  17. #define BQ24261_SLAVE_ADDR_READ 0xD7
  18. #define PRECC_BATVOL 2800 //preCC 2.8V
  19. /**********************************************************
  20. *
  21. * [Global Variable]
  22. *
  23. *********************************************************/
  24. kal_uint8 bq24261_reg[bq24261_REG_NUM] = {0};
  25. /**********************************************************
  26. *
  27. * [I2C Function For Read/Write bq24261]
  28. *
  29. *********************************************************/
  30. #define BQ24261_I2C_ID I2C0
  31. static struct mt_i2c_t bq24261_i2c;
  32. kal_uint32 bq24261_write_byte(kal_uint8 addr, kal_uint8 value)
  33. {
  34. kal_uint32 ret_code = I2C_OK;
  35. kal_uint8 write_data[2];
  36. kal_uint16 len;
  37. write_data[0]= addr;
  38. write_data[1] = value;
  39. bq24261_i2c.id = BQ24261_I2C_ID;
  40. /* Since i2c will left shift 1 bit, we need to set BQ24261 I2C address to >>1 */
  41. bq24261_i2c.addr = (BQ24261_SLAVE_ADDR_WRITE >> 1);
  42. bq24261_i2c.mode = ST_MODE;
  43. bq24261_i2c.speed = 100;
  44. len = 2;
  45. ret_code = i2c_write(&bq24261_i2c, write_data, len);
  46. if (I2C_OK != ret_code)
  47. dprintf(INFO, "%s: i2c_write: ret_code: %d\n", __func__, ret_code);
  48. return ret_code;
  49. }
  50. kal_uint32 bq24261_read_byte (kal_uint8 addr, kal_uint8 *dataBuffer)
  51. {
  52. kal_uint32 ret_code = I2C_OK;
  53. kal_uint16 len;
  54. *dataBuffer = addr;
  55. bq24261_i2c.id = BQ24261_I2C_ID;
  56. /* Since i2c will left shift 1 bit, we need to set BQ24261 I2C address to >>1 */
  57. bq24261_i2c.addr = (BQ24261_SLAVE_ADDR_READ >> 1);
  58. bq24261_i2c.mode = ST_MODE;
  59. bq24261_i2c.speed = 100;
  60. len = 1;
  61. ret_code = i2c_write_read(&bq24261_i2c, dataBuffer, len, len);
  62. if (I2C_OK != ret_code)
  63. dprintf(INFO, "%s: i2c_read: ret_code: %d\n", __func__, ret_code);
  64. return ret_code;
  65. }
  66. /**********************************************************
  67. *
  68. * [Read / Write Function]
  69. *
  70. *********************************************************/
  71. kal_uint32 bq24261_read_interface (kal_uint8 RegNum, kal_uint8 *val, kal_uint8 MASK, kal_uint8 SHIFT)
  72. {
  73. kal_uint8 bq24261_reg = 0;
  74. int ret = 0;
  75. dprintf(INFO, "--------------------------------------------------LK\n");
  76. ret = bq24261_read_byte(RegNum, &bq24261_reg);
  77. dprintf(INFO, "[bq24261_read_interface] Reg[%x]=0x%x\n", RegNum, bq24261_reg);
  78. bq24261_reg &= (MASK << SHIFT);
  79. *val = (bq24261_reg >> SHIFT);
  80. if (g_bq24261_log_en>1)
  81. dprintf(INFO, "%d\n", ret);
  82. return ret;
  83. }
  84. kal_uint32 bq24261_config_interface (kal_uint8 RegNum, kal_uint8 val, kal_uint8 MASK, kal_uint8 SHIFT)
  85. {
  86. kal_uint8 bq24261_reg = 0;
  87. kal_uint32 ret = 0;
  88. dprintf(INFO, "--------------------------------------------------LK\n");
  89. ret = bq24261_read_byte(RegNum, &bq24261_reg);
  90. bq24261_reg &= ~(MASK << SHIFT);
  91. bq24261_reg |= (val << SHIFT);
  92. if (RegNum == bq24261_CON1 && val == 1
  93. && MASK ==CON1_RESET_MASK && SHIFT == CON1_RESET_SHIFT) {
  94. // RESET bit
  95. } else if (RegNum == bq24261_CON1) {
  96. bq24261_reg &= ~0x80; //RESET bit read returs 1, so clear it
  97. }
  98. ret = bq24261_write_byte(RegNum, bq24261_reg);
  99. dprintf(INFO, "[bq24261_config_interface] write Reg[%x]=0x%x\n", RegNum, bq24261_reg);
  100. // Check
  101. //bq24261_read_byte(RegNum, &bq24261_reg);
  102. //dprintf(INFO, "[bq24261_config_interface] Check Reg[%x]=0x%x\n", RegNum, bq24261_reg);
  103. if (g_bq24261_log_en>1)
  104. dprintf(INFO, "%d\n", ret);
  105. return ret;
  106. }
  107. /**********************************************************
  108. *
  109. * [Internal Function]
  110. *
  111. *********************************************************/
  112. //CON0----------------------------------------------------
  113. void bq24261_set_tmr_rst(kal_uint32 val)
  114. {
  115. kal_uint32 ret=0;
  116. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON0),
  117. (kal_uint8)(val),
  118. (kal_uint8)(CON0_TMR_RST_MASK),
  119. (kal_uint8)(CON0_TMR_RST_SHIFT)
  120. );
  121. if (g_bq24261_log_en>1)
  122. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  123. }
  124. void bq24261_set_en_boost(kal_uint32 val)
  125. {
  126. kal_uint32 ret=0;
  127. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON0),
  128. (kal_uint8)(val),
  129. (kal_uint8)(CON0_EN_BOOST_MASK),
  130. (kal_uint8)(CON0_EN_BOOST_SHIFT)
  131. );
  132. if (g_bq24261_log_en>1)
  133. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  134. }
  135. kal_uint32 bq24261_get_stat(void)
  136. {
  137. kal_uint32 ret=0;
  138. kal_uint8 val=0;
  139. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON0),
  140. (&val),
  141. (kal_uint8)(CON0_STAT_MASK),
  142. (kal_uint8)(CON0_STAT_SHIFT)
  143. );
  144. if (g_bq24261_log_en>1)
  145. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  146. return val;
  147. }
  148. void bq24261_set_en_shipmode(kal_uint32 val)
  149. {
  150. kal_uint32 ret=0;
  151. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON0),
  152. (kal_uint8)(val),
  153. (kal_uint8)(CON0_EN_SHIPMODE_MASK),
  154. (kal_uint8)(CON0_EN_SHIPMODE_SHIFT)
  155. );
  156. if (g_bq24261_log_en>1)
  157. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  158. }
  159. kal_uint32 bq24261_get_fault(void)
  160. {
  161. kal_uint32 ret=0;
  162. kal_uint8 val=0;
  163. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON0),
  164. (&val),
  165. (kal_uint8)(CON0_FAULT_MASK),
  166. (kal_uint8)(CON0_FAULT_SHIFT)
  167. );
  168. if (g_bq24261_log_en>1)
  169. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  170. return val;
  171. }
  172. //CON1----------------------------------------------------
  173. void bq24261_set_reset(kal_uint32 val)
  174. {
  175. kal_uint32 ret=0;
  176. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON1),
  177. (kal_uint8)(val),
  178. (kal_uint8)(CON1_RESET_MASK),
  179. (kal_uint8)(CON1_RESET_SHIFT)
  180. );
  181. if (g_bq24261_log_en>1)
  182. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  183. }
  184. void bq24261_set_in_limit(kal_uint32 val)
  185. {
  186. kal_uint32 ret=0;
  187. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON1),
  188. (kal_uint8)(val),
  189. (kal_uint8)(CON1_IN_LIMIT_MASK),
  190. (kal_uint8)(CON1_IN_LIMIT_SHIFT)
  191. );
  192. if (g_bq24261_log_en>1)
  193. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  194. }
  195. void bq24261_set_en_stat(kal_uint32 val)
  196. {
  197. kal_uint32 ret=0;
  198. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON1),
  199. (kal_uint8)(val),
  200. (kal_uint8)(CON1_EN_STAT_MASK),
  201. (kal_uint8)(CON1_EN_STAT_SHIFT)
  202. );
  203. if (g_bq24261_log_en>1)
  204. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  205. }
  206. void bq24261_set_te(kal_uint32 val)
  207. {
  208. kal_uint32 ret=0;
  209. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON1),
  210. (kal_uint8)(val),
  211. (kal_uint8)(CON1_TE_MASK),
  212. (kal_uint8)(CON1_TE_SHIFT)
  213. );
  214. if (g_bq24261_log_en>1)
  215. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  216. }
  217. void bq24261_set_dis_ce(kal_uint32 val)
  218. {
  219. kal_uint32 ret=0;
  220. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON1),
  221. (kal_uint8)(val),
  222. (kal_uint8)(CON1_DIS_CE_MASK),
  223. (kal_uint8)(CON1_DIS_CE_SHIFT)
  224. );
  225. if (g_bq24261_log_en>1)
  226. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  227. }
  228. void bq24261_set_hz_mode(kal_uint32 val)
  229. {
  230. kal_uint32 ret=0;
  231. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON1),
  232. (kal_uint8)(val),
  233. (kal_uint8)(CON1_HZ_MODE_MASK),
  234. (kal_uint8)(CON1_HZ_MODE_SHIFT)
  235. );
  236. if (g_bq24261_log_en>1)
  237. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  238. }
  239. //CON2----------------------------------------------------
  240. void bq24261_set_vbreg(kal_uint32 val)
  241. {
  242. kal_uint32 ret=0;
  243. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON2),
  244. (kal_uint8)(val),
  245. (kal_uint8)(CON2_VBREG_MASK),
  246. (kal_uint8)(CON2_VBREG_SHIFT)
  247. );
  248. if (g_bq24261_log_en>1)
  249. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  250. }
  251. void bq24261_set_mod_freq(kal_uint32 val)
  252. {
  253. kal_uint32 ret=0;
  254. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON2),
  255. (kal_uint8)(val),
  256. (kal_uint8)(CON2_MOD_FREQ_MASK),
  257. (kal_uint8)(CON2_MOD_FREQ_SHIFT)
  258. );
  259. if (g_bq24261_log_en>1)
  260. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  261. }
  262. //CON3----------------------------------------------------
  263. kal_uint32 bq24261_get_vender_code(void)
  264. {
  265. kal_uint32 ret=0;
  266. kal_uint8 val=0;
  267. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON3),
  268. (&val),
  269. (kal_uint8)(CON3_VENDER_CODE_MASK),
  270. (kal_uint8)(CON3_VENDER_CODE_SHIFT)
  271. );
  272. if (g_bq24261_log_en>1)
  273. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  274. return val;
  275. }
  276. kal_uint32 bq24261_get_pn(void)
  277. {
  278. kal_uint32 ret=0;
  279. kal_uint8 val=0;
  280. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON3),
  281. (&val),
  282. (kal_uint8)(CON3_PN_MASK),
  283. (kal_uint8)(CON3_PN_SHIFT)
  284. );
  285. if (g_bq24261_log_en>1)
  286. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  287. return val;
  288. }
  289. //CON4----------------------------------------------------
  290. void bq24261_set_ichg(kal_uint32 val)
  291. {
  292. kal_uint32 ret=0;
  293. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON4),
  294. (kal_uint8)(val),
  295. (kal_uint8)(CON4_ICHRG_MASK),
  296. (kal_uint8)(CON4_ICHRG_SHIFT)
  297. );
  298. if (g_bq24261_log_en>1)
  299. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  300. }
  301. void bq24261_set_iterm(kal_uint32 val)
  302. {
  303. kal_uint32 ret=0;
  304. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON4),
  305. (kal_uint8)(val),
  306. (kal_uint8)(CON4_ITERM_MASK),
  307. (kal_uint8)(CON4_ITERM_SHIFT)
  308. );
  309. if (g_bq24261_log_en>1)
  310. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  311. }
  312. //CON5----------------------------------------------------
  313. kal_uint32 bq24261_get_minsys_status(void)
  314. {
  315. kal_uint32 ret=0;
  316. kal_uint8 val=0;
  317. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON5),
  318. (&val),
  319. (kal_uint8)(CON5_MINSYS_STATUS_MASK),
  320. (kal_uint8)(CON5_MINSYS_STATUS_SHIFT)
  321. );
  322. if (g_bq24261_log_en>1)
  323. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  324. return val;
  325. }
  326. kal_uint32 bq24261_get_vindpm_status(void)
  327. {
  328. kal_uint32 ret=0;
  329. kal_uint8 val=0;
  330. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON5),
  331. (&val),
  332. (kal_uint8)(CON5_VINDPM_STATUS_MASK),
  333. (kal_uint8)(CON5_VINDPM_STATUS_SHIFT)
  334. );
  335. if (g_bq24261_log_en>1)
  336. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  337. return val;
  338. }
  339. void bq24261_set_low_chg(kal_uint32 val)
  340. {
  341. kal_uint32 ret=0;
  342. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON5),
  343. (kal_uint8)(val),
  344. (kal_uint8)(CON5_LOW_CHG_MASK),
  345. (kal_uint8)(CON5_LOW_CHG_SHIFT)
  346. );
  347. if (g_bq24261_log_en>1)
  348. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  349. }
  350. void bq24261_set_dpdm_en(kal_uint32 val)
  351. {
  352. kal_uint32 ret=0;
  353. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON5),
  354. (kal_uint8)(val),
  355. (kal_uint8)(CON5_DPDM_EN_MASK),
  356. (kal_uint8)(CON5_DPDM_EN_SHIFT)
  357. );
  358. if (g_bq24261_log_en>1)
  359. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  360. }
  361. kal_uint32 bq24261_get_cd_status(void)
  362. {
  363. kal_uint32 ret=0;
  364. kal_uint8 val=0;
  365. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON5),
  366. (&val),
  367. (kal_uint8)(CON5_CD_STATUS_MASK),
  368. (kal_uint8)(CON5_CD_STATUS_SHIFT)
  369. );
  370. if (g_bq24261_log_en>1)
  371. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  372. return val;
  373. }
  374. void bq24261_set_vindpm(kal_uint32 val)
  375. {
  376. kal_uint32 ret=0;
  377. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON5),
  378. (kal_uint8)(val),
  379. (kal_uint8)(CON5_VINDPM_MASK),
  380. (kal_uint8)(CON5_VINDPM_SHIFT)
  381. );
  382. if (g_bq24261_log_en>1)
  383. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  384. }
  385. //CON6----------------------------------------------------
  386. void bq24261_set_2xtmr_en(kal_uint32 val)
  387. {
  388. kal_uint32 ret=0;
  389. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON6),
  390. (kal_uint8)(val),
  391. (kal_uint8)(CON6_2XTMR_EN_MASK),
  392. (kal_uint8)(CON6_2XTMR_EN_SHIFT)
  393. );
  394. if (g_bq24261_log_en>1)
  395. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  396. }
  397. void bq24261_set_tmr(kal_uint32 val)
  398. {
  399. kal_uint32 ret=0;
  400. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON6),
  401. (kal_uint8)(val),
  402. (kal_uint8)(CON6_TMR_MASK),
  403. (kal_uint8)(CON6_TMR_SHIFT)
  404. );
  405. if (g_bq24261_log_en>1)
  406. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  407. }
  408. void bq24261_set_boost_ilim(kal_uint32 val)
  409. {
  410. kal_uint32 ret=0;
  411. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON6),
  412. (kal_uint8)(val),
  413. (kal_uint8)(CON6_BOOST_ILIM_MASK),
  414. (kal_uint8)(CON6_BOOST_ILIM_SHIFT)
  415. );
  416. if (g_bq24261_log_en>1)
  417. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  418. }
  419. void bq24261_set_ts_en(kal_uint32 val)
  420. {
  421. kal_uint32 ret=0;
  422. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON6),
  423. (kal_uint8)(val),
  424. (kal_uint8)(CON6_TS_EN_MASK),
  425. (kal_uint8)(CON6_TS_EN_SHIFT)
  426. );
  427. if (g_bq24261_log_en>1)
  428. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  429. }
  430. kal_uint32 bq24261_get_ts_fault(void)
  431. {
  432. kal_uint32 ret=0;
  433. kal_uint8 val=0;
  434. ret=bq24261_read_interface( (kal_uint8)(bq24261_CON6),
  435. (&val),
  436. (kal_uint8)(CON6_TS_FAULT_MASK),
  437. (kal_uint8)(CON6_TS_FAULT_SHIFT)
  438. );
  439. if (g_bq24261_log_en>1)
  440. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  441. return val;
  442. }
  443. void bq24261_set_vindpm_off(kal_uint32 val)
  444. {
  445. kal_uint32 ret=0;
  446. ret=bq24261_config_interface( (kal_uint8)(bq24261_CON6),
  447. (kal_uint8)(val),
  448. (kal_uint8)(CON6_VINDPM_OFF_MASK),
  449. (kal_uint8)(CON6_VINDPM_OFF_SHIFT)
  450. );
  451. if (g_bq24261_log_en>1)
  452. dprintf(INFO, "[%s]ret=%d\n", __func__, ret);
  453. }
  454. /**********************************************************
  455. *
  456. * [Internal Function]
  457. *
  458. *********************************************************/
  459. void bq24261_dump_register(void)
  460. {
  461. int i=0;
  462. dprintf(CRITICAL, "bq24261_dump_register\r\n");
  463. for (i=0; i<bq24261_REG_NUM; i++) {
  464. bq24261_read_byte(i, &bq24261_reg[i]);
  465. dprintf(CRITICAL, "[0x%x]=0x%x\r\n", i, bq24261_reg[i]);
  466. }
  467. }
  468. void bq24261_hw_init(void)
  469. {
  470. bq24261_set_tmr_rst(0x1); // wdt reset
  471. bq24261_set_en_boost(0); // Disable OTG boost
  472. bq24261_set_tmr(0x3); // Disable Safty timer
  473. bq24261_set_iterm(0x2); // ITERM to BAT
  474. bq24261_set_vindpm_off(0); // VINDPM_OFF
  475. bq24261_set_vindpm(0x4); // VINDPM
  476. bq24261_set_ts_en(0); // Thermal sense
  477. bq24261_set_hz_mode(0x0);
  478. if (get_mt6351_pmic_chip_version() < PMIC6351_E3_CID_CODE)
  479. bq24261_set_vbreg(0x19);
  480. else
  481. bq24261_set_vbreg(0x23);
  482. }
  483. static CHARGER_TYPE g_chr_type_num = CHARGER_UNKNOWN;
  484. int hw_charging_get_charger_type(void);
  485. extern int g_std_ac_large_current_en;
  486. void bq24261_charging_enable(kal_uint32 bEnable)
  487. {
  488. int temp_CC_value = 0;
  489. kal_int32 bat_val = 0;
  490. if (CHARGER_UNKNOWN == g_chr_type_num && KAL_TRUE == upmu_is_chr_det()) {
  491. hw_charging_get_charger_type();
  492. dprintf(CRITICAL, "[BATTERY:bq24261] charger type: %d\n", g_chr_type_num);
  493. }
  494. bat_val = get_i_sense_volt(1);
  495. if (g_chr_type_num == STANDARD_CHARGER) {
  496. if (g_std_ac_large_current_en==1) {
  497. temp_CC_value = 2000;
  498. bq24261_set_in_limit(0x7); //IN current limit at 2A
  499. if (bat_val < PRECC_BATVOL)
  500. bq24261_set_ichg(0x0); //Pre-Charging Current Limit at 500ma
  501. else
  502. bq24261_set_ichg(0xF); //Fast Charging Current Limit at 2A
  503. } else {
  504. temp_CC_value = 1000;
  505. bq24261_set_in_limit(0x4); //IN current limit at 1.5A
  506. if (bat_val < PRECC_BATVOL)
  507. bq24261_set_ichg(0x0); //Pre-Charging Current Limit at 500ma
  508. else
  509. bq24261_set_ichg(0x5); //Fast Charging Current Limit at 1A
  510. }
  511. } else if (g_chr_type_num == STANDARD_HOST \
  512. || g_chr_type_num == CHARGING_HOST \
  513. || g_chr_type_num == NONSTANDARD_CHARGER) {
  514. temp_CC_value = 500;
  515. bq24261_set_in_limit(0x2); //IN current limit at 500mA
  516. bq24261_set_ichg(0); //Fast Charging Current Limit at 500mA
  517. } else {
  518. temp_CC_value = 500;
  519. bq24261_set_in_limit(0x2); //IN current limit at 500mA
  520. bq24261_set_ichg(0); //Fast Charging Current Limit at 500mA
  521. }
  522. if (KAL_TRUE == bEnable)
  523. bq24261_set_dis_ce(0); // charger enable
  524. else
  525. bq24261_set_dis_ce(0x1); // charger disable
  526. bq24261_set_tmr_rst(0x1);
  527. dprintf(INFO, "[BATTERY:bq24261] bq24261_set_ac_current(), CC value(%dmA) \r\n", temp_CC_value);
  528. dprintf(INFO, "[BATTERY:bq24261] charger enable/disable %d !\r\n", bEnable);
  529. }
  530. #if defined(CONFIG_POWER_EXT)
  531. int hw_charging_get_charger_type(void)
  532. {
  533. g_chr_type_num = STANDARD_HOST;
  534. return STANDARD_HOST;
  535. }
  536. #else
  537. extern void Charger_Detect_Init(void);
  538. extern void Charger_Detect_Release(void);
  539. extern void mdelay (unsigned long msec);
  540. static void hw_bc11_dump_register(void)
  541. {
  542. dprintf(INFO, "Reg[0x%x]=0x%x,Reg[0x%x]=0x%x\n",
  543. MT6351_CHR_CON20, upmu_get_reg_value(MT6351_CHR_CON20),
  544. MT6351_CHR_CON21, upmu_get_reg_value(MT6351_CHR_CON21)
  545. );
  546. }
  547. static void hw_bc11_init(void)
  548. {
  549. mdelay(300);
  550. Charger_Detect_Init();
  551. //RG_bc11_BIAS_EN=1
  552. mt6351_upmu_set_rg_bc11_bias_en(0x1);
  553. //RG_bc11_VSRC_EN[1:0]=00
  554. mt6351_upmu_set_rg_bc11_vsrc_en(0x0);
  555. //RG_bc11_VREF_VTH = [1:0]=00
  556. mt6351_upmu_set_rg_bc11_vref_vth(0x0);
  557. //RG_bc11_CMP_EN[1.0] = 00
  558. mt6351_upmu_set_rg_bc11_cmp_en(0x0);
  559. //RG_bc11_IPU_EN[1.0] = 00
  560. mt6351_upmu_set_rg_bc11_ipu_en(0x0);
  561. //RG_bc11_IPD_EN[1.0] = 00
  562. mt6351_upmu_set_rg_bc11_ipd_en(0x0);
  563. //bc11_RST=1
  564. mt6351_upmu_set_rg_bc11_rst(0x1);
  565. //bc11_BB_CTRL=1
  566. mt6351_upmu_set_rg_bc11_bb_ctrl(0x1);
  567. mdelay(50);
  568. if (g_bq24261_log_en>1) {
  569. dprintf(INFO, "hw_bc11_init() \r\n");
  570. hw_bc11_dump_register();
  571. }
  572. }
  573. static U32 hw_bc11_DCD(void)
  574. {
  575. U32 wChargerAvail = 0;
  576. //RG_bc11_IPU_EN[1.0] = 10
  577. mt6351_upmu_set_rg_bc11_ipu_en(0x2);
  578. //RG_bc11_IPD_EN[1.0] = 01
  579. mt6351_upmu_set_rg_bc11_ipd_en(0x1);
  580. //RG_bc11_VREF_VTH = [1:0]=01
  581. mt6351_upmu_set_rg_bc11_vref_vth(0x1);
  582. //RG_bc11_CMP_EN[1.0] = 10
  583. mt6351_upmu_set_rg_bc11_cmp_en(0x2);
  584. mdelay(80);
  585. wChargerAvail = mt6351_upmu_get_rgs_bc11_cmp_out();
  586. if (g_bq24261_log_en>1) {
  587. dprintf(INFO, "hw_bc11_DCD() \r\n");
  588. hw_bc11_dump_register();
  589. }
  590. //RG_bc11_IPU_EN[1.0] = 00
  591. mt6351_upmu_set_rg_bc11_ipu_en(0x0);
  592. //RG_bc11_IPD_EN[1.0] = 00
  593. mt6351_upmu_set_rg_bc11_ipd_en(0x0);
  594. //RG_bc11_CMP_EN[1.0] = 00
  595. mt6351_upmu_set_rg_bc11_cmp_en(0x0);
  596. //RG_bc11_VREF_VTH = [1:0]=00
  597. mt6351_upmu_set_rg_bc11_vref_vth(0x0);
  598. return wChargerAvail;
  599. }
  600. static U32 hw_bc11_stepA1(void)
  601. {
  602. U32 wChargerAvail = 0;
  603. //RG_bc11_IPD_EN[1.0] = 01
  604. mt6351_upmu_set_rg_bc11_ipd_en(0x1);
  605. //RG_bc11_VREF_VTH = [1:0]=00
  606. mt6351_upmu_set_rg_bc11_vref_vth(0x0);
  607. //RG_bc11_CMP_EN[1.0] = 01
  608. mt6351_upmu_set_rg_bc11_cmp_en(0x1);
  609. mdelay(80);
  610. wChargerAvail = mt6351_upmu_get_rgs_bc11_cmp_out();
  611. if (g_bq24261_log_en>1) {
  612. dprintf(INFO, "hw_bc11_stepA1() \r\n");
  613. hw_bc11_dump_register();
  614. }
  615. //RG_bc11_IPD_EN[1.0] = 00
  616. mt6351_upmu_set_rg_bc11_ipd_en(0x0);
  617. //RG_bc11_CMP_EN[1.0] = 00
  618. mt6351_upmu_set_rg_bc11_cmp_en(0x0);
  619. return wChargerAvail;
  620. }
  621. static U32 hw_bc11_stepA2(void)
  622. {
  623. U32 wChargerAvail = 0;
  624. //RG_bc11_VSRC_EN[1.0] = 10
  625. mt6351_upmu_set_rg_bc11_vsrc_en(0x2);
  626. //RG_bc11_IPD_EN[1:0] = 01
  627. mt6351_upmu_set_rg_bc11_ipd_en(0x1);
  628. //RG_bc11_VREF_VTH = [1:0]=00
  629. mt6351_upmu_set_rg_bc11_vref_vth(0x0);
  630. //RG_bc11_CMP_EN[1.0] = 01
  631. mt6351_upmu_set_rg_bc11_cmp_en(0x1);
  632. mdelay(80);
  633. wChargerAvail = mt6351_upmu_get_rgs_bc11_cmp_out();
  634. if (g_bq24261_log_en>1) {
  635. dprintf(INFO, "hw_bc11_stepA2() \r\n");
  636. hw_bc11_dump_register();
  637. }
  638. //RG_bc11_VSRC_EN[1:0]=00
  639. mt6351_upmu_set_rg_bc11_vsrc_en(0x0);
  640. //RG_bc11_IPD_EN[1.0] = 00
  641. mt6351_upmu_set_rg_bc11_ipd_en(0x0);
  642. //RG_bc11_CMP_EN[1.0] = 00
  643. mt6351_upmu_set_rg_bc11_cmp_en(0x0);
  644. return wChargerAvail;
  645. }
  646. static U32 hw_bc11_stepB2(void)
  647. {
  648. U32 wChargerAvail = 0;
  649. //RG_bc11_IPU_EN[1:0]=10
  650. mt6351_upmu_set_rg_bc11_ipu_en(0x2);
  651. //RG_bc11_VREF_VTH = [1:0]=01
  652. mt6351_upmu_set_rg_bc11_vref_vth(0x1);
  653. //RG_bc11_CMP_EN[1.0] = 01
  654. mt6351_upmu_set_rg_bc11_cmp_en(0x1);
  655. mdelay(80);
  656. wChargerAvail = mt6351_upmu_get_rgs_bc11_cmp_out();
  657. if (g_bq24261_log_en>1) {
  658. dprintf(INFO, "hw_bc11_stepB2() \r\n");
  659. hw_bc11_dump_register();
  660. }
  661. //RG_bc11_IPU_EN[1.0] = 00
  662. mt6351_upmu_set_rg_bc11_ipu_en(0x0);
  663. //RG_bc11_CMP_EN[1.0] = 00
  664. mt6351_upmu_set_rg_bc11_cmp_en(0x0);
  665. //RG_bc11_VREF_VTH = [1:0]=00
  666. mt6351_upmu_set_rg_bc11_vref_vth(0x0);
  667. return wChargerAvail;
  668. }
  669. static void hw_bc11_done(void)
  670. {
  671. //RG_bc11_VSRC_EN[1:0]=00
  672. mt6351_upmu_set_rg_bc11_vsrc_en(0x0);
  673. //RG_bc11_VREF_VTH = [1:0]=0
  674. mt6351_upmu_set_rg_bc11_vref_vth(0x0);
  675. //RG_bc11_CMP_EN[1.0] = 00
  676. mt6351_upmu_set_rg_bc11_cmp_en(0x0);
  677. //RG_bc11_IPU_EN[1.0] = 00
  678. mt6351_upmu_set_rg_bc11_ipu_en(0x0);
  679. //RG_bc11_IPD_EN[1.0] = 00
  680. mt6351_upmu_set_rg_bc11_ipd_en(0x0);
  681. //RG_bc11_BIAS_EN=0
  682. mt6351_upmu_set_rg_bc11_bias_en(0x0);
  683. Charger_Detect_Release();
  684. if (g_bq24261_log_en>1) {
  685. dprintf(INFO, "hw_bc11_done() \r\n");
  686. hw_bc11_dump_register();
  687. }
  688. }
  689. int hw_charging_get_charger_type(void)
  690. {
  691. if (CHARGER_UNKNOWN != g_chr_type_num)
  692. return g_chr_type_num;
  693. /********* Step initial ***************/
  694. hw_bc11_init();
  695. /********* Step DCD ***************/
  696. if (1 == hw_bc11_DCD()) {
  697. /********* Step A1 ***************/
  698. if (1 == hw_bc11_stepA1()) {
  699. g_chr_type_num = APPLE_2_1A_CHARGER;
  700. dprintf(INFO, "step A1 : Apple 2.1A CHARGER!\r\n");
  701. } else {
  702. g_chr_type_num = NONSTANDARD_CHARGER;
  703. dprintf(INFO, "step A1 : Non STANDARD CHARGER!\r\n");
  704. }
  705. } else {
  706. /********* Step A2 ***************/
  707. if (1 == hw_bc11_stepA2()) {
  708. /********* Step B2 ***************/
  709. if (1 == hw_bc11_stepB2()) {
  710. g_chr_type_num = STANDARD_CHARGER;
  711. dprintf(INFO, "step B2 : STANDARD CHARGER!\r\n");
  712. } else {
  713. g_chr_type_num = CHARGING_HOST;
  714. dprintf(INFO, "step B2 : Charging Host!\r\n");
  715. }
  716. } else {
  717. g_chr_type_num = STANDARD_HOST;
  718. dprintf(INFO, "step A2 : Standard USB Host!\r\n");
  719. }
  720. }
  721. /********* Finally setting *******************************/
  722. hw_bc11_done();
  723. return g_chr_type_num;
  724. }
  725. #endif