battery_meter_fg_20.c 126 KB

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