battery_meter_fg_20.c 123 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334
  1. #include <linux/init.h> /* For init/exit macros */
  2. #include <linux/module.h> /* For MODULE_ marcros */
  3. #include <linux/fs.h>
  4. #include <linux/device.h>
  5. #include <linux/interrupt.h>
  6. #include <linux/spinlock.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/device.h>
  9. #include <linux/kdev_t.h>
  10. #include <linux/fs.h>
  11. #include <linux/cdev.h>
  12. #include <linux/delay.h>
  13. #include <linux/mutex.h>
  14. #include <linux/kthread.h>
  15. #include <linux/proc_fs.h>
  16. #include <linux/rtc.h>
  17. #include <linux/time.h>
  18. #include <linux/slab.h>
  19. #ifdef CONFIG_OF
  20. #include <linux/of.h>
  21. #include <linux/of_irq.h>
  22. #include <linux/of_address.h>
  23. #endif
  24. #include <asm/uaccess.h>
  25. #include <linux/netlink.h>
  26. #include <linux/kernel.h>
  27. #include <linux/socket.h>
  28. #include <linux/skbuff.h>
  29. #include <net/sock.h>
  30. #include <net/genetlink.h>
  31. #include <linux/reboot.h>
  32. #include <linux/vmalloc.h>
  33. #include <mt-plat/mt_boot.h>
  34. #include <mt-plat/mtk_rtc.h>
  35. #include <mt-plat/mt_boot_reason.h>
  36. #include <mt-plat/battery_meter.h>
  37. #include <mt-plat/battery_common.h>
  38. #include <mt-plat/battery_meter_hal.h>
  39. #include <mach/mt_battery_meter.h>
  40. #include <mach/mt_battery_meter_table.h>
  41. #include <mach/mt_pmic.h>
  42. #include <mt-plat/upmu_common.h>
  43. /* ============================================================ // */
  44. /* define */
  45. /* ============================================================ // */
  46. #define PROFILE_SIZE 4
  47. static DEFINE_MUTEX(FGADC_mutex);
  48. int Enable_FGADC_LOG = BMLOG_INFO_LEVEL;
  49. #define NETLINK_FGD 26
  50. #define CUST_SETTING_VERSION 0x100000
  51. #define FGD_CHECK_VERSION 0x100001
  52. /* ============================================================ // */
  53. /* global variable */
  54. /* ============================================================ // */
  55. BATTERY_METER_CONTROL battery_meter_ctrl = NULL;
  56. /* static struct proc_dir_entry *proc_entry_fgadc; */
  57. static char proc_fgadc_data[32];
  58. kal_bool gFG_Is_Charging = KAL_FALSE;
  59. kal_bool gFG_Is_Charging_init = KAL_FALSE;
  60. signed int g_auxadc_solution = 0;
  61. unsigned int g_spm_timer = 600;
  62. bool bat_spm_timeout = false;
  63. struct timespec g_sleep_total_time;
  64. #ifdef MTK_ENABLE_AGING_ALGORITHM
  65. unsigned int suspend_total_time = 0;
  66. #endif
  67. unsigned int add_time = 0;
  68. signed int g_booting_vbat = 0;
  69. /*static unsigned int temperature_change = 1;*/
  70. static struct sock *daemo_nl_sk;
  71. static void nl_send_to_user(u32 pid, int seq, struct fgd_nl_msg_t *reply_msg);
  72. static u_int g_fgd_pid;
  73. static unsigned int g_fgd_version = -1;
  74. static kal_bool init_flag;
  75. void battery_meter_set_init_flag(kal_bool flag)
  76. {
  77. init_flag = flag;
  78. }
  79. void battery_meter_reset_sleep_time(void)
  80. {
  81. g_sleep_total_time.tv_sec = 0;
  82. g_sleep_total_time.tv_nsec = 0;
  83. }
  84. /* PMIC AUXADC Related Variable */
  85. int g_R_BAT_SENSE = R_BAT_SENSE;
  86. int g_R_I_SENSE = R_I_SENSE;
  87. int g_R_CHARGER_1 = R_CHARGER_1;
  88. int g_R_CHARGER_2 = R_CHARGER_2;
  89. int gFG_result = 1;
  90. int gFG_plugout_status = 0;
  91. int gFG_result_soc = 0;
  92. /* HW FG */
  93. #ifndef DIFFERENCE_HWOCV_RTC
  94. #define DIFFERENCE_HWOCV_RTC 30 /* 30% difference */
  95. #endif
  96. #ifndef DIFFERENCE_HWOCV_SWOCV
  97. #define DIFFERENCE_HWOCV_SWOCV 15 /* 105% difference */
  98. #endif
  99. #ifndef DIFFERENCE_SWOCV_RTC
  100. #define DIFFERENCE_SWOCV_RTC 10 /* 10% difference */
  101. #endif
  102. #ifndef MAX_SWOCV
  103. #define MAX_SWOCV 5 /* 5% maximum */
  104. #endif
  105. /* SW Fuel Gauge */
  106. #ifndef MAX_HWOCV
  107. #define MAX_HWOCV 5
  108. #endif
  109. #ifndef MAX_VBAT
  110. #define MAX_VBAT 90
  111. #endif
  112. #ifndef DIFFERENCE_HWOCV_VBAT
  113. #define DIFFERENCE_HWOCV_VBAT 30
  114. #endif
  115. #ifndef Q_MAX_SYS_VOLTAGE
  116. #define Q_MAX_SYS_VOLTAGE 3300
  117. #endif
  118. /* smooth time tracking */
  119. signed int gFG_coulomb_act_time = -1;
  120. signed int gFG_coulomb_act_pre = 0;
  121. signed int gFG_coulomb_act_diff = 0;
  122. signed int gFG_coulomb_act_diff_time = 0;
  123. signed int gFG_coulomb_is_charging = 0;
  124. signed int gFG_DOD0_init = 0;
  125. signed int gFG_DOD0 = 0;
  126. signed int gFG_DOD1 = 0;
  127. signed int gFG_DOD_B = 0;
  128. signed int gFG_coulomb = 0;
  129. signed int gFG_coulomb_act = 0;
  130. signed int gFG_voltage = 0;
  131. signed int gFG_current = 0;
  132. signed int gFG_current_init = 0;
  133. signed int gFG_capacity = 0;
  134. signed int gFG_capacity_by_c = -1;
  135. signed int gFG_capacity_by_c_init = 0;
  136. signed int gFG_capacity_by_v = 0;
  137. signed int gFG_capacity_by_v_init = 0;
  138. signed int gFG_temp = 100;
  139. signed int gFG_temp_avg = 100;
  140. signed int gFG_temp_avg_init = 100;
  141. signed int gFG_resistance_bat = 0;
  142. signed int gFG_compensate_value = 0;
  143. signed int gFG_ori_voltage = 0;
  144. signed int gFG_BATT_CAPACITY = 0;
  145. signed int gFG_voltage_init = 0;
  146. signed int gFG_current_auto_detect_R_fg_total = 0;
  147. signed int gFG_current_auto_detect_R_fg_count = 0;
  148. signed int gFG_current_auto_detect_R_fg_result = 0;
  149. signed int gFG_15_vlot = 3700;
  150. signed int gFG_BATT_CAPACITY_high_current = 1200;
  151. signed int gFG_BATT_CAPACITY_aging = 1200;
  152. signed int gFG_vbat = 0;
  153. signed int gFG_swocv = 0;
  154. signed int gFG_hwocv = 0;
  155. signed int gFG_vbat_soc = 0;
  156. signed int gFG_hw_soc = 0;
  157. signed int gFG_sw_soc = 0;
  158. /* voltage mode */
  159. signed int gfg_percent_check_point = 50;
  160. signed int volt_mode_update_timer = 0;
  161. signed int volt_mode_update_time_out = 6; /* 1mins */
  162. /* EM */
  163. signed int g_fg_dbg_bat_volt = 0;
  164. signed int g_fg_dbg_bat_current = 0;
  165. signed int g_fg_dbg_bat_zcv = 0;
  166. signed int g_fg_dbg_bat_temp = 0;
  167. signed int g_fg_dbg_bat_r = 0;
  168. signed int g_fg_dbg_bat_car = 0;
  169. signed int g_fg_dbg_bat_qmax = 0;
  170. signed int g_fg_dbg_d0 = 0;
  171. signed int g_fg_dbg_d1 = 0;
  172. signed int g_fg_dbg_percentage = 0;
  173. signed int g_fg_dbg_percentage_fg = 0;
  174. signed int g_fg_dbg_percentage_voltmode = 0;
  175. signed int FGvbatVoltageBuffer[FG_VBAT_AVERAGE_SIZE];
  176. signed int FGbatteryIndex = 0;
  177. signed int FGbatteryVoltageSum = 0;
  178. signed int gFG_voltage_AVG = 0;
  179. signed int gFG_vbat_offset = 0;
  180. signed int vbat_offset_counter = 0;
  181. #ifdef Q_MAX_BY_CURRENT
  182. signed int FGCurrentBuffer[FG_CURRENT_AVERAGE_SIZE];
  183. signed int FGCurrentIndex = 0;
  184. signed int FGCurrentSum = 0;
  185. #endif
  186. signed int gFG_current_AVG = 0;
  187. signed int g_tracking_point = CUST_TRACKING_POINT;
  188. signed int g_rtc_fg_soc = 0;
  189. signed int g_I_SENSE_offset = 0;
  190. /* SW FG */
  191. signed int oam_v_ocv_init = 0;
  192. signed int oam_v_ocv_1 = 0;
  193. signed int oam_v_ocv_2 = 0;
  194. signed int oam_r_1 = 0;
  195. signed int oam_r_2 = 0;
  196. signed int oam_d0 = 0;
  197. signed int oam_i_ori = 0;
  198. signed int oam_i_1 = 0;
  199. signed int oam_i_2 = 0;
  200. signed int oam_car_1 = 0;
  201. signed int oam_car_2 = 0;
  202. signed int oam_d_1 = 1;
  203. signed int oam_d_2 = 1;
  204. signed int oam_d_3 = 1;
  205. signed int oam_d_3_pre = 0;
  206. signed int oam_d_4 = 0;
  207. signed int oam_d_4_pre = 0;
  208. signed int oam_d_5 = 0;
  209. signed int oam_init_i = 0;
  210. signed int oam_run_i = 0;
  211. signed int d5_count = 0;
  212. signed int d5_count_time = 60;
  213. signed int d5_count_time_rate = 1;
  214. signed int g_d_hw_ocv = 0;
  215. signed int g_vol_bat_hw_ocv = 0;
  216. /* SW FG 2.0 */
  217. signed int oam_v_ocv;
  218. signed int oam_r;
  219. signed int swfg_ap_suspend_time;
  220. signed int ap_suspend_car;
  221. struct timespec ap_suspend_time;
  222. signed int total_suspend_times;
  223. signed int this_suspend_times;
  224. signed int last_hwocv;
  225. signed int last_i;
  226. signed int hwocv_token;
  227. signed int is_hwocv_update;
  228. signed int g_hw_ocv_before_sleep = 0;
  229. struct timespec suspend_time, car_time;
  230. signed int g_sw_vbat_temp = 0;
  231. struct timespec last_oam_run_time;
  232. /*static signed int coulomb_before_sleep = 0x123456;*/
  233. #if !defined(CONFIG_POWER_EXT)
  234. static signed int last_time = 1;
  235. #endif
  236. /* aging mechanism */
  237. #ifdef MTK_ENABLE_AGING_ALGORITHM
  238. /*
  239. static signed int aging_ocv_1 = 0;
  240. static signed int aging_ocv_2 = 0;
  241. static signed int aging_car_1 = 0;
  242. static signed int aging_car_2 = 0;
  243. static signed int aging_dod_1 = 100;
  244. static signed int aging_dod_2 = 100;
  245. static signed int aging_temp_1 = 0;
  246. static signed int aging_temp_2 = 0;
  247. static signed int aging_temp_3 = 0;
  248. static signed int aging_temp_4 = 0;
  249. static kal_bool aging_stage1_enable = KAL_FALSE;
  250. static kal_bool aging_stage2_enable = KAL_FALSE;
  251. static signed int aging2_dod = 0;
  252. static signed int qmax_aging = 0;
  253. */
  254. #ifdef MD_SLEEP_CURRENT_CHECK
  255. /*
  256. static signed int DOD_hwocv = 100;
  257. static signed int DOD_now = 100;
  258. static unsigned int volt_now = 0;
  259. static signed int cal_vbat = 0;
  260. static signed int cal_ocv = 0;
  261. static signed int cal_r_1 = 0, cal_r_2 = 0;
  262. static signed int cal_current = 0;
  263. static signed int cal_current_avg = 0;
  264. static signed int cal_car = 0;
  265. static signed int gFG_aft_soc = 0;
  266. */
  267. #endif
  268. #ifndef SUSPEND_CURRENT_CHECK_THRESHOLD
  269. #define SUSPEND_CURRENT_CHECK_THRESHOLD 100 /* 10mA */
  270. #endif
  271. #ifndef DIFFERENCE_VOLTAGE_UPDATE
  272. #define DIFFERENCE_VOLTAGE_UPDATE 20 /* 20mV */
  273. #endif
  274. #ifndef OCV_RECOVER_TIME
  275. #define OCV_RECOVER_TIME 2100
  276. #endif
  277. #ifndef AGING1_UPDATE_SOC
  278. #define AGING1_UPDATE_SOC 30
  279. #endif
  280. #ifndef AGING1_LOAD_SOC
  281. #define AGING1_LOAD_SOC 70
  282. #endif
  283. #ifndef MIN_DOD_DIFF_THRESHOLD
  284. #define MIN_DOD_DIFF_THRESHOLD 40
  285. #endif
  286. #ifndef MIN_DOD2_DIFF_THRESHOLD
  287. #define MIN_DOD2_DIFF_THRESHOLD 70
  288. #endif
  289. #ifndef CHARGE_TRACKING_TIME
  290. #define CHARGE_TRACKING_TIME 60
  291. #endif
  292. #ifndef DISCHARGE_TRACKING_TIME
  293. #define DISCHARGE_TRACKING_TIME 10
  294. #endif
  295. static signed int suspend_current_threshold = SUSPEND_CURRENT_CHECK_THRESHOLD;
  296. static signed int ocv_check_time = OCV_RECOVER_TIME;
  297. static signed int difference_voltage_update = DIFFERENCE_VOLTAGE_UPDATE;
  298. static signed int aging1_load_soc = AGING1_LOAD_SOC;
  299. static signed int aging1_update_soc = AGING1_UPDATE_SOC;
  300. static signed int shutdown_system_voltage = SHUTDOWN_SYSTEM_VOLTAGE;
  301. static signed int charge_tracking_time = CHARGE_TRACKING_TIME;
  302. static signed int discharge_tracking_time = DISCHARGE_TRACKING_TIME;
  303. #endif /* aging mechanism */
  304. #ifndef RECHARGE_TOLERANCE
  305. #define RECHARGE_TOLERANCE 10
  306. #endif
  307. /*static signed int recharge_tolerance = RECHARGE_TOLERANCE;*/
  308. #ifdef SHUTDOWN_GAUGE0
  309. static signed int shutdown_gauge0 = 1;
  310. #else
  311. static signed int shutdown_gauge0;
  312. #endif
  313. #ifdef SHUTDOWN_GAUGE1_MINS
  314. static signed int shutdown_gauge1_xmins = 1;
  315. #else
  316. static signed int shutdown_gauge1_xmins;
  317. #endif
  318. #ifndef FG_CURRENT_INIT_VALUE
  319. #define FG_CURRENT_INIT_VALUE 3500
  320. #endif
  321. #ifndef FG_MIN_CHARGING_SMOOTH_TIME
  322. #define FG_MIN_CHARGING_SMOOTH_TIME 40
  323. #endif
  324. #ifndef APSLEEP_MDWAKEUP_CAR
  325. #define APSLEEP_MDWAKEUP_CAR 5240
  326. #endif
  327. #ifndef AP_MDSLEEP_CAR
  328. #define AP_MDSLEEP_CAR 30
  329. #endif
  330. #ifndef APSLEEP_BATTERY_VOLTAGE_COMPENSATE
  331. #define APSLEEP_BATTERY_VOLTAGE_COMPENSATE 150
  332. #endif
  333. static signed int shutdown_gauge1_mins = SHUTDOWN_GAUGE1_MINS;
  334. signed int gFG_battery_cycle = 0;
  335. signed int gFG_aging_factor_1 = 100;
  336. signed int gFG_aging_factor_2 = 100;
  337. signed int gFG_loading_factor1 = 100;
  338. signed int gFG_loading_factor2 = 100;
  339. /* battery info */
  340. signed int gFG_coulomb_cyc = 0;
  341. signed int gFG_coulomb_aging = 0;
  342. signed int gFG_pre_coulomb_count = 0x12345678;
  343. #ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT
  344. signed int gFG_max_voltage = 0;
  345. signed int gFG_min_voltage = 10000;
  346. signed int gFG_max_current = 0;
  347. signed int gFG_min_current = 0;
  348. signed int gFG_max_temperature = -20;
  349. signed int gFG_min_temperature = 100;
  350. #endif /* battery info */
  351. unsigned int g_sw_fg_version = 150327;
  352. static signed int gFG_daemon_log_level = BM_DAEMON_DEFAULT_LOG_LEVEL;
  353. static unsigned char gDisableFG;
  354. /* ============================================================ // */
  355. /* function prototype */
  356. /* ============================================================ // */
  357. struct battery_meter_table_custom_data {
  358. /* cust_battery_meter_table.h */
  359. int battery_profile_t0_size;
  360. BATTERY_PROFILE_STRUCT battery_profile_t0[100];
  361. int battery_profile_t1_size;
  362. BATTERY_PROFILE_STRUCT battery_profile_t1[100];
  363. int battery_profile_t2_size;
  364. BATTERY_PROFILE_STRUCT battery_profile_t2[100];
  365. int battery_profile_t3_size;
  366. BATTERY_PROFILE_STRUCT battery_profile_t3[100];
  367. int battery_profile_temperature_size;
  368. BATTERY_PROFILE_STRUCT battery_profile_temperature[100];
  369. int r_profile_t0_size;
  370. R_PROFILE_STRUCT r_profile_t0[100];
  371. int r_profile_t1_size;
  372. R_PROFILE_STRUCT r_profile_t1[100];
  373. int r_profile_t2_size;
  374. R_PROFILE_STRUCT r_profile_t2[100];
  375. int r_profile_t3_size;
  376. R_PROFILE_STRUCT r_profile_t3[100];
  377. int r_profile_temperature_size;
  378. R_PROFILE_STRUCT r_profile_temperature[100];
  379. };
  380. struct battery_meter_custom_data batt_meter_cust_data;
  381. struct battery_meter_table_custom_data batt_meter_table_cust_data;
  382. /* Temperature window size */
  383. #define TEMP_AVERAGE_SIZE 30
  384. kal_bool gFG_Is_offset_init = KAL_FALSE;
  385. #ifdef MTK_MULTI_BAT_PROFILE_SUPPORT
  386. unsigned int g_fg_battery_id = 0;
  387. #ifdef MTK_GET_BATTERY_ID_BY_AUXADC
  388. void fgauge_get_profile_id(void)
  389. {
  390. int id_volt = 0;
  391. int id = 0;
  392. int ret = 0;
  393. ret = IMM_GetOneChannelValue_Cali(BATTERY_ID_CHANNEL_NUM, &id_volt);
  394. if (ret != 0)
  395. bm_info("[fgauge_get_profile_id]id_volt read fail\n");
  396. else
  397. bm_info("[fgauge_get_profile_id]id_volt = %d\n", id_volt);
  398. if ((sizeof(g_battery_id_voltage) / sizeof(signed int)) != TOTAL_BATTERY_NUMBER) {
  399. bm_info("[fgauge_get_profile_id]error! voltage range incorrect!\n");
  400. return;
  401. }
  402. for (id = 0; id < TOTAL_BATTERY_NUMBER; id++) {
  403. if (id_volt < g_battery_id_voltage[id]) {
  404. g_fg_battery_id = id;
  405. break;
  406. } else if (g_battery_id_voltage[id] == -1) {
  407. g_fg_battery_id = TOTAL_BATTERY_NUMBER - 1;
  408. }
  409. }
  410. bm_info("[fgauge_get_profile_id]Battery id (%d)\n", g_fg_battery_id);
  411. }
  412. #elif defined(MTK_GET_BATTERY_ID_BY_GPIO)
  413. void fgauge_get_profile_id(void)
  414. {
  415. g_fg_battery_id = 0;
  416. }
  417. #else
  418. void fgauge_get_profile_id(void)
  419. {
  420. g_fg_battery_id = 0;
  421. }
  422. #endif
  423. #endif
  424. /* ============================================================ // */
  425. /* function prototype */
  426. /* ============================================================ // */
  427. /* ============================================================ // */
  428. /* extern variable */
  429. /* ============================================================ // */
  430. /* ============================================================ // */
  431. /* extern function */
  432. /* ============================================================ // */
  433. /* extern int get_rtc_spare_fg_value(void); */
  434. /* extern unsigned long rtc_read_hw_time(void); */
  435. /* ============================================================ // */
  436. /*
  437. typedef enum {
  438. FG_DAEMON_CMD_UPLOAD_TEST,
  439. FG_DAEMON_CMD_GET_SOC,
  440. FG_DAEMON_CMD_GET_UI_SOC,
  441. FG_DAEMON_CMD_TO_USER_NUMBER
  442. } FG_DAEMON_CTRL_CMD_TO_USER;
  443. */
  444. /* ============================================================ // */
  445. int __batt_meter_init_cust_data_from_cust_header(void)
  446. {
  447. /* cust_battery_meter_table.h */
  448. batt_meter_table_cust_data.battery_profile_t0_size = sizeof(battery_profile_t0)
  449. / sizeof(BATTERY_PROFILE_STRUCT);
  450. memcpy(&batt_meter_table_cust_data.battery_profile_t0,
  451. &battery_profile_t0, sizeof(battery_profile_t0));
  452. batt_meter_table_cust_data.battery_profile_t1_size = sizeof(battery_profile_t1)
  453. / sizeof(BATTERY_PROFILE_STRUCT);
  454. memcpy(&batt_meter_table_cust_data.battery_profile_t1,
  455. &battery_profile_t1, sizeof(battery_profile_t1));
  456. batt_meter_table_cust_data.battery_profile_t2_size = sizeof(battery_profile_t2)
  457. / sizeof(BATTERY_PROFILE_STRUCT);
  458. memcpy(&batt_meter_table_cust_data.battery_profile_t2,
  459. &battery_profile_t2, sizeof(battery_profile_t2));
  460. batt_meter_table_cust_data.battery_profile_t3_size = sizeof(battery_profile_t3)
  461. / sizeof(BATTERY_PROFILE_STRUCT);
  462. memcpy(&batt_meter_table_cust_data.battery_profile_t3,
  463. &battery_profile_t3, sizeof(battery_profile_t3));
  464. batt_meter_table_cust_data.r_profile_t0_size =
  465. sizeof(r_profile_t0) / sizeof(R_PROFILE_STRUCT);
  466. memcpy(&batt_meter_table_cust_data.r_profile_t0, &r_profile_t0, sizeof(r_profile_t0));
  467. batt_meter_table_cust_data.r_profile_t1_size =
  468. sizeof(r_profile_t1) / sizeof(R_PROFILE_STRUCT);
  469. memcpy(&batt_meter_table_cust_data.r_profile_t1, &r_profile_t1, sizeof(r_profile_t1));
  470. batt_meter_table_cust_data.r_profile_t2_size =
  471. sizeof(r_profile_t2) / sizeof(R_PROFILE_STRUCT);
  472. memcpy(&batt_meter_table_cust_data.r_profile_t2, &r_profile_t2, sizeof(r_profile_t2));
  473. batt_meter_table_cust_data.r_profile_t3_size =
  474. sizeof(r_profile_t3) / sizeof(R_PROFILE_STRUCT);
  475. memcpy(&batt_meter_table_cust_data.r_profile_t3, &r_profile_t3, sizeof(r_profile_t3));
  476. /* cust_battery_meter.h */
  477. #if defined(SOC_BY_HW_FG)
  478. batt_meter_cust_data.soc_flow = HW_FG;
  479. #elif defined(SOC_BY_SW_FG)
  480. batt_meter_cust_data.soc_flow = SW_FG;
  481. #elif defined(SOC_BY_AUXADC)
  482. batt_meter_cust_data.soc_flow = AUXADC;
  483. #endif
  484. #if defined(HW_FG_FORCE_USE_SW_OCV)
  485. batt_meter_cust_data.hw_fg_force_use_sw_ocv = 1;
  486. #else /* #if defined(HW_FG_FORCE_USE_SW_OCV) */
  487. batt_meter_cust_data.hw_fg_force_use_sw_ocv = 0;
  488. #endif /* #if defined(HW_FG_FORCE_USE_SW_OCV) */
  489. /* ADC resister */
  490. batt_meter_cust_data.r_bat_sense = R_BAT_SENSE;
  491. g_R_BAT_SENSE = R_BAT_SENSE;
  492. batt_meter_cust_data.r_i_sense = R_I_SENSE;
  493. g_R_I_SENSE = R_I_SENSE;
  494. batt_meter_cust_data.r_charger_1 = R_CHARGER_1;
  495. g_R_CHARGER_1 = R_CHARGER_1;
  496. batt_meter_cust_data.r_charger_2 = R_CHARGER_2;
  497. g_R_CHARGER_2 = R_CHARGER_2;
  498. batt_meter_cust_data.temperature_t0 = TEMPERATURE_T0;
  499. batt_meter_cust_data.temperature_t1 = TEMPERATURE_T1;
  500. batt_meter_cust_data.temperature_t2 = TEMPERATURE_T2;
  501. batt_meter_cust_data.temperature_t3 = TEMPERATURE_T3;
  502. batt_meter_cust_data.temperature_t = TEMPERATURE_T;
  503. batt_meter_cust_data.fg_meter_resistance = FG_METER_RESISTANCE;
  504. /* Qmax for battery */
  505. batt_meter_cust_data.q_max_pos_50 = Q_MAX_POS_50;
  506. batt_meter_cust_data.q_max_pos_25 = Q_MAX_POS_25;
  507. batt_meter_cust_data.q_max_pos_0 = Q_MAX_POS_0;
  508. batt_meter_cust_data.q_max_neg_10 = Q_MAX_NEG_10;
  509. batt_meter_cust_data.q_max_pos_50_h_current = Q_MAX_POS_50_H_CURRENT;
  510. batt_meter_cust_data.q_max_pos_25_h_current = Q_MAX_POS_25_H_CURRENT;
  511. batt_meter_cust_data.q_max_pos_0_h_current = Q_MAX_POS_0_H_CURRENT;
  512. batt_meter_cust_data.q_max_neg_10_h_current = Q_MAX_NEG_10_H_CURRENT;
  513. batt_meter_cust_data.oam_d5 = OAM_D5; /* 1 : D5, 0: D2 */
  514. #if defined(CHANGE_TRACKING_POINT)
  515. batt_meter_cust_data.change_tracking_point = 1;
  516. #else /* #if defined(CHANGE_TRACKING_POINT) */
  517. batt_meter_cust_data.change_tracking_point = 0;
  518. #endif /* #if defined(CHANGE_TRACKING_POINT) */
  519. batt_meter_cust_data.cust_tracking_point = CUST_TRACKING_POINT;
  520. g_tracking_point = CUST_TRACKING_POINT;
  521. batt_meter_cust_data.cust_r_sense = CUST_R_SENSE;
  522. batt_meter_cust_data.cust_hw_cc = CUST_HW_CC;
  523. batt_meter_cust_data.aging_tuning_value = AGING_TUNING_VALUE;
  524. batt_meter_cust_data.cust_r_fg_offset = CUST_R_FG_OFFSET;
  525. batt_meter_cust_data.ocv_board_compesate = OCV_BOARD_COMPESATE;
  526. batt_meter_cust_data.r_fg_board_base = R_FG_BOARD_BASE;
  527. batt_meter_cust_data.r_fg_board_slope = R_FG_BOARD_SLOPE;
  528. batt_meter_cust_data.car_tune_value = CAR_TUNE_VALUE;
  529. /* HW Fuel gague */
  530. batt_meter_cust_data.current_detect_r_fg = CURRENT_DETECT_R_FG;
  531. batt_meter_cust_data.minerroroffset = MinErrorOffset;
  532. batt_meter_cust_data.fg_vbat_average_size = FG_VBAT_AVERAGE_SIZE;
  533. batt_meter_cust_data.r_fg_value = R_FG_VALUE;
  534. batt_meter_cust_data.difference_hwocv_rtc = DIFFERENCE_HWOCV_RTC;
  535. batt_meter_cust_data.difference_hwocv_swocv = DIFFERENCE_HWOCV_SWOCV;
  536. batt_meter_cust_data.difference_swocv_rtc = DIFFERENCE_SWOCV_RTC;
  537. batt_meter_cust_data.max_swocv = MAX_SWOCV;
  538. batt_meter_cust_data.max_hwocv = MAX_HWOCV;
  539. batt_meter_cust_data.max_vbat = MAX_VBAT;
  540. batt_meter_cust_data.difference_hwocv_vbat = DIFFERENCE_HWOCV_VBAT;
  541. batt_meter_cust_data.suspend_current_threshold = SUSPEND_CURRENT_CHECK_THRESHOLD;
  542. batt_meter_cust_data.ocv_check_time = OCV_RECOVER_TIME;
  543. batt_meter_cust_data.shutdown_system_voltage = SHUTDOWN_SYSTEM_VOLTAGE;
  544. batt_meter_cust_data.recharge_tolerance = RECHARGE_TOLERANCE;
  545. #if defined(FIXED_TBAT_25)
  546. batt_meter_cust_data.fixed_tbat_25 = 1;
  547. #else /* #if defined(FIXED_TBAT_25) */
  548. batt_meter_cust_data.fixed_tbat_25 = 0;
  549. #endif /* #if defined(FIXED_TBAT_25) */
  550. batt_meter_cust_data.batterypseudo100 = BATTERYPSEUDO100;
  551. batt_meter_cust_data.batterypseudo1 = BATTERYPSEUDO1;
  552. /* Dynamic change wake up period of battery thread when suspend */
  553. batt_meter_cust_data.vbat_normal_wakeup = VBAT_NORMAL_WAKEUP;
  554. batt_meter_cust_data.vbat_low_power_wakeup = VBAT_LOW_POWER_WAKEUP;
  555. batt_meter_cust_data.normal_wakeup_period = NORMAL_WAKEUP_PERIOD;
  556. /* _g_bat_sleep_total_time = NORMAL_WAKEUP_PERIOD; */
  557. batt_meter_cust_data.low_power_wakeup_period = LOW_POWER_WAKEUP_PERIOD;
  558. batt_meter_cust_data.close_poweroff_wakeup_period = CLOSE_POWEROFF_WAKEUP_PERIOD;
  559. #if defined(INIT_SOC_BY_SW_SOC)
  560. batt_meter_cust_data.init_soc_by_sw_soc = 1;
  561. #else /* #if defined(INIT_SOC_BY_SW_SOC) */
  562. batt_meter_cust_data.init_soc_by_sw_soc = 0;
  563. #endif /* #if defined(INIT_SOC_BY_SW_SOC) */
  564. #if defined(SYNC_UI_SOC_IMM)
  565. batt_meter_cust_data.sync_ui_soc_imm = 1;
  566. #else /* #if defined(SYNC_UI_SOC_IMM) */
  567. batt_meter_cust_data.sync_ui_soc_imm = 0;
  568. #endif /* #if defined(SYNC_UI_SOC_IMM) */
  569. #if defined(MTK_ENABLE_AGING_ALGORITHM)
  570. batt_meter_cust_data.mtk_enable_aging_algorithm = 1;
  571. #else /* #if defined(MTK_ENABLE_AGING_ALGORITHM) */
  572. batt_meter_cust_data.mtk_enable_aging_algorithm = 0;
  573. #endif /* #if defined(MTK_ENABLE_AGING_ALGORITHM) */
  574. #if defined(MD_SLEEP_CURRENT_CHECK)
  575. batt_meter_cust_data.md_sleep_current_check = 1;
  576. #else /* #if defined(MD_SLEEP_CURRENT_CHECK) */
  577. batt_meter_cust_data.md_sleep_current_check = 0;
  578. #endif /* #if defined(MD_SLEEP_CURRENT_CHECK) */
  579. #if defined(Q_MAX_BY_CURRENT)
  580. batt_meter_cust_data.q_max_by_current = 1;
  581. #elif defined(Q_MAX_BY_SYS)
  582. batt_meter_cust_data.q_max_by_current = 2;
  583. #else /* #if defined(Q_MAX_BY_CURRENT) */
  584. batt_meter_cust_data.q_max_by_current = 0;
  585. #endif /* #if defined(Q_MAX_BY_CURRENT) */
  586. batt_meter_cust_data.q_max_sys_voltage = Q_MAX_SYS_VOLTAGE;
  587. #if defined(SHUTDOWN_GAUGE0)
  588. batt_meter_cust_data.shutdown_gauge0 = 1;
  589. #else /* #if defined(SHUTDOWN_GAUGE0) */
  590. batt_meter_cust_data.shutdown_gauge0 = 0;
  591. #endif /* #if defined(SHUTDOWN_GAUGE0) */
  592. #if defined(SHUTDOWN_GAUGE1_XMINS)
  593. batt_meter_cust_data.shutdown_gauge1_xmins = 1;
  594. #else /* #if defined(SHUTDOWN_GAUGE1_XMINS) */
  595. batt_meter_cust_data.shutdown_gauge1_xmins = 0;
  596. #endif /* #if defined(SHUTDOWN_GAUGE1_XMINS) */
  597. batt_meter_cust_data.shutdown_gauge1_mins = SHUTDOWN_GAUGE1_MINS;
  598. batt_meter_cust_data.min_charging_smooth_time = FG_MIN_CHARGING_SMOOTH_TIME;
  599. batt_meter_cust_data.apsleep_battery_voltage_compensate =
  600. APSLEEP_BATTERY_VOLTAGE_COMPENSATE;
  601. return 0;
  602. }
  603. static void __batt_meter_parse_node(const struct device_node *np,
  604. const char *node_srting, int *cust_val)
  605. {
  606. u32 val;
  607. if (of_property_read_u32(np, node_srting, &val) == 0) {
  608. (*cust_val) = (int)val;
  609. bm_debug("Get %s: %d\n", node_srting, (*cust_val));
  610. } else {
  611. bm_err("Get %s failed\n", node_srting);
  612. }
  613. }
  614. static void __batt_meter_parse_table(const struct device_node *np,
  615. const char *node_srting, int iSize, BATTERY_PROFILE_STRUCT_P profile_p)
  616. {
  617. int addr, val, idx;
  618. /*the number of battery table is
  619. the same as the number of r table*/
  620. idx = 0;
  621. bm_debug("batt_meter_parse_table: %s, %d\n", node_srting, iSize);
  622. while (!of_property_read_u32_index(np, node_srting, idx, &addr)) {
  623. idx++;
  624. if (!of_property_read_u32_index(np, node_srting, idx, &val))
  625. bm_debug("batt_temperature_table: addr: %d, val: %d\n", addr, val);
  626. profile_p->percentage = addr;
  627. profile_p->voltage = val;
  628. /* dump parsing data */
  629. #if 0
  630. msleep(20);
  631. bm_debug("[%s]>> %s[%d]: <%d, %d>\n", __func__,
  632. node_srting, (idx/2), profile_p->percentage, profile_p->voltage);
  633. #endif
  634. profile_p++;
  635. if ((idx++) >= (iSize * 2))
  636. break;
  637. }
  638. /* error handle */
  639. if (0 == idx) {
  640. bm_err("[%s] cannot find %s in dts\n", __func__, node_srting);
  641. return;
  642. }
  643. /* use last data to fill with the rest array
  644. if raw data is less than temp array */
  645. /* error handle */
  646. profile_p--;
  647. while (idx < (iSize * 2)) {
  648. profile_p++;
  649. profile_p->percentage = addr;
  650. profile_p->voltage = val;
  651. idx = idx + 2;
  652. /* dump parsing data */
  653. #if 0
  654. msleep(20);
  655. bm_print(BM_LOG_CRTI, "__batt_meter_parse_table>> %s[%d]: <%d, %d>\n",
  656. node_srting, (idx/2) - 1, profile_p->percentage, profile_p->voltage);
  657. #endif
  658. }
  659. }
  660. int __batt_meter_init_cust_data_from_dt(void)
  661. {
  662. struct device_node *np;
  663. int num;
  664. unsigned int idx, addr, val;
  665. /* check customer setting */
  666. np = of_find_compatible_node(NULL, NULL, "mediatek,bat_meter");
  667. if (!np) {
  668. /* printk(KERN_ERR "(E) Failed to find device-tree node: %s\n", path); */
  669. bm_err("Failed to find device-tree node: bat_meter\n");
  670. return -ENODEV;
  671. }
  672. bm_debug("__batt_meter_init_cust_data_from_dt\n");
  673. __batt_meter_parse_node(np, "hw_fg_force_use_sw_ocv",
  674. &batt_meter_cust_data.hw_fg_force_use_sw_ocv);
  675. __batt_meter_parse_node(np, "r_bat_sense",
  676. &batt_meter_cust_data.r_bat_sense);
  677. __batt_meter_parse_node(np, "r_i_sense",
  678. &batt_meter_cust_data.r_i_sense);
  679. __batt_meter_parse_node(np, "r_charger_1",
  680. &batt_meter_cust_data.r_charger_1);
  681. __batt_meter_parse_node(np, "r_charger_2",
  682. &batt_meter_cust_data.r_charger_2);
  683. /* parse ntc table*/
  684. __batt_meter_parse_node(np, "batt_temperature_table_num", &num);
  685. idx = 0;
  686. while (!of_property_read_u32_index(np, "batt_temperature_table", idx, &addr)) {
  687. idx++;
  688. if (!of_property_read_u32_index(np, "batt_temperature_table", idx, &val))
  689. bm_debug("batt_temperature_table: addr: %d, val: %d\n", addr, val);
  690. Batt_Temperature_Table[idx / 2].BatteryTemp = addr;
  691. Batt_Temperature_Table[idx / 2].TemperatureR = val;
  692. idx++;
  693. if (idx >= num * 2)
  694. break;
  695. }
  696. __batt_meter_parse_node(np, "temperature_t0",
  697. &batt_meter_cust_data.temperature_t0);
  698. __batt_meter_parse_table(np, "battery_profile_t0",
  699. batt_meter_table_cust_data.battery_profile_t0_size,
  700. &batt_meter_table_cust_data.battery_profile_t0[0]);
  701. __batt_meter_parse_table(np, "r_profile_t0",
  702. batt_meter_table_cust_data.r_profile_t0_size,
  703. (BATTERY_PROFILE_STRUCT *)&batt_meter_table_cust_data.r_profile_t0[0]);
  704. __batt_meter_parse_node(np, "temperature_t1",
  705. &batt_meter_cust_data.temperature_t1);
  706. __batt_meter_parse_table(np, "battery_profile_t1",
  707. batt_meter_table_cust_data.battery_profile_t1_size,
  708. &batt_meter_table_cust_data.battery_profile_t1[0]);
  709. __batt_meter_parse_table(np, "r_profile_t1",
  710. batt_meter_table_cust_data.r_profile_t1_size,
  711. (BATTERY_PROFILE_STRUCT *)&batt_meter_table_cust_data.r_profile_t1[0]);
  712. __batt_meter_parse_node(np, "temperature_t2",
  713. &batt_meter_cust_data.temperature_t2);
  714. __batt_meter_parse_table(np, "battery_profile_t2",
  715. batt_meter_table_cust_data.battery_profile_t2_size,
  716. &batt_meter_table_cust_data.battery_profile_t2[0]);
  717. __batt_meter_parse_table(np, "r_profile_t2",
  718. batt_meter_table_cust_data.r_profile_t2_size,
  719. (BATTERY_PROFILE_STRUCT *)&batt_meter_table_cust_data.r_profile_t2[0]);
  720. __batt_meter_parse_node(np, "temperature_t3",
  721. &batt_meter_cust_data.temperature_t3);
  722. __batt_meter_parse_table(np, "battery_profile_t3",
  723. batt_meter_table_cust_data.battery_profile_t3_size,
  724. &batt_meter_table_cust_data.battery_profile_t3[0]);
  725. __batt_meter_parse_table(np, "r_profile_t3",
  726. batt_meter_table_cust_data.r_profile_t3_size,
  727. (BATTERY_PROFILE_STRUCT *)&batt_meter_table_cust_data.r_profile_t3[0]);
  728. __batt_meter_parse_node(np, "temperature_t",
  729. &batt_meter_cust_data.temperature_t);
  730. __batt_meter_parse_node(np, "fg_meter_resistance",
  731. &batt_meter_cust_data.fg_meter_resistance);
  732. __batt_meter_parse_node(np, "q_max_pos_50",
  733. &batt_meter_cust_data.q_max_pos_50);
  734. __batt_meter_parse_node(np, "q_max_pos_25",
  735. &batt_meter_cust_data.q_max_pos_25);
  736. __batt_meter_parse_node(np, "q_max_pos_0",
  737. &batt_meter_cust_data.q_max_pos_0);
  738. __batt_meter_parse_node(np, "q_max_neg_10",
  739. &batt_meter_cust_data.q_max_neg_10);
  740. __batt_meter_parse_node(np, "q_max_pos_50_h_current",
  741. &batt_meter_cust_data.q_max_pos_50_h_current);
  742. __batt_meter_parse_node(np, "q_max_pos_25_h_current",
  743. &batt_meter_cust_data.q_max_pos_25_h_current);
  744. __batt_meter_parse_node(np, "q_max_pos_0_h_current",
  745. &batt_meter_cust_data.q_max_pos_0_h_current);
  746. __batt_meter_parse_node(np, "q_max_neg_10_h_current",
  747. &batt_meter_cust_data.q_max_neg_10_h_current);
  748. __batt_meter_parse_node(np, "oam_d5",
  749. &batt_meter_cust_data.oam_d5);
  750. __batt_meter_parse_node(np, "change_tracking_point",
  751. &batt_meter_cust_data.change_tracking_point);
  752. __batt_meter_parse_node(np, "cust_tracking_point",
  753. &batt_meter_cust_data.cust_tracking_point);
  754. __batt_meter_parse_node(np, "cust_r_sense",
  755. &batt_meter_cust_data.cust_r_sense);
  756. __batt_meter_parse_node(np, "cust_hw_cc",
  757. &batt_meter_cust_data.cust_hw_cc);
  758. __batt_meter_parse_node(np, "aging_tuning_value",
  759. &batt_meter_cust_data.aging_tuning_value);
  760. __batt_meter_parse_node(np, "cust_r_fg_offset",
  761. &batt_meter_cust_data.cust_r_fg_offset);
  762. __batt_meter_parse_node(np, "ocv_board_compesate",
  763. &batt_meter_cust_data.ocv_board_compesate);
  764. __batt_meter_parse_node(np, "r_fg_board_base",
  765. &batt_meter_cust_data.r_fg_board_base);
  766. __batt_meter_parse_node(np, "r_fg_board_slope",
  767. &batt_meter_cust_data.r_fg_board_slope);
  768. __batt_meter_parse_node(np, "car_tune_value",
  769. &batt_meter_cust_data.car_tune_value);
  770. __batt_meter_parse_node(np, "current_detect_r_fg",
  771. &batt_meter_cust_data.current_detect_r_fg);
  772. __batt_meter_parse_node(np, "minerroroffset",
  773. &batt_meter_cust_data.minerroroffset);
  774. __batt_meter_parse_node(np, "fg_vbat_average_size",
  775. &batt_meter_cust_data.fg_vbat_average_size);
  776. __batt_meter_parse_node(np, "r_fg_value",
  777. &batt_meter_cust_data.r_fg_value);
  778. /* TODO: update dt for new parameters */
  779. __batt_meter_parse_node(np, "difference_hwocv_rtc",
  780. &batt_meter_cust_data.difference_hwocv_rtc);
  781. __batt_meter_parse_node(np, "difference_hwocv_swocv",
  782. &batt_meter_cust_data.difference_hwocv_swocv);
  783. __batt_meter_parse_node(np, "difference_swocv_rtc",
  784. &batt_meter_cust_data.difference_swocv_rtc);
  785. __batt_meter_parse_node(np, "max_swocv",
  786. &batt_meter_cust_data.max_swocv);
  787. __batt_meter_parse_node(np, "max_hwocv",
  788. &batt_meter_cust_data.max_hwocv);
  789. __batt_meter_parse_node(np, "max_vbat",
  790. &batt_meter_cust_data.max_vbat);
  791. __batt_meter_parse_node(np, "difference_hwocv_vbat",
  792. &batt_meter_cust_data.difference_hwocv_vbat);
  793. __batt_meter_parse_node(np, "suspend_current_threshold",
  794. &batt_meter_cust_data.suspend_current_threshold);
  795. __batt_meter_parse_node(np, "ocv_check_time",
  796. &batt_meter_cust_data.ocv_check_time);
  797. __batt_meter_parse_node(np, "fixed_tbat_25",
  798. &batt_meter_cust_data.fixed_tbat_25);
  799. __batt_meter_parse_node(np, "batterypseudo100",
  800. &batt_meter_cust_data.batterypseudo100);
  801. __batt_meter_parse_node(np, "batterypseudo1",
  802. &batt_meter_cust_data.batterypseudo1);
  803. __batt_meter_parse_node(np, "vbat_normal_wakeup",
  804. &batt_meter_cust_data.vbat_normal_wakeup);
  805. __batt_meter_parse_node(np, "vbat_low_power_wakeup",
  806. &batt_meter_cust_data.vbat_low_power_wakeup);
  807. __batt_meter_parse_node(np, "normal_wakeup_period",
  808. &batt_meter_cust_data.normal_wakeup_period);
  809. __batt_meter_parse_node(np, "low_power_wakeup_period",
  810. &batt_meter_cust_data.low_power_wakeup_period);
  811. __batt_meter_parse_node(np, "close_poweroff_wakeup_period",
  812. &batt_meter_cust_data.close_poweroff_wakeup_period);
  813. __batt_meter_parse_node(np, "init_soc_by_sw_soc",
  814. &batt_meter_cust_data.init_soc_by_sw_soc);
  815. __batt_meter_parse_node(np, "sync_ui_soc_imm",
  816. &batt_meter_cust_data.sync_ui_soc_imm);
  817. __batt_meter_parse_node(np, "mtk_enable_aging_algorithm",
  818. &batt_meter_cust_data.mtk_enable_aging_algorithm);
  819. __batt_meter_parse_node(np, "md_sleep_current_check",
  820. &batt_meter_cust_data.md_sleep_current_check);
  821. __batt_meter_parse_node(np, "q_max_by_current",
  822. &batt_meter_cust_data.q_max_by_current);
  823. __batt_meter_parse_node(np, "q_max_sys_voltage",
  824. &batt_meter_cust_data.q_max_sys_voltage);
  825. __batt_meter_parse_node(np, "shutdown_gauge0",
  826. &batt_meter_cust_data.shutdown_gauge0);
  827. __batt_meter_parse_node(np, "shutdown_gauge1_xmins",
  828. &batt_meter_cust_data.shutdown_gauge1_xmins);
  829. __batt_meter_parse_node(np, "shutdown_gauge1_mins",
  830. &batt_meter_cust_data.shutdown_gauge1_mins);
  831. __batt_meter_parse_node(np, "shutdown_system_voltage",
  832. &batt_meter_cust_data.shutdown_system_voltage);
  833. /* Parse Global value setting */
  834. __batt_meter_parse_node(np, "difference_voltage_update",
  835. &difference_voltage_update);
  836. __batt_meter_parse_node(np, "aging1_load_soc",
  837. &aging1_load_soc);
  838. __batt_meter_parse_node(np, "aging1_update_soc",
  839. &aging1_update_soc);
  840. __batt_meter_parse_node(np, "charge_tracking_time",
  841. &charge_tracking_time);
  842. __batt_meter_parse_node(np, "discharge_tracking_time",
  843. &discharge_tracking_time);
  844. return 0;
  845. }
  846. int batt_meter_init_cust_data(void)
  847. {
  848. __batt_meter_init_cust_data_from_cust_header();
  849. #ifdef CONFIG_OF
  850. __batt_meter_init_cust_data_from_dt();
  851. #endif
  852. return 0;
  853. }
  854. int get_r_fg_value(void)
  855. {
  856. // return (R_FG_VALUE + CUST_R_FG_OFFSET);
  857. return(batt_meter_cust_data.r_fg_value + batt_meter_cust_data.cust_r_fg_offset);
  858. }
  859. #ifdef MTK_MULTI_BAT_PROFILE_SUPPORT
  860. int BattThermistorConverTemp(int Res)
  861. {
  862. int i = 0;
  863. int RES1 = 0, RES2 = 0;
  864. int TBatt_Value = -200, TMP1 = 0, TMP2 = 0;
  865. BATT_TEMPERATURE *batt_temperature_table = &Batt_Temperature_Table[g_fg_battery_id];
  866. if (Res >= batt_temperature_table[0].TemperatureR) {
  867. TBatt_Value = -20;
  868. } else if (Res <= batt_temperature_table[16].TemperatureR) {
  869. TBatt_Value = 60;
  870. } else {
  871. RES1 = batt_temperature_table[0].TemperatureR;
  872. TMP1 = batt_temperature_table[0].BatteryTemp;
  873. for (i = 0; i <= 16; i++) {
  874. if (Res >= batt_temperature_table[i].TemperatureR) {
  875. RES2 = batt_temperature_table[i].TemperatureR;
  876. TMP2 = batt_temperature_table[i].BatteryTemp;
  877. break;
  878. }
  879. RES1 = batt_temperature_table[i].TemperatureR;
  880. TMP1 = batt_temperature_table[i].BatteryTemp;
  881. }
  882. TBatt_Value = (((Res - RES2) * TMP1) + ((RES1 - Res) * TMP2)) / (RES1 - RES2);
  883. }
  884. return TBatt_Value;
  885. }
  886. signed int fgauge_get_Q_max(signed short temperature)
  887. {
  888. signed int ret_Q_max = 0;
  889. signed int low_temperature = 0, high_temperature = 0;
  890. signed int low_Q_max = 0, high_Q_max = 0;
  891. signed int tmp_Q_max_1 = 0, tmp_Q_max_2 = 0;
  892. if (temperature <= TEMPERATURE_T1) {
  893. low_temperature = (-10);
  894. tmp_Q_max_1 = g_Q_MAX_NEG_10[g_fg_battery_id];
  895. high_temperature = TEMPERATURE_T1;
  896. tmp_Q_max_2 = g_Q_MAX_POS_0[g_fg_battery_id];
  897. if (temperature < low_temperature)
  898. temperature = low_temperature;
  899. } else if (temperature <= TEMPERATURE_T2) {
  900. low_temperature = TEMPERATURE_T1;
  901. tmp_Q_max_1 = g_Q_MAX_POS_0[g_fg_battery_id];
  902. high_temperature = TEMPERATURE_T2;
  903. tmp_Q_max_2 = g_Q_MAX_POS_25[g_fg_battery_id];
  904. if (temperature < low_temperature)
  905. temperature = low_temperature;
  906. } else {
  907. low_temperature = TEMPERATURE_T2;
  908. tmp_Q_max_1 = g_Q_MAX_POS_25[g_fg_battery_id];
  909. high_temperature = TEMPERATURE_T3;
  910. tmp_Q_max_2 = g_Q_MAX_POS_50[g_fg_battery_id];
  911. if (temperature > high_temperature)
  912. temperature = high_temperature;
  913. }
  914. if (tmp_Q_max_1 <= tmp_Q_max_2) {
  915. low_Q_max = tmp_Q_max_1;
  916. high_Q_max = tmp_Q_max_2;
  917. ret_Q_max =
  918. low_Q_max +
  919. ((((temperature - low_temperature) * (high_Q_max -
  920. low_Q_max) * 10) / (high_temperature -
  921. low_temperature) +
  922. 5) / 10);
  923. } else {
  924. low_Q_max = tmp_Q_max_2;
  925. high_Q_max = tmp_Q_max_1;
  926. ret_Q_max =
  927. low_Q_max +
  928. ((((high_temperature - temperature) * (high_Q_max -
  929. low_Q_max) * 10) / (high_temperature -
  930. low_temperature) +
  931. 5) / 10);
  932. }
  933. bm_trace("[fgauge_get_Q_max] Q_max = %d\r\n", ret_Q_max);
  934. return ret_Q_max;
  935. }
  936. signed int fgauge_get_Q_max_high_current(signed short temperature)
  937. {
  938. signed int ret_Q_max = 0;
  939. signed int low_temperature = 0, high_temperature = 0;
  940. signed int low_Q_max = 0, high_Q_max = 0;
  941. signed int tmp_Q_max_1 = 0, tmp_Q_max_2 = 0;
  942. if (temperature <= TEMPERATURE_T1) {
  943. low_temperature = (-10);
  944. tmp_Q_max_1 = g_Q_MAX_NEG_10_H_CURRENT[g_fg_battery_id];
  945. high_temperature = TEMPERATURE_T1;
  946. tmp_Q_max_2 = g_Q_MAX_POS_0_H_CURRENT[g_fg_battery_id];
  947. if (temperature < low_temperature)
  948. temperature = low_temperature;
  949. } else if (temperature <= TEMPERATURE_T2) {
  950. low_temperature = TEMPERATURE_T1;
  951. tmp_Q_max_1 = g_Q_MAX_POS_0_H_CURRENT[g_fg_battery_id];
  952. high_temperature = TEMPERATURE_T2;
  953. tmp_Q_max_2 = g_Q_MAX_POS_25_H_CURRENT[g_fg_battery_id];
  954. if (temperature < low_temperature)
  955. temperature = low_temperature;
  956. } else {
  957. low_temperature = TEMPERATURE_T2;
  958. tmp_Q_max_1 = g_Q_MAX_POS_25_H_CURRENT[g_fg_battery_id];
  959. high_temperature = TEMPERATURE_T3;
  960. tmp_Q_max_2 = g_Q_MAX_POS_50_H_CURRENT[g_fg_battery_id];
  961. if (temperature > high_temperature)
  962. temperature = high_temperature;
  963. }
  964. if (tmp_Q_max_1 <= tmp_Q_max_2) {
  965. low_Q_max = tmp_Q_max_1;
  966. high_Q_max = tmp_Q_max_2;
  967. ret_Q_max =
  968. low_Q_max +
  969. ((((temperature - low_temperature) * (high_Q_max -
  970. low_Q_max) * 10) / (high_temperature -
  971. low_temperature) +
  972. 5) / 10);
  973. } else {
  974. low_Q_max = tmp_Q_max_2;
  975. high_Q_max = tmp_Q_max_1;
  976. ret_Q_max =
  977. low_Q_max +
  978. ((((high_temperature - temperature) * (high_Q_max -
  979. low_Q_max) * 10) / (high_temperature -
  980. low_temperature) +
  981. 5) / 10);
  982. }
  983. bm_trace("[fgauge_get_Q_max_high_current] Q_max = %d\r\n", ret_Q_max);
  984. return ret_Q_max;
  985. }
  986. #else
  987. int BattThermistorConverTemp(int Res)
  988. {
  989. int i = 0;
  990. int RES1 = 0, RES2 = 0;
  991. int TBatt_Value = -200, TMP1 = 0, TMP2 = 0;
  992. if (Res >= Batt_Temperature_Table[0].TemperatureR) {
  993. TBatt_Value = -20;
  994. } else if (Res <= Batt_Temperature_Table[16].TemperatureR) {
  995. TBatt_Value = 60;
  996. } else {
  997. RES1 = Batt_Temperature_Table[0].TemperatureR;
  998. TMP1 = Batt_Temperature_Table[0].BatteryTemp;
  999. for (i = 0; i <= 16; i++) {
  1000. if (Res >= Batt_Temperature_Table[i].TemperatureR) {
  1001. RES2 = Batt_Temperature_Table[i].TemperatureR;
  1002. TMP2 = Batt_Temperature_Table[i].BatteryTemp;
  1003. break;
  1004. }
  1005. RES1 = Batt_Temperature_Table[i].TemperatureR;
  1006. TMP1 = Batt_Temperature_Table[i].BatteryTemp;
  1007. }
  1008. TBatt_Value = (((Res - RES2) * TMP1) + ((RES1 - Res) * TMP2)) / (RES1 - RES2);
  1009. }
  1010. return TBatt_Value;
  1011. }
  1012. signed int fgauge_get_Q_max(signed short temperature)
  1013. {
  1014. signed int ret_Q_max = 0;
  1015. signed int low_temperature = 0, high_temperature = 0;
  1016. signed int low_Q_max = 0, high_Q_max = 0;
  1017. signed int tmp_Q_max_1 = 0, tmp_Q_max_2 = 0;
  1018. if (temperature <= TEMPERATURE_T1) {
  1019. low_temperature = (-10);
  1020. tmp_Q_max_1 = Q_MAX_NEG_10;
  1021. high_temperature = TEMPERATURE_T1;
  1022. tmp_Q_max_2 = Q_MAX_POS_0;
  1023. if (temperature < low_temperature)
  1024. temperature = low_temperature;
  1025. } else if (temperature <= TEMPERATURE_T2) {
  1026. low_temperature = TEMPERATURE_T1;
  1027. tmp_Q_max_1 = Q_MAX_POS_0;
  1028. high_temperature = TEMPERATURE_T2;
  1029. tmp_Q_max_2 = Q_MAX_POS_25;
  1030. if (temperature < low_temperature)
  1031. temperature = low_temperature;
  1032. } else {
  1033. low_temperature = TEMPERATURE_T2;
  1034. tmp_Q_max_1 = Q_MAX_POS_25;
  1035. high_temperature = TEMPERATURE_T3;
  1036. tmp_Q_max_2 = Q_MAX_POS_50;
  1037. if (temperature > high_temperature)
  1038. temperature = high_temperature;
  1039. }
  1040. if (tmp_Q_max_1 <= tmp_Q_max_2) {
  1041. low_Q_max = tmp_Q_max_1;
  1042. high_Q_max = tmp_Q_max_2;
  1043. ret_Q_max =
  1044. low_Q_max +
  1045. ((((temperature - low_temperature) * (high_Q_max -
  1046. low_Q_max) * 10) / (high_temperature -
  1047. low_temperature) +
  1048. 5) / 10);
  1049. } else {
  1050. low_Q_max = tmp_Q_max_2;
  1051. high_Q_max = tmp_Q_max_1;
  1052. ret_Q_max =
  1053. low_Q_max +
  1054. ((((high_temperature - temperature) * (high_Q_max -
  1055. low_Q_max) * 10) / (high_temperature -
  1056. low_temperature) +
  1057. 5) / 10);
  1058. }
  1059. bm_trace("[fgauge_get_Q_max] Q_max = %d\r\n", ret_Q_max);
  1060. return ret_Q_max;
  1061. }
  1062. signed int fgauge_get_Q_max_high_current(signed short temperature)
  1063. {
  1064. signed int ret_Q_max = 0;
  1065. signed int low_temperature = 0, high_temperature = 0;
  1066. signed int low_Q_max = 0, high_Q_max = 0;
  1067. signed int tmp_Q_max_1 = 0, tmp_Q_max_2 = 0;
  1068. if (temperature <= TEMPERATURE_T1) {
  1069. low_temperature = (-10);
  1070. tmp_Q_max_1 = Q_MAX_NEG_10_H_CURRENT;
  1071. high_temperature = TEMPERATURE_T1;
  1072. tmp_Q_max_2 = Q_MAX_POS_0_H_CURRENT;
  1073. if (temperature < low_temperature)
  1074. temperature = low_temperature;
  1075. } else if (temperature <= TEMPERATURE_T2) {
  1076. low_temperature = TEMPERATURE_T1;
  1077. tmp_Q_max_1 = Q_MAX_POS_0_H_CURRENT;
  1078. high_temperature = TEMPERATURE_T2;
  1079. tmp_Q_max_2 = Q_MAX_POS_25_H_CURRENT;
  1080. if (temperature < low_temperature)
  1081. temperature = low_temperature;
  1082. } else {
  1083. low_temperature = TEMPERATURE_T2;
  1084. tmp_Q_max_1 = Q_MAX_POS_25_H_CURRENT;
  1085. high_temperature = TEMPERATURE_T3;
  1086. tmp_Q_max_2 = Q_MAX_POS_50_H_CURRENT;
  1087. if (temperature > high_temperature)
  1088. temperature = high_temperature;
  1089. }
  1090. if (tmp_Q_max_1 <= tmp_Q_max_2) {
  1091. low_Q_max = tmp_Q_max_1;
  1092. high_Q_max = tmp_Q_max_2;
  1093. ret_Q_max =
  1094. low_Q_max +
  1095. ((((temperature - low_temperature) * (high_Q_max -
  1096. low_Q_max) * 10) / (high_temperature -
  1097. low_temperature) +
  1098. 5) / 10);
  1099. } else {
  1100. low_Q_max = tmp_Q_max_2;
  1101. high_Q_max = tmp_Q_max_1;
  1102. ret_Q_max =
  1103. low_Q_max +
  1104. ((((high_temperature - temperature) * (high_Q_max -
  1105. low_Q_max) * 10) / (high_temperature -
  1106. low_temperature) +
  1107. 5) / 10);
  1108. }
  1109. bm_trace("[fgauge_get_Q_max_high_current] Q_max = %d\r\n", ret_Q_max);
  1110. return ret_Q_max;
  1111. }
  1112. #endif
  1113. int BattVoltToTemp(int dwVolt)
  1114. {
  1115. long long TRes_temp;
  1116. long long TRes;
  1117. int sBaTTMP = -100;
  1118. /* TRes_temp = ((long long)RBAT_PULL_UP_R*(long long)dwVolt) / (RBAT_PULL_UP_VOLT-dwVolt); */
  1119. /* TRes = (TRes_temp * (long long)RBAT_PULL_DOWN_R)/((long long)RBAT_PULL_DOWN_R - TRes_temp); */
  1120. TRes_temp = (RBAT_PULL_UP_R * (long long)dwVolt);
  1121. #ifdef RBAT_PULL_UP_VOLT_BY_BIF
  1122. do_div(TRes_temp, (pmic_get_vbif28_volt() - dwVolt));
  1123. /* bm_debug("[RBAT_PULL_UP_VOLT_BY_BIF] vbif28:%d\n",pmic_get_vbif28_volt()); */
  1124. #else
  1125. do_div(TRes_temp, (RBAT_PULL_UP_VOLT - dwVolt));
  1126. #endif
  1127. #ifdef RBAT_PULL_DOWN_R
  1128. TRes = (TRes_temp * RBAT_PULL_DOWN_R);
  1129. do_div(TRes, abs(RBAT_PULL_DOWN_R - TRes_temp));
  1130. #else
  1131. TRes = TRes_temp;
  1132. #endif
  1133. /* convert register to temperature */
  1134. sBaTTMP = BattThermistorConverTemp((int)TRes);
  1135. #ifdef RBAT_PULL_UP_VOLT_BY_BIF
  1136. bm_debug("[BattVoltToTemp] %d %d\n", RBAT_PULL_UP_R, pmic_get_vbif28_volt());
  1137. #else
  1138. bm_debug("[BattVoltToTemp] %d\n", RBAT_PULL_UP_R);
  1139. #endif
  1140. return sBaTTMP;
  1141. }
  1142. int force_get_tbat(kal_bool update)
  1143. {
  1144. #if defined(CONFIG_POWER_EXT) || defined(FIXED_TBAT_25)
  1145. bm_debug("[force_get_tbat] fixed TBAT=25 t\n");
  1146. return 25;
  1147. #else
  1148. int bat_temperature_volt = 0;
  1149. int bat_temperature_val = 0;
  1150. static int pre_bat_temperature_val = -1;
  1151. int fg_r_value = 0;
  1152. signed int fg_current_temp = 0;
  1153. kal_bool fg_current_state = KAL_FALSE;
  1154. int bat_temperature_volt_temp = 0;
  1155. int ret = 0;
  1156. if (batt_meter_cust_data.fixed_tbat_25) {
  1157. bm_debug("[force_get_tbat] fixed TBAT=25 t\n");
  1158. return 25;
  1159. }
  1160. if (update == KAL_TRUE || pre_bat_temperature_val == -1) {
  1161. /* Get V_BAT_Temperature */
  1162. bat_temperature_volt = 2;
  1163. ret =
  1164. battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_TEMP, &bat_temperature_volt);
  1165. if (bat_temperature_volt != 0) {
  1166. #if defined(SOC_BY_HW_FG)
  1167. fg_r_value = get_r_fg_value();
  1168. ret =
  1169. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT,
  1170. &fg_current_temp);
  1171. ret =
  1172. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN,
  1173. &fg_current_state);
  1174. fg_current_temp = fg_current_temp / 10;
  1175. if (fg_current_state == KAL_TRUE) {
  1176. bat_temperature_volt_temp = bat_temperature_volt;
  1177. bat_temperature_volt =
  1178. bat_temperature_volt - ((fg_current_temp * fg_r_value) / 1000);
  1179. } else {
  1180. bat_temperature_volt_temp = bat_temperature_volt;
  1181. bat_temperature_volt =
  1182. bat_temperature_volt + ((fg_current_temp * fg_r_value) / 1000);
  1183. }
  1184. #endif
  1185. bat_temperature_val = BattVoltToTemp(bat_temperature_volt);
  1186. }
  1187. #ifdef CONFIG_MTK_BIF_SUPPORT
  1188. battery_charging_control(CHARGING_CMD_GET_BIF_TBAT, &bat_temperature_val);
  1189. #endif
  1190. bm_debug("[force_get_tbat] %d,%d,%d,%d,%d,%d\n",
  1191. bat_temperature_volt_temp, bat_temperature_volt, fg_current_state, fg_current_temp,
  1192. fg_r_value, bat_temperature_val);
  1193. pre_bat_temperature_val = bat_temperature_val;
  1194. } else {
  1195. bat_temperature_val = pre_bat_temperature_val;
  1196. }
  1197. return bat_temperature_val;
  1198. #endif
  1199. }
  1200. EXPORT_SYMBOL(force_get_tbat);
  1201. #if defined(SOC_BY_HW_FG)
  1202. void update_fg_dbg_tool_value(void)
  1203. {
  1204. g_fg_dbg_bat_volt = gFG_voltage_init;
  1205. if (gFG_Is_Charging == KAL_TRUE)
  1206. g_fg_dbg_bat_current = 1 - gFG_current - 1;
  1207. else
  1208. g_fg_dbg_bat_current = gFG_current;
  1209. g_fg_dbg_bat_zcv = gFG_voltage;
  1210. g_fg_dbg_bat_temp = gFG_temp;
  1211. g_fg_dbg_bat_r = gFG_resistance_bat;
  1212. g_fg_dbg_bat_car = gFG_coulomb_act;
  1213. g_fg_dbg_bat_qmax = gFG_BATT_CAPACITY_aging;
  1214. g_fg_dbg_d0 = gFG_DOD0;
  1215. g_fg_dbg_d1 = gFG_DOD1;
  1216. g_fg_dbg_percentage = bat_get_ui_percentage();
  1217. g_fg_dbg_percentage_fg = gFG_capacity_by_c;
  1218. g_fg_dbg_percentage_voltmode = gfg_percent_check_point;
  1219. }
  1220. void fgauge_algo_run_get_init_data(void)
  1221. {
  1222. int ret = 0;
  1223. kal_bool charging_enable = KAL_FALSE;
  1224. #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING) && !defined(SWCHR_POWER_PATH)
  1225. if (LOW_POWER_OFF_CHARGING_BOOT != get_boot_mode())
  1226. #endif
  1227. /*stop charging for vbat measurement */
  1228. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1229. msleep(50);
  1230. /* 1. Get Raw Data */
  1231. gFG_voltage_init = battery_meter_get_battery_voltage(KAL_TRUE);
  1232. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &gFG_current_init);
  1233. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN, &gFG_Is_Charging_init);
  1234. charging_enable = KAL_TRUE;
  1235. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1236. bm_info
  1237. ("1.[fgauge_algo_run_get_init_data](gFG_voltage_init %d, gFG_current_init %d, gFG_Is_Charging_init %d)\n",
  1238. gFG_voltage_init, gFG_current_init, gFG_Is_Charging_init);
  1239. }
  1240. #endif
  1241. #if defined(SOC_BY_SW_FG)
  1242. void update_fg_dbg_tool_value(void)
  1243. {
  1244. }
  1245. void fgauge_algo_run_get_init_data(void)
  1246. {
  1247. kal_bool charging_enable = KAL_FALSE;
  1248. #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING) && !defined(SWCHR_POWER_PATH)
  1249. if (LOW_POWER_OFF_CHARGING_BOOT != get_boot_mode())
  1250. #endif
  1251. /*stop charging for vbat measurement */
  1252. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1253. msleep(50);
  1254. /* 1. Get Raw Data */
  1255. gFG_voltage_init = battery_meter_get_battery_voltage(KAL_TRUE);
  1256. gFG_current_init = FG_CURRENT_INIT_VALUE;
  1257. gFG_Is_Charging_init = KAL_FALSE;
  1258. charging_enable = KAL_TRUE;
  1259. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  1260. bm_info
  1261. ("1.[fgauge_algo_run_get_init_data](gFG_voltage_init %d, gFG_current_init %d, gFG_Is_Charging_init %d)\n",
  1262. gFG_voltage_init, gFG_current_init, gFG_Is_Charging_init);
  1263. }
  1264. #endif
  1265. signed int get_dynamic_period(int first_use, int first_wakeup_time, int battery_capacity_level)
  1266. {
  1267. #if defined(CONFIG_POWER_EXT)
  1268. return first_wakeup_time;
  1269. #elif defined(SOC_BY_AUXADC) || defined(SOC_BY_SW_FG)
  1270. #if defined(CONFIG_MTK_HAFG_20)
  1271. signed int vbat_val = 0;
  1272. vbat_val = g_sw_vbat_temp;
  1273. #ifdef CONFIG_MTK_POWER_EXT_DETECT
  1274. if (KAL_TRUE == bat_is_ext_power())
  1275. return NORMAL_WAKEUP_PERIOD;
  1276. #endif
  1277. if (wake_up_smooth_time == 0) {
  1278. /* change wake up period when system suspend. */
  1279. // if (vbat_val > VBAT_NORMAL_WAKEUP) /* 3.6v */
  1280. if (vbat_val > batt_meter_cust_data.vbat_normal_wakeup) /* 3.6v */
  1281. g_spm_timer = batt_meter_cust_data.normal_wakeup_period ;//NORMAL_WAKEUP_PERIOD; /* 54 min */
  1282. // else if (vbat_val > VBAT_LOW_POWER_WAKEUP) /* 3.5v */
  1283. else if (vbat_val > batt_meter_cust_data.vbat_low_power_wakeup) /* 3.5v */
  1284. g_spm_timer = batt_meter_cust_data.low_power_wakeup_period ;//LOW_POWER_WAKEUP_PERIOD; /* 5 min */
  1285. else
  1286. g_spm_timer = batt_meter_cust_data.close_poweroff_wakeup_period ;//CLOSE_POWEROFF_WAKEUP_PERIOD; /* 0.5 min */
  1287. } else
  1288. g_spm_timer = wake_up_smooth_time;
  1289. bm_print(BM_LOG_CRTI, "vbat_val=%d, g_spm_timer=%d wake_up_smooth_time=%d\n", vbat_val,
  1290. g_spm_timer, wake_up_smooth_time);
  1291. return g_spm_timer;
  1292. #else
  1293. signed int vbat_val = 0;
  1294. vbat_val = g_sw_vbat_temp;
  1295. #ifdef CONFIG_MTK_POWER_EXT_DETECT
  1296. if (KAL_TRUE == bat_is_ext_power())
  1297. return NORMAL_WAKEUP_PERIOD;
  1298. #endif
  1299. /* change wake up period when system suspend. */
  1300. // if (vbat_val > VBAT_NORMAL_WAKEUP) /* 3.6v */
  1301. if (vbat_val > batt_meter_cust_data.vbat_normal_wakeup) /* 3.6v */
  1302. g_spm_timer = batt_meter_cust_data.normal_wakeup_period;//NORMAL_WAKEUP_PERIOD; /* 90 min */
  1303. // else if (vbat_val > VBAT_LOW_POWER_WAKEUP) /* 3.5v */
  1304. else if (vbat_val > batt_meter_cust_data.vbat_low_power_wakeup) /* 3.5v */
  1305. g_spm_timer = batt_meter_cust_data.low_power_wakeup_period ;//LOW_POWER_WAKEUP_PERIOD; /* 5 min */
  1306. else
  1307. g_spm_timer = batt_meter_cust_data.close_poweroff_wakeup_period ;//CLOSE_POWEROFF_WAKEUP_PERIOD; /* 0.5 min */
  1308. bm_debug("vbat_val=%d, g_spm_timer=%d\n", vbat_val, g_spm_timer);
  1309. return g_spm_timer;
  1310. #endif
  1311. #else
  1312. #ifdef FG_BAT_INT
  1313. int ret = 0;
  1314. signed int car_instant = 0;
  1315. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR_ACT, &car_instant);
  1316. if (wake_up_smooth_time == 0)
  1317. g_spm_timer = NORMAL_WAKEUP_PERIOD;
  1318. else
  1319. g_spm_timer = wake_up_smooth_time;
  1320. bm_print(BM_LOG_CRTI,
  1321. "[get_dynamic_period] g_spm_timer:%d wake_up_smooth_time:%d vbat:%d car:%d\r\n",
  1322. g_spm_timer, wake_up_smooth_time, g_sw_vbat_temp, car_instant);
  1323. return g_spm_timer;
  1324. #else
  1325. signed int car_instant = 0;
  1326. signed int current_instant = 0;
  1327. static signed int car_sleep = 0x12345678;
  1328. signed int car_wakeup = 0;
  1329. signed int ret_val = -1;
  1330. signed int I_sleep = 0;
  1331. signed int new_time = 0;
  1332. signed int vbat_val = 0;
  1333. int ret = 0;
  1334. vbat_val = g_sw_vbat_temp;
  1335. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &current_instant);
  1336. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR_ACT, &car_instant);
  1337. if (car_instant < 0)
  1338. car_instant = car_instant - (car_instant * 2);
  1339. /* 3.6v */
  1340. if (vbat_val > VBAT_NORMAL_WAKEUP) {
  1341. static unsigned int pre_time;
  1342. car_wakeup = car_instant;
  1343. if (car_sleep > car_wakeup || car_sleep == 0x12345678) {
  1344. car_sleep = car_wakeup;
  1345. bm_debug("[get_dynamic_period] reset car_sleep\n");
  1346. }
  1347. if (last_time == 0) {
  1348. last_time = 1;
  1349. } else {
  1350. /* mt_battery_update_time(&car_time); */
  1351. /* add_time = mt_battery_get_duration_time(); */
  1352. if (car_wakeup == car_sleep) {
  1353. pre_time += add_time;
  1354. last_time = pre_time;
  1355. } else {
  1356. last_time = pre_time + add_time;
  1357. pre_time = 0;
  1358. }
  1359. }
  1360. I_sleep = (((car_wakeup - car_sleep) * 3600) / last_time + 5) / 10; /* unit: second */
  1361. if (I_sleep == 0) {
  1362. new_time = g_spm_timer;
  1363. } else {
  1364. new_time =
  1365. ((gFG_BATT_CAPACITY_aging * battery_capacity_level * 3600) / 100) /
  1366. I_sleep;
  1367. }
  1368. bm_print(BM_LOG_CRTI,
  1369. "[get_dynamic_period] car_instant=%d, car_wakeup=%d, car_sleep=%d, I_sleep=%d, gFG_BATT_CAPACITY=%d, add_time=%d, last_time=%d, new_time=%d , battery_capacity_level = %d\r\n",
  1370. car_instant, car_wakeup, car_sleep, I_sleep, gFG_BATT_CAPACITY_aging,
  1371. add_time, last_time, new_time, battery_capacity_level);
  1372. if (new_time > 1800)
  1373. new_time = 1800;
  1374. ret_val = new_time;
  1375. if (ret_val == 0)
  1376. ret_val = first_wakeup_time;
  1377. /* update parameter */
  1378. car_sleep = car_wakeup;
  1379. g_spm_timer = ret_val;
  1380. // } else if (vbat_val > VBAT_LOW_POWER_WAKEUP) { /* 3.5v */
  1381. } else if (vbat_val > batt_meter_cust_data.vbat_low_power_wakeup) { /* 3.5v */
  1382. g_spm_timer = batt_meter_cust_data.low_power_wakeup_period;//LOW_POWER_WAKEUP_PERIOD; /* 5 min */
  1383. } else {
  1384. g_spm_timer = batt_meter_cust_data.close_poweroff_wakeup_period ;//CLOSE_POWEROFF_WAKEUP_PERIOD; /* 0.5 min */
  1385. }
  1386. bm_debug("vbat_val=%d, g_spm_timer=%d\n", vbat_val, g_spm_timer);
  1387. return g_spm_timer;
  1388. #endif
  1389. #endif
  1390. }
  1391. /* ============================================================ // */
  1392. signed int battery_meter_get_battery_voltage(kal_bool update)
  1393. {
  1394. int ret = 0;
  1395. int val = 5;
  1396. static int pre_val = -1;
  1397. if (update == KAL_TRUE || pre_val == -1) {
  1398. val = 5; /* set avg times */
  1399. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_SENSE, &val);
  1400. pre_val = val;
  1401. } else {
  1402. val = pre_val;
  1403. }
  1404. g_sw_vbat_temp = val;
  1405. #ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT
  1406. if (g_sw_vbat_temp > gFG_max_voltage)
  1407. gFG_max_voltage = g_sw_vbat_temp;
  1408. if (g_sw_vbat_temp < gFG_min_voltage)
  1409. gFG_min_voltage = g_sw_vbat_temp;
  1410. #endif
  1411. return val;
  1412. }
  1413. int battery_meter_get_low_battery_interrupt_status(void)
  1414. {
  1415. int is_lbat_int_trigger;
  1416. int ret;
  1417. ret =
  1418. battery_meter_ctrl(BATTERY_METER_CMD_GET_LOW_BAT_INTERRUPT_STATUS,
  1419. &is_lbat_int_trigger);
  1420. if (ret != 0)
  1421. return KAL_FALSE;
  1422. return is_lbat_int_trigger;
  1423. }
  1424. signed int battery_meter_get_charging_current_imm(void)
  1425. {
  1426. #ifdef AUXADC_SUPPORT_IMM_CURRENT_MODE
  1427. return PMIC_IMM_GetCurrent();
  1428. #else
  1429. int ret;
  1430. signed int ADC_I_SENSE = 1; /* 1 measure time */
  1431. signed int ADC_BAT_SENSE = 1; /* 1 measure time */
  1432. int ICharging = 0;
  1433. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_SENSE, &ADC_BAT_SENSE);
  1434. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_I_SENSE, &ADC_I_SENSE);
  1435. ICharging = (ADC_I_SENSE - ADC_BAT_SENSE + g_I_SENSE_offset) * 1000 / batt_meter_cust_data.cust_r_sense; //CUST_R_SENSE;
  1436. return ICharging;
  1437. #endif
  1438. }
  1439. signed int battery_meter_get_charging_current(void)
  1440. {
  1441. #ifdef DISABLE_CHARGING_CURRENT_MEASURE
  1442. return 0;
  1443. #elif defined(AUXADC_SUPPORT_IMM_CURRENT_MODE)
  1444. return PMIC_IMM_GetCurrent();
  1445. #elif !defined(EXTERNAL_SWCHR_SUPPORT)
  1446. signed int ADC_BAT_SENSE_tmp[20] = {
  1447. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  1448. };
  1449. signed int ADC_BAT_SENSE_sum = 0;
  1450. signed int ADC_BAT_SENSE = 0;
  1451. signed int ADC_I_SENSE_tmp[20] = {
  1452. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  1453. };
  1454. signed int ADC_I_SENSE_sum = 0;
  1455. signed int ADC_I_SENSE = 0;
  1456. int repeat = 20;
  1457. int i = 0;
  1458. int j = 0;
  1459. signed int temp = 0;
  1460. int ICharging = 0;
  1461. int ret = 0;
  1462. int val = 1;
  1463. for (i = 0; i < repeat; i++) {
  1464. val = 1; /* set avg times */
  1465. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_SENSE, &val);
  1466. ADC_BAT_SENSE_tmp[i] = val;
  1467. val = 1; /* set avg times */
  1468. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_I_SENSE, &val);
  1469. ADC_I_SENSE_tmp[i] = val;
  1470. ADC_BAT_SENSE_sum += ADC_BAT_SENSE_tmp[i];
  1471. ADC_I_SENSE_sum += ADC_I_SENSE_tmp[i];
  1472. }
  1473. /* sorting BAT_SENSE */
  1474. for (i = 0; i < repeat; i++) {
  1475. for (j = i; j < repeat; j++) {
  1476. if (ADC_BAT_SENSE_tmp[j] < ADC_BAT_SENSE_tmp[i]) {
  1477. temp = ADC_BAT_SENSE_tmp[j];
  1478. ADC_BAT_SENSE_tmp[j] = ADC_BAT_SENSE_tmp[i];
  1479. ADC_BAT_SENSE_tmp[i] = temp;
  1480. }
  1481. }
  1482. }
  1483. bm_trace("[g_Get_I_Charging:BAT_SENSE]\r\n");
  1484. for (i = 0; i < repeat; i++)
  1485. bm_trace("%d,", ADC_BAT_SENSE_tmp[i]);
  1486. bm_trace("\r\n");
  1487. /* sorting I_SENSE */
  1488. for (i = 0; i < repeat; i++) {
  1489. for (j = i; j < repeat; j++) {
  1490. if (ADC_I_SENSE_tmp[j] < ADC_I_SENSE_tmp[i]) {
  1491. temp = ADC_I_SENSE_tmp[j];
  1492. ADC_I_SENSE_tmp[j] = ADC_I_SENSE_tmp[i];
  1493. ADC_I_SENSE_tmp[i] = temp;
  1494. }
  1495. }
  1496. }
  1497. bm_trace("[g_Get_I_Charging:I_SENSE]\r\n");
  1498. for (i = 0; i < repeat; i++)
  1499. bm_trace("%d,", ADC_I_SENSE_tmp[i]);
  1500. bm_trace("\r\n");
  1501. ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[0];
  1502. ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[1];
  1503. ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[18];
  1504. ADC_BAT_SENSE_sum -= ADC_BAT_SENSE_tmp[19];
  1505. ADC_BAT_SENSE = ADC_BAT_SENSE_sum / (repeat - 4);
  1506. bm_trace("[g_Get_I_Charging] ADC_BAT_SENSE=%d\r\n", ADC_BAT_SENSE);
  1507. ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[0];
  1508. ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[1];
  1509. ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[18];
  1510. ADC_I_SENSE_sum -= ADC_I_SENSE_tmp[19];
  1511. ADC_I_SENSE = ADC_I_SENSE_sum / (repeat - 4);
  1512. bm_trace("[g_Get_I_Charging] ADC_I_SENSE(Before)=%d\r\n", ADC_I_SENSE);
  1513. bm_trace("[g_Get_I_Charging] ADC_I_SENSE(After)=%d\r\n", ADC_I_SENSE);
  1514. if (ADC_I_SENSE > ADC_BAT_SENSE)
  1515. ICharging = (ADC_I_SENSE - ADC_BAT_SENSE + g_I_SENSE_offset) * 1000 / batt_meter_cust_data.cust_r_sense;//CUST_R_SENSE;
  1516. else
  1517. ICharging = 0;
  1518. return ICharging;
  1519. #else
  1520. return 0;
  1521. #endif
  1522. }
  1523. signed int battery_meter_get_battery_current(void)
  1524. {
  1525. int ret = 0;
  1526. signed int val = 0;
  1527. if (g_auxadc_solution == 1)
  1528. val = oam_i_2;
  1529. else
  1530. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &val);
  1531. return val;
  1532. }
  1533. kal_bool battery_meter_get_battery_current_sign(void)
  1534. {
  1535. int ret = 0;
  1536. kal_bool val = 0;
  1537. if (g_auxadc_solution == 1)
  1538. val = 0; /* discharging */
  1539. else
  1540. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN, &val);
  1541. return val;
  1542. }
  1543. signed int battery_meter_get_car(void)
  1544. {
  1545. int ret = 0;
  1546. signed int val = 0;
  1547. if (g_auxadc_solution == 1)
  1548. val = oam_car_2;
  1549. else {
  1550. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR_ACT, &val);
  1551. if (val < 0)
  1552. val = (val - 5) / 10;
  1553. else
  1554. val = (val + 5) / 10;
  1555. }
  1556. return val;
  1557. }
  1558. signed int battery_meter_get_battery_temperature(void)
  1559. {
  1560. #ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT
  1561. signed int batt_temp = force_get_tbat(KAL_TRUE);
  1562. if (batt_temp > gFG_max_temperature)
  1563. gFG_max_temperature = batt_temp;
  1564. if (batt_temp < gFG_min_temperature)
  1565. gFG_min_temperature = batt_temp;
  1566. return batt_temp;
  1567. #else
  1568. return force_get_tbat(KAL_TRUE);
  1569. #endif
  1570. }
  1571. signed int battery_meter_get_charger_voltage(void)
  1572. {
  1573. int ret = 0;
  1574. int val = 0;
  1575. val = 5; /* set avg times */
  1576. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_CHARGER, &val);
  1577. /* val = (((R_CHARGER_1+R_CHARGER_2)*100*val)/R_CHARGER_2)/100; */
  1578. return val;
  1579. }
  1580. signed int battery_meter_get_battery_percentage(void)
  1581. {
  1582. #if defined(CONFIG_POWER_EXT)
  1583. return 50;
  1584. #else
  1585. #if defined(SOC_BY_HW_FG)
  1586. return gFG_capacity_by_c; /* hw fg, //return gfg_percent_check_point; // voltage mode */
  1587. #endif
  1588. #endif
  1589. return gFG_capacity_by_c;
  1590. }
  1591. signed int battery_meter_initial(void)
  1592. {
  1593. #if defined(CONFIG_POWER_EXT)
  1594. return 0;
  1595. #else
  1596. static kal_bool meter_initilized = KAL_FALSE;
  1597. mutex_lock(&FGADC_mutex);
  1598. if (meter_initilized == KAL_FALSE) {
  1599. #if defined(SOC_BY_HW_FG)
  1600. /* 1. HW initialization */
  1601. battery_meter_ctrl(BATTERY_METER_CMD_HW_FG_INIT, NULL);
  1602. if (wakeup_fg_algo(FG_MAIN) == -1) {
  1603. /* fgauge_initialization(); */
  1604. fgauge_algo_run_get_init_data();
  1605. bm_err("[battery_meter_initial] SOC_BY_HW_FG not done\n");
  1606. }
  1607. #endif
  1608. #if defined(SOC_BY_SW_FG)
  1609. /* 1. HW initialization */
  1610. battery_meter_ctrl(BATTERY_METER_CMD_HW_FG_INIT, NULL);
  1611. if (wakeup_fg_algo(FG_MAIN) == -1) {
  1612. /* fgauge_initialization(); */
  1613. fgauge_algo_run_get_init_data();
  1614. bm_err("[battery_meter_initial] SOC_BY_SW_FG not done\n");
  1615. }
  1616. #endif
  1617. meter_initilized = KAL_TRUE;
  1618. }
  1619. mutex_unlock(&FGADC_mutex);
  1620. return 0;
  1621. #endif
  1622. }
  1623. signed int battery_meter_sync(signed int bat_i_sense_offset)
  1624. {
  1625. #if defined(CONFIG_POWER_EXT)
  1626. return 0;
  1627. #else
  1628. g_I_SENSE_offset = bat_i_sense_offset;
  1629. return 0;
  1630. #endif
  1631. }
  1632. signed int battery_meter_get_battery_zcv(void)
  1633. {
  1634. #if defined(CONFIG_POWER_EXT)
  1635. return 3987;
  1636. #else
  1637. return gFG_voltage;
  1638. #endif
  1639. }
  1640. signed int battery_meter_get_battery_nPercent_zcv(void)
  1641. {
  1642. #if defined(CONFIG_POWER_EXT)
  1643. return 3700;
  1644. #else
  1645. return gFG_15_vlot; /* 15% zcv, 15% can be customized by 100-g_tracking_point */
  1646. #endif
  1647. }
  1648. signed int battery_meter_get_battery_nPercent_UI_SOC(void)
  1649. {
  1650. #if defined(CONFIG_POWER_EXT)
  1651. return 15;
  1652. #else
  1653. return g_tracking_point; /* tracking point */
  1654. #endif
  1655. }
  1656. signed int battery_meter_get_tempR(signed int dwVolt)
  1657. {
  1658. #if defined(CONFIG_POWER_EXT)
  1659. return 0;
  1660. #else
  1661. int TRes;
  1662. TRes = (RBAT_PULL_UP_R * dwVolt) / (RBAT_PULL_UP_VOLT - dwVolt);
  1663. return TRes;
  1664. #endif
  1665. }
  1666. signed int battery_meter_get_tempV(void)
  1667. {
  1668. #if defined(CONFIG_POWER_EXT)
  1669. return 0;
  1670. #else
  1671. int ret = 0;
  1672. int val = 0;
  1673. val = 1; /* set avg times */
  1674. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_TEMP, &val);
  1675. return val;
  1676. #endif
  1677. }
  1678. signed int battery_meter_get_VSense(void)
  1679. {
  1680. #if defined(CONFIG_POWER_EXT)
  1681. return 0;
  1682. #else
  1683. int ret = 0;
  1684. int val = 0;
  1685. val = 1; /* set avg times */
  1686. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_I_SENSE, &val);
  1687. return val;
  1688. #endif
  1689. }
  1690. /* ============================================================ // */
  1691. static ssize_t fgadc_log_write(struct file *filp, const char __user *buff,
  1692. size_t len, loff_t *data)
  1693. {
  1694. if (copy_from_user(&proc_fgadc_data, buff, len)) {
  1695. bm_debug("fgadc_log_write error.\n");
  1696. return -EFAULT;
  1697. }
  1698. if (proc_fgadc_data[0] == '1') {
  1699. bm_debug("enable FGADC driver log system\n");
  1700. Enable_FGADC_LOG = 1;
  1701. } else if (proc_fgadc_data[0] == '2') {
  1702. bm_debug("enable FGADC driver log system:2\n");
  1703. Enable_FGADC_LOG = 2;
  1704. } else if (proc_fgadc_data[0] == '3') {
  1705. bm_debug("enable FGADC driver log system:3\n");
  1706. Enable_FGADC_LOG = 3;
  1707. } else if (proc_fgadc_data[0] == '4') {
  1708. bm_debug("enable FGADC driver log system:4\n");
  1709. Enable_FGADC_LOG = 4;
  1710. } else if (proc_fgadc_data[0] == '5') {
  1711. bm_debug("enable FGADC driver log system:5\n");
  1712. Enable_FGADC_LOG = 5;
  1713. } else if (proc_fgadc_data[0] == '6') {
  1714. bm_debug("enable FGADC driver log system:6\n");
  1715. Enable_FGADC_LOG = 6;
  1716. } else if (proc_fgadc_data[0] == '7') {
  1717. bm_debug("enable FGADC driver log system:7\n");
  1718. Enable_FGADC_LOG = 7;
  1719. } else if (proc_fgadc_data[0] == '8') {
  1720. bm_debug("enable FGADC driver log system:8\n");
  1721. Enable_FGADC_LOG = 8;
  1722. } else {
  1723. bm_debug("Disable FGADC driver log system\n");
  1724. Enable_FGADC_LOG = 0;
  1725. }
  1726. return len;
  1727. }
  1728. static const struct file_operations fgadc_proc_fops = {
  1729. .write = fgadc_log_write,
  1730. };
  1731. int init_proc_log_fg(void)
  1732. {
  1733. int ret = 0;
  1734. #if 1
  1735. proc_create("fgadc_log", 0644, NULL, &fgadc_proc_fops);
  1736. bm_debug("proc_create fgadc_proc_fops\n");
  1737. #else
  1738. proc_entry_fgadc = create_proc_entry("fgadc_log", 0644, NULL);
  1739. if (proc_entry_fgadc == NULL) {
  1740. ret = -ENOMEM;
  1741. bm_debug("init_proc_log_fg: Couldn't create proc entry\n");
  1742. } else {
  1743. proc_entry_fgadc->write_proc = fgadc_log_write;
  1744. bm_debug("init_proc_log_fg loaded.\n");
  1745. }
  1746. #endif
  1747. return ret;
  1748. }
  1749. #ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT
  1750. /* ============================================================ // */
  1751. #ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA
  1752. signed int get_battery_aging_factor(signed int cycle)
  1753. {
  1754. signed int i, f1, f2, c1, c2;
  1755. signed int saddles;
  1756. saddles = sizeof(battery_aging_table) / sizeof(BATTERY_CYCLE_STRUCT);
  1757. for (i = 0; i < saddles; i++) {
  1758. if (battery_aging_table[i].cycle == cycle)
  1759. return battery_aging_table[i].aging_factor;
  1760. if (battery_aging_table[i].cycle > cycle) {
  1761. if (i == 0)
  1762. return 100;
  1763. if (battery_aging_table[i].aging_factor >
  1764. battery_aging_table[i - 1].aging_factor) {
  1765. f1 = battery_aging_table[i].aging_factor;
  1766. f2 = battery_aging_table[i - 1].aging_factor;
  1767. c1 = battery_aging_table[i].cycle;
  1768. c2 = battery_aging_table[i - 1].cycle;
  1769. return (f2 + ((cycle - c2) * (f1 - f2)) / (c1 - c2));
  1770. }
  1771. f1 = battery_aging_table[i - 1].aging_factor;
  1772. f2 = battery_aging_table[i].aging_factor;
  1773. c1 = battery_aging_table[i].cycle;
  1774. c2 = battery_aging_table[i - 1].cycle;
  1775. return (f2 + ((cycle - c2) * (f1 - f2)) / (c1 - c2));
  1776. }
  1777. }
  1778. return battery_aging_table[saddles - 1].aging_factor;
  1779. }
  1780. #endif
  1781. static ssize_t show_FG_Battery_Cycle(struct device *dev, struct device_attribute *attr, char *buf)
  1782. {
  1783. bm_debug("[FG] gFG_battery_cycle : %d\n", gFG_battery_cycle);
  1784. return sprintf(buf, "%d\n", gFG_battery_cycle);
  1785. }
  1786. static ssize_t store_FG_Battery_Cycle(struct device *dev, struct device_attribute *attr,
  1787. const char *buf, size_t size)
  1788. {
  1789. signed int cycle;
  1790. #ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA
  1791. signed int aging_capacity;
  1792. signed int factor;
  1793. #endif
  1794. if (0 == kstrtoint(buf, 10, &cycle)) {
  1795. bm_debug("[FG] update battery cycle count: %d\n", cycle);
  1796. gFG_battery_cycle = cycle;
  1797. #ifdef CUSTOM_BATTERY_CYCLE_AGING_DATA
  1798. /* perform cycle aging calculation */
  1799. factor = get_battery_aging_factor(gFG_battery_cycle);
  1800. if (factor > 0 && factor < 100) {
  1801. bm_debug("[FG] cycle count to aging factor %d\n", factor);
  1802. aging_capacity = gFG_BATT_CAPACITY * factor / 100;
  1803. if (aging_capacity < gFG_BATT_CAPACITY_aging) {
  1804. bm_debug("[FG] update gFG_BATT_CAPACITY_aging to %d\n",
  1805. aging_capacity);
  1806. gFG_BATT_CAPACITY_aging = aging_capacity;
  1807. }
  1808. }
  1809. #endif
  1810. } else {
  1811. bm_debug("[FG] format error!\n");
  1812. }
  1813. return size;
  1814. }
  1815. static DEVICE_ATTR(FG_Battery_Cycle, 0664, show_FG_Battery_Cycle, store_FG_Battery_Cycle);
  1816. /* ------------------------------------------------------------------------------------------- */
  1817. static ssize_t show_FG_Max_Battery_Voltage(struct device *dev, struct device_attribute *attr,
  1818. char *buf)
  1819. {
  1820. bm_debug("[FG] gFG_max_voltage : %d\n", gFG_max_voltage);
  1821. return sprintf(buf, "%d\n", gFG_max_voltage);
  1822. }
  1823. static ssize_t store_FG_Max_Battery_Voltage(struct device *dev, struct device_attribute *attr,
  1824. const char *buf, size_t size)
  1825. {
  1826. signed int voltage;
  1827. if (0 == kstrtoint(buf, 10, &voltage)) {
  1828. if (voltage > gFG_max_voltage) {
  1829. bm_debug("[FG] update battery max voltage: %d\n", voltage);
  1830. gFG_max_voltage = voltage;
  1831. }
  1832. } else {
  1833. bm_debug("[FG] format error!\n");
  1834. }
  1835. return size;
  1836. }
  1837. static DEVICE_ATTR(FG_Max_Battery_Voltage, 0664, show_FG_Max_Battery_Voltage,
  1838. store_FG_Max_Battery_Voltage);
  1839. /* ------------------------------------------------------------------------------------------- */
  1840. static ssize_t show_FG_Min_Battery_Voltage(struct device *dev, struct device_attribute *attr,
  1841. char *buf)
  1842. {
  1843. bm_debug("[FG] gFG_min_voltage : %d\n", gFG_min_voltage);
  1844. return sprintf(buf, "%d\n", gFG_min_voltage);
  1845. }
  1846. static ssize_t store_FG_Min_Battery_Voltage(struct device *dev, struct device_attribute *attr,
  1847. const char *buf, size_t size)
  1848. {
  1849. signed int voltage;
  1850. if (0 == kstrtoint(buf, 10, &voltage)) {
  1851. if (voltage < gFG_min_voltage) {
  1852. bm_debug("[FG] update battery min voltage: %d\n", voltage);
  1853. gFG_min_voltage = voltage;
  1854. }
  1855. } else {
  1856. bm_debug("[FG] format error!\n");
  1857. }
  1858. return size;
  1859. }
  1860. static DEVICE_ATTR(FG_Min_Battery_Voltage, 0664, show_FG_Min_Battery_Voltage,
  1861. store_FG_Min_Battery_Voltage);
  1862. /* ------------------------------------------------------------------------------------------- */
  1863. static ssize_t show_FG_Max_Battery_Current(struct device *dev, struct device_attribute *attr,
  1864. char *buf)
  1865. {
  1866. bm_debug("[FG] gFG_max_current : %d\n", gFG_max_current);
  1867. return sprintf(buf, "%d\n", gFG_max_current);
  1868. }
  1869. static ssize_t store_FG_Max_Battery_Current(struct device *dev, struct device_attribute *attr,
  1870. const char *buf, size_t size)
  1871. {
  1872. signed int bat_current;
  1873. if (0 == kstrtoint(buf, 10, &bat_current)) {
  1874. if (bat_current > gFG_max_current) {
  1875. bm_debug("[FG] update battery max current: %d\n", bat_current);
  1876. gFG_max_current = bat_current;
  1877. }
  1878. } else {
  1879. bm_debug("[FG] format error!\n");
  1880. }
  1881. return size;
  1882. }
  1883. static DEVICE_ATTR(FG_Max_Battery_Current, 0664, show_FG_Max_Battery_Current,
  1884. store_FG_Max_Battery_Current);
  1885. /* ------------------------------------------------------------------------------------------- */
  1886. static ssize_t show_FG_Min_Battery_Current(struct device *dev, struct device_attribute *attr,
  1887. char *buf)
  1888. {
  1889. bm_debug("[FG] gFG_min_current : %d\n", gFG_min_current);
  1890. return sprintf(buf, "%d\n", gFG_min_current);
  1891. }
  1892. static ssize_t store_FG_Min_Battery_Current(struct device *dev, struct device_attribute *attr,
  1893. const char *buf, size_t size)
  1894. {
  1895. signed int bat_current;
  1896. if (0 == kstrtoint(buf, 10, , &bat_current)) {
  1897. if (bat_current < gFG_min_current) {
  1898. bm_debug("[FG] update battery min current: %d\n", bat_current);
  1899. gFG_min_current = bat_current;
  1900. }
  1901. } else {
  1902. bm_debug("[FG] format error!\n");
  1903. }
  1904. return size;
  1905. }
  1906. static DEVICE_ATTR(FG_Min_Battery_Current, 0664, show_FG_Min_Battery_Current,
  1907. store_FG_Min_Battery_Current);
  1908. /* ------------------------------------------------------------------------------------------- */
  1909. static ssize_t show_FG_Max_Battery_Temperature(struct device *dev, struct device_attribute *attr,
  1910. char *buf)
  1911. {
  1912. bm_debug("[FG] gFG_max_temperature : %d\n", gFG_max_temperature);
  1913. return sprintf(buf, "%d\n", gFG_max_temperature);
  1914. }
  1915. static ssize_t store_FG_Max_Battery_Temperature(struct device *dev, struct device_attribute *attr,
  1916. const char *buf, size_t size)
  1917. {
  1918. signed int temp;
  1919. if (0 == kstrtoint(buf, 10, &temp)) {
  1920. if (temp > gFG_max_temperature) {
  1921. bm_debug("[FG] update battery max temp: %d\n", temp);
  1922. gFG_max_temperature = temp;
  1923. }
  1924. } else {
  1925. bm_debug("[FG] format error!\n");
  1926. }
  1927. return size;
  1928. }
  1929. static DEVICE_ATTR(FG_Max_Battery_Temperature, 0664, show_FG_Max_Battery_Temperature,
  1930. store_FG_Max_Battery_Temperature);
  1931. /* ------------------------------------------------------------------------------------------- */
  1932. static ssize_t show_FG_Min_Battery_Temperature(struct device *dev, struct device_attribute *attr,
  1933. char *buf)
  1934. {
  1935. bm_debug("[FG] gFG_min_temperature : %d\n", gFG_min_temperature);
  1936. return sprintf(buf, "%d\n", gFG_min_temperature);
  1937. }
  1938. static ssize_t store_FG_Min_Battery_Temperature(struct device *dev, struct device_attribute *attr,
  1939. const char *buf, size_t size)
  1940. {
  1941. signed int temp;
  1942. if (0 == kstrtoint(buf, 10, &temp)) {
  1943. if (temp < gFG_min_temperature) {
  1944. bm_debug("[FG] update battery min temp: %d\n", temp);
  1945. gFG_min_temperature = temp;
  1946. }
  1947. } else {
  1948. bm_debug("[FG] format error!\n");
  1949. }
  1950. return size;
  1951. }
  1952. static DEVICE_ATTR(FG_Min_Battery_Temperature, 0664, show_FG_Min_Battery_Temperature,
  1953. store_FG_Min_Battery_Temperature);
  1954. /* ------------------------------------------------------------------------------------------- */
  1955. static ssize_t show_FG_Aging_Factor(struct device *dev, struct device_attribute *attr, char *buf)
  1956. {
  1957. bm_debug("[FG] gFG_aging_factor_1 : %d\n", gFG_aging_factor_1);
  1958. return sprintf(buf, "%d\n", gFG_aging_factor_1);
  1959. }
  1960. static ssize_t store_FG_Aging_Factor(struct device *dev, struct device_attribute *attr,
  1961. const char *buf, size_t size)
  1962. {
  1963. signed int factor;
  1964. signed int aging_capacity;
  1965. if (0 == kstrtoint(buf, 10, &factor)) {
  1966. if (factor <= 100 && factor >= 0) {
  1967. bm_print(BM_LOG_CRTI,
  1968. "[FG] update battery aging factor: old(%d), new(%d)\n",
  1969. gFG_aging_factor_1, factor);
  1970. gFG_aging_factor_1 = factor;
  1971. if (gFG_aging_factor_1 != 100) {
  1972. aging_capacity = gFG_BATT_CAPACITY * gFG_aging_factor_1 / 100;
  1973. if (aging_capacity < gFG_BATT_CAPACITY_aging) {
  1974. bm_print(BM_LOG_CRTI,
  1975. "[FG] update gFG_BATT_CAPACITY_aging to %d\n",
  1976. aging_capacity);
  1977. gFG_BATT_CAPACITY_aging = aging_capacity;
  1978. }
  1979. }
  1980. }
  1981. } else {
  1982. bm_debug("[FG] format error!\n");
  1983. }
  1984. return size;
  1985. }
  1986. static DEVICE_ATTR(FG_Aging_Factor, 0664, show_FG_Aging_Factor, store_FG_Aging_Factor);
  1987. /* ------------------------------------------------------------------------------------------- */
  1988. #endif
  1989. /* ============================================================ // */
  1990. static ssize_t show_FG_Current(struct device *dev, struct device_attribute *attr, char *buf)
  1991. {
  1992. signed int ret = 0;
  1993. signed int fg_current_inout_battery = 0;
  1994. signed int val = 0;
  1995. kal_bool is_charging = 0;
  1996. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &val);
  1997. ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN, &is_charging);
  1998. if (is_charging == KAL_TRUE)
  1999. fg_current_inout_battery = 0 - val;
  2000. else
  2001. fg_current_inout_battery = val;
  2002. bm_debug("[FG] gFG_current_inout_battery : %d\n", fg_current_inout_battery);
  2003. return sprintf(buf, "%d\n", fg_current_inout_battery);
  2004. }
  2005. static ssize_t store_FG_Current(struct device *dev, struct device_attribute *attr, const char *buf,
  2006. size_t size)
  2007. {
  2008. return size;
  2009. }
  2010. static DEVICE_ATTR(FG_Current, 0664, show_FG_Current, store_FG_Current);
  2011. /* ============================================================ // */
  2012. static ssize_t show_FG_g_fg_dbg_bat_volt(struct device *dev, struct device_attribute *attr,
  2013. char *buf)
  2014. {
  2015. bm_debug("[FG] g_fg_dbg_bat_volt : %d\n", g_fg_dbg_bat_volt);
  2016. return sprintf(buf, "%d\n", g_fg_dbg_bat_volt);
  2017. }
  2018. static ssize_t store_FG_g_fg_dbg_bat_volt(struct device *dev, struct device_attribute *attr,
  2019. const char *buf, size_t size)
  2020. {
  2021. return size;
  2022. }
  2023. static DEVICE_ATTR(FG_g_fg_dbg_bat_volt, 0664, show_FG_g_fg_dbg_bat_volt,
  2024. store_FG_g_fg_dbg_bat_volt);
  2025. /* ------------------------------------------------------------------------------------------- */
  2026. static ssize_t show_FG_g_fg_dbg_bat_current(struct device *dev, struct device_attribute *attr,
  2027. char *buf)
  2028. {
  2029. bm_debug("[FG] g_fg_dbg_bat_current : %d\n", g_fg_dbg_bat_current);
  2030. return sprintf(buf, "%d\n", g_fg_dbg_bat_current);
  2031. }
  2032. static ssize_t store_FG_g_fg_dbg_bat_current(struct device *dev, struct device_attribute *attr,
  2033. const char *buf, size_t size)
  2034. {
  2035. return size;
  2036. }
  2037. static DEVICE_ATTR(FG_g_fg_dbg_bat_current, 0664, show_FG_g_fg_dbg_bat_current,
  2038. store_FG_g_fg_dbg_bat_current);
  2039. /* ------------------------------------------------------------------------------------------- */
  2040. static ssize_t show_FG_g_fg_dbg_bat_zcv(struct device *dev, struct device_attribute *attr,
  2041. char *buf)
  2042. {
  2043. bm_debug("[FG] g_fg_dbg_bat_zcv : %d\n", g_fg_dbg_bat_zcv);
  2044. return sprintf(buf, "%d\n", g_fg_dbg_bat_zcv);
  2045. }
  2046. static ssize_t store_FG_g_fg_dbg_bat_zcv(struct device *dev, struct device_attribute *attr,
  2047. const char *buf, size_t size)
  2048. {
  2049. return size;
  2050. }
  2051. static DEVICE_ATTR(FG_g_fg_dbg_bat_zcv, 0664, show_FG_g_fg_dbg_bat_zcv, store_FG_g_fg_dbg_bat_zcv);
  2052. /* ------------------------------------------------------------------------------------------- */
  2053. static ssize_t show_FG_g_fg_dbg_bat_temp(struct device *dev, struct device_attribute *attr,
  2054. char *buf)
  2055. {
  2056. bm_debug("[FG] g_fg_dbg_bat_temp : %d\n", g_fg_dbg_bat_temp);
  2057. return sprintf(buf, "%d\n", g_fg_dbg_bat_temp);
  2058. }
  2059. static ssize_t store_FG_g_fg_dbg_bat_temp(struct device *dev, struct device_attribute *attr,
  2060. const char *buf, size_t size)
  2061. {
  2062. return size;
  2063. }
  2064. static DEVICE_ATTR(FG_g_fg_dbg_bat_temp, 0664, show_FG_g_fg_dbg_bat_temp,
  2065. store_FG_g_fg_dbg_bat_temp);
  2066. /* ------------------------------------------------------------------------------------------- */
  2067. static ssize_t show_FG_g_fg_dbg_bat_r(struct device *dev, struct device_attribute *attr, char *buf)
  2068. {
  2069. bm_debug("[FG] g_fg_dbg_bat_r : %d\n", g_fg_dbg_bat_r);
  2070. return sprintf(buf, "%d\n", g_fg_dbg_bat_r);
  2071. }
  2072. static ssize_t store_FG_g_fg_dbg_bat_r(struct device *dev, struct device_attribute *attr,
  2073. const char *buf, size_t size)
  2074. {
  2075. return size;
  2076. }
  2077. static DEVICE_ATTR(FG_g_fg_dbg_bat_r, 0664, show_FG_g_fg_dbg_bat_r, store_FG_g_fg_dbg_bat_r);
  2078. /* ------------------------------------------------------------------------------------------- */
  2079. static ssize_t show_FG_g_fg_dbg_bat_car(struct device *dev, struct device_attribute *attr,
  2080. char *buf)
  2081. {
  2082. bm_debug("[FG] g_fg_dbg_bat_car : %d\n", g_fg_dbg_bat_car);
  2083. return sprintf(buf, "%d\n", g_fg_dbg_bat_car);
  2084. }
  2085. static ssize_t store_FG_g_fg_dbg_bat_car(struct device *dev, struct device_attribute *attr,
  2086. const char *buf, size_t size)
  2087. {
  2088. return size;
  2089. }
  2090. static DEVICE_ATTR(FG_g_fg_dbg_bat_car, 0664, show_FG_g_fg_dbg_bat_car, store_FG_g_fg_dbg_bat_car);
  2091. /* ------------------------------------------------------------------------------------------- */
  2092. static ssize_t show_FG_g_fg_dbg_bat_qmax(struct device *dev, struct device_attribute *attr,
  2093. char *buf)
  2094. {
  2095. bm_debug("[FG] g_fg_dbg_bat_qmax : %d\n", g_fg_dbg_bat_qmax);
  2096. return sprintf(buf, "%d\n", g_fg_dbg_bat_qmax);
  2097. }
  2098. static ssize_t store_FG_g_fg_dbg_bat_qmax(struct device *dev, struct device_attribute *attr,
  2099. const char *buf, size_t size)
  2100. {
  2101. return size;
  2102. }
  2103. static DEVICE_ATTR(FG_g_fg_dbg_bat_qmax, 0664, show_FG_g_fg_dbg_bat_qmax,
  2104. store_FG_g_fg_dbg_bat_qmax);
  2105. /* ------------------------------------------------------------------------------------------- */
  2106. static ssize_t show_FG_g_fg_dbg_d0(struct device *dev, struct device_attribute *attr, char *buf)
  2107. {
  2108. bm_debug("[FG] g_fg_dbg_d0 : %d\n", g_fg_dbg_d0);
  2109. return sprintf(buf, "%d\n", g_fg_dbg_d0);
  2110. }
  2111. static ssize_t store_FG_g_fg_dbg_d0(struct device *dev, struct device_attribute *attr,
  2112. const char *buf, size_t size)
  2113. {
  2114. return size;
  2115. }
  2116. static DEVICE_ATTR(FG_g_fg_dbg_d0, 0664, show_FG_g_fg_dbg_d0, store_FG_g_fg_dbg_d0);
  2117. /* ------------------------------------------------------------------------------------------- */
  2118. static ssize_t show_FG_g_fg_dbg_d1(struct device *dev, struct device_attribute *attr, char *buf)
  2119. {
  2120. bm_debug("[FG] g_fg_dbg_d1 : %d\n", g_fg_dbg_d1);
  2121. return sprintf(buf, "%d\n", g_fg_dbg_d1);
  2122. }
  2123. static ssize_t store_FG_g_fg_dbg_d1(struct device *dev, struct device_attribute *attr,
  2124. const char *buf, size_t size)
  2125. {
  2126. return size;
  2127. }
  2128. static DEVICE_ATTR(FG_g_fg_dbg_d1, 0664, show_FG_g_fg_dbg_d1, store_FG_g_fg_dbg_d1);
  2129. /* ------------------------------------------------------------------------------------------- */
  2130. static ssize_t show_FG_g_fg_dbg_percentage(struct device *dev, struct device_attribute *attr,
  2131. char *buf)
  2132. {
  2133. bm_debug("[FG] g_fg_dbg_percentage : %d\n", g_fg_dbg_percentage);
  2134. return sprintf(buf, "%d\n", g_fg_dbg_percentage);
  2135. }
  2136. static ssize_t store_FG_g_fg_dbg_percentage(struct device *dev, struct device_attribute *attr,
  2137. const char *buf, size_t size)
  2138. {
  2139. return size;
  2140. }
  2141. static DEVICE_ATTR(FG_g_fg_dbg_percentage, 0664, show_FG_g_fg_dbg_percentage,
  2142. store_FG_g_fg_dbg_percentage);
  2143. /* ------------------------------------------------------------------------------------------- */
  2144. static ssize_t show_FG_g_fg_dbg_percentage_uisoc(struct device *dev, struct device_attribute *attr,
  2145. char *buf)
  2146. {
  2147. bm_debug("[FG] g_fg_dbg_percentage :%d\n", BMT_status.UI_SOC);
  2148. return sprintf(buf, "%d\n", BMT_status.UI_SOC);
  2149. }
  2150. static ssize_t store_FG_g_fg_dbg_percentage_uisoc(struct device *dev, struct device_attribute *attr,
  2151. const char *buf, size_t size)
  2152. {
  2153. return size;
  2154. }
  2155. static DEVICE_ATTR(FG_g_fg_dbg_percentage_uisoc, 0664, show_FG_g_fg_dbg_percentage_uisoc,
  2156. store_FG_g_fg_dbg_percentage_uisoc);
  2157. /* ------------------------------------------------------------------------------------------- */
  2158. static ssize_t show_FG_g_fg_dbg_percentage_fg(struct device *dev, struct device_attribute *attr,
  2159. char *buf)
  2160. {
  2161. bm_debug("[FG] g_fg_dbg_percentage_fg : %d\n", g_fg_dbg_percentage_fg);
  2162. return sprintf(buf, "%d\n", g_fg_dbg_percentage_fg);
  2163. }
  2164. static ssize_t store_FG_g_fg_dbg_percentage_fg(struct device *dev, struct device_attribute *attr,
  2165. const char *buf, size_t size)
  2166. {
  2167. return size;
  2168. }
  2169. static DEVICE_ATTR(FG_g_fg_dbg_percentage_fg, 0664, show_FG_g_fg_dbg_percentage_fg,
  2170. store_FG_g_fg_dbg_percentage_fg);
  2171. /* ------------------------------------------------------------------------------------------- */
  2172. static ssize_t show_FG_g_fg_dbg_percentage_voltmode(struct device *dev,
  2173. struct device_attribute *attr, char *buf)
  2174. {
  2175. bm_debug("[FG] g_fg_dbg_percentage_voltmode : %d\n", g_fg_dbg_percentage_voltmode);
  2176. return sprintf(buf, "%d\n", g_fg_dbg_percentage_voltmode);
  2177. }
  2178. static ssize_t store_FG_g_fg_dbg_percentage_voltmode(struct device *dev,
  2179. struct device_attribute *attr, const char *buf,
  2180. size_t size)
  2181. {
  2182. return size;
  2183. }
  2184. static DEVICE_ATTR(FG_g_fg_dbg_percentage_voltmode, 0664, show_FG_g_fg_dbg_percentage_voltmode,
  2185. store_FG_g_fg_dbg_percentage_voltmode);
  2186. /* ============================================================ // */
  2187. #ifdef MTK_ENABLE_AGING_ALGORITHM
  2188. /* ------------------------------------------------------------------------------------------- */
  2189. static ssize_t show_FG_suspend_current_threshold(struct device *dev, struct device_attribute *attr,
  2190. char *buf)
  2191. {
  2192. bm_debug("[FG] show suspend_current_threshold : %d\n", suspend_current_threshold);
  2193. return sprintf(buf, "%d\n", suspend_current_threshold);
  2194. }
  2195. static ssize_t store_FG_suspend_current_threshold(struct device *dev, struct device_attribute *attr,
  2196. const char *buf, size_t size)
  2197. {
  2198. unsigned int val = 0;
  2199. int ret;
  2200. bm_debug("[store_FG_suspend_current_threshold]\n");
  2201. if (buf != NULL && size != 0) {
  2202. bm_debug("[store_FG_suspend_current_threshold] buf is %s\n", buf);
  2203. ret = kstrtouint(buf, 10, &val);
  2204. if (val < 100)
  2205. val = 100;
  2206. suspend_current_threshold = val;
  2207. bm_debug("[store_FG_suspend_current_threshold] suspend_current_threshold=%d\n",
  2208. suspend_current_threshold);
  2209. }
  2210. return size;
  2211. }
  2212. static DEVICE_ATTR(FG_suspend_current_threshold, 0664, show_FG_suspend_current_threshold,
  2213. store_FG_suspend_current_threshold);
  2214. /* ------------------------------------------------------------------------------------------- */
  2215. static ssize_t show_FG_ocv_check_time(struct device *dev, struct device_attribute *attr, char *buf)
  2216. {
  2217. bm_debug("[FG] show ocv_check_time : %d\n", ocv_check_time);
  2218. return sprintf(buf, "%d\n", ocv_check_time);
  2219. }
  2220. static ssize_t store_FG_ocv_check_time(struct device *dev, struct device_attribute *attr,
  2221. const char *buf, size_t size)
  2222. {
  2223. unsigned long val = 0;
  2224. int ret = 0;
  2225. bm_debug("[store_FG_ocv_check_time]\n");
  2226. if (buf != NULL && size != 0) {
  2227. bm_debug("[store_FG_ocv_check_time] buf is %s\n", buf);
  2228. ret = kstrtoul(buf, 10, &val);
  2229. if (val < 100)
  2230. val = 100;
  2231. ocv_check_time = val;
  2232. bm_debug("[store_ocv_check_time] ocv_check_time=%d\n", ocv_check_time);
  2233. }
  2234. return size;
  2235. }
  2236. static DEVICE_ATTR(FG_ocv_check_time, 0664, show_FG_ocv_check_time, store_FG_ocv_check_time);
  2237. /* ------------------------------------------------------------------------------------------- */
  2238. static ssize_t show_FG_difference_voltage_update(struct device *dev, struct device_attribute *attr,
  2239. char *buf)
  2240. {
  2241. bm_debug("[FG] show ocv_check_time : %d\n", difference_voltage_update);
  2242. return sprintf(buf, "%d\n", difference_voltage_update);
  2243. }
  2244. static ssize_t store_FG_difference_voltage_update(struct device *dev, struct device_attribute *attr,
  2245. const char *buf, size_t size)
  2246. {
  2247. unsigned long val = 0;
  2248. int ret = 0;
  2249. bm_debug("[store_FG_difference_voltage_update]\n");
  2250. if (buf != NULL && size != 0) {
  2251. bm_debug("[store_FG_difference_voltage_update] buf is %s\n", buf);
  2252. ret = kstrtoul(buf, 10, &val);
  2253. if (val < 0)
  2254. val = 0;
  2255. difference_voltage_update = val;
  2256. bm_debug("[store_difference_voltage_update] difference_voltage_update=%d\n",
  2257. difference_voltage_update);
  2258. }
  2259. return size;
  2260. }
  2261. static DEVICE_ATTR(FG_difference_voltage_update, 0664, show_FG_difference_voltage_update,
  2262. store_FG_difference_voltage_update);
  2263. /* ------------------------------------------------------------------------------------------- */
  2264. static ssize_t show_FG_aging1_load_soc(struct device *dev, struct device_attribute *attr, char *buf)
  2265. {
  2266. bm_debug("[FG] show aging1_load_soc : %d\n", aging1_load_soc);
  2267. return sprintf(buf, "%d\n", aging1_load_soc);
  2268. }
  2269. static ssize_t store_FG_aging1_load_soc(struct device *dev, struct device_attribute *attr,
  2270. const char *buf, size_t size)
  2271. {
  2272. unsigned int val = 0;
  2273. int ret;
  2274. bm_debug("[store_FG_aging1_load_soc]\n");
  2275. if (buf != NULL && size != 0) {
  2276. bm_debug("[store_FG_aging1_load_soc] buf is %s\n", buf);
  2277. ret = kstrtouint(buf, 10, &val);
  2278. if (val < 0)
  2279. val = 0;
  2280. if (val > 100)
  2281. val = 100;
  2282. aging1_load_soc = val;
  2283. bm_debug("[store_aging1_load_soc] aging1_load_soc=%d\n", aging1_load_soc);
  2284. }
  2285. return size;
  2286. }
  2287. static DEVICE_ATTR(FG_aging1_load_soc, 0664, show_FG_aging1_load_soc, store_FG_aging1_load_soc);
  2288. /* ------------------------------------------------------------------------------------------- */
  2289. static ssize_t show_FG_aging1_update_soc(struct device *dev, struct device_attribute *attr,
  2290. char *buf)
  2291. {
  2292. bm_debug("[FG] show aging1_update_soc : %d\n", aging1_update_soc);
  2293. return sprintf(buf, "%d\n", aging1_update_soc);
  2294. }
  2295. static ssize_t store_FG_aging1_update_soc(struct device *dev, struct device_attribute *attr,
  2296. const char *buf, size_t size)
  2297. {
  2298. unsigned int val = 0;
  2299. int ret;
  2300. bm_debug("[store_FG_aging1_update_soc]\n");
  2301. if (buf != NULL && size != 0) {
  2302. bm_debug("[store_FG_aging1_update_soc] buf is %s\n", buf);
  2303. ret = kstrtouint(buf, 10, &val);
  2304. if (val < 0)
  2305. val = 0;
  2306. if (val > 100)
  2307. val = 100;
  2308. aging1_update_soc = val;
  2309. bm_debug("[store_aging1_update_soc] aging1_update_soc=%d\n", aging1_update_soc);
  2310. }
  2311. return size;
  2312. }
  2313. static DEVICE_ATTR(FG_aging1_update_soc, 0664, show_FG_aging1_update_soc,
  2314. store_FG_aging1_update_soc);
  2315. /* ------------------------------------------------------------------------------------------- */
  2316. static ssize_t show_FG_shutdown_system_voltage(struct device *dev, struct device_attribute *attr,
  2317. char *buf)
  2318. {
  2319. bm_debug("[FG] show shutdown_system_voltage : %d\n", shutdown_system_voltage);
  2320. return sprintf(buf, "%d\n", shutdown_system_voltage);
  2321. }
  2322. static ssize_t store_FG_shutdown_system_voltage(struct device *dev, struct device_attribute *attr,
  2323. const char *buf, size_t size)
  2324. {
  2325. unsigned int val = 0;
  2326. int ret;
  2327. bm_debug("[shutdown_system_voltage]\n");
  2328. if (buf != NULL && size != 0) {
  2329. bm_debug("[shutdown_system_voltage] buf is %s\n", buf);
  2330. ret = kstrtouint(buf, 10, &val);
  2331. if (val < 0)
  2332. val = 0;
  2333. shutdown_system_voltage = val;
  2334. bm_debug("[shutdown_system_voltage] shutdown_system_voltage=%d\n",
  2335. shutdown_system_voltage);
  2336. }
  2337. return size;
  2338. }
  2339. static DEVICE_ATTR(FG_shutdown_system_voltage, 0664, show_FG_shutdown_system_voltage,
  2340. store_FG_shutdown_system_voltage);
  2341. /* ------------------------------------------------------------------------------------------- */
  2342. static ssize_t show_FG_charge_tracking_time(struct device *dev, struct device_attribute *attr,
  2343. char *buf)
  2344. {
  2345. bm_debug("[FG] show charge_tracking_time : %d\n", charge_tracking_time);
  2346. return sprintf(buf, "%d\n", charge_tracking_time);
  2347. }
  2348. static ssize_t store_FG_charge_tracking_time(struct device *dev, struct device_attribute *attr,
  2349. const char *buf, size_t size)
  2350. {
  2351. unsigned int val = 0;
  2352. int ret;
  2353. bm_debug("[charge_tracking_time]\n");
  2354. if (buf != NULL && size != 0) {
  2355. bm_debug("[charge_tracking_time] buf is %s\n", buf);
  2356. ret = kstrtouint(buf, 10, &val);
  2357. if (val < 0)
  2358. val = 0;
  2359. charge_tracking_time = val;
  2360. bm_debug("[charge_tracking_time] charge_tracking_time=%d\n", charge_tracking_time);
  2361. }
  2362. return size;
  2363. }
  2364. static DEVICE_ATTR(FG_charge_tracking_time, 0664, show_FG_charge_tracking_time,
  2365. store_FG_charge_tracking_time);
  2366. /* ------------------------------------------------------------------------------------------- */
  2367. static ssize_t show_FG_discharge_tracking_time(struct device *dev, struct device_attribute *attr,
  2368. char *buf)
  2369. {
  2370. bm_debug("[FG] show discharge_tracking_time : %d\n", discharge_tracking_time);
  2371. return sprintf(buf, "%d\n", discharge_tracking_time);
  2372. }
  2373. static ssize_t store_FG_discharge_tracking_time(struct device *dev, struct device_attribute *attr,
  2374. const char *buf, size_t size)
  2375. {
  2376. unsigned int val = 0;
  2377. int ret;
  2378. bm_debug("[discharge_tracking_time]\n");
  2379. if (buf != NULL && size != 0) {
  2380. bm_debug("[discharge_tracking_time] buf is %s\n", buf);
  2381. ret = kstrtouint(buf, 10, &val);
  2382. if (val < 0)
  2383. val = 0;
  2384. discharge_tracking_time = val;
  2385. bm_debug("[discharge_tracking_time] discharge_tracking_time=%d\n",
  2386. discharge_tracking_time);
  2387. }
  2388. return size;
  2389. }
  2390. static DEVICE_ATTR(FG_discharge_tracking_time, 0664, show_FG_discharge_tracking_time,
  2391. store_FG_discharge_tracking_time);
  2392. /* ------------------------------------------------------------------------------------------- */
  2393. #endif
  2394. static ssize_t show_FG_shutdown_gauge0(struct device *dev, struct device_attribute *attr, char *buf)
  2395. {
  2396. bm_debug("[FG] show shutdown_gauge0 : %d\n", shutdown_gauge0);
  2397. return sprintf(buf, "%d\n", shutdown_gauge0);
  2398. }
  2399. static ssize_t store_FG_shutdown_gauge0(struct device *dev, struct device_attribute *attr,
  2400. const char *buf, size_t size)
  2401. {
  2402. unsigned int val = 0;
  2403. int ret;
  2404. bm_debug("[shutdown_gauge0]\n");
  2405. if (buf != NULL && size != 0) {
  2406. bm_debug("[shutdown_gauge0] buf is %s\n", buf);
  2407. ret = kstrtouint(buf, 10, &val);
  2408. if (val < 0)
  2409. val = 0;
  2410. shutdown_gauge0 = val;
  2411. bm_debug("[shutdown_gauge0] shutdown_gauge0=%d\n", shutdown_gauge0);
  2412. }
  2413. return size;
  2414. }
  2415. static DEVICE_ATTR(FG_shutdown_gauge0, 0664, show_FG_shutdown_gauge0, store_FG_shutdown_gauge0);
  2416. /* ------------------------------------------------------------------------------------------- */
  2417. static ssize_t show_FG_shutdown_gauge1_xmins(struct device *dev, struct device_attribute *attr,
  2418. char *buf)
  2419. {
  2420. bm_debug("[FG] show shutdown_gauge1_xmins : %d\n", shutdown_gauge1_xmins);
  2421. return sprintf(buf, "%d\n", shutdown_gauge1_xmins);
  2422. }
  2423. static ssize_t store_FG_shutdown_gauge1_xmins(struct device *dev, struct device_attribute *attr,
  2424. const char *buf, size_t size)
  2425. {
  2426. unsigned int val = 0;
  2427. int ret;
  2428. bm_debug("[shutdown_gauge1_xmins]\n");
  2429. if (buf != NULL && size != 0) {
  2430. bm_debug("[shutdown_gauge1_xmins] buf is %s\n", buf);
  2431. ret = kstrtouint(buf, 10, &val);
  2432. if (val < 0)
  2433. val = 0;
  2434. shutdown_gauge1_xmins = val;
  2435. bm_debug("[shutdown_gauge1_xmins] shutdown_gauge1_xmins=%d\n",
  2436. shutdown_gauge1_xmins);
  2437. }
  2438. return size;
  2439. }
  2440. static DEVICE_ATTR(FG_shutdown_gauge1_xmins, 0664, show_FG_shutdown_gauge1_xmins,
  2441. store_FG_shutdown_gauge1_xmins);
  2442. /* ------------------------------------------------------------------------------------------- */
  2443. static ssize_t show_FG_shutdown_gauge1_mins(struct device *dev, struct device_attribute *attr,
  2444. char *buf)
  2445. {
  2446. bm_debug("[FG] show shutdown_gauge1_mins : %d\n", shutdown_gauge1_mins);
  2447. return sprintf(buf, "%d\n", shutdown_gauge1_mins);
  2448. }
  2449. static ssize_t store_FG_shutdown_gauge1_mins(struct device *dev, struct device_attribute *attr,
  2450. const char *buf, size_t size)
  2451. {
  2452. unsigned int val = 0;
  2453. int ret;
  2454. bm_debug("[shutdown_gauge1_mins]\n");
  2455. if (buf != NULL && size != 0) {
  2456. bm_debug("[shutdown_gauge1_mins] buf is %s\n", buf);
  2457. ret = kstrtouint(buf, 10, &val);
  2458. if (val < 0)
  2459. val = 0;
  2460. shutdown_gauge1_mins = val;
  2461. bm_debug("[shutdown_gauge1_mins] shutdown_gauge1_mins=%d\n", shutdown_gauge1_mins);
  2462. }
  2463. return size;
  2464. }
  2465. static DEVICE_ATTR(FG_shutdown_gauge1_mins, 0664, show_FG_shutdown_gauge1_mins,
  2466. store_FG_shutdown_gauge1_mins);
  2467. /* ------------------------------------------------------------------------------------------- */
  2468. static ssize_t show_FG_daemon_log_level(struct device *dev, struct device_attribute *attr,
  2469. char *buf)
  2470. {
  2471. bm_trace("[FG] show FG_daemon_log_level : %d\n", gFG_daemon_log_level);
  2472. return sprintf(buf, "%d\n", gFG_daemon_log_level);
  2473. }
  2474. static ssize_t store_FG_daemon_log_level(struct device *dev, struct device_attribute *attr,
  2475. const char *buf, size_t size)
  2476. {
  2477. unsigned long val = 0;
  2478. int ret;
  2479. bm_debug("[FG_daemon_log_level]\n");
  2480. if (buf != NULL && size != 0) {
  2481. bm_debug("[FG_daemon_log_level] buf is %s\n", buf);
  2482. ret = kstrtoul(buf, 10, &val);
  2483. if (val < 0) {
  2484. bm_debug("[FG_daemon_log_level] val is %d ??\n", (int)val);
  2485. val = 0;
  2486. }
  2487. gFG_daemon_log_level = val;
  2488. bm_debug("[FG_daemon_log_level] gFG_daemon_log_level=%d\n", gFG_daemon_log_level);
  2489. }
  2490. return size;
  2491. }
  2492. static DEVICE_ATTR(FG_daemon_log_level, 0664, show_FG_daemon_log_level, store_FG_daemon_log_level);
  2493. /* ------------------------------------------------------------------------------------------- */
  2494. static ssize_t show_FG_daemon_disable(struct device *dev, struct device_attribute *attr, char *buf)
  2495. {
  2496. bm_trace("[FG] show FG_daemon_log_level : %d\n", gDisableFG);
  2497. return sprintf(buf, "%d\n", gDisableFG);
  2498. }
  2499. static ssize_t store_FG_daemon_disable(struct device *dev, struct device_attribute *attr,
  2500. const char *buf, size_t size)
  2501. {
  2502. bm_debug("[disable FG daemon]\n");
  2503. BMT_status.UI_SOC2 = 50;
  2504. if (!g_battery_soc_ready) {
  2505. g_battery_soc_ready = KAL_TRUE;
  2506. gfg_percent_check_point = 50;
  2507. }
  2508. bat_update_thread_wakeup();
  2509. gDisableFG = 1;
  2510. return size;
  2511. }
  2512. static DEVICE_ATTR(FG_daemon_disable, 0664, show_FG_daemon_disable, store_FG_daemon_disable);
  2513. /* ------------------------------------------------------------------------------------------- */
  2514. #ifdef FG_BAT_INT
  2515. unsigned char reset_fg_bat_int = KAL_TRUE;
  2516. signed int fg_bat_int_coulomb_pre;
  2517. signed int fg_bat_int_coulomb;
  2518. void fg_bat_int_handler(void)
  2519. {
  2520. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR_ACT, &fg_bat_int_coulomb);
  2521. battery_log(BAT_LOG_CRTI, "fg_bat_int_handler %d %d\n", fg_bat_int_coulomb_pre,
  2522. fg_bat_int_coulomb);
  2523. reset_fg_bat_int = KAL_TRUE;
  2524. if (bat_is_charger_exist() == KAL_FALSE) {
  2525. battery_log(BAT_LOG_CRTI, "wake up user space >>\n");
  2526. /* self_correct_dod_scheme(duration_time); */
  2527. wakeup_fg_algo(FG_RESUME);
  2528. }
  2529. }
  2530. signed int battery_meter_set_columb_interrupt(unsigned int val)
  2531. {
  2532. battery_log(BAT_LOG_FULL, "battery_meter_set_columb_interrupt=%d\n", val);
  2533. battery_meter_ctrl(BATTERY_METER_CMD_SET_COLUMB_INTERRUPT, &val);
  2534. return 0;
  2535. }
  2536. #endif
  2537. static int battery_meter_probe(struct platform_device *dev)
  2538. {
  2539. int ret_device_file = 0;
  2540. char *temp_strptr;
  2541. bm_info("[battery_meter_probe] probe\n");
  2542. /* select battery meter control method */
  2543. battery_meter_ctrl = bm_ctrl_cmd;
  2544. #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING)
  2545. if (get_boot_mode() == LOW_POWER_OFF_CHARGING_BOOT
  2546. || get_boot_mode() == KERNEL_POWER_OFF_CHARGING_BOOT) {
  2547. temp_strptr =
  2548. kzalloc(strlen(saved_command_line) + strlen(" androidboot.mode=charger") + 1,
  2549. GFP_KERNEL);
  2550. strcpy(temp_strptr, saved_command_line);
  2551. strcat(temp_strptr, " androidboot.mode=charger");
  2552. saved_command_line = temp_strptr;
  2553. }
  2554. #endif
  2555. /* LOG System Set */
  2556. init_proc_log_fg();
  2557. /* last_oam_run_time = rtc_read_hw_time(); */
  2558. getrawmonotonic(&last_oam_run_time);
  2559. /* Create File For FG UI DEBUG */
  2560. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Current);
  2561. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_volt);
  2562. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_current);
  2563. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_zcv);
  2564. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_temp);
  2565. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_r);
  2566. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_car);
  2567. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_bat_qmax);
  2568. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_d0);
  2569. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_d1);
  2570. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_percentage);
  2571. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_percentage_fg);
  2572. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_percentage_uisoc);
  2573. ret_device_file =
  2574. device_create_file(&(dev->dev), &dev_attr_FG_g_fg_dbg_percentage_voltmode);
  2575. #ifdef MTK_ENABLE_AGING_ALGORITHM
  2576. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_suspend_current_threshold);
  2577. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_ocv_check_time);
  2578. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_difference_voltage_update);
  2579. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_aging1_load_soc);
  2580. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_aging1_update_soc);
  2581. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_shutdown_system_voltage);
  2582. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_charge_tracking_time);
  2583. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_discharge_tracking_time);
  2584. #endif
  2585. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_shutdown_gauge0);
  2586. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_shutdown_gauge1_xmins);
  2587. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_shutdown_gauge1_mins);
  2588. #ifdef MTK_BATTERY_LIFETIME_DATA_SUPPORT
  2589. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Battery_Cycle);
  2590. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Aging_Factor);
  2591. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Max_Battery_Voltage);
  2592. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Min_Battery_Voltage);
  2593. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Max_Battery_Current);
  2594. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Min_Battery_Current);
  2595. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Max_Battery_Temperature);
  2596. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_Min_Battery_Temperature);
  2597. #endif
  2598. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_daemon_log_level);
  2599. ret_device_file = device_create_file(&(dev->dev), &dev_attr_FG_daemon_disable);
  2600. batt_meter_init_cust_data();
  2601. #if defined(FG_BAT_INT)
  2602. pmic_register_interrupt_callback(FG_BAT_INT_L_NO, fg_bat_int_handler);
  2603. pmic_register_interrupt_callback(FG_BAT_INT_H_NO, fg_bat_int_handler);
  2604. #endif
  2605. return 0;
  2606. }
  2607. static int battery_meter_remove(struct platform_device *dev)
  2608. {
  2609. bm_debug("[battery_meter_remove]\n");
  2610. return 0;
  2611. }
  2612. static void battery_meter_shutdown(struct platform_device *dev)
  2613. {
  2614. bm_debug("[battery_meter_shutdown]\n");
  2615. }
  2616. static int battery_meter_suspend(struct platform_device *dev, pm_message_t state)
  2617. {
  2618. /* -- hibernation path */
  2619. if (state.event == PM_EVENT_FREEZE) {
  2620. pr_warn("[%s] %p:%p\n", __func__, battery_meter_ctrl, &bm_ctrl_cmd);
  2621. battery_meter_ctrl = bm_ctrl_cmd;
  2622. }
  2623. /* -- end of hibernation path */
  2624. #if defined(FG_BAT_INT)
  2625. #if defined(CONFIG_POWER_EXT)
  2626. #elif defined(SOC_BY_HW_FG)
  2627. if (reset_fg_bat_int == KAL_TRUE) {
  2628. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR_ACT, &fg_bat_int_coulomb_pre);
  2629. bm_notice("[battery_meter_suspend]enable battery_meter_set_columb_interrupt %d\n",
  2630. batt_meter_cust_data.q_max_pos_25);
  2631. battery_meter_set_columb_interrupt(batt_meter_cust_data.q_max_pos_25 / 100);
  2632. /*battery_meter_set_columb_interrupt(1); */
  2633. reset_fg_bat_int = KAL_FALSE;
  2634. } else {
  2635. bm_notice
  2636. ("[battery_meter_suspend]do not enable battery_meter_set_columb_interrupt %d\n",
  2637. batt_meter_cust_data.q_max_pos_25);
  2638. battery_meter_set_columb_interrupt(0x1ffff);
  2639. }
  2640. #endif
  2641. #else
  2642. #endif /* #if defined(FG_BAT_INT) */
  2643. #if defined(CONFIG_POWER_EXT)
  2644. #elif defined(SOC_BY_SW_FG) || defined(SOC_BY_HW_FG)
  2645. {
  2646. #if defined(SOC_BY_SW_FG)
  2647. {
  2648. /*if (battery_meter_get_low_battery_interrupt_status() == KAL_TRUE)
  2649. battery_meter_ctrl(BATTERY_METER_CMD_SET_LOW_BAT_INTERRUPT,
  2650. &oam_v_ocv);*/
  2651. get_monotonic_boottime(&ap_suspend_time);
  2652. }
  2653. #endif
  2654. battery_meter_ctrl(BATTERY_METER_CMD_GET_REFRESH_HW_OCV, &hwocv_token);
  2655. #ifdef MTK_POWER_EXT_DETECT
  2656. if (KAL_TRUE == bat_is_ext_power())
  2657. return 0;
  2658. #endif
  2659. mt_battery_update_time(&car_time, CAR_TIME);
  2660. add_time = mt_battery_get_duration_time(CAR_TIME);
  2661. if ((g_sleep_total_time.tv_sec < g_spm_timer) && g_sleep_total_time.tv_sec != 0) {
  2662. if (wake_up_smooth_time == 0)
  2663. return 0;
  2664. else if (g_sleep_total_time.tv_sec < wake_up_smooth_time)
  2665. return 0;
  2666. }
  2667. battery_meter_reset_sleep_time();
  2668. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &g_hw_ocv_before_sleep);
  2669. bm_info("[battery_meter_suspend]sleep_total_time = %d, last_time = %d\n",
  2670. (int)g_sleep_total_time.tv_sec, last_time);
  2671. }
  2672. #endif
  2673. return 0;
  2674. }
  2675. static int battery_meter_resume(struct platform_device *dev)
  2676. {
  2677. #if defined(CONFIG_POWER_EXT)
  2678. #elif defined(SOC_BY_SW_FG) || defined(SOC_BY_HW_FG)
  2679. unsigned int duration_time = 0;
  2680. #ifdef MTK_POWER_EXT_DETECT
  2681. if (KAL_TRUE == bat_is_ext_power())
  2682. return 0;
  2683. #endif
  2684. mt_battery_update_time(&suspend_time, SUSPEND_TIME);
  2685. add_time = mt_battery_get_duration_time_act(SUSPEND_TIME).tv_sec;
  2686. g_sleep_total_time =
  2687. timespec_add(g_sleep_total_time, mt_battery_get_duration_time_act(SUSPEND_TIME));
  2688. bm_info
  2689. ("[battery_meter_resume] sleep time = %d, duration_time = %d, wake_up_smooth_time %d, g_spm_timer = %d\n",
  2690. (int)g_sleep_total_time.tv_sec, duration_time, wake_up_smooth_time, g_spm_timer);
  2691. #if defined(SOC_BY_HW_FG)
  2692. #ifdef MTK_ENABLE_AGING_ALGORITHM
  2693. if (g_sleep_total_time.tv_sec < g_spm_timer) {
  2694. if (wake_up_smooth_time == 0) {
  2695. if (bat_is_charger_exist() == KAL_FALSE) {
  2696. /* self_correct_dod_scheme(duration_time); */
  2697. wakeup_fg_algo(FG_RESUME);
  2698. }
  2699. return 0;
  2700. } else if (g_sleep_total_time.tv_sec < wake_up_smooth_time) {
  2701. if (bat_is_charger_exist() == KAL_FALSE) {
  2702. /* self_correct_dod_scheme(duration_time); */
  2703. wakeup_fg_algo(FG_RESUME);
  2704. }
  2705. return 0;
  2706. }
  2707. }
  2708. #endif
  2709. bm_info("* battery_meter_resume!! * suspend_time %d smooth_time %d g_spm_timer %d\n",
  2710. (int)g_sleep_total_time.tv_sec, wake_up_smooth_time, g_spm_timer);
  2711. bat_spm_timeout = true;
  2712. if (g_sleep_total_time.tv_sec >= wake_up_smooth_time)
  2713. wake_up_smooth_time = 0;
  2714. #elif defined(SOC_BY_SW_FG)
  2715. if (bat_is_charger_exist() == KAL_FALSE) {
  2716. unsigned int time;
  2717. signed int voltage = 0;
  2718. int oam_i = 0, oam_car_tmp;
  2719. /* mt_battery_update_time(&ap_suspend_time, AP_SUSPEND_TIME); */
  2720. /* time = mt_battery_get_duration_time(AP_SUSPEND_TIME); */
  2721. time = add_time;
  2722. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &voltage);
  2723. total_suspend_times++;
  2724. this_suspend_times++;
  2725. if (voltage == hwocv_token) {
  2726. oam_car_tmp = -time * APSLEEP_MDWAKEUP_CAR;
  2727. bm_print(BM_LOG_CRTI,
  2728. "[battery_meter_resume](1)time:%d bat:%d ocv:%d r:%d i:%d ocar:%d card:%d lbat:%d %d\n",
  2729. time, voltage, oam_v_ocv, oam_r, oam_i, ap_suspend_car / 3600,
  2730. oam_car_tmp / 3600, pmic_get_register_value(PMIC_RG_ADC_OUT_LBAT),
  2731. pmic_get_register_value(PMIC_RG_LBAT_DEBOUNCE_COUNT_MIN));
  2732. last_hwocv = 0;
  2733. last_i = 0;
  2734. is_hwocv_update = KAL_FALSE;
  2735. } else {
  2736. oam_car_tmp = -time * AP_MDSLEEP_CAR;
  2737. last_hwocv = voltage;
  2738. last_i = oam_i;
  2739. is_hwocv_update = KAL_TRUE;
  2740. bm_print(BM_LOG_CRTI,
  2741. "[battery_meter_resume](2)time:%d bat:%d ocv:%d r:%d i:%d ocar:%d card:%d lbat:%d %d\n",
  2742. time, voltage, oam_v_ocv, oam_r, oam_i, ap_suspend_car / 3600,
  2743. oam_car_tmp / 3600, pmic_get_register_value(PMIC_RG_ADC_OUT_LBAT),
  2744. pmic_get_register_value(PMIC_RG_LBAT_DEBOUNCE_COUNT_MIN));
  2745. }
  2746. swfg_ap_suspend_time = g_sleep_total_time.tv_sec;
  2747. ap_suspend_car = ap_suspend_car + oam_car_tmp;
  2748. if (abs(ap_suspend_car / 3600) > 100) {
  2749. bat_spm_timeout = true;
  2750. return 0;
  2751. }
  2752. if (g_sleep_total_time.tv_sec > wake_up_smooth_time && wake_up_smooth_time != 0) {
  2753. wake_up_smooth_time = 0;
  2754. bat_spm_timeout = true;
  2755. return 0;
  2756. }
  2757. if (swfg_ap_suspend_time > 600) {
  2758. bat_spm_timeout = true;
  2759. return 0;
  2760. }
  2761. return 0;
  2762. }
  2763. #endif
  2764. #endif
  2765. return 0;
  2766. }
  2767. /* ----------------------------------------------------- */
  2768. #ifdef CONFIG_OF
  2769. static const struct of_device_id mt_bat_meter_of_match[] = {
  2770. {.compatible = "mediatek,bat_meter",},
  2771. {},
  2772. };
  2773. MODULE_DEVICE_TABLE(of, mt_bat_meter_of_match);
  2774. #endif
  2775. struct platform_device battery_meter_device = {
  2776. .name = "battery_meter",
  2777. .id = -1,
  2778. };
  2779. static struct platform_driver battery_meter_driver = {
  2780. .probe = battery_meter_probe,
  2781. .remove = battery_meter_remove,
  2782. .shutdown = battery_meter_shutdown,
  2783. .suspend = battery_meter_suspend,
  2784. .resume = battery_meter_resume,
  2785. .driver = {
  2786. .name = "battery_meter",
  2787. },
  2788. };
  2789. static int battery_meter_dts_probe(struct platform_device *dev)
  2790. {
  2791. int ret = 0;
  2792. battery_xlog_printk(BAT_LOG_CRTI, "******** battery_meter_dts_probe!! ********\n");
  2793. battery_meter_device.dev.of_node = dev->dev.of_node;
  2794. ret = platform_device_register(&battery_meter_device);
  2795. if (ret) {
  2796. battery_xlog_printk(BAT_LOG_CRTI,
  2797. "****[battery_meter_dts_probe] Unable to register device (%d)\n",
  2798. ret);
  2799. return ret;
  2800. }
  2801. return 0;
  2802. }
  2803. static struct platform_driver battery_meter_dts_driver = {
  2804. .probe = battery_meter_dts_probe,
  2805. .remove = NULL,
  2806. .shutdown = NULL,
  2807. .suspend = NULL,
  2808. .resume = NULL,
  2809. .driver = {
  2810. .name = "battery_meter_dts",
  2811. #ifdef CONFIG_OF
  2812. .of_match_table = mt_bat_meter_of_match,
  2813. #endif
  2814. },
  2815. };
  2816. /* ============================================================ */
  2817. void bmd_ctrl_cmd_from_user(void *nl_data, struct fgd_nl_msg_t *ret_msg)
  2818. {
  2819. struct fgd_nl_msg_t *msg;
  2820. msg = nl_data;
  2821. ret_msg->fgd_cmd = msg->fgd_cmd;
  2822. switch (msg->fgd_cmd) {
  2823. case FG_DAEMON_CMD_GET_INIT_FLAG:
  2824. {
  2825. ret_msg->fgd_data_len += sizeof(init_flag);
  2826. memcpy(ret_msg->fgd_data, &init_flag, sizeof(init_flag));
  2827. bm_debug("[fg_res] init_flag = %d\n", init_flag);
  2828. }
  2829. break;
  2830. case FG_DAEMON_CMD_GET_SOC:
  2831. {
  2832. ret_msg->fgd_data_len += sizeof(gFG_capacity_by_c);
  2833. memcpy(ret_msg->fgd_data, &gFG_capacity_by_c, sizeof(gFG_capacity_by_c));
  2834. bm_debug("[fg_res] gFG_capacity_by_c = %d\n", gFG_capacity_by_c);
  2835. }
  2836. break;
  2837. case FG_DAEMON_CMD_GET_DOD0:
  2838. {
  2839. ret_msg->fgd_data_len += sizeof(gFG_DOD0);
  2840. memcpy(ret_msg->fgd_data, &gFG_DOD0, sizeof(gFG_DOD0));
  2841. bm_debug("[fg_res] gFG_DOD0 = %d\n", gFG_DOD0);
  2842. }
  2843. break;
  2844. case FG_DAEMON_CMD_GET_DOD1:
  2845. {
  2846. ret_msg->fgd_data_len += sizeof(gFG_DOD1);
  2847. memcpy(ret_msg->fgd_data, &gFG_DOD1, sizeof(gFG_DOD1));
  2848. bm_debug("[fg_res] gFG_DOD1 = %d\n", gFG_DOD1);
  2849. }
  2850. break;
  2851. case FG_DAEMON_CMD_GET_HW_OCV:
  2852. {
  2853. signed int voltage = 0;
  2854. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &voltage);
  2855. ret_msg->fgd_data_len += sizeof(voltage);
  2856. memcpy(ret_msg->fgd_data, &voltage, sizeof(voltage));
  2857. bm_debug("[fg_res] voltage = %d\n", voltage);
  2858. gFG_hwocv = voltage;
  2859. }
  2860. break;
  2861. case FG_DAEMON_CMD_GET_HW_FG_INIT_CURRENT:
  2862. {
  2863. ret_msg->fgd_data_len += sizeof(gFG_current_init);
  2864. memcpy(ret_msg->fgd_data, &gFG_current_init, sizeof(gFG_current_init));
  2865. bm_debug("[fg_res] init fg_current = %d\n", gFG_current_init);
  2866. gFG_current = gFG_current_init;
  2867. }
  2868. break;
  2869. case FG_DAEMON_CMD_GET_HW_FG_CURRENT:
  2870. {
  2871. signed int fg_current = 0;
  2872. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &fg_current);
  2873. ret_msg->fgd_data_len += sizeof(fg_current);
  2874. memcpy(ret_msg->fgd_data, &fg_current, sizeof(fg_current));
  2875. bm_debug("[fg_res] fg_current = %d\n", fg_current);
  2876. gFG_current = fg_current;
  2877. }
  2878. break;
  2879. case FG_DAEMON_CMD_GET_HW_FG_INIT_CURRENT_SIGN:
  2880. {
  2881. ret_msg->fgd_data_len += sizeof(gFG_Is_Charging_init);
  2882. memcpy(ret_msg->fgd_data, &gFG_Is_Charging_init,
  2883. sizeof(gFG_Is_Charging_init));
  2884. bm_debug("[fg_res] current_state = %d\n", gFG_Is_Charging_init);
  2885. gFG_Is_Charging = gFG_Is_Charging_init;
  2886. }
  2887. break;
  2888. case FG_DAEMON_CMD_GET_HW_FG_CURRENT_SIGN:
  2889. {
  2890. kal_bool current_state = KAL_FALSE;
  2891. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN,
  2892. &current_state);
  2893. ret_msg->fgd_data_len += sizeof(current_state);
  2894. memcpy(ret_msg->fgd_data, &current_state, sizeof(current_state));
  2895. bm_debug("[fg_res] current_state = %d\n", current_state);
  2896. gFG_Is_Charging = current_state;
  2897. }
  2898. break;
  2899. case FG_DAEMON_CMD_GET_HW_FG_CAR_ACT:
  2900. {
  2901. signed int fg_coulomb = 0;
  2902. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CAR_ACT, &fg_coulomb);
  2903. ret_msg->fgd_data_len += sizeof(fg_coulomb);
  2904. memcpy(ret_msg->fgd_data, &fg_coulomb, sizeof(fg_coulomb));
  2905. bm_debug("[fg_res] fg_coulomb = %d\n", fg_coulomb);
  2906. gFG_coulomb_act = fg_coulomb;
  2907. break;
  2908. }
  2909. case FG_DAEMON_CMD_GET_TEMPERTURE:
  2910. {
  2911. kal_bool update;
  2912. int temperture = 0;
  2913. memcpy(&update, &msg->fgd_data[0], sizeof(update));
  2914. bm_debug("[fg_res] update = %d\n", update);
  2915. temperture = force_get_tbat(update);
  2916. bm_debug("[fg_res] temperture = %d\n", temperture);
  2917. ret_msg->fgd_data_len += sizeof(temperture);
  2918. memcpy(ret_msg->fgd_data, &temperture, sizeof(temperture));
  2919. gFG_temp = temperture;
  2920. }
  2921. break;
  2922. case FG_DAEMON_CMD_DUMP_REGISTER:
  2923. battery_meter_ctrl(BATTERY_METER_CMD_DUMP_REGISTER, NULL);
  2924. break;
  2925. case FG_DAEMON_CMD_CHARGING_ENABLE:
  2926. {
  2927. kal_bool charging_enable = KAL_FALSE;
  2928. battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable);
  2929. ret_msg->fgd_data_len += sizeof(charging_enable);
  2930. memcpy(ret_msg->fgd_data, &charging_enable, sizeof(charging_enable));
  2931. bm_debug("[fg_res] charging_enable = %d\n", charging_enable);
  2932. }
  2933. break;
  2934. case FG_DAEMON_CMD_GET_BATTERY_INIT_VOLTAGE:
  2935. {
  2936. ret_msg->fgd_data_len += sizeof(gFG_voltage_init);
  2937. memcpy(ret_msg->fgd_data, &gFG_voltage_init, sizeof(gFG_voltage_init));
  2938. bm_debug("[fg_res] voltage = %d\n", gFG_voltage_init);
  2939. }
  2940. break;
  2941. case FG_DAEMON_CMD_GET_BATTERY_VOLTAGE:
  2942. {
  2943. signed int update;
  2944. int voltage = 0;
  2945. memcpy(&update, &msg->fgd_data[0], sizeof(update));
  2946. bm_debug("[fg_res] update = %d\n", update);
  2947. if (update == 1)
  2948. voltage = battery_meter_get_battery_voltage(KAL_TRUE);
  2949. else
  2950. voltage = BMT_status.bat_vol;
  2951. ret_msg->fgd_data_len += sizeof(voltage);
  2952. memcpy(ret_msg->fgd_data, &voltage, sizeof(voltage));
  2953. bm_debug("[fg_res] voltage = %d\n", voltage);
  2954. }
  2955. break;
  2956. case FG_DAEMON_CMD_FGADC_RESET:
  2957. bm_debug("[fg_res] fgadc_reset\n");
  2958. battery_meter_ctrl(BATTERY_METER_CMD_HW_RESET, NULL);
  2959. #ifdef FG_BAT_INT
  2960. reset_fg_bat_int = KAL_TRUE;
  2961. #endif
  2962. break;
  2963. case FG_DAEMON_CMD_GET_BATTERY_PLUG_STATUS:
  2964. {
  2965. int plugout_status = 0;
  2966. battery_meter_ctrl(BATTERY_METER_CMD_GET_BATTERY_PLUG_STATUS,
  2967. &plugout_status);
  2968. ret_msg->fgd_data_len += sizeof(plugout_status);
  2969. memcpy(ret_msg->fgd_data, &plugout_status, sizeof(plugout_status));
  2970. bm_debug("[fg_res] plugout_status = %d\n", plugout_status);
  2971. gFG_plugout_status = plugout_status;
  2972. }
  2973. break;
  2974. case FG_DAEMON_CMD_GET_RTC_SPARE_FG_VALUE:
  2975. {
  2976. signed int rtc_fg_soc = 0;
  2977. rtc_fg_soc = get_rtc_spare_fg_value();
  2978. ret_msg->fgd_data_len += sizeof(rtc_fg_soc);
  2979. memcpy(ret_msg->fgd_data, &rtc_fg_soc, sizeof(rtc_fg_soc));
  2980. bm_debug("[fg_res] rtc_fg_soc = %d\n", rtc_fg_soc);
  2981. }
  2982. break;
  2983. case FG_DAEMON_CMD_IS_CHARGER_EXIST:
  2984. {
  2985. kal_bool charger_exist = KAL_FALSE;
  2986. charger_exist = bat_is_charger_exist();
  2987. ret_msg->fgd_data_len += sizeof(charger_exist);
  2988. memcpy(ret_msg->fgd_data, &charger_exist, sizeof(charger_exist));
  2989. bm_debug("[fg_res] charger_exist = %d\n", charger_exist);
  2990. }
  2991. break;
  2992. case FG_DAEMON_CMD_IS_BATTERY_FULL:
  2993. {
  2994. kal_bool battery_full = KAL_FALSE;
  2995. battery_full = BMT_status.bat_full;
  2996. ret_msg->fgd_data_len += sizeof(battery_full);
  2997. memcpy(ret_msg->fgd_data, &battery_full, sizeof(battery_full));
  2998. bm_debug("[fg_res] battery_full = %d\n", battery_full);
  2999. }
  3000. break;
  3001. case FG_DAEMON_CMD_GET_BOOT_REASON:
  3002. {
  3003. signed int boot_reason = get_boot_reason();
  3004. ret_msg->fgd_data_len += sizeof(boot_reason);
  3005. memcpy(ret_msg->fgd_data, &boot_reason, sizeof(boot_reason));
  3006. bm_debug(" ret_msg->fgd_data_len %d\n", ret_msg->fgd_data_len);
  3007. bm_debug("[fg_res] g_boot_reason = %d\n", boot_reason);
  3008. }
  3009. break;
  3010. case FG_DAEMON_CMD_GET_CHARGING_CURRENT:
  3011. {
  3012. signed int ICharging = battery_meter_get_charging_current();
  3013. ret_msg->fgd_data_len += sizeof(ICharging);
  3014. memcpy(ret_msg->fgd_data, &ICharging, sizeof(ICharging));
  3015. bm_debug("[fg_res] ICharging = %d\n", ICharging);
  3016. }
  3017. break;
  3018. case FG_DAEMON_CMD_GET_CHARGER_VOLTAGE:
  3019. {
  3020. signed int charger_vol = battery_meter_get_charger_voltage();
  3021. ret_msg->fgd_data_len += sizeof(charger_vol);
  3022. memcpy(ret_msg->fgd_data, &charger_vol, sizeof(charger_vol));
  3023. bm_debug("[fg_res] charger_vol = %d\n", charger_vol);
  3024. }
  3025. break;
  3026. case FG_DAEMON_CMD_GET_SHUTDOWN_COND:
  3027. {
  3028. unsigned int shutdown_cond = 0; /* mt_battery_shutdown_check(); move to user space */
  3029. ret_msg->fgd_data_len += sizeof(shutdown_cond);
  3030. memcpy(ret_msg->fgd_data, &shutdown_cond, sizeof(shutdown_cond));
  3031. bm_debug("[fg_res] shutdown_cond = %d\n", shutdown_cond);
  3032. }
  3033. break;
  3034. case FG_DAEMON_CMD_GET_CUSTOM_SETTING:
  3035. {
  3036. kal_bool version;
  3037. memcpy(&version, &msg->fgd_data[0], sizeof(version));
  3038. bm_debug("[fg_res] version = %d\n", version);
  3039. if (version != CUST_SETTING_VERSION) {
  3040. bm_debug("ERROR version 0x%x, expect 0x%x\n", version,
  3041. CUST_SETTING_VERSION);
  3042. break;
  3043. }
  3044. memcpy(ret_msg->fgd_data, &batt_meter_cust_data,
  3045. sizeof(batt_meter_cust_data));
  3046. ret_msg->fgd_data_len += sizeof(batt_meter_cust_data);
  3047. memcpy(&ret_msg->fgd_data[ret_msg->fgd_data_len],
  3048. &batt_meter_table_cust_data, sizeof(batt_meter_table_cust_data));
  3049. ret_msg->fgd_data_len += sizeof(batt_meter_table_cust_data);
  3050. bm_debug("k fgauge_construct_profile_init1 %d:%d %d:%d %d:%d %d:%d %d:%d\n",
  3051. batt_meter_table_cust_data.battery_profile_t0[0].percentage,
  3052. batt_meter_table_cust_data.battery_profile_t0[0].voltage,
  3053. batt_meter_table_cust_data.battery_profile_t0[10].percentage,
  3054. batt_meter_table_cust_data.battery_profile_t0[10].voltage,
  3055. batt_meter_table_cust_data.battery_profile_t0[20].percentage,
  3056. batt_meter_table_cust_data.battery_profile_t0[20].voltage,
  3057. batt_meter_table_cust_data.battery_profile_t0[30].percentage,
  3058. batt_meter_table_cust_data.battery_profile_t0[30].voltage,
  3059. batt_meter_table_cust_data.battery_profile_t0[40].percentage,
  3060. batt_meter_table_cust_data.battery_profile_t0[40].voltage);
  3061. }
  3062. break;
  3063. case FG_DAEMON_CMD_GET_UI_SOC:
  3064. {
  3065. ret_msg->fgd_data_len += sizeof(BMT_status.UI_SOC);
  3066. memcpy(ret_msg->fgd_data, &(BMT_status.UI_SOC), sizeof(BMT_status.UI_SOC));
  3067. bm_debug("[fg_res] ui soc = %d\n", BMT_status.UI_SOC);
  3068. }
  3069. break;
  3070. case FG_DAEMON_CMD_GET_CV_VALUE:
  3071. {
  3072. unsigned int cv_voltage;
  3073. cv_voltage = get_cv_voltage();
  3074. ret_msg->fgd_data_len += sizeof(cv_voltage);
  3075. memcpy(ret_msg->fgd_data, &cv_voltage, sizeof(cv_voltage));
  3076. bm_debug("[fg_res] cv value = %d\n", cv_voltage);
  3077. }
  3078. break;
  3079. case FG_DAEMON_CMD_GET_DURATION_TIME:
  3080. {
  3081. int duration_time = 0;
  3082. BATTERY_TIME_ENUM duration_type;
  3083. memcpy(&duration_type, &msg->fgd_data[0], sizeof(duration_type));
  3084. bm_debug("[fg_res] duration_type = %d\n", duration_type);
  3085. duration_time = mt_battery_get_duration_time(duration_type);
  3086. ret_msg->fgd_data_len += sizeof(duration_time);
  3087. memcpy(ret_msg->fgd_data, &duration_time, sizeof(duration_time));
  3088. bm_debug("[fg_res] duration time = %d\n", duration_time);
  3089. }
  3090. break;
  3091. case FG_DAEMON_CMD_GET_TRACKING_TIME:
  3092. {
  3093. ret_msg->fgd_data_len += sizeof(battery_tracking_time);
  3094. memcpy(ret_msg->fgd_data, &battery_tracking_time,
  3095. sizeof(battery_tracking_time));
  3096. bm_debug("[fg_res] tracking time = %d\n", battery_tracking_time);
  3097. }
  3098. break;
  3099. case FG_DAEMON_CMD_GET_CURRENT_TH:
  3100. {
  3101. ret_msg->fgd_data_len += sizeof(suspend_current_threshold);
  3102. memcpy(ret_msg->fgd_data, &suspend_current_threshold,
  3103. sizeof(suspend_current_threshold));
  3104. bm_debug("[fg_res] suspend_current_threshold = %d\n",
  3105. suspend_current_threshold);
  3106. }
  3107. break;
  3108. case FG_DAEMON_CMD_GET_CHECK_TIME:
  3109. {
  3110. ret_msg->fgd_data_len += sizeof(ocv_check_time);
  3111. memcpy(ret_msg->fgd_data, &ocv_check_time, sizeof(ocv_check_time));
  3112. bm_debug("[fg_res] check time = %d\n", ocv_check_time);
  3113. }
  3114. break;
  3115. case FG_DAEMON_CMD_GET_DIFFERENCE_VOLTAGE_UPDATE:
  3116. {
  3117. ret_msg->fgd_data_len += sizeof(difference_voltage_update);
  3118. memcpy(ret_msg->fgd_data, &difference_voltage_update,
  3119. sizeof(difference_voltage_update));
  3120. bm_debug("[fg_res] difference_voltage_update = %d\n",
  3121. difference_voltage_update);
  3122. }
  3123. break;
  3124. case FG_DAEMON_CMD_GET_AGING1_LOAD_SOC:
  3125. {
  3126. ret_msg->fgd_data_len += sizeof(aging1_load_soc);
  3127. memcpy(ret_msg->fgd_data, &aging1_load_soc, sizeof(aging1_load_soc));
  3128. bm_debug("[fg_res] aging1_load_soc = %d\n", aging1_load_soc);
  3129. }
  3130. break;
  3131. case FG_DAEMON_CMD_GET_AGING1_UPDATE_SOC:
  3132. {
  3133. ret_msg->fgd_data_len += sizeof(aging1_update_soc);
  3134. memcpy(ret_msg->fgd_data, &aging1_update_soc, sizeof(aging1_update_soc));
  3135. bm_debug("[fg_res] aging1_update_soc = %d\n", aging1_update_soc);
  3136. }
  3137. break;
  3138. case FG_DAEMON_CMD_GET_SHUTDOWN_SYSTEM_VOLTAGE:
  3139. {
  3140. ret_msg->fgd_data_len += sizeof(shutdown_system_voltage);
  3141. memcpy(ret_msg->fgd_data, &shutdown_system_voltage,
  3142. sizeof(shutdown_system_voltage));
  3143. bm_debug("[fg_res] shutdown_system_voltage = %d\n",
  3144. shutdown_system_voltage);
  3145. }
  3146. break;
  3147. case FG_DAEMON_CMD_GET_CHARGE_TRACKING_TIME:
  3148. {
  3149. ret_msg->fgd_data_len += sizeof(charge_tracking_time);
  3150. memcpy(ret_msg->fgd_data, &charge_tracking_time,
  3151. sizeof(charge_tracking_time));
  3152. bm_debug("[fg_res] charge_tracking_time = %d\n", charge_tracking_time);
  3153. }
  3154. break;
  3155. case FG_DAEMON_CMD_GET_DISCHARGE_TRACKING_TIME:
  3156. {
  3157. ret_msg->fgd_data_len += sizeof(discharge_tracking_time);
  3158. memcpy(ret_msg->fgd_data, &discharge_tracking_time,
  3159. sizeof(discharge_tracking_time));
  3160. bm_debug("[fg_res] discharge_tracking_time = %d\n",
  3161. discharge_tracking_time);
  3162. }
  3163. break;
  3164. case FG_DAEMON_CMD_GET_SHUTDOWN_GAUGE0:
  3165. {
  3166. ret_msg->fgd_data_len += sizeof(shutdown_gauge0);
  3167. memcpy(ret_msg->fgd_data, &shutdown_gauge0, sizeof(shutdown_gauge0));
  3168. bm_debug("[fg_res] shutdown_gauge0 = %d\n", shutdown_gauge0);
  3169. }
  3170. break;
  3171. case FG_DAEMON_CMD_GET_SHUTDOWN_GAUGE1_XMINS:
  3172. {
  3173. ret_msg->fgd_data_len += sizeof(shutdown_gauge1_xmins);
  3174. memcpy(ret_msg->fgd_data, &shutdown_gauge1_xmins,
  3175. sizeof(shutdown_gauge1_xmins));
  3176. bm_debug("[fg_res] shutdown_gauge1_xmins = %d\n", shutdown_gauge1_xmins);
  3177. }
  3178. break;
  3179. case FG_DAEMON_CMD_GET_SHUTDOWN_GAUGE1_MINS:
  3180. {
  3181. ret_msg->fgd_data_len += sizeof(shutdown_gauge1_mins);
  3182. memcpy(ret_msg->fgd_data, &shutdown_gauge1_mins,
  3183. sizeof(shutdown_gauge1_mins));
  3184. bm_debug("[fg_res] shutdown_gauge1_mins = %d\n", shutdown_gauge1_mins);
  3185. }
  3186. break;
  3187. case FG_DAEMON_CMD_SET_SUSPEND_TIME:
  3188. bm_debug("[fg_res] set suspend time\n");
  3189. get_monotonic_boottime(&suspend_time);
  3190. break;
  3191. case FG_DAEMON_CMD_SET_WAKEUP_SMOOTH_TIME:
  3192. {
  3193. memcpy(&wake_up_smooth_time, &msg->fgd_data[0],
  3194. sizeof(wake_up_smooth_time));
  3195. bm_debug("[fg_res] wake_up_smooth_time = %d\n", wake_up_smooth_time);
  3196. }
  3197. break;
  3198. case FG_DAEMON_CMD_SET_IS_CHARGING:
  3199. {
  3200. memcpy(&gFG_coulomb_is_charging, &msg->fgd_data[0],
  3201. sizeof(gFG_coulomb_is_charging));
  3202. bm_debug("[fg_res] is_charging = %d\n", gFG_coulomb_is_charging);
  3203. }
  3204. break;
  3205. case FG_DAEMON_CMD_SET_RBAT:
  3206. {
  3207. memcpy(&gFG_resistance_bat, &msg->fgd_data[0], sizeof(gFG_resistance_bat));
  3208. bm_debug("[fg_res] gFG_resistance_bat = %d\n", gFG_resistance_bat);
  3209. }
  3210. break;
  3211. case FG_DAEMON_CMD_SET_SWOCV:
  3212. {
  3213. memcpy(&gFG_voltage, &msg->fgd_data[0], sizeof(gFG_voltage));
  3214. bm_debug("[fg_res] gFG_voltage = %d\n", gFG_voltage);
  3215. }
  3216. break;
  3217. case FG_DAEMON_CMD_SET_DOD0:
  3218. {
  3219. memcpy(&gFG_DOD0, &msg->fgd_data[0], sizeof(gFG_DOD0));
  3220. bm_debug("[fg_res] gFG_DOD0 = %d\n", gFG_DOD0);
  3221. }
  3222. break;
  3223. case FG_DAEMON_CMD_SET_DOD1:
  3224. {
  3225. memcpy(&gFG_DOD1, &msg->fgd_data[0], sizeof(gFG_DOD1));
  3226. bm_debug("[fg_res] gFG_DOD1 = %d\n", gFG_DOD1);
  3227. }
  3228. break;
  3229. case FG_DAEMON_CMD_SET_QMAX:
  3230. {
  3231. memcpy(&gFG_BATT_CAPACITY_aging, &msg->fgd_data[0],
  3232. sizeof(gFG_BATT_CAPACITY_aging));
  3233. bm_debug("[fg_res] QMAX = %d\n", gFG_BATT_CAPACITY_aging);
  3234. }
  3235. break;
  3236. case FG_DAEMON_CMD_SET_BATTERY_FULL:
  3237. {
  3238. signed int battery_full;
  3239. memcpy(&battery_full, &msg->fgd_data[0], sizeof(battery_full));
  3240. BMT_status.bat_full = (kal_bool) battery_full;
  3241. bm_debug("[fg_res] set bat_full = %d\n", BMT_status.bat_full);
  3242. }
  3243. break;
  3244. case FG_DAEMON_CMD_SET_RTC:
  3245. {
  3246. signed int rtcvalue;
  3247. memcpy(&rtcvalue, &msg->fgd_data[0], sizeof(rtcvalue));
  3248. set_rtc_spare_fg_value(rtcvalue);
  3249. bm_notice("[fg_res] set rtc = %d\n", rtcvalue);
  3250. }
  3251. break;
  3252. case FG_DAEMON_CMD_SET_POWEROFF:
  3253. {
  3254. bm_debug("[fg_res] FG_DAEMON_CMD_SET_POWEROFF\n");
  3255. kernel_power_off();
  3256. }
  3257. break;
  3258. case FG_DAEMON_CMD_SET_INIT_FLAG:
  3259. {
  3260. memcpy(&init_flag, &msg->fgd_data[0], sizeof(init_flag));
  3261. bm_notice("[fg_res] init_flag = %d\n", init_flag);
  3262. }
  3263. break;
  3264. case FG_DAEMON_CMD_IS_KPOC:
  3265. {
  3266. signed int kpoc = bat_is_kpoc();
  3267. ret_msg->fgd_data_len += sizeof(kpoc);
  3268. memcpy(ret_msg->fgd_data, &kpoc, sizeof(kpoc));
  3269. bm_debug("[fg_res] query kpoc = %d\n", kpoc);
  3270. }
  3271. break;
  3272. case FG_DAEMON_CMD_SET_SOC:
  3273. {
  3274. memcpy(&gFG_capacity_by_c, &msg->fgd_data[0], sizeof(gFG_capacity_by_c));
  3275. bm_debug("[fg_res] SOC = %d\n", gFG_capacity_by_c);
  3276. BMT_status.SOC = gFG_capacity_by_c;
  3277. }
  3278. break;
  3279. case FG_DAEMON_CMD_SET_UI_SOC:
  3280. {
  3281. signed int UI_SOC;
  3282. memcpy(&UI_SOC, &msg->fgd_data[0], sizeof(UI_SOC));
  3283. bm_debug("[fg_res] UI_SOC = %d\n", UI_SOC);
  3284. BMT_status.UI_SOC = UI_SOC;
  3285. }
  3286. break;
  3287. case FG_DAEMON_CMD_SET_UI_SOC2:
  3288. {
  3289. signed int UI_SOC;
  3290. memcpy(&UI_SOC, &msg->fgd_data[0], sizeof(UI_SOC));
  3291. bm_debug("[fg_res] UI_SOC2 = %d\n", UI_SOC);
  3292. BMT_status.UI_SOC2 = UI_SOC;
  3293. if (!g_battery_soc_ready) {
  3294. g_battery_soc_ready = KAL_TRUE;
  3295. gfg_percent_check_point = UI_SOC;
  3296. }
  3297. bat_update_thread_wakeup();
  3298. /* wake_up_bat(); */
  3299. }
  3300. break;
  3301. case FG_DAEMON_CMD_CHECK_FG_DAEMON_VERSION:
  3302. {
  3303. memcpy(&g_fgd_version, &msg->fgd_data[0], sizeof(g_fgd_version));
  3304. bm_debug("[fg_res] g_fgd_pid = %d\n", g_fgd_version);
  3305. if (FGD_CHECK_VERSION != g_fgd_version) {
  3306. bm_err("bad FG_DAEMON_VERSION 0x%x, 0x%x\n",
  3307. FGD_CHECK_VERSION, g_fgd_version);
  3308. } else {
  3309. bm_debug("FG_DAEMON_VERSION OK\n");
  3310. }
  3311. }
  3312. break;
  3313. case FG_DAEMON_CMD_SET_DAEMON_PID:
  3314. {
  3315. memcpy(&g_fgd_pid, &msg->fgd_data[0], sizeof(g_fgd_pid));
  3316. bm_debug("[fg_res] g_fgd_pid = %d\n", g_fgd_pid);
  3317. }
  3318. break;
  3319. case FG_DAEMON_CMD_SET_OAM_V_OCV:
  3320. {
  3321. signed int tmp;
  3322. memcpy(&tmp, &msg->fgd_data[0], sizeof(tmp));
  3323. bm_print(BM_LOG_CRTI, "[fg_res] OAM_V_OCV = %d\n", tmp);
  3324. oam_v_ocv = tmp;
  3325. }
  3326. break;
  3327. case FG_DAEMON_CMD_SET_OAM_R:
  3328. {
  3329. signed int tmp;
  3330. memcpy(&tmp, &msg->fgd_data[0], sizeof(tmp));
  3331. bm_print(BM_LOG_CRTI, "[fg_res] OAM_R = %d\n", tmp);
  3332. oam_r = tmp;
  3333. }
  3334. break;
  3335. case FG_DAEMON_CMD_GET_SUSPEND_TIME:
  3336. {
  3337. ret_msg->fgd_data_len += sizeof(swfg_ap_suspend_time);
  3338. memcpy(ret_msg->fgd_data, &swfg_ap_suspend_time,
  3339. sizeof(swfg_ap_suspend_time));
  3340. bm_print(BM_LOG_CRTI, "[fg_res] suspend_time = %d\n", swfg_ap_suspend_time);
  3341. swfg_ap_suspend_time = 0;
  3342. }
  3343. break;
  3344. case FG_DAEMON_CMD_GET_SUSPEND_CAR:
  3345. {
  3346. signed int car = ap_suspend_car / 3600;
  3347. ret_msg->fgd_data_len += sizeof(car);
  3348. memcpy(ret_msg->fgd_data, &car, sizeof(car));
  3349. bm_print(BM_LOG_CRTI,
  3350. "[fg_res] ap_suspend_car:(%d:%d) t:%d hwocv:%d ocv:%d i:%d stime:%d:%d\n",
  3351. ap_suspend_car, car, swfg_ap_suspend_time, last_hwocv, oam_v_ocv,
  3352. last_i, total_suspend_times, this_suspend_times);
  3353. ap_suspend_car = ap_suspend_car % 3600;
  3354. this_suspend_times = 0;
  3355. }
  3356. break;
  3357. case FG_DAEMON_CMD_IS_HW_OCV_UPDATE:
  3358. {
  3359. ret_msg->fgd_data_len += sizeof(is_hwocv_update);
  3360. memcpy(ret_msg->fgd_data, &is_hwocv_update, sizeof(is_hwocv_update));
  3361. bm_print(BM_LOG_CRTI, "[fg_res] is_hwocv_update = %d\n", is_hwocv_update);
  3362. is_hwocv_update = KAL_FALSE;
  3363. }
  3364. break;
  3365. default:
  3366. bm_debug("bad FG_DAEMON_CTRL_CMD_FROM_USER 0x%x\n", msg->fgd_cmd);
  3367. break;
  3368. } /* switch() */
  3369. }
  3370. static void nl_send_to_user(u32 pid, int seq, struct fgd_nl_msg_t *reply_msg)
  3371. {
  3372. struct sk_buff *skb;
  3373. struct nlmsghdr *nlh;
  3374. /* int size=sizeof(struct fgd_nl_msg_t); */
  3375. int size = reply_msg->fgd_data_len + FGD_NL_MSG_T_HDR_LEN;
  3376. int len = NLMSG_SPACE(size);
  3377. void *data;
  3378. int ret;
  3379. skb = alloc_skb(len, GFP_ATOMIC);
  3380. if (!skb)
  3381. return;
  3382. nlh = nlmsg_put(skb, pid, seq, 0, size, 0);
  3383. data = NLMSG_DATA(nlh);
  3384. memcpy(data, reply_msg, size);
  3385. NETLINK_CB(skb).portid = 0; /* from kernel */
  3386. NETLINK_CB(skb).dst_group = 0; /* unicast */
  3387. /* bm_debug("[Netlink] nl_reply_user: netlink_unicast size=%d fgd_cmd=%d pid=%d\n",
  3388. /size, reply_msg->fgd_cmd, pid); */
  3389. ret = netlink_unicast(daemo_nl_sk, skb, pid, MSG_DONTWAIT);
  3390. if (ret < 0) {
  3391. bm_err("[Netlink] send failed %d\n", ret);
  3392. return;
  3393. }
  3394. /*bm_debug("[Netlink] reply_user: netlink_unicast- ret=%d\n", ret); */
  3395. }
  3396. static void nl_data_handler(struct sk_buff *skb)
  3397. {
  3398. u32 pid;
  3399. kuid_t uid;
  3400. int seq;
  3401. void *data;
  3402. struct nlmsghdr *nlh;
  3403. struct fgd_nl_msg_t *fgd_msg, *fgd_ret_msg;
  3404. int size = 0;
  3405. nlh = (struct nlmsghdr *)skb->data;
  3406. pid = NETLINK_CREDS(skb)->pid;
  3407. uid = NETLINK_CREDS(skb)->uid;
  3408. seq = nlh->nlmsg_seq;
  3409. /*bm_debug("[Netlink] recv skb from user space uid:%d pid:%d seq:%d\n",uid,pid,seq); */
  3410. data = NLMSG_DATA(nlh);
  3411. fgd_msg = (struct fgd_nl_msg_t *)data;
  3412. size = fgd_msg->fgd_ret_data_len + FGD_NL_MSG_T_HDR_LEN;
  3413. fgd_ret_msg = vmalloc(size);
  3414. if (!fgd_ret_msg) {
  3415. /* bm_err("Error: nl_data_handler() vmalloc fail!!!\n"); */
  3416. return;
  3417. }
  3418. memset(fgd_ret_msg, 0, size);
  3419. bmd_ctrl_cmd_from_user(data, fgd_ret_msg);
  3420. nl_send_to_user(pid, seq, fgd_ret_msg);
  3421. /*bm_print(BM_LOG_CRTI,"[Netlink] send to user space process done\n"); */
  3422. vfree(fgd_ret_msg);
  3423. }
  3424. int wakeup_fg_algo(int flow_state)
  3425. {
  3426. update_fg_dbg_tool_value();
  3427. if (gDisableFG) {
  3428. bm_notice("FG daemon is disabled\n");
  3429. return -1;
  3430. }
  3431. if (g_fgd_pid != 0) {
  3432. struct fgd_nl_msg_t *fgd_msg;
  3433. int size = FGD_NL_MSG_T_HDR_LEN + sizeof(flow_state);
  3434. fgd_msg = vmalloc(size);
  3435. if (!fgd_msg) {
  3436. /* bm_err("Error: wakeup_fg_algo() vmalloc fail!!!\n"); */
  3437. return -1;
  3438. }
  3439. bm_debug("[battery_meter_driver] malloc size=%d\n", size);
  3440. memset(fgd_msg, 0, size);
  3441. fgd_msg->fgd_cmd = FG_DAEMON_CMD_NOTIFY_DAEMON;
  3442. memcpy(fgd_msg->fgd_data, &flow_state, sizeof(flow_state));
  3443. fgd_msg->fgd_data_len += sizeof(flow_state);
  3444. nl_send_to_user(g_fgd_pid, 0, fgd_msg);
  3445. vfree(fgd_msg);
  3446. return 0;
  3447. } else {
  3448. return -1;
  3449. }
  3450. }
  3451. static int __init battery_meter_init(void)
  3452. {
  3453. int ret;
  3454. /* add by willcai for the userspace to kernelspace */
  3455. struct netlink_kernel_cfg cfg = {
  3456. .input = nl_data_handler,
  3457. };
  3458. /* end */
  3459. #ifdef CONFIG_OF
  3460. /* */
  3461. #else
  3462. ret = platform_device_register(&battery_meter_device);
  3463. if (ret) {
  3464. bm_err("[battery_meter_driver] Unable to device register(%d)\n", ret);
  3465. return ret;
  3466. }
  3467. #endif
  3468. ret = platform_driver_register(&battery_meter_driver);
  3469. if (ret) {
  3470. bm_err("[battery_meter_driver] Unable to register driver (%d)\n", ret);
  3471. return ret;
  3472. }
  3473. #ifdef CONFIG_OF
  3474. ret = platform_driver_register(&battery_meter_dts_driver);
  3475. #endif
  3476. /* add by willcai for the userspace to kernelspace */
  3477. /* daemo_nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, 0, nl_data_handler, NULL, THIS_MODULE); */
  3478. daemo_nl_sk = netlink_kernel_create(&init_net, NETLINK_FGD, &cfg);
  3479. bm_debug("netlink_kernel_create protol= %d\n", NETLINK_FGD);
  3480. if (daemo_nl_sk == NULL) {
  3481. bm_err("netlink_kernel_create error\n");
  3482. return -1;
  3483. }
  3484. bm_debug("netlink_kernel_create ok\n");
  3485. bm_debug("[battery_meter_driver] Initialization : DONE\n");
  3486. return 0;
  3487. }
  3488. #ifdef BATTERY_MODULE_INIT
  3489. device_initcall(battery_meter_init);
  3490. #else
  3491. static void __exit battery_meter_exit(void)
  3492. {
  3493. }
  3494. module_init(battery_meter_init);
  3495. /* module_exit(battery_meter_exit); */
  3496. #endif
  3497. MODULE_AUTHOR("James Lo");
  3498. MODULE_DESCRIPTION("Battery Meter Device Driver");
  3499. MODULE_LICENSE("GPL");