emigen.pl 111 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041
  1. #!/usr/local/bin/perl
  2. #
  3. #*****************************************************************************
  4. # Copyright Statement:
  5. # --------------------
  6. # This software is protected by Copyright and the information contained
  7. # herein is confidential. The software may not be copied and the information
  8. # contained herein may not be used or disclosed except with the written
  9. # permission of MediaTek Inc. (C) 2008
  10. #
  11. # BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  12. # THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  13. # RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  14. # AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  15. # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  16. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  17. # NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  18. # SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  19. # SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  20. # THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  21. # NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  22. # SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  23. #
  24. # BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  25. # LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  26. # AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  27. # OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  28. # MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  29. #
  30. # THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  31. # WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  32. # LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  33. # RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  34. # THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  35. #
  36. #****************************************************************************/
  37. #*
  38. #* Filename:
  39. #* ---------
  40. #* emigen_sp.pl
  41. #*
  42. #* Project:
  43. #* --------
  44. #*
  45. #*
  46. #* Description:
  47. #* ------------
  48. #* This script will
  49. #* 1. parse custom_MemoryDevice.h to get memory device type and part number
  50. #* 2. read a excel file to get appropriate emi setting based on the part number
  51. #* 3. based on the emi settings, generate custom_EMI.c if not exist
  52. #* 4. based on the emi settings, generate custom_EMI.h if not exist
  53. #*
  54. #* Author:
  55. #* -------
  56. #*
  57. #*============================================================================
  58. #* HISTORY
  59. #* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  60. #*------------------------------------------------------------------------------
  61. #* $Revision$
  62. #* $Modtime$
  63. #* $Log$
  64. #*
  65. #*
  66. #*------------------------------------------------------------------------------
  67. #* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  68. #*============================================================================
  69. #****************************************************************************/
  70. #****************************************************************************
  71. # Included Modules
  72. #****************************************************************************
  73. # original design, but perl does not support array of structure, really?
  74. #
  75. #my $CustomChip = () ;
  76. #
  77. #
  78. # an array of following structure:
  79. #
  80. # CustChip => NAND_ID
  81. # => CS0_PART_NUMBER
  82. # => CS1_PART_NUMBER
  83. #
  84. #
  85. #
  86. #
  87. #
  88. #
  89. use File::Basename;
  90. my $os = &OsName();
  91. my $build_opt = $ARGV[5];
  92. my $start_num;
  93. BEGIN
  94. {
  95. $LOCAL_PATH = dirname($0);
  96. }
  97. print "LOCAL_PATH: $LOCAL_PATH\n";
  98. #use lib "$LOCAL_PATH/../Spreadsheet";
  99. use lib "$LOCAL_PATH/../";
  100. #require 'ParseExcel.pm';
  101. use pack_dep_gen;
  102. if ($os eq "windows")
  103. {
  104. use strict;
  105. &gen_pm;
  106. require 'ForWindows.pm';
  107. $Win32::OLE::Warn = 3;
  108. $start_num = 1;
  109. }
  110. elsif ($os eq "linux")
  111. {
  112. print "Os = linux\n";
  113. use lib "$LOCAL_PATH/../Spreadsheet";
  114. require 'ParseExcel.pm';
  115. $start_num = 0;
  116. }
  117. else
  118. {
  119. die "unknow OS!\n";
  120. }
  121. #****************************************************************************
  122. # PLATFORM EMI support matrix
  123. #****************************************************************************
  124. my %BBtbl_LPSDRAM =
  125. (
  126. 'MT6763' => 1,
  127. );
  128. #****************************************************************************
  129. # Constants
  130. #****************************************************************************
  131. my $EMIGEN_VERNO = " V0.01";
  132. # V0.01, Zhen Jiang, Porting emigen to DUMA project
  133. #
  134. my $DebugPrint = 1; # 1 for debug; 0 for non-debug
  135. my $COLUMN_VENDOR = $start_num + 0;
  136. my $COLUMN_PART_NUMBER = $COLUMN_VENDOR + 1 ;
  137. my $COLUMN_TYPE = $COLUMN_PART_NUMBER + 1 ;
  138. my $COLUMN_MODE = $COLUMN_TYPE + 1 ;
  139. my $COLUMN_DENSITY = $COLUMN_MODE + 1 ;
  140. my $COLUMN_BOARD_ID = $COLUMN_DENSITY + 1 ;
  141. my $COLUMN_NAND_EMMC_ID = $COLUMN_BOARD_ID + 1 ;
  142. my $COLUMN_FW_ID = $COLUMN_NAND_EMMC_ID + 1 ;
  143. my $COLUMN_NAND_PAGE_SIZE = $COLUMN_FW_ID + 1 ;
  144. my $COLUMN_PLATFORM = $COLUMN_NAND_PAGE_SIZE + 1 ;
  145. my $CUSTOM_MEMORY_DEVICE_HDR = $ARGV[0]; # src\custom\<project>, need full path for now
  146. #my $MEMORY_DEVICE_LIST_XLS = Win32::GetCwd()."\\memorydevicelist\\".$ARGV[1];
  147. my $MEMORY_DEVICE_LIST_XLS = $ARGV[1];
  148. my $PLATFORM = $ARGV[2]; # MTxxxx
  149. my $PROJECT = $ARGV[3];
  150. my $MTK_EMIGEN_OUT_DIR = $ARGV[4];
  151. #my $MTK_MACH_TYPE = $ARGV[6]; # Darren
  152. #my $MTK_EMIGEN_OUT_DIR = "$ENV{PRODUCT_OUT}/EMIGEN";
  153. print "$CUSTOM_MEMORY_DEVICE_HDR\n$MEMORY_DEVICE_LIST_XLS\n$PLATFORM\n" if ($DebugPrint == 1);
  154. print "$MTK_EMIGEN_OUT_DIR\n" if ($DebugPrint == 1);
  155. # following parameters come from $CUSTOM_MEMORY_DEVICE_HDR
  156. my $MEMORY_DEVICE_TYPE;
  157. # data structure of $part_number if ($MEMORY_DEVICE_TYPE eq 'LPSDRAM')
  158. #
  159. # my $part_info =
  160. # {
  161. # CS => { "0" => { PART_NUMBER => $part_number,
  162. # EXCEL_ROW => $excel_row,
  163. # VENDOR => $vendor,
  164. my $part_info = (); # has different data structures for different $MEMORY_DEVICE_TYPE
  165. my $bank_num = 0; # 0: No memory is attached
  166. # 1: 1 is attached
  167. # 2: 2 are attached
  168. # locations of output EMI settings
  169. # src\custom\<project>\DRV\bootloader\EMI
  170. my $CUSTOM_EMI_H = $CUSTOM_MEMORY_DEVICE_HDR;
  171. #my $CUSTOM_EMI_C = $CUSTOM_MEMORY_DEVICE_HDR;
  172. my $INFO_TAG = $CUSTOM_MEMORY_DEVICE_HDR;
  173. if ($os eq "windows")
  174. {
  175. $CUSTOM_EMI_H = "$MTK_EMIGEN_OUT_DIR/custom_emi.h";
  176. # $CUSTOM_EMI_C = "$MTK_EMIGEN_OUT_DIR/custom_emi.c";
  177. `mkdir output` unless (-d "output");
  178. }
  179. elsif ($os eq "linux")
  180. {
  181. $CUSTOM_EMI_H = "$MTK_EMIGEN_OUT_DIR/custom_emi.h";
  182. # $CUSTOM_EMI_C = "$MTK_EMIGEN_OUT_DIR/custom_emi.c";
  183. $INFO_TAG = "$MTK_EMIGEN_OUT_DIR/MTK_Loader_Info.tag";
  184. }
  185. # Pregen: after we load all perl module, it need to print all depend module
  186. PrintDependModule($0);
  187. print "$CUSTOM_EMI_H\n$INFO_TAG\n" if ($DebugPrint ==1);
  188. # check existance of custom_EMI.h and custom_EMI.c
  189. my $is_existed_h = (-e $CUSTOM_EMI_H)? 1 : 0;
  190. #my $is_existed_c = (-e $CUSTOM_EMI_C)? 1 : 0;
  191. #
  192. #if ( ($is_existed_h == 1) && ($is_existed_c == 1) )
  193. #{
  194. # print "\n\nALL custom_EMI\.h, custom_EMI\.c are existed!!!\n\n\n";
  195. # exit;
  196. #}
  197. #****************************************************************************
  198. # parse custom_MemoryDevice.h to extract MEMORY_DEVICE_TYPE & PART_NUMBER
  199. #****************************************************************************
  200. open CUSTOM_MEMORY_DEVICE_HDR, "<$CUSTOM_MEMORY_DEVICE_HDR" or &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: file error!", __FILE__, __LINE__);
  201. #Pregen: print file name after we open a file which will be read
  202. PrintDependency($CUSTOM_MEMORY_DEVICE_HDR);
  203. # CustCS_CustemChips:
  204. # the number of part number which customer assigned
  205. # in mediatek/custom/$project/preloader/inc/custom_MemoryDevice.h
  206. # TotalCustemChips:
  207. # because one part number may match multiple emmc/nand ID, the TotalCustemChips >= CustCS_CustemChips
  208. # the final number of part number which will use to create emi_setting
  209. # in mediatek/custom/$project/preloader/inc/custom_emi.h
  210. #
  211. my $CustCS_CustemChips = 0 ;
  212. my $TotalCustemChips = 0 ;
  213. #
  214. # arrays
  215. #
  216. # this should be an array of structurs, but it is said perl does not support it.
  217. # these are input, except EMI_GEND
  218. #
  219. # CustCS_PART_NUMBER:
  220. # the content of part number which customer assigned
  221. # in mediatek/custom/$project/preloader/inc/custom_MemoryDevice.h
  222. # Total_PART_NUMBER:
  223. # the final part number which will show
  224. # in mediatek/custom/$project/preloader/inc/custom_emi.h
  225. my $CustCS_PART_NUMBER ;
  226. my $Total_PART_NUMBER ;
  227. ######################################################################################
  228. my $DEV_TYPE;
  229. my $DEV_TYPE1;
  230. my $DEV_TYPE2;
  231. my $DEV_MODE;
  232. my $NAND_EMMC_ID;
  233. my $FW_ID ;
  234. my $ID_String ;
  235. my $FW_ID_String ;
  236. my $Sub_version;
  237. my $USE_EMMC_ID_LEN=9;
  238. my $MAX_NAND_EMMC_ID_LEN=16;
  239. my $MAX_FW_ID_LEN=8;
  240. my $fw_id_len;
  241. my $NAND_PAGE_SIZE;
  242. my $MODE_EXTERN_VAL;
  243. my $DIS_CBT_MODE_EXTERN_TYPE;
  244. my $EMI_CONA_VAL;
  245. my $CHN0_EMI_CONA_VAL;
  246. my $CHN1_EMI_CONA_VAL;
  247. my $EMI_CONF_VAL;
  248. my $EMI_CONH_VAL;
  249. #my $AC_TIME_EMI_DUMMY_01;
  250. my $AC_TIME_EMI_FREQUENCY;
  251. my $AC_TIME_EMI_TRAS;
  252. my $AC_TIME_EMI_TRP;
  253. my $AC_TIME_EMI_TRPAB;
  254. my $AC_TIME_EMI_TRC;
  255. my $AC_TIME_EMI_TRFC;
  256. my $AC_TIME_EMI_TRFCPB;
  257. my $AC_TIME_EMI_TXP;
  258. my $AC_TIME_EMI_TRTP;
  259. my $AC_TIME_EMI_TRCD;
  260. my $AC_TIME_EMI_TWR;
  261. my $AC_TIME_EMI_TWTR;
  262. my $AC_TIME_EMI_TRRD;
  263. my $AC_TIME_EMI_TFAW;
  264. my $AC_TIME_EMI_TRTW_ODT_OFF;
  265. my $AC_TIME_EMI_TRTW_ODT_ON;
  266. my $AC_TIME_EMI_REFCNT;
  267. my $AC_TIME_EMI_REFCNT_FR_CLK;
  268. my $AC_TIME_EMI_TXREFCNT;
  269. my $AC_TIME_EMI_TZQCS;
  270. my $AC_TIME_EMI_TRTPD;
  271. my $AC_TIME_EMI_TWTPD;
  272. my $AC_TIME_EMI_TMRR2W_ODT_OFF;
  273. my $AC_TIME_EMI_TMRR2W_ODT_ON;
  274. my $AC_TIME_EMI_TRAS_05T;
  275. my $AC_TIME_EMI_TRP_05T;
  276. my $AC_TIME_EMI_TRPAB_05T;
  277. my $AC_TIME_EMI_TRC_05T;
  278. my $AC_TIME_EMI_TRFC_05T;
  279. my $AC_TIME_EMI_TRFCPB_05T;
  280. my $AC_TIME_EMI_TXP_05T;
  281. my $AC_TIME_EMI_TRTP_05T;
  282. my $AC_TIME_EMI_TRCD_05T;
  283. my $AC_TIME_EMI_TWR_05T;
  284. my $AC_TIME_EMI_TWTR_05T;
  285. my $AC_TIME_EMI_TRRD_05T;
  286. my $AC_TIME_EMI_TFAW_05T;
  287. my $AC_TIME_EMI_TRTW_ODT_OFF_05T;
  288. my $AC_TIME_EMI_TRTW_ODT_ON_05T;
  289. my $AC_TIME_EMI_REFCNT_05T;
  290. my $AC_TIME_EMI_REFCNT_FR_CLK_05T;
  291. my $AC_TIME_EMI_TXREFCNT_05T;
  292. my $AC_TIME_EMI_TZQCS_05T;
  293. my $AC_TIME_EMI_TRTPD_05T;
  294. my $AC_TIME_EMI_TWTPD_05T;
  295. my $AC_TIME_EMI_TMRR2W_ODT_OFF_05T;
  296. my $AC_TIME_EMI_TMRR2W_ODT_ON_05T;
  297. #my $AC_TIME_EMI_XRTW2W;
  298. #my $AC_TIME_EMI_XRTW2R;
  299. #my $AC_TIME_EMI_XRTR2W;
  300. #my $AC_TIME_EMI_XRTR2R;
  301. #my $AC_TIME_EMI_DUMMY_02;
  302. #my $AC_TIME_EMI_WRITE_LATENCY_0x41c;
  303. #my $AC_TIME_EMI_WRITE_LATENCY_0x420;
  304. #my $AC_TIME_EMI_WRITE_LATENCY_0x424;
  305. #my $AC_TIME_EMI_WRITE_LATENCY_0x428;
  306. #my $AC_TIME_EMI_WRITE_LATENCY_0x42c;
  307. #my $AC_TIME_EMI_DQSINCTL_FOR_GATING;
  308. #my $AC_TIME_EMI_DATLAT;
  309. #my $AC_TIME_EMI_MODE_REG_WL;
  310. #my $AC_TIME_EMI_MODE_REG_RL;
  311. my $AC_TIME_VALUE;
  312. my $DRAM_RANK0_SIZE;
  313. my $DRAM_RANK1_SIZE;
  314. my $Discrete_DDR = 0;
  315. my $MCP_LPDDR2 = 0;
  316. my $MCP_LPDDR3 = 0;
  317. my $MCP_LPDDR4 = 0;
  318. my $MCP_LPDDR4X = 0;
  319. my $MCP_LPDDR4P = 0;
  320. my $MCP_PCDDR3 = 0;
  321. my $DIS_LPDDR2 = 0;
  322. my $DIS_LPDDR3 = 0;
  323. my $DIS_LPDDR4 = 0;
  324. my $DIS_LPDDR4X = 0;
  325. my $DIS_LPDDR4P = 0;
  326. my $DIS_PCDDR3 = 0;
  327. my $DDR1_2_3 ;
  328. #discrete dram
  329. my $DIS_TYPE;
  330. my $DIS_CONA;
  331. my $DIS_CONH;
  332. my $DIS_AC_U00;
  333. my $DIS_AC_U01;
  334. my $DIS_AC_U02;
  335. my $DIS_AC_U03;
  336. my $DIS_AC_U04;
  337. my $DIS_AC_U05;
  338. my $DIS_AC_U06;
  339. my $DIS_AC_U07;
  340. my $DIS_CONF;
  341. my $DIS_CH0_CONA;
  342. my $DIS_CH1_CONA;
  343. my $DIS_CBT_MODE_EXTERN;
  344. #union
  345. #1
  346. #my $LPDDR2_MODE_REG1;
  347. #my $LPDDR2_MODE_REG2;
  348. #my $LPDDR2_MODE_REG3;
  349. #my $LPDDR2_MODE_REG5;
  350. #my $LPDDR2_MODE_REG10;
  351. #my $LPDDR2_MODE_REG63;
  352. #2
  353. #my $DDR1_MODE_REG;
  354. #my $DDR1_EXT_MODE_REG;
  355. #3
  356. #my $PCDDR3_MODE_REG0;
  357. #my $PCDDR3_MODE_REG1;
  358. #my $PCDDR3_MODE_REG2;
  359. #my $PCDDR3_MODE_REG3;
  360. #my $PCDDR3_MODE_REG4;
  361. #my $PCDDR3_MODE_REG5;
  362. #4
  363. #my $LPDDR3_MODE_REG1;
  364. #my $LPDDR3_MODE_REG2;
  365. #my $LPDDR3_MODE_REG3;
  366. my $LPDDR3_MODE_REG5;
  367. my $LPDDR4_MODE_REG5;
  368. my $LPDDR4X_MODE_REG5;
  369. my $LPDDR4P_MODE_REG5;
  370. #my $LPDDR3_MODE_REG10;
  371. #my $LPDDR3_MODE_REG63;
  372. my $HAVE_HW_TRAPPING = 1;
  373. my $PIN_MUX_TYPE;
  374. my $EMI_SETTINGS ;
  375. #
  376. # all above are arrays, each represents an user defined chip.
  377. #
  378. # this is the ID of the custom board.
  379. my $CustBoard_ID ;
  380. while (<CUSTOM_MEMORY_DEVICE_HDR>)
  381. {
  382. # matching the following lines
  383. # "#define MEMORY_DEVICE_TYPE LPSDRAM"
  384. # "#define CS0_PART_NUMBER EDK1432CABH60"
  385. # error-checking
  386. if (/^#if|^#ifdef|^#ifndef|^#elif|^#else/)
  387. {
  388. &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: Not allowed to set conditional keywords $_ in custom_MemoryDevice.h!", __FILE__, __LINE__)
  389. unless (/^#ifndef\s+__CUSTOM_MEMORYDEVICE__/);
  390. }
  391. if (/^#define\s+(\w+)\[(\d+)\]\s+\(([-\w]*)\)/ || /^#define\s+(\w+)\[(\d+)\]\s+([-\w]*)/ ||
  392. /^#define\s+(MEMORY_DEVICE_TYPE)\s+\((\w*)\)/ || /^#define\s+(MEMORY_DEVICE_TYPE)\s+(\w*)/ ||
  393. /^#define\s+(BOARD_ID)\s+\((\w*)\)/ || /^#define\s+(BOARD_ID)\s+(\w*)/)
  394. {
  395. if ($1 eq "BOARD_ID")
  396. {
  397. $CustBoard_ID = $2 ;
  398. }
  399. elsif ($1 eq "CS_PART_NUMBER")
  400. {
  401. print "\nCS0 $2, $3\n" ;
  402. $CustCS_PART_NUMBER[$2] = $3 ;
  403. $CustCS_CustemChips = $CustCS_CustemChips + 1 ;
  404. print "$CustCS_PART_NUMBER[$2]\n"
  405. }
  406. }
  407. }
  408. print "\n$CustCS_CustemChips\n" if ($DebugPrint ==1);
  409. close CUSTOM_MEMORY_DEVICE_HDR;
  410. #
  411. #
  412. # we now read in all the needed infomation form custom defination file,
  413. # so close it.
  414. #
  415. #
  416. #
  417. # check if data validate.
  418. #
  419. if ($CustCS_CustemChips > 10)
  420. {
  421. die "\n[Error]CustCS_CustemChips($CustCS_CustemChips) > 10\n" ;
  422. }
  423. if ($CustCS_CustemChips == 0)
  424. {
  425. die "\n[Error]CustCS_CustemChips($CustCS_CustemChips) = 0?\n" ;
  426. }
  427. #****************************************************************************
  428. # read a excel file to get emi settings
  429. #****************************************************************************
  430. # get already active Excel application or open new
  431. if ($os eq "windows")
  432. {
  433. $Excel = Win32::OLE->GetActiveObject('Excel.Application')
  434. || Win32::OLE->new('Excel.Application', 'Quit');
  435. # copy the Excel file to a temp file and open it;
  436. # this will prevent error due to simultaneous Excel access
  437. $Book = $Excel->Workbooks->Open($MEMORY_DEVICE_LIST_XLS);
  438. }
  439. else
  440. {
  441. my $parser = Spreadsheet::ParseExcel->new();
  442. $Book = $parser->Parse($MEMORY_DEVICE_LIST_XLS);
  443. }
  444. #Pregen: print file name after we open a file which will be read
  445. PrintDependency($MEMORY_DEVICE_LIST_XLS);
  446. # select worksheet
  447. my $Sheet;
  448. my $eos_flag = 5; # if this flag counts to '0', it means End Of Sheet
  449. my $iter = 0 ;
  450. my $CustCS_part_number_iter = 0;
  451. my $total_part_number_iter = 0;
  452. while ($iter<$CustCS_CustemChips)
  453. {
  454. $eos_flag = 5;
  455. $total_part_number_iter = &DeviceListParser_LPSDRAM($iter,$total_part_number_iter);
  456. $iter = $iter + 1 ;
  457. }
  458. # if the value read from excel validate
  459. $iter = 0 ;
  460. my $Page_size = "0" ;
  461. print "TotalCustemChips:$TotalCustemChips\n";
  462. while ($iter < $TotalCustemChips)
  463. {
  464. # only one Discrete is allowed
  465. if ($DEV_TYPE1[$iter] eq "00" || $DEV_TYPE1[$iter] eq "0F")
  466. {
  467. # if all discrete dram are LPDDR2, LPDDR3, LPDDR4, LPDDR4X and LPDDR4P, it is allowed
  468. if ($DEV_TYPE2[$iter] eq "02" || $DEV_TYPE2[$iter] eq "03" || $DEV_TYPE2[$iter] eq "05" || $DEV_TYPE2[$iter] eq "06" || $DEV_TYPE2[$iter] eq "07")
  469. {
  470. my $iter_dis_dram;
  471. $iter_dis_dram = 0;
  472. while ($iter_dis_dram < $TotalCustemChips)
  473. {
  474. if ($iter_dis_dram == $iter || !($DEV_TYPE1[$iter_dis_dram] eq "00" || $DEV_TYPE1[$iter_dis_dram] eq "0F"))
  475. {
  476. $iter_dis_dram++;
  477. next;
  478. }
  479. {
  480. #comment to avoid build error for the same vendor ID
  481. #=head
  482. if ($DEV_TYPE2[$iter] eq "02")
  483. {
  484. # check the MODE_REG5(DRAM vendor_ID) are unique
  485. # if have same MODE5 in the list, send the build error
  486. if ( $LPDDR2_MODE_REG5[$iter] eq $LPDDR2_MODE_REG5[$iter_dis_dram])
  487. {
  488. print "[Error] MODE_REG5(DRAM vendor_ID) should not be the same in the Combo list, MODE_REG5($Total_PART_NUMBER[$iter])==MODE_REG6($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  489. die "[Error] MODE_REG5(DRAM vendor_ID) should not be the same in the Combo list, MODE_REG5($Total_PART_NUMBER[$iter])==MODE_REG5($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  490. }
  491. }
  492. elsif ($DEV_TYPE2[$iter] eq "03")
  493. {
  494. # check the MODE_REG5(DRAM vendor_ID) are unique
  495. # if have same MODE5 in the list, send the build error
  496. if ( $LPDDR3_MODE_REG5[$iter] eq $LPDDR3_MODE_REG5[$iter_dis_dram])
  497. {
  498. if ((($DRAM_RANK0_SIZE[$iter] eq $DRAM_RANK0_SIZE[$iter_dis_dram]) && ($DRAM_RANK1_SIZE[$iter] eq $DRAM_RANK1_SIZE[$iter_dis_dram])))
  499. #if ( $LPDDR3_MODE_REG5[$iter] eq $LPDDR3_MODE_REG5[$iter_dis_dram])
  500. {
  501. die "[Error] LPDDR3 DRAM_RANKx_SIZE should not be the same in the Combo list, DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter])==DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  502. }
  503. }
  504. }
  505. elsif (($DEV_TYPE2[$iter] eq "05"))
  506. {
  507. # check the MODE_REG5(DRAM vendor_ID) are unique
  508. # if have same MODE5 in the list, send the build error
  509. #if ( $LPDDR4_MODE_REG5[$iter] eq $LPDDR4_MODE_REG5[$iter_dis_dram])
  510. if ( $LPDDR4_MODE_REG5[$iter] eq $LPDDR4_MODE_REG5[$iter_dis_dram])
  511. {
  512. if ((($DRAM_RANK0_SIZE[$iter] eq $DRAM_RANK0_SIZE[$iter_dis_dram]) && ($DRAM_RANK1_SIZE[$iter] eq $DRAM_RANK1_SIZE[$iter_dis_dram])))
  513. {
  514. #die "[Error] MODE_REG5(DRAM vendor_ID) should not be the same in the Combo list, MODE_REG5($Total_PART_NUMBER[$iter])==MODE_REG5($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  515. die "[Error] LPDDR4 DRAM_RANKx_SIZE should not be the same in the Combo list, DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter])==DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  516. }
  517. }
  518. }
  519. elsif ($DEV_TYPE2[$iter] eq "06")
  520. {
  521. # check the MODE_REG5(DRAM vendor_ID) are unique
  522. # if have same MODE5 in the list, send the build error
  523. if ( $LPDDR4X_MODE_REG5[$iter] eq $LPDDR4X_MODE_REG5[$iter_dis_dram])
  524. {
  525. if ((($DRAM_RANK0_SIZE[$iter] eq $DRAM_RANK0_SIZE[$iter_dis_dram]) && ($DRAM_RANK1_SIZE[$iter] eq $DRAM_RANK1_SIZE[$iter_dis_dram])))
  526. {
  527. #die "[Error] MODE_REG5(DRAM vendor_ID) should not be the same in the Combo list, MODE_REG5($Total_PART_NUMBER[$iter])==MODE_REG5($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  528. die "[Error] LPDDR4X DRAM_RANKx_SIZE should not be the same in the Combo list, DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter])==DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  529. }
  530. }
  531. }
  532. elsif ($DEV_TYPE2[$iter] eq "07")
  533. {
  534. # check the MODE_REG5(DRAM vendor_ID) are unique
  535. # if have same MODE5 in the list, send the build error
  536. if ( $LPDDR4P_MODE_REG5[$iter] eq $LPDDR4P_MODE_REG5[$iter_dis_dram])
  537. {
  538. if ((($DRAM_RANK0_SIZE[$iter] eq $DRAM_RANK0_SIZE[$iter_dis_dram]) && ($DRAM_RANK1_SIZE[$iter] eq $DRAM_RANK1_SIZE[$iter_dis_dram])))
  539. {
  540. #die "[Error] MODE_REG5(DRAM vendor_ID) should not be the same in the Combo list, MODE_REG5($Total_PART_NUMBER[$iter])==MODE_REG5($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  541. die "[Error] LPDDR4P DRAM_RANKx_SIZE should not be the same in the Combo list, DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter])==DRAM_RANKx_SIZE($Total_PART_NUMBER[$iter_dis_dram])\n" ;
  542. }
  543. }
  544. }
  545. #=cut
  546. }
  547. $iter_dis_dram++;
  548. }
  549. $Discrete_DDR = $Discrete_DDR + 1 ;
  550. }
  551. else{
  552. # DDR1,DDR3 only support one discrete DRAM in the Combo List
  553. # if more then one discrete DRAM in the list, send build error
  554. if ($Discrete_DDR == 0)
  555. {
  556. $Discrete_DDR = $Discrete_DDR + 1 ;
  557. if ($TotalCustemChips > 1)
  558. {
  559. print "[Error]At most one discrete PCDDR3 DRAM is allowed in the Combo MCP list\n" ;
  560. die "[Error]Combo discrete DRAM only support LPDDR2, LPDDR3, LPDDR4, LPDDR4X and LPDDR4P\n" ;
  561. }
  562. }
  563. else
  564. {
  565. die "[Error]more than 1 Discrete DDR used!\n" ;
  566. }
  567. }
  568. }
  569. else{
  570. }
  571. # NAND can't use different page size.
  572. if ($DEV_TYPE1[$iter] == "01")
  573. {
  574. if ($Page_size == "0")
  575. {
  576. $Page_size = $NAND_PAGE_SIZE[$iter] ;
  577. }
  578. else
  579. {
  580. if ($Page_size != $NAND_PAGE_SIZE[$iter])
  581. {
  582. die "[Error]different MCP page size!$Page_size, $NAND_PAGE_SIZE[$iter]\n" ;
  583. }
  584. }
  585. }
  586. # Nand or eMMC's + FW ID must unique
  587. my $iter2 ;
  588. $iter2 = $iter + 1 ;
  589. while ($iter2 < $TotalCustemChips)
  590. {
  591. if ($DEV_TYPE1[$iter] != "00")
  592. {
  593. if ($NAND_EMMC_ID[$iter] eq $NAND_EMMC_ID[$iter2])
  594. {
  595. if ( $Total_PART_NUMBER[$iter] ne $Total_PART_NUMBER[$iter2] )
  596. {
  597. die "[Error]Different part number:$Total_PART_NUMBER[$iter],$Total_PART_NUMBER[$iter2] with same NAND/eMMC ID:$NAND_EMMC_ID[$iter]"
  598. }
  599. else
  600. { #$Total_PART_NUMBER[$iter] eq $Total_PART_NUMBER[$iter2] and $NAND_EMMC_ID[$iter] eq $NAND_EMMC_ID[$iter2] and $FW_ID[$iter] eq $FW_ID[$iter2]
  601. if ($FW_ID[$iter] eq $FW_ID[$iter2])
  602. {
  603. die "[Error]Two same part number:$Total_PART_NUMBER[$iter],$Total_PART_NUMBER[$iter2] with same NAND/eMMC ID:$NAND_EMMC_ID[$iter] and same FW ID:$FW_ID[$iter]"
  604. }
  605. }
  606. }
  607. }
  608. $iter2 = $iter2 + 1 ;
  609. }
  610. $iter = $iter + 1 ;
  611. }
  612. if ($HAVE_HW_TRAPPING == 0 && $DIS_LPDDR2 > 0 && (($DIS_LPDDR3 > 0) || ($MCP_LPDDR3 > 0) || ($DIS_PCDDR3 > 0)))
  613. {
  614. die "[Error] LPDDR2 and LPDDR3 are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  615. }
  616. if ($HAVE_HW_TRAPPING == 0 && $DIS_LPDDR3 > 0 && (($DIS_LPDDR2 > 0) || ($MCP_LPDDR2 > 0) || ($DIS_PCDDR3 > 0) || ($MCP_LPDDR4X > 0) || ($DIS_LPDDR4X > 0) || ($MCP_LPDDR4 > 0) || ($DIS_LPDDR4 > 0)))
  617. {
  618. die "[Error] LPDDR2 and LPDDR3 are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  619. }
  620. if ($HAVE_HW_TRAPPING == 0 && $DIS_LPDDR4 > 0 && (($DIS_LPDDR2 > 0) || ($DIS_LPDDR3 > 0) || ($MCP_LPDDR2 > 0) || ($MCP_LPDDR3 > 0) || ($DIS_PCDDR3 > 0)))
  621. {
  622. die "[Error] LPDDR2, LPDDR3 and LPDDR4/4X are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  623. }
  624. if ($HAVE_HW_TRAPPING == 0 && $DIS_LPDDR4X > 0 && (($DIS_LPDDR2 > 0) || ($DIS_LPDDR3 > 0) || ($MCP_LPDDR2 > 0) || ($MCP_LPDDR3 > 0) || ($DIS_PCDDR3 > 0)))
  625. {
  626. die "[Error] LPDDR2, LPDDR3 and LPDDR4/4X are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  627. }
  628. if ($HAVE_HW_TRAPPING == 0 && $DIS_LPDDR4P > 0 && (($DIS_LPDDR2 > 0) || ($DIS_LPDDR3 > 0) || ($MCP_LPDDR2 > 0) || ($MCP_LPDDR3 > 0) || ($DIS_PCDDR3 > 0)))
  629. {
  630. die "[Error] LPDDR2, LPDDR3 and LPDDR4/4X/4P are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  631. }
  632. if ($DIS_PCDDR3 > 1)
  633. {
  634. die "[Error] PCDDR3 not support Combo Discrete DRAM feature.\n" ;
  635. }
  636. if (($DIS_PCDDR3 == 1) && ($CustCS_CustemChips>1) )
  637. {
  638. die "[Error] PCDDR3 not support Combo Discrete DRAM feature.\n" ;
  639. }
  640. # close the temp Excel file
  641. if ($os eq "windows")
  642. {
  643. $Book->Close(1);
  644. }
  645. #&error_handler("$CUSTOM_MEMORY_DEVICE_HDR: Incorrect memory device type!", __FILE__, __LINE__) unless $MEMORY_DEVICE_TYPE;
  646. #&error_handler("$CUSTOM_MEMORY_DEVICE_HDR: part number not supported!", __FILE__, __LINE__) if ($is_part_found <= 0);
  647. #&error_handler("$CUSTOM_MEMORY_DEVICE_HDR: Device not allowed to set NOR_RAM_MCP type!", __FILE__, __LINE__) if (($MEMORY_DEVICE_TYPE eq 'NOR_RAM_MCP') && ($part_info->{CS}->{1}->{DRAM} eq 'YES'));
  648. #&error_handler("$CUSTOM_MEMORY_DEVICE_HDR: Device not allowed to set NOR_LPSDRAM_MCP type!", __FILE__, __LINE__) if (($MEMORY_DEVICE_TYPE eq 'NOR_LPSDRAM_MCP') && ($part_info->{CS}->{1}->{DRAM} eq 'NO'));
  649. #****************************************************************************
  650. # generate custom_EMI.c
  651. #****************************************************************************
  652. #if ($is_existed_c == 0)
  653. #{
  654. # if ($is_existed_c == 1)
  655. # {
  656. # unlink ($CUSTOM_EMI_C);
  657. # }
  658. # my $temp_path = `dirname $CUSTOM_EMI_C`;
  659. # `mkdir -p $temp_path`;
  660. # open (CUSTOM_EMI_C, ">$CUSTOM_EMI_C") or &error_handler("$CUSTOM_EMI_C: file error!", __FILE__, __LINE__);
  661. # print CUSTOM_EMI_C &copyright_file_header();
  662. # print CUSTOM_EMI_C &description_file_header( "custom_emi.c",
  663. # "This Module defines the EMI (external memory interface) related setting.",
  664. # "EMI auto generator". $EMIGEN_VERNO);
  665. # print CUSTOM_EMI_C &custom_EMI_c_file_body();
  666. # close CUSTOM_EMI_C or &error_handler("$CUSTOM_EMI_C: file error!", __FILE__, __LINE__);
  667. # print "\n$CUSTOM_EMI_C is generated\n";
  668. #} # if ($is_existed_c == 0)
  669. #****************************************************************************
  670. # generate custom_emi.h
  671. #****************************************************************************
  672. if ($build_opt == 0)
  673. {
  674. if ($is_existed_h == 1)
  675. {
  676. unlink ($CUSTOM_EMI_H);
  677. }
  678. my $temp_path = `dirname $CUSTOM_EMI_H`;
  679. `mkdir -p $temp_path`;
  680. open (CUSTOM_EMI_H, ">$CUSTOM_EMI_H") or &error_handler("CUSTOM_EMI_H: file error!", __FILE__, __LINE__);
  681. print CUSTOM_EMI_H &copyright_file_header();
  682. print CUSTOM_EMI_H &description_file_header( "custom_emi.h",
  683. "This Module defines the EMI (external memory interface) related setting.",
  684. "EMI auto generator". $EMIGEN_VERNO);
  685. print CUSTOM_EMI_H &custom_EMI_h_file_body();
  686. close CUSTOM_EMI_H or &error_handler("$CUSTOM_EMI_H: file error!", __FILE__, __LINE__);
  687. print "\n$CUSTOM_EMI_H is generated\n";
  688. } # if ($build_opt == 0)
  689. if ($build_opt == 1) # Build Preloader TAG!
  690. {
  691. &write_tag($PROJECT);
  692. }
  693. exit;
  694. #****************************************************************************
  695. # subroutine: trim
  696. # input: $string: trim string
  697. #****************************************************************************
  698. sub trim($)
  699. {
  700. my $string = shift;
  701. $string =~ s/^\s+//;
  702. $string =~ s/\s+$//;
  703. return $string;
  704. }
  705. #****************************************************************************
  706. # subroutine: error_handler
  707. # input: $error_msg: error message
  708. #****************************************************************************
  709. sub error_handler
  710. {
  711. my ($error_msg, $file, $line_no) = @_;
  712. my $final_error_msg = "[Error]EMIGEN ERROR: $error_msg at $file line $line_no\n";
  713. print $final_error_msg;
  714. die $final_error_msg;
  715. }
  716. #****************************************************************************
  717. # subroutine: copyright_file_header
  718. # return: file header -- copyright
  719. #****************************************************************************
  720. sub copyright_file_header
  721. {
  722. my $template = <<"__TEMPLATE";
  723. /*****************************************************************************
  724. * Copyright Statement:
  725. * --------------------
  726. * This software is protected by Copyright and the information contained
  727. * herein is confidential. The software may not be copied and the information
  728. * contained herein may not be used or disclosed except with the written
  729. * permission of MediaTek Inc. (C) 2008
  730. *
  731. * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  732. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  733. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  734. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  735. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  736. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  737. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  738. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  739. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  740. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  741. * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  742. * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  743. *
  744. * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  745. * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  746. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  747. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  748. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  749. *
  750. * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  751. * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  752. * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  753. * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  754. * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  755. *
  756. *****************************************************************************/
  757. __TEMPLATE
  758. return $template;
  759. }
  760. #****************************************************************************
  761. # subroutine: description_file_header
  762. # return: file header -- description
  763. # input: $filename: filename
  764. # input: $description: one line description
  765. # input: $author: optional
  766. #****************************************************************************
  767. sub description_file_header
  768. {
  769. my ($filename, $description, $author) = @_;
  770. my @stat_ar = stat $MEMORY_DEVICE_LIST_XLS;
  771. my ($day, $month, $year) = (localtime($stat_ar[9]))[3,4,5]; $month++; $year+=1900;
  772. my $template = <<"__TEMPLATE";
  773. /*****************************************************************************
  774. *
  775. * Filename:
  776. * ---------
  777. * $filename
  778. *
  779. * Project:
  780. * --------
  781. * Android
  782. *
  783. * Description:
  784. * ------------
  785. * $description
  786. *
  787. * Author:
  788. * -------
  789. * $author
  790. *
  791. * Memory Device database last modified on $year/$month/$day
  792. *
  793. *============================================================================
  794. * HISTORY
  795. * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  796. *------------------------------------------------------------------------------
  797. * \$Revision\$
  798. * \$Modtime\$
  799. * \$Log\$
  800. *
  801. *------------------------------------------------------------------------------
  802. * WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!!
  803. * This file is generated by EMI Auto-gen Tool.
  804. * Please do not modify the content directly!
  805. * It could be overwritten!
  806. *============================================================================
  807. * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  808. *============================================================================
  809. ****************************************************************************/
  810. __TEMPLATE
  811. return $template;
  812. }
  813. #****************************************************************************
  814. # subroutine: HeaderBody_for_lpsdram
  815. # return: content for custom_EMI.h
  816. #****************************************************************************
  817. #sub custom_EMI_h_file_body
  818. #{
  819. ###
  820. # my $template = <<"__TEMPLATE";
  821. #ifndef __CUSTOM_EMI__
  822. #define __CUSTOM_EMI__
  823. #define COMBO_LPDDR2 ($MCP_LPDDR2+$DIS_LPDDR2)
  824. #define COMBO_LPDDR3 ($MCP_LPDDR3+$DIS_LPDDR3)
  825. #define COMBO_LPDDR4 ($MCP_LPDDR4+$DIS_LPDDR4)
  826. #define COMBO_LPDR4X ($MCP_LPDDR4X+$DIS_LPDDR4X)
  827. #define COMBO_LPDR4P ($MCP_LPDDR4P+$DIS_LPDDR4P)
  828. #define COMBO_PCDDR3 ($MCP_PCDDR3+$DIS_PCDDR3)
  829. #endif /* __CUSTOM_EMI__ */
  830. #__TEMPLATE
  831. # return $template;
  832. #}
  833. #****************************************************************************
  834. # subroutine: custom_EMI_h_file_body
  835. # return:
  836. #****************************************************************************
  837. sub custom_EMI_h_file_body
  838. {
  839. ###
  840. my $EMI_SETTINGS_string = "" ;
  841. my $ddr = -1 ;
  842. $iter = 0 ;
  843. for $iter (0..$TotalCustemChips-1)
  844. {
  845. if ($DEV_TYPE1[$iter] != "00")
  846. {
  847. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$iter] ;
  848. $EMI_SETTINGS_string = $EMI_SETTINGS_string . " ," ;
  849. }
  850. }
  851. for $iter (0..$TotalCustemChips-1)
  852. {
  853. if ($DEV_TYPE1[$iter] == "00")
  854. {
  855. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$iter] ;
  856. $EMI_SETTINGS_string = $EMI_SETTINGS_string . " ," ;
  857. }
  858. }
  859. =head
  860. previous version
  861. while ($iter<$TotalCustemChips)
  862. {
  863. if ($DEV_TYPE1[$iter] == "00")
  864. {
  865. $ddr = $iter ;
  866. print "Discrete ddr found $ddr \n" ;
  867. $iter = $iter + 1 ;
  868. }
  869. else
  870. {
  871. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$iter] ;
  872. $iter = $iter + 1 ;
  873. if ($iter < $TotalCustemChips || $ddr != -1)
  874. {
  875. $EMI_SETTINGS_string = $EMI_SETTINGS_string . " ," ;
  876. }
  877. }
  878. }
  879. # if we have discrete dram, we put them in the end
  880. if ($ddr != -1)
  881. {
  882. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$ddr] ;
  883. }
  884. =cut
  885. my $template = <<"__TEMPLATE";
  886. #ifndef __CUSTOM_EMI__
  887. #define __CUSTOM_EMI__
  888. #include "dramc_pi_api.h"
  889. #include "emi.h"
  890. #define COMBO_LPDDR2 ($MCP_LPDDR2+$DIS_LPDDR2)
  891. #define COMBO_LPDDR3 ($MCP_LPDDR3+$DIS_LPDDR3)
  892. #define COMBO_LPDDR4 ($MCP_LPDDR4+$DIS_LPDDR4)
  893. #define COMBO_LPDR4X ($MCP_LPDDR4X+$DIS_LPDDR4X)
  894. #define COMBO_LPDR4P ($MCP_LPDDR4P+$DIS_LPDDR4P)
  895. #define COMBO_PCDDR3 ($MCP_PCDDR3+$DIS_PCDDR3)
  896. #define NUM_EMI_RECORD ($TotalCustemChips)
  897. int num_of_emi_records = NUM_EMI_RECORD ;
  898. EMI_SETTINGS default_emi_setting =
  899. {
  900. 0x0, /* sub_version */
  901. $DIS_TYPE, /* TYPE */
  902. 0, /* EMMC ID/FW ID checking length */
  903. 0, /* FW length */
  904. {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, /* NAND_EMMC_ID */
  905. {0x00,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, /* FW_ID */
  906. $DIS_CONA, /* EMI_CONA_VAL */
  907. $DIS_CONH, /* EMI_CONH_VAL */
  908. $DIS_AC_U00, /* U 00 */
  909. $DIS_AC_U01, /* U 01 */
  910. $DIS_AC_U02, /* U 02 */
  911. $DIS_AC_U03, /* U 03 */
  912. $DIS_AC_U04, /* U 04 */
  913. $DIS_AC_U05, /* U 05 */
  914. $DIS_AC_U06, /* U 06 */
  915. $DIS_AC_U07, /* U 07 */
  916. {0x20000000,0,0,0}, /* DRAM RANK SIZE */
  917. $DIS_CONF, /* EMI_CONF_VAL */
  918. $DIS_CH0_CONA, /* CHN0_EMI_CONA_VAL */
  919. $DIS_CH1_CONA, /* CHN1_EMI_CONA_VAL */
  920. $DIS_CBT_MODE_EXTERN, /* dram_cbt_mode_extern */
  921. {0,0,0,0,0,0}, /* reserved 6 */
  922. 0x00000000, /* LPDDR4_MODE_REG5 */
  923. 0, /* PIN_MUX_TYPE for tablet */
  924. };
  925. EMI_SETTINGS emi_settings[] =
  926. {
  927. $EMI_SETTINGS_string
  928. };
  929. #endif /* __CUSTOM_EMI__ */
  930. __TEMPLATE
  931. return $template ;
  932. }
  933. #****************************************************************************
  934. # subroutine: DeviceListParser_LPSDRAM
  935. # input: the number in array
  936. # return: string contain 1 set of EMI setting for input
  937. #****************************************************************************
  938. sub DeviceListParser_LPSDRAM
  939. {
  940. my ($id) ;
  941. my ($CustCS_id) ;
  942. my ($PartNum) ;
  943. my ($iter);
  944. my ($num_part_found);
  945. $num_part_found = 0 ;
  946. $CustCS_id = $_[0]; # CustCS_CustemChips_iter
  947. $id = $_[1] ; # total_part_number_iter
  948. $PartNum = $CustCS_PART_NUMBER[$CustCS_id] ;
  949. print "\nCustCS ID num is $CustCS_id, part number:$CustCS_PART_NUMBER[$CustCS_id]\n" ;
  950. my $row = $start_num + 0 ; # scan from row 2 when $MEMORY_DEVICE_TYPE eq 'LPSDRAM'
  951. my $col = $COLUMN_PART_NUMBER ; # scan column 2 for Part Number
  952. my $rows_part_found; # stores the part numbers found in MDL
  953. $Sheet = get_sheet("mt6763") ;
  954. # find cell address of the specified Nand ID
  955. my $scan_idx = &xls_cell_value($Sheet, $row, $col) ;
  956. print "[Bike Check] scan_idx= $scan_idx eos_flag=$eos_flag\n";
  957. while (defined ($scan_idx) && ($eos_flag > 0))
  958. {
  959. ++$row ;
  960. $scan_idx = &xls_cell_value($Sheet, $row, $col) ;
  961. print "[Bike Check] scan_idx= $scan_idx\n";
  962. unless (defined $scan_idx)
  963. {
  964. print "[$row][scan_idx]No Value, $eos_flag\n" if $DebugPrint == 1 ;
  965. $eos_flag -- ;
  966. next ;
  967. }
  968. if ($scan_idx eq "")
  969. {
  970. print "[$row][scan_idx]EQ null, $eos_flag\n" if $DebugPrint == 1 ;
  971. $eos_flag -- ;
  972. next ;
  973. }
  974. $eos_flag = 5 ;
  975. # remove leading and tailing spaces
  976. $scan_idx =~ s/^\s+// if $DebugPrint == 1 ;
  977. $scan_idx =~ s/\s+$// if $DebugPrint == 1 ;
  978. $scan_idx =~ s/^\s+// ;
  979. $scan_idx =~ s/\s+$// ;
  980. print "$scan_idx ?= $PartNum\n" ;
  981. if ($scan_idx eq $PartNum) # scan column 2 for Part Number
  982. {
  983. my $boardid ;
  984. $boardid = &xls_cell_value($Sheet, $row, $COLUMN_BOARD_ID) ;
  985. if ($CustBoard_ID eq $boardid)
  986. {
  987. $rows_part_found[$num_part_found] = $row;
  988. print "\nPartNum($PartNum==$scan_idx) found in row $row\n" ;
  989. $Total_PART_NUMBER[$TotalCustemChips] = $PartNum;
  990. $num_part_found += 1 ;
  991. $TotalCustemChips += 1;
  992. }
  993. }
  994. }
  995. print("[Bike Check]num_part_found $num_part_found");
  996. if ($num_part_found == 0)
  997. {
  998. print "\n[Error]unsupported part number $PartNum\n" ;
  999. die "\n[Error]unsupported part number $PartNum\n" ;
  1000. }
  1001. $iter = 0;
  1002. while ($iter<$num_part_found)
  1003. {
  1004. $_ = $rows_part_found[$iter] ;
  1005. $iter ++;
  1006. $VENDOR[$id] = &xls_cell_value($Sheet, $_, $COLUMN_VENDOR) ;
  1007. $DENSITY[$id] = &xls_cell_value($Sheet, $_, $COLUMN_DENSITY) ;
  1008. # find the correct platform
  1009. my $platform_scan_idx = $COLUMN_PLATFORM ; #First EMI controller
  1010. my $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx) ;
  1011. while (!($tmp_platform =~ $PLATFORM))
  1012. {
  1013. $platform_scan_idx++;
  1014. $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx);
  1015. if ($platform_scan_idx > 100)
  1016. {
  1017. die "[Error][Porting Error] It cannot find the right platform name.Please check platform name in XLS\n";
  1018. }
  1019. }
  1020. &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: $PLATFORM not support LPSDRAM!", __FILE__, __LINE__) if ($platform_scan_idx > $COLUMN_PLATFORM);
  1021. $DEV_TYPE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_TYPE) ;
  1022. $DEV_MODE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_MODE) ;
  1023. $NAND_EMMC_ID[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_EMMC_ID) ;
  1024. $FW_ID[$id] = &xls_cell_value($Sheet, $_, $COLUMN_FW_ID) ;
  1025. $NAND_PAGE_SIZE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_PAGE_SIZE) ;
  1026. $EMI_CONA_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1027. $CHN0_EMI_CONA_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1028. $CHN1_EMI_CONA_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1029. $EMI_CONF_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1030. $EMI_CONH_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1031. # $AC_TIME_EMI_DUMMY_01[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1032. $AC_TIME_EMI_FREQUENCY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1033. $AC_TIME_EMI_TRAS[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1034. $AC_TIME_EMI_TRP[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1035. $AC_TIME_EMI_TRPAB[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1036. $AC_TIME_EMI_TRC[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1037. $AC_TIME_EMI_TRFC[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1038. $AC_TIME_EMI_TRFCPB[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1039. $AC_TIME_EMI_TXP[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1040. $AC_TIME_EMI_TRTP[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1041. $AC_TIME_EMI_TRCD[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1042. $AC_TIME_EMI_TWR[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1043. $AC_TIME_EMI_TWTR[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1044. $AC_TIME_EMI_TRRD[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1045. $AC_TIME_EMI_TFAW[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1046. $AC_TIME_EMI_TRTW_ODT_OFF[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1047. $AC_TIME_EMI_TRTW_ODT_ON[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1048. $AC_TIME_EMI_REFCNT[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1049. $AC_TIME_EMI_REFCNT_FR_CLK[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1050. $AC_TIME_EMI_TXREFCNT[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1051. $AC_TIME_EMI_TZQCS[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1052. $AC_TIME_EMI_TRTPD[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1053. $AC_TIME_EMI_TWTPD[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1054. $AC_TIME_EMI_TMRR2W_ODT_OFF[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1055. $AC_TIME_EMI_TMRR2W_ODT_ON[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1056. $CHIP_ID[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; #Darren
  1057. $AC_TIME_EMI_TRAS_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1058. $AC_TIME_EMI_TRP_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1059. $AC_TIME_EMI_TRPAB_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1060. $AC_TIME_EMI_TRC_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1061. $AC_TIME_EMI_TRFC_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1062. $AC_TIME_EMI_TRFCPB_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1063. $AC_TIME_EMI_TXP_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1064. $AC_TIME_EMI_TRTP_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1065. $AC_TIME_EMI_TRCD_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1066. $AC_TIME_EMI_TWR_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1067. $AC_TIME_EMI_TWTR_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1068. $AC_TIME_EMI_TRRD_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1069. $AC_TIME_EMI_TFAW_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1070. $AC_TIME_EMI_TRTW_ODT_OFF_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1071. $AC_TIME_EMI_TRTW_ODT_ON_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1072. # $AC_TIME_EMI_REFCNT_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1073. # $AC_TIME_EMI_REFCNT_FR_CLK_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1074. # $AC_TIME_EMI_TXREFCNT_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1075. # $AC_TIME_EMI_TZQCS_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1076. $AC_TIME_EMI_TRTPD_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1077. $AC_TIME_EMI_TWTPD_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1078. $AC_TIME_EMI_TMRR2W_ODT_OFF_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1079. $AC_TIME_EMI_TMRR2W_ODT_ON_05T[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1080. # $AC_TIME_EMI_XRTW2W[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1081. # $AC_TIME_EMI_XRTW2R[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1082. # $AC_TIME_EMI_XRTR2W[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1083. # $AC_TIME_EMI_XRTR2R[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1084. # $AC_TIME_EMI_DUMMY_02[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1085. # $AC_TIME_EMI_WRITE_LATENCY_0x41c[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1086. # $AC_TIME_EMI_WRITE_LATENCY_0x420[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1087. # $AC_TIME_EMI_WRITE_LATENCY_0x424[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1088. # $AC_TIME_EMI_WRITE_LATENCY_0x428[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1089. # $AC_TIME_EMI_WRITE_LATENCY_0x42c[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1090. # $AC_TIME_EMI_DQSINCTL_FOR_GATING[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1091. # $AC_TIME_EMI_DATLAT[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1092. # $AC_TIME_EMI_MODE_REG_WL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1093. # $AC_TIME_EMI_MODE_REG_RL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1094. #
  1095. # $DDR1_2_3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1096. #
  1097. # # openoffice saved file workaround START
  1098. #
  1099. # if ($DEV_TYPE[$id] =~ /DDR1/)
  1100. # {
  1101. # $DDR1_2_3[$id] = 'DDR1';
  1102. # }
  1103. # elsif ($DEV_TYPE[$id] =~ /LPDDR2/)
  1104. # {
  1105. # $DDR1_2_3[$id] = 'LPDDR2';
  1106. # }
  1107. # elsif ($DEV_TYPE[$id] =~ /PCDDR3/)
  1108. # {
  1109. # $DDR1_2_3[$id] = 'PCDDR3';
  1110. # }
  1111. # elsif ($DEV_TYPE[$id] =~ /LPDDR3/)
  1112. # {
  1113. # $DDR1_2_3[$id] = 'LPDDR3';
  1114. # }
  1115. # # openoffice saved file workaround END
  1116. if ($DEV_TYPE[$id] =~ /LPDDR4/)
  1117. {
  1118. $DDR1_2_3[$id] = 'LPDDR4';
  1119. $DIS_TYPE = "0x0005";
  1120. #$DIS_CONA = "0xf050f154";
  1121. $DIS_CONA = "0x0000e050";
  1122. $DIS_CONH = "0x00000000";
  1123. $DIS_AC_U00 = "0x06090640";
  1124. $DIS_AC_U01 = "0x113D1101";
  1125. $DIS_AC_U02 = "0x0D060301";
  1126. $DIS_AC_U03 = "0x99080307";
  1127. $DIS_AC_U04 = "0x224E6561";
  1128. $DIS_AC_U05 = "0x0B0B0C0C";
  1129. $DIS_AC_U06 = "0x00054045";
  1130. $DIS_AC_U07 = "0x00000000";
  1131. $DIS_CONF = "0x00042100";
  1132. #$DIS_CH0_CONA = "0x0400f050";
  1133. #$DIS_CH1_CONA = "0x0400f050";
  1134. $DIS_CH0_CONA = "0x0400e050";
  1135. $DIS_CH1_CONA = "0x04000000";
  1136. $DIS_CBT_MODE_EXTERN = "CBT_R0_R1_BYTE";
  1137. }
  1138. elsif ($DEV_TYPE[$id] =~ /LPDR4X/)
  1139. {
  1140. $DDR1_2_3[$id] = 'LPDR4X';
  1141. $DIS_TYPE = "0x0006";
  1142. #$DIS_CONA = "0xf050f154";
  1143. $DIS_CONA = "0x0000e050";
  1144. $DIS_CONH = "0x00000000";
  1145. $DIS_AC_U00 = "0x06090640";
  1146. $DIS_AC_U01 = "0x113D1101";
  1147. $DIS_AC_U02 = "0x0D060301";
  1148. $DIS_AC_U03 = "0x99080307";
  1149. $DIS_AC_U04 = "0x224E6561";
  1150. $DIS_AC_U05 = "0x0B0B0C0C";
  1151. $DIS_AC_U06 = "0x00054045";
  1152. $DIS_AC_U07 = "0x00000000";
  1153. $DIS_CONF = "0x00042100";
  1154. #$DIS_CH0_CONA = "0x0400f050";
  1155. #$DIS_CH1_CONA = "0x0400f050";
  1156. $DIS_CH0_CONA = "0x0400e050";
  1157. $DIS_CH1_CONA = "0x04000000";
  1158. $DIS_CBT_MODE_EXTERN = "CBT_R0_R1_BYTE";
  1159. }
  1160. elsif ($DEV_TYPE[$id] =~ /LPDR4P/)
  1161. {
  1162. $DDR1_2_3[$id] = 'LPDR4P';
  1163. $DIS_TYPE = "0x0007";
  1164. #$DIS_CONA = "0xf050f154";
  1165. $DIS_CONA = "0x0000e050";
  1166. $DIS_CONH = "0x00000000";
  1167. $DIS_AC_U00 = "0x06090640";
  1168. $DIS_AC_U01 = "0x113D1101";
  1169. $DIS_AC_U02 = "0x0D060301";
  1170. $DIS_AC_U03 = "0x99080307";
  1171. $DIS_AC_U04 = "0x224E6561";
  1172. $DIS_AC_U05 = "0x0B0B0C0C";
  1173. $DIS_AC_U06 = "0x00054045";
  1174. $DIS_AC_U07 = "0x00000000";
  1175. $DIS_CONF = "0x00042100";
  1176. #$DIS_CH0_CONA = "0x0400f050";
  1177. #$DIS_CH1_CONA = "0x0400f050";
  1178. $DIS_CH0_CONA = "0x0400e050";
  1179. $DIS_CH1_CONA = "0x04000000";
  1180. $DIS_CBT_MODE_EXTERN = "CBT_R0_R1_BYTE";
  1181. }
  1182. else
  1183. {
  1184. $DDR1_2_3[$id] = 'LPDDR3';
  1185. $DIS_TYPE = "0x0003";
  1186. #$DIS_CONA = "0x0000a0a2";
  1187. $DIS_CONA = "0x0000a052";
  1188. $DIS_CONH = "0x00000000";
  1189. $DIS_AC_U00 = "0x070C03A5";
  1190. $DIS_AC_U01 = "0x1F571501";
  1191. $DIS_AC_U02 = "0x0D070301";
  1192. $DIS_AC_U03 = "0x660F0407";
  1193. $DIS_AC_U04 = "0x29656570";
  1194. $DIS_AC_U05 = "0x00000B0A";
  1195. $DIS_AC_U06 = "0x15055054";
  1196. $DIS_AC_U07 = "0x00000000";
  1197. $DIS_CONF = "0x04210000";
  1198. #$DIS_CH0_CONA = "0x0000a0a2";
  1199. $DIS_CH0_CONA = "0x0000a052";
  1200. $DIS_CH1_CONA = "0x00000002";
  1201. $DIS_CBT_MODE_EXTERN = "CBT_R0_R1_NORMAL";
  1202. }
  1203. if ($DEV_MODE[$id] eq "R0_NORMAL+R1_NORMAL")
  1204. {
  1205. $MODE_EXTERN_VAL[$id] = "CBT_R0_R1_NORMAL";
  1206. $DIS_CBT_MODE_EXTERN_TYPE[$id] = "0x0";
  1207. }
  1208. elsif ($DEV_MODE[$id] eq "R0_BYTE+R1_BYTE")
  1209. {
  1210. $MODE_EXTERN_VAL[$id] = "CBT_R0_R1_BYTE";
  1211. $DIS_CBT_MODE_EXTERN_TYPE[$id] = "0x1";
  1212. }
  1213. elsif ($DEV_MODE[$id] eq "R0_NORMAL+R1_BYTE")
  1214. {
  1215. $MODE_EXTERN_VAL[$id] = "CBT_R0_NORMAL_R1_BYTE";
  1216. $DIS_CBT_MODE_EXTERN_TYPE[$id] = "0x2";
  1217. }
  1218. elsif ($DEV_MODE[$id] eq "R0_BYTE+R1_NORMAL")
  1219. {
  1220. $MODE_EXTERN_VAL[$id] = "CBT_R0_BYTE_R1_NORMAL";
  1221. $DIS_CBT_MODE_EXTERN_TYPE[$id] = "0x3";
  1222. }
  1223. else
  1224. {
  1225. die "[Error]Wrong Mode !!!\n";
  1226. }
  1227. #union
  1228. # LPDDR2
  1229. if ($DDR1_2_3[$id] eq "LPDDR2")
  1230. {
  1231. die "[Error][EMIgen] no support LPDDR2.";
  1232. }
  1233. # DDR1
  1234. elsif ($DDR1_2_3[$id] eq "DDR1")
  1235. {
  1236. die "[Error][EMIgen] no support DDR1.";
  1237. }
  1238. # PCDDR3
  1239. elsif ($DDR1_2_3[$id] eq "PCDDR3")
  1240. {
  1241. die "[Error][EMIgen] no support PCDDR3.";
  1242. }
  1243. # LPDDR3
  1244. elsif ($DDR1_2_3[$id] eq "LPDDR3")
  1245. {
  1246. $LPDDR3_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1247. }
  1248. elsif ($DDR1_2_3[$id] eq "LPDDR4")
  1249. {
  1250. $LPDDR4_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1251. }
  1252. elsif ($DDR1_2_3[$id] eq "LPDR4X")
  1253. {
  1254. $LPDDR4X_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1255. }
  1256. elsif ($DDR1_2_3[$id] eq "LPDR4P")
  1257. {
  1258. $LPDDR4P_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1259. }
  1260. $PIN_MUX_TYPE[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  1261. if ($DENSITY[$id] eq "8192+8192")
  1262. {
  1263. $DRAM_RANK0_SIZE[$id] = "0x40000000";
  1264. $DRAM_RANK1_SIZE[$id] = "0x40000000";
  1265. }
  1266. elsif ($DENSITY[$id] eq "16384+8192")
  1267. {
  1268. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1269. $DRAM_RANK1_SIZE[$id] = "0x40000000";
  1270. }
  1271. elsif ($DENSITY[$id] eq "8192+4096")
  1272. {
  1273. $DRAM_RANK0_SIZE[$id] = "0x40000000";
  1274. $DRAM_RANK1_SIZE[$id] = "0x20000000";
  1275. }
  1276. elsif ($DENSITY[$id] eq "4096+4096")
  1277. {
  1278. $DRAM_RANK0_SIZE[$id] = "0x20000000";
  1279. $DRAM_RANK1_SIZE[$id] = "0x20000000";
  1280. }
  1281. elsif ($DENSITY[$id] eq "2048+2048")
  1282. {
  1283. $DRAM_RANK0_SIZE[$id] = "0x10000000";
  1284. $DRAM_RANK1_SIZE[$id] = "0x10000000";
  1285. }
  1286. elsif ($DENSITY[$id] eq "4096+2048")
  1287. {
  1288. $DRAM_RANK0_SIZE[$id] = "0x20000000";
  1289. $DRAM_RANK1_SIZE[$id] = "0x10000000";
  1290. }
  1291. elsif ($DENSITY[$id] eq "12288+12288")
  1292. {
  1293. $DRAM_RANK0_SIZE[$id] = "0x60000000";
  1294. $DRAM_RANK1_SIZE[$id] = "0x60000000";
  1295. }
  1296. elsif ($DENSITY[$id] eq "6144+6144")
  1297. {
  1298. $DRAM_RANK0_SIZE[$id] = "0x30000000";
  1299. $DRAM_RANK1_SIZE[$id] = "0x30000000";
  1300. }
  1301. elsif ($DENSITY[$id] eq "16384+16384")
  1302. {
  1303. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1304. $DRAM_RANK1_SIZE[$id] = "0x80000000";
  1305. }
  1306. elsif ($DENSITY[$id] eq "24576+24576")
  1307. {
  1308. $DRAM_RANK0_SIZE[$id] = "0xC0000000";
  1309. $DRAM_RANK1_SIZE[$id] = "0xC0000000";
  1310. }
  1311. elsif ($DENSITY[$id] eq "16384+32768")
  1312. {
  1313. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1314. $DRAM_RANK1_SIZE[$id] = "0x100000000";
  1315. }
  1316. elsif ($DENSITY[$id] eq "32768")
  1317. {
  1318. $DRAM_RANK0_SIZE[$id] = "0x100000000";
  1319. $DRAM_RANK1_SIZE[$id] = "0";
  1320. }
  1321. elsif ($DENSITY[$id] eq "24576")
  1322. {
  1323. $DRAM_RANK0_SIZE[$id] = "0xC0000000";
  1324. $DRAM_RANK1_SIZE[$id] = "0";
  1325. }
  1326. elsif ($DENSITY[$id] eq "16384")
  1327. {
  1328. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1329. $DRAM_RANK1_SIZE[$id] = "0";
  1330. }
  1331. elsif ($DENSITY[$id] eq "12288")
  1332. {
  1333. $DRAM_RANK0_SIZE[$id] = "0x60000000";
  1334. $DRAM_RANK1_SIZE[$id] = "0";
  1335. }
  1336. elsif ($DENSITY[$id] eq "8192")
  1337. {
  1338. $DRAM_RANK0_SIZE[$id] = "0x40000000";
  1339. $DRAM_RANK1_SIZE[$id] = "0";
  1340. }
  1341. elsif ($DENSITY[$id] eq "6144")
  1342. {
  1343. $DRAM_RANK0_SIZE[$id] = "0x30000000";
  1344. $DRAM_RANK1_SIZE[$id] = "0";
  1345. }
  1346. elsif ($DENSITY[$id] eq "4096")
  1347. {
  1348. $DRAM_RANK0_SIZE[$id] = "0x20000000";
  1349. $DRAM_RANK1_SIZE[$id] = "0";
  1350. }
  1351. elsif ($DENSITY[$id] eq "2048")
  1352. {
  1353. $DRAM_RANK0_SIZE[$id] = "0x10000000";
  1354. $DRAM_RANK1_SIZE[$id] = "0";
  1355. }
  1356. else
  1357. {
  1358. die "[Error]Wrong Density size!!DENSITY:$DENSITY[$id], Please check Density in MDL.\n";
  1359. }
  1360. # if (!($CHIP_ID[$id] eq $MTK_MACH_TYPE))
  1361. if (!($CHIP_ID[$id] eq "mt6763"))
  1362. {
  1363. die "[Error] Wrong Chip ID:$CHIP_ID[$id]"
  1364. }
  1365. #the rank size check algorithim should double check with EMI owner when porting.
  1366. #rank size check START
  1367. $hex_val = hex($EMI_CONA_VAL[$id]);
  1368. $hex_val_ch0 = hex($CHN0_EMI_CONA_VAL[$id]);
  1369. $hex_val_ch1 = hex($CHN1_EMI_CONA_VAL[$id]);
  1370. if ($DENSITY[$id] =~ /\+/)
  1371. {
  1372. if (($DEV_TYPE[$id] =~ /LPDDR4/) || ($DEV_TYPE[$id] =~ /LPDR4X/) || ($DEV_TYPE[$id] =~ /LPDR4P/))
  1373. {
  1374. if (!($hex_val & 0x20000)) # dual rank
  1375. {
  1376. die "[Error] LPDDR4 Wrong CONA value with dual rank:$DENSITY[$id],$EMI_CONA_VAL[$id]"
  1377. }
  1378. else
  1379. {
  1380. if ($hex_val & 0x10000) #dual ch
  1381. {
  1382. if (!(($hex_val_ch0 & 0x1) && ($hex_val_ch1 & 0x1))) #dual rank
  1383. {
  1384. die "[Error] LPDDR4 Wrong Dual CHN CONA value with dual rank:$CHN0_EMI_CONA_VAL[$id],$CHN1_EMI_CONA_VAL[$id]"
  1385. }
  1386. }
  1387. else #single ch
  1388. {
  1389. if (!($hex_val_ch0 & 0x1))
  1390. {
  1391. die "[Error] LPDDR4 Wrong Single CHN CONA value with dual rank:$CHN0_EMI_CONA_VAL[$id]"
  1392. }
  1393. }
  1394. }
  1395. }
  1396. else # LPDDR3
  1397. {
  1398. if (!($hex_val & 0x20000))
  1399. {
  1400. die "[Error] LPDDR3 Wrong CONA value with dual rank:$DENSITY[$id],$EMI_CONA_VAL[$id]"
  1401. }
  1402. }
  1403. }
  1404. else # single rank
  1405. {
  1406. if (($DEV_TYPE[$id] =~ /LPDDR4/) || ($DEV_TYPE[$id] =~ /LPDR4X/) || ($DEV_TYPE[$id] =~ /LPDR4P/))
  1407. {
  1408. if ($hex_val & 0x20000)
  1409. {
  1410. die "[Error] LPDDR4 Wrong CONA value with single rank:$DENSITY[$id],$EMI_CONA_VAL[$id]";
  1411. }
  1412. else
  1413. {
  1414. if ($hex_val & 0x10000) #dual ch
  1415. {
  1416. if (($hex_val_ch0 & 0x1) || ($hex_val_ch1 & 0x1)) #dual ch
  1417. {
  1418. die "[Error] LPDDR4 Wrong Dual CHN CONA value with single rank:$CHN0_EMI_CONA_VAL[$id],$CHN1_EMI_CONA_VAL[$id]"
  1419. }
  1420. }
  1421. else # single ch
  1422. {
  1423. if (($hex_val_ch0 & 0x1))
  1424. {
  1425. die "[Error] LPDDR4 Wrong Single CHN CONA value with single rank:$CHN0_EMI_CONA_VAL[$id]"
  1426. }
  1427. }
  1428. }
  1429. }
  1430. else # LPDDR3
  1431. {
  1432. if ($hex_val & 0x20000)
  1433. {
  1434. die "[Error] LPDDR3 Wrong CONA value with single rank:$DENSITY[$id],$EMI_CONA_VAL[$id]";
  1435. }
  1436. }
  1437. }
  1438. #rank size check END
  1439. if ($DEV_TYPE[$id] eq "Discrete DDR1")
  1440. {
  1441. $DEV_TYPE1[$id] = "00" ;
  1442. $DEV_TYPE2[$id] = "01" ;
  1443. die "[Error][EMIgen] no support DDR1.";
  1444. $NAND_EMMC_ID[$id]="0x00";
  1445. $FW_ID[$id]="0x00"
  1446. }
  1447. elsif ($DEV_TYPE[$id] eq "Discrete LPDDR2")
  1448. {
  1449. $DEV_TYPE1[$id] = "00" ;
  1450. $DEV_TYPE2[$id] = "02" ;
  1451. die "[Error][EMIgen] no support LPDDR2.";
  1452. $NAND_EMMC_ID[$id]="";
  1453. $FW_ID[$id]=""
  1454. }
  1455. elsif ($DEV_TYPE[$id] eq "Discrete Tablet LPDDR2") # Denali Tablet (Darren)
  1456. {
  1457. $DEV_TYPE1[$id] = "0F" ;
  1458. $DEV_TYPE2[$id] = "02" ;
  1459. die "[Error][EMIgen] no support Discrete LPDDR2.";
  1460. $NAND_EMMC_ID[$id]="";
  1461. $FW_ID[$id]=""
  1462. }
  1463. elsif ($DEV_TYPE[$id] eq "Discrete LPDDR3")
  1464. {
  1465. $DEV_TYPE1[$id] = "00" ;
  1466. $DEV_TYPE2[$id] = "03" ;
  1467. $DIS_LPDDR3 = $DIS_LPDDR3 + 1 ;
  1468. $NAND_EMMC_ID[$id]="";
  1469. $FW_ID[$id]=""
  1470. }
  1471. elsif ($DEV_TYPE[$id] eq "Discrete LPDDR4")
  1472. {
  1473. $DEV_TYPE1[$id] = "00" ;
  1474. $DEV_TYPE2[$id] = "05" ;
  1475. $DIS_LPDDR4 = $DIS_LPDDR4 + 1 ;
  1476. $NAND_EMMC_ID[$id]="";
  1477. $FW_ID[$id]=""
  1478. }
  1479. elsif ($DEV_TYPE[$id] eq "Discrete LPDR4X")
  1480. {
  1481. $DEV_TYPE1[$id] = "00" ;
  1482. $DEV_TYPE2[$id] = "06" ;
  1483. $DIS_LPDDR4X = $DIS_LPDDR4X + 1 ;
  1484. $NAND_EMMC_ID[$id]="";
  1485. $FW_ID[$id]=""
  1486. }
  1487. elsif ($DEV_TYPE[$id] eq "Discrete LPDR4P")
  1488. {
  1489. $DEV_TYPE1[$id] = "00" ;
  1490. $DEV_TYPE2[$id] = "07" ;
  1491. $DIS_LPDDR4P = $DIS_LPDDR4P + 1 ;
  1492. $NAND_EMMC_ID[$id]="";
  1493. $FW_ID[$id]=""
  1494. }
  1495. elsif ($DEV_TYPE[$id] eq "Discrete PCDDR3")
  1496. {
  1497. $DEV_TYPE1[$id] = "00" ;
  1498. $DEV_TYPE2[$id] = "04" ;
  1499. die "[Error][EMIgen] no support Discrete PCDDR3.";
  1500. }
  1501. elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR1)")
  1502. {
  1503. $DEV_TYPE1[$id] = "01" ;
  1504. $DEV_TYPE2[$id] = "01" ;
  1505. die "[Error][EMIgen] no support NAND+DDR1.";
  1506. }
  1507. elsif ($DEV_TYPE[$id] eq "MCP(NAND+LPDDR2)")
  1508. {
  1509. $DEV_TYPE1[$id] = "01" ;
  1510. $DEV_TYPE2[$id] = "02" ;
  1511. die "[Error][EMIgen] no support NAND+LPDDR2.";
  1512. }
  1513. elsif ($DEV_TYPE[$id] eq "MCP(NAND+LPDDR3)")
  1514. {
  1515. $DEV_TYPE1[$id] = "01" ;
  1516. $DEV_TYPE2[$id] = "03" ;
  1517. die "[Error][EMIgen] no support NAND+LPDDR3.";
  1518. }
  1519. elsif ($DEV_TYPE[$id] eq "MCP(NAND+PCDDR3)")
  1520. {
  1521. $DEV_TYPE1[$id] = "01" ;
  1522. $DEV_TYPE2[$id] = "04" ;
  1523. die "[Error][EMIgen] no support NAND+PCDDR3.";
  1524. }
  1525. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR1)")
  1526. {
  1527. $DEV_TYPE1[$id] = "02" ;
  1528. $DEV_TYPE2[$id] = "01" ;
  1529. die "[Error][EMIgen] no support DDR1.";
  1530. }
  1531. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDDR2)")
  1532. {
  1533. $DEV_TYPE1[$id] = "02" ;
  1534. $DEV_TYPE2[$id] = "02" ;
  1535. die "[Error][EMIgen] no support LPDDR2.";
  1536. }
  1537. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDDR3)")
  1538. {
  1539. $DEV_TYPE1[$id] = "02" ;
  1540. $DEV_TYPE2[$id] = "03" ;
  1541. $MCP_LPDDR3 = $MCP_LPDDR3 + 1 ;
  1542. }
  1543. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDDR4)")
  1544. {
  1545. $DEV_TYPE1[$id] = "02" ;
  1546. $DEV_TYPE2[$id] = "05" ;
  1547. $MCP_LPDDR4 = $MCP_LPDDR4 + 1 ;
  1548. }
  1549. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDR4X)")
  1550. {
  1551. $DEV_TYPE1[$id] = "02" ;
  1552. $DEV_TYPE2[$id] = "06" ;
  1553. $MCP_LPDDR4X = $MCP_LPDDR4X + 1 ;
  1554. }
  1555. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDR4P)")
  1556. {
  1557. $DEV_TYPE1[$id] = "02" ;
  1558. $DEV_TYPE2[$id] = "07" ;
  1559. $MCP_LPDDR4P = $MCP_LPDDR4P + 1 ;
  1560. }
  1561. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+PCDDR3)")
  1562. {
  1563. $DEV_TYPE1[$id] = "02" ;
  1564. $DEV_TYPE2[$id] = "04" ;
  1565. die "[Error][EMIgen] no support PCDDR3.";
  1566. }
  1567. elsif ($DEV_TYPE[$id] eq "MCP(UFS+LPDR4)")
  1568. {
  1569. $DEV_TYPE1[$id] = "03" ;
  1570. $DEV_TYPE2[$id] = "05" ;
  1571. $MCP_LPDDR4 = $MCP_LPDDR4 + 1 ;
  1572. }
  1573. elsif ($DEV_TYPE[$id] eq "MCP(UFS+LPDR4X)")
  1574. {
  1575. $DEV_TYPE1[$id] = "03" ;
  1576. $DEV_TYPE2[$id] = "06" ;
  1577. $MCP_LPDDR4X = $MCP_LPDDR4X + 1 ;
  1578. }
  1579. else
  1580. {
  1581. die "[Error] unknown mcp type $DEV_TYPE[$id] \n" ;
  1582. }
  1583. #LPDDR2 MODE_REG5 empty value check START
  1584. if (($DEV_TYPE2[$id] eq "02") && ($LPDDR2_MODE_REG5[$id] eq ''))
  1585. {
  1586. die "[Error](".$id.")MDL error, LPDDR2 but no LPDDR2_MODE_REG5 information, please update the MDL\n";
  1587. }
  1588. if (($DEV_TYPE2[$id] eq "03") && ($LPDDR3_MODE_REG5[$id] eq ''))
  1589. {
  1590. die "[Error](".$id.")MDL error, LPDDR3 but no LPDDR3_MODE_REG5 information, please update the MDL\n";
  1591. }
  1592. if (($DEV_TYPE2[$id] eq "05") && ($LPDDR4_MODE_REG5[$id] eq ''))
  1593. {
  1594. die "[Error](".$id.")MDL error, LPDDR4 but no LPDDR4_MODE_REG5 information, please update the MDL\n";
  1595. }
  1596. if (($DEV_TYPE2[$id] eq "06") && ($LPDDR4X_MODE_REG5[$id] eq ''))
  1597. {
  1598. die "[Error](".$id.")MDL error, LPDDR4X but no LPDDR4X_MODE_REG5 information, please update the MDL\n";
  1599. }
  1600. if (($DEV_TYPE2[$id] eq "07") && ($LPDDR4P_MODE_REG5[$id] eq ''))
  1601. {
  1602. die "[Error](".$id.")MDL error, LPDDR4P but no LPDDR4P_MODE_REG5 information, please update the MDL\n";
  1603. }
  1604. #LPDDR2 MODE_REG5 empty value check END
  1605. print "NAND_EMMC_ID:$NAND_EMMC_ID[$id]\n";
  1606. # To parse NAND_EMMC_ID, we only support 12 bytes ID
  1607. if (length($NAND_EMMC_ID[$id]) % 2)
  1608. {
  1609. die "[Error] The wrong NAND_EMMC_ID: $NAND_EMMC_ID[$id] !! It is not byte align";
  1610. }
  1611. if (length($FW_ID[$id]) % 2)
  1612. {
  1613. die "[Error] The wrong FW_ID: $FW_ID[$id] !! It is not byte align";
  1614. }
  1615. $ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  1616. $FW_ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  1617. $Sub_version[$id] = "0x1";
  1618. $ID_Length[$id] = (length($NAND_EMMC_ID[$id])-2)/2;
  1619. $FW_ID_Length[$id] = (length($FW_ID[$id])-2)/2;
  1620. if ($ID_Length[$id] < 0)
  1621. {
  1622. $ID_Length[$id] = 0;
  1623. }
  1624. if ($FW_ID_Length[$id] < 0)
  1625. {
  1626. $FW_ID_Length[$id] = 0;
  1627. }
  1628. $nand_emmc_id_len = $ID_Length[$id];
  1629. print $ID_Length[$id].$FW_ID_Length[$id];
  1630. if ($ID_Length[$id]> 0)
  1631. {
  1632. my @NAND_VECTOR = ($NAND_EMMC_ID[$id] =~ m/([\dA-Fa-f]{2})/gs);
  1633. #create NAND_EMMC_ID string
  1634. $last = pop(@NAND_VECTOR);
  1635. $ID_String[$id] = "{";
  1636. foreach $a (@NAND_VECTOR)
  1637. {
  1638. $ID_String[$id] .= "0x$a,";
  1639. }
  1640. $ID_String[$id] .= "0x$last";
  1641. # To add ZERO in the end
  1642. if ($nand_emmc_id_len < $MAX_NAND_EMMC_ID_LEN)
  1643. {
  1644. for($i = 0; $i <($MAX_NAND_EMMC_ID_LEN - $ID_Length[$id]); $i++)
  1645. {
  1646. $ID_String[$id].= ",0x0"
  1647. }
  1648. }
  1649. $ID_String[$id] .= "}";
  1650. }
  1651. else{
  1652. $ID_Length[$id] = 0;
  1653. }
  1654. print "$ID_String[$id]\n" ;
  1655. #create FW ID string
  1656. if ($FW_ID_Length[$id] > 0)
  1657. {
  1658. my @FW_ID_VECTOR = ($FW_ID[$id] =~ m/([\dA-Fa-f]{2})/gs);
  1659. $last = pop(@FW_ID_VECTOR);
  1660. $FW_ID_String[$id] = "{";
  1661. foreach $a (@FW_ID_VECTOR)
  1662. {
  1663. $FW_ID_String[$id] .= "0x$a,";
  1664. }
  1665. $FW_ID_String[$id] .= "0x$last";
  1666. # To add ZERO in the end
  1667. if ($fw_id_len < $MAX_FW_ID_LEN)
  1668. {
  1669. for($i = 0; $i <($MAX_FW_ID_LEN - $FW_ID_Length[$id]); $i++)
  1670. {
  1671. $FW_ID_String[$id].= ",0x0"
  1672. }
  1673. }
  1674. $FW_ID_String[$id] .= "}";
  1675. }
  1676. else{
  1677. $FW_ID_Length[$id] = 0;
  1678. }
  1679. print "$FW_ID_String[$id]\n" ;
  1680. $EMI_SETTINGS[$id] = "\n\t//$PartNum\n\t{\n\t\t" ;
  1681. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $Sub_version[$id] . ",\t\t/* sub_version */\n\t\t" ;
  1682. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "0x" . $DEV_TYPE1[$id] . $DEV_TYPE2[$id] . ",\t\t/* TYPE */\n\t\t" ;
  1683. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_Length[$id] . ",\t\t/* EMMC ID/FW ID checking length */\n\t\t" ;
  1684. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $FW_ID_Length[$id] . ",\t\t/* FW length */\n\t\t" ;
  1685. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_String[$id] . ",\t\t/* NAND_EMMC_ID */\n\t\t" ;
  1686. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $FW_ID_String[$id] . ",\t\t/* FW_ID */\n\t\t" ;
  1687. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONA_VAL[$id] . ",\t\t/* EMI_CONA_VAL */\n\t\t" ;
  1688. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONH_VAL[$id] . ",\t\t/* EMI_CONH_VAL */\n\t\t" ;
  1689. $AC_TIME_VALUE[$id][0] = sprintf("0x%08X",($AC_TIME_EMI_FREQUENCY[$id] + ($AC_TIME_EMI_TRAS[$id] << 16) + ($AC_TIME_EMI_TRP[$id] << 24)));
  1690. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][0] . ",\t\t/* U 00 */\n\t\t" ;
  1691. $AC_TIME_VALUE[$id][1] = sprintf("0x%08X",(($AC_TIME_EMI_TRPAB[$id]) + ($AC_TIME_EMI_TRC[$id] << 8) + ($AC_TIME_EMI_TRFC[$id] << 16) + ($AC_TIME_EMI_TRFCPB[$id] << 24)));
  1692. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][1] . ",\t\t/* U 01 */\n\t\t" ;
  1693. $AC_TIME_VALUE[$id][2] = sprintf("0x%08X",(($AC_TIME_EMI_TXP[$id]) + ($AC_TIME_EMI_TRTP[$id] << 8) + ($AC_TIME_EMI_TRCD[$id] << 16) + ($AC_TIME_EMI_TWR[$id] << 24)));
  1694. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][2] . ",\t\t/* U 02 */\n\t\t" ;
  1695. $AC_TIME_VALUE[$id][3] = sprintf("0x%08X",(($AC_TIME_EMI_TWTR[$id]) + ($AC_TIME_EMI_TRRD[$id] << 8) + ($AC_TIME_EMI_TFAW[$id] << 16) + ($AC_TIME_EMI_TRTW_ODT_OFF[$id] << 24) + ($AC_TIME_EMI_TRTW_ODT_ON[$id] << 28)));
  1696. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][3] . ",\t\t/* U 03 */\n\t\t" ;
  1697. $AC_TIME_VALUE[$id][4] = sprintf("0x%08X",(($AC_TIME_EMI_REFCNT[$id]) + ($AC_TIME_EMI_REFCNT_FR_CLK[$id] << 8) + ($AC_TIME_EMI_TXREFCNT[$id] << 16) + ($AC_TIME_EMI_TZQCS[$id] << 24)));
  1698. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][4] . ",\t\t/* U 04 */\n\t\t" ;
  1699. $AC_TIME_VALUE[$id][5] = sprintf("0x%08X",(($AC_TIME_EMI_TRTPD[$id]) + ($AC_TIME_EMI_TWTPD[$id] << 8) + ($AC_TIME_EMI_TMRR2W_ODT_OFF[$id] << 16) + ($AC_TIME_EMI_TMRR2W_ODT_ON[$id] << 24)));
  1700. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][5] . ",\t\t/* U 05 */\n\t\t" ;
  1701. $AC_TIME_VALUE[$id][6] = sprintf("0x%08X",(($AC_TIME_EMI_TRAS_05T[$id]) + ($AC_TIME_EMI_TRP_05T[$id] << 2) + ($AC_TIME_EMI_TRPAB_05T[$id] << 4) +
  1702. ($AC_TIME_EMI_TRC_05T[$id] << 6) + ($AC_TIME_EMI_TRFC_05T[$id] << 8) + ($AC_TIME_EMI_TRFCPB_05T[$id] << 10) +
  1703. ($AC_TIME_EMI_TXP_05T[$id] << 12) + ($AC_TIME_EMI_TRTP_05T[$id] << 14) + ($AC_TIME_EMI_TRCD_05T[$id] << 16) +
  1704. ($AC_TIME_EMI_TWR_05T[$id] << 18) + ($AC_TIME_EMI_TWTR_05T[$id] << 20) + ($AC_TIME_EMI_TRRD_05T[$id] << 22) +
  1705. ($AC_TIME_EMI_TFAW_05T[$id] << 24) + ($AC_TIME_EMI_TRTW_ODT_OFF_05T[$id] << 26) + ($AC_TIME_EMI_TRTW_ODT_ON_05T[$id] << 28) +
  1706. ($AC_TIME_EMI_TRTPD_05T[$id] << 30)));
  1707. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][6] . ",\t\t/* U 06 */\n\t\t" ;
  1708. $AC_TIME_VALUE[$id][7] = sprintf("0x%08X",(($AC_TIME_EMI_TWTPD_05T[$id]) + ($AC_TIME_EMI_TMRR2W_ODT_OFF_05T[$id] << 2) + ($AC_TIME_EMI_TMRR2W_ODT_ON_05T[$id] << 4)));
  1709. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE[$id][7] . ",\t\t/* U 07 */\n\t\t" ;
  1710. # $AC_TIME_VALUE[7] = sprintf("0x%X",(($AC_TIME_EMI_TXREFCNT_05T[$id]) + ($AC_TIME_EMI_TZQCS_05T[$id] << 2) + ($AC_TIME_EMI_XRTW2W[$id] << 4) + ($AC_TIME_EMI_XRTW2R[$id] << 8) +
  1711. # ($AC_TIME_EMI_XRTR2W[$id] << 12) + ($AC_TIME_EMI_XRTR2R[$id] << 16) + ($AC_TIME_EMI_DUMMY_02[$id] << 20)));
  1712. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE . ",\t\t/* U 06 */\n\t\t" ;
  1713. #
  1714. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_EMI_WRITE_LATENCY_0x41c[$id] . ",\t\t/* U 07 */\n\t\t" ;
  1715. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_EMI_WRITE_LATENCY_0x420[$id] . ",\t\t/* U 08 */\n\t\t" ;
  1716. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_EMI_WRITE_LATENCY_0x424[$id] . ",\t\t/* U 09 */\n\t\t" ;
  1717. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_EMI_WRITE_LATENCY_0x428[$id] . ",\t\t/* U 10 */\n\t\t" ;
  1718. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_EMI_WRITE_LATENCY_0x42c[$id] . ",\t\t/* U 11 */\n\t\t" ;
  1719. #
  1720. # $AC_TIME_VALUE = sprintf("0x%X",(($AC_TIME_EMI_DQSINCTL_FOR_GATING[$id]) + ($AC_TIME_EMI_DATLAT[$id] << 8) + ($AC_TIME_EMI_MODE_REG_WL[$id] << 16) + ($AC_TIME_EMI_MODE_REG_RL[$id] << 24)));
  1721. # $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $AC_TIME_VALUE . ",\t\t/* U 12 */\n\t\t" ;
  1722. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{" . $DRAM_RANK0_SIZE[$id] . "," . $DRAM_RANK1_SIZE[$id] . ",0,0},\t\t/* DRAM RANK SIZE */\n\t\t" ;
  1723. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONF_VAL[$id] . ",\t\t/* EMI_CONF_VAL */\n\t\t" ;
  1724. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $CHN0_EMI_CONA_VAL[$id] . ",\t\t/* CHN0_EMI_CONA_VAL */\n\t\t" ;
  1725. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $CHN1_EMI_CONA_VAL[$id] . ",\t\t/* CHN1_EMI_CONA_VAL */\n\t\t" ;
  1726. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $MODE_EXTERN_VAL[$id] . ",\t\t/* dram_cbt_mode_extern */\n\t\t" ;
  1727. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{0,0,0,0,0,0},\t\t/* reserved 6 */\n\t\t" ;
  1728. #union
  1729. #1 LPDDR2
  1730. if ($DDR1_2_3[$id] eq "LPDDR2")
  1731. {
  1732. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG1[$id] . ",\t\t/* LPDDR2_MODE_REG1 */\n\t\t" ;
  1733. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG2[$id] . ",\t\t/* LPDDR2_MODE_REG2 */\n\t\t" ;
  1734. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG3[$id] . ",\t\t/* LPDDR2_MODE_REG3 */\n\t\t" ;
  1735. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG5[$id] . ",\t\t/* LPDDR2_MODE_REG5 */\n\t\t" ;
  1736. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG10[$id] . ",\t\t/* LPDDR2_MODE_REG10 */\n\t\t" ;
  1737. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG63[$id] . ",\t\t/* LPDDR2_MODE_REG63 */\n\t}" ;
  1738. }
  1739. #2 DDR1
  1740. elsif ($DDR1_2_3[$id] eq "DDR1")
  1741. {
  1742. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_MODE_REG[$id] . ",\t\t/* DDR1_MODE_REG */\n\t\t" ;
  1743. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_EXT_MODE_REG[$id] . "\t\t/* DDR1_EXT_MODE_REG */\n\t}" ;
  1744. }
  1745. #3 PCDDR3
  1746. elsif ($DDR1_2_3[$id] eq "PCDDR3")
  1747. {
  1748. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG0[$id] . ",\t\t/* PCDDR3_MODE_REG0 */\n\t\t" ;
  1749. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG1[$id] . ",\t\t/* PCDDR3_MODE_REG1 */\n\t\t" ;
  1750. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG2[$id] . ",\t\t/* PCDDR3_MODE_REG2 */\n\t\t" ;
  1751. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG3[$id] . ",\t\t/* PCDDR3_MODE_REG3 */\n\t\t" ;
  1752. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG4[$id] . ",\t\t/* PCDDR3_MODE_REG4 */\n\t\t" ;
  1753. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG5[$id] . ",\t\t/* PCDDR3_MODE_REG5 */\n\t}" ;
  1754. }
  1755. #3 LPDDR3
  1756. elsif ($DDR1_2_3[$id] eq "LPDDR3")
  1757. {
  1758. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG1[$id] . ",\t\t/* LPDDR3_MODE_REG1 */\n\t\t" ;
  1759. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG2[$id] . ",\t\t/* LPDDR3_MODE_REG2 */\n\t\t" ;
  1760. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG3[$id] . ",\t\t/* LPDDR3_MODE_REG3 */\n\t\t" ;
  1761. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG5[$id] . ",\t\t/* LPDDR3_MODE_REG5 */\n\t\t" ;
  1762. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG10[$id] . ",\t\t/* LPDDR3_MODE_REG10 */\n\t\t" ;
  1763. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG63[$id] . ",\t\t/* LPDDR3_MODE_REG63 */\n\t}" ;
  1764. }
  1765. #4 LPDDR4/4X/4P
  1766. elsif ($DDR1_2_3[$id] eq "LPDDR4")
  1767. {
  1768. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR4_MODE_REG5[$id] . ",\t\t/* LPDDR4_MODE_REG5 */\n\t\t" ;
  1769. }
  1770. elsif ($DDR1_2_3[$id] eq "LPDR4X")
  1771. {
  1772. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR4X_MODE_REG5[$id] . ",\t\t/* LPDDR4X_MODE_REG5 */\n\t\t" ;
  1773. }
  1774. elsif ($DDR1_2_3[$id] eq "LPDR4P")
  1775. {
  1776. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR4P_MODE_REG5[$id] . ",\t\t/* LPDDR4P_MODE_REG5 */\n\t\t" ;
  1777. }
  1778. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PIN_MUX_TYPE[$id] . ",\t\t/* PIN_MUX_TYPE for tablet */\n\t}" ;
  1779. print $EMI_SETTINGS[$id] ;
  1780. print "\n\n" ;
  1781. $id ++;
  1782. }
  1783. &check_dram_rank_size_by_EMI_settings($id); #Darren+
  1784. # return total_part_number_iter
  1785. return $id;
  1786. }
  1787. #****************************************************************************************
  1788. # subroutine: check_dram_rank_size_by_EMI_settings
  1789. # return: which os this script is running
  1790. # input: no input
  1791. #****************************************************************************************
  1792. sub check_dram_rank_size_by_EMI_settings {
  1793. $hex_CONA = hex($EMI_CONA_VAL[$id]);
  1794. $hex_CONH = hex($EMI_CONH_VAL[$id]);
  1795. $shift_for_16bit = 1;
  1796. #Is it 32-bit or 16-bit I/O
  1797. if ($hex_CONA & 0x2)
  1798. {
  1799. $shift_for_16bit = 0;
  1800. }
  1801. $dram_rank0_size = 0;
  1802. $dram_rank1_size = 0;
  1803. $ch0_rank0_size = ($hex_CONH >> 16) & 0xf;
  1804. $ch0_rank1_size = ($hex_CONH >> 20) & 0xf;
  1805. $ch1_rank0_size = ($hex_CONH >> 24) & 0xf;
  1806. $ch1_rank1_size = ($hex_CONH >> 28) & 0xf;
  1807. if($ch0_rank0_size == 0)
  1808. {
  1809. #rank 0 setting
  1810. $col_bit = (($hex_CONA >> 4) & 0x03) + 9;
  1811. $row_bit = ((($hex_CONA >> 24) & 0x1) << 2) + (($hex_CONA >> 12) & 0x03) + 13;
  1812. $dram_rank0_size = (1 << ($row_bit + $col_bit)) * (4 >> $shift_for_16bit) * 8; #4 or 2 byte * 8 banks
  1813. print "[Debug] dram_rank0_size: $dram_rank0_size\n";
  1814. }
  1815. else
  1816. {
  1817. $dram_rank0_size = ($ch0_rank0_size * 256 << 20);
  1818. }
  1819. if (0 != ($hex_CONA & (1 << 17))) #rank 1 exist
  1820. {
  1821. if($ch0_rank1_size == 0)
  1822. {
  1823. $col_bit = (($hex_CONA >> 6) & 0x03) + 9;
  1824. $row_bit = ((($hex_CONA >> 25) & 0x1) << 2) + (($hex_CONA >> 14) & 0x03) + 13;
  1825. $dram_rank1_size = ((1 << ($row_bit + $col_bit)) * (4 >> $shift_for_16bit) * 8); #4 or 2 byte * 8 banks
  1826. print "[Debug] dram_rank1_size: $dram_rank1_size\n";
  1827. }
  1828. else
  1829. {
  1830. $dram_rank1_size = ($ch0_rank1_size * 256 << 20);
  1831. }
  1832. }
  1833. if(0 != (($hex_CONA >> 8) & 0x01)) #channel 1 exist
  1834. {
  1835. if($ch1_rank0_size == 0)
  1836. {
  1837. #rank0 setting
  1838. $col_bit = (($hex_CONA >> 20) & 0x03) + 9;
  1839. $row_bit = ((($hex_CONH >> 4) & 0x1) << 2) + (($hex_CONA >> 28) & 0x03) + 13;
  1840. $dram_rank0_size += ((1 << ($row_bit + $col_bit)) * (4 >> $shift_for_16bit) * 8); #4 or 2 byte * 8 banks
  1841. print "[Debug] dram_rank0_size: $dram_rank0_size\n";
  1842. }
  1843. else
  1844. {
  1845. $dram_rank0_size += ($ch1_rank0_size * 256 << 20);
  1846. }
  1847. if (0 != ($hex_CONA & (1 << 16))) #rank 1 exist
  1848. {
  1849. if($ch1_rank1_size == 0)
  1850. {
  1851. $col_bit = (($hex_CONA >> 22) & 0x03) + 9;
  1852. $row_bit = ((($hex_CONH >> 5) & 0x1) << 2) + (($hex_CONA >> 30) & 0x03) + 13;
  1853. $dram_rank1_size += ((1 << ($row_bit + $col_bit)) * (4 >> $shift_for_16bit) * 8); #4 or 2 byte * 8 banks
  1854. print "[Debug] dram_rank1_size: $dram_rank1_size\n";
  1855. }
  1856. else
  1857. {
  1858. $dram_rank1_size += ($ch1_rank1_size * 256 << 20);
  1859. }
  1860. }
  1861. }
  1862. if((($hex_CONA >> 8) & 0x01) >= 2) # for qual channel
  1863. {
  1864. $dram_rank0_size = $dram_rank0_size * 2;
  1865. $dram_rank1_size = $dram_rank1_size * 2;
  1866. }
  1867. print "[Debug] DRAM rank0 size: $dram_rank0_size, DRAM rank1 size: $dram_rank1_size\n";
  1868. $mdl_r0_size = hex($DRAM_RANK0_SIZE[$id]);
  1869. $mdl_r1_size = hex($DRAM_RANK1_SIZE[$id]);
  1870. print "[Debug] DRAM_RANK0_SIZE: $mdl_r0_size, DRAM_RANK1_SIZE: $mdl_r1_size\n";
  1871. if (($mdl_r0_size != $dram_rank0_size) || ($mdl_r1_size != $dram_rank1_size))
  1872. {
  1873. die "[Error][DRAMC] DRAM size settings incorrect between EMI CONA/CONH and MDL Density !!!\n";
  1874. }
  1875. }
  1876. #****************************************************************************************
  1877. # subroutine: OsName
  1878. # return: which os this script is running
  1879. # input: no input
  1880. #****************************************************************************************
  1881. sub OsName {
  1882. my $os = `set os`;
  1883. if(!defined $os) {
  1884. $os = "linux";
  1885. }
  1886. else {
  1887. die "[Error]does not support windows now!!" ;
  1888. $os = "windows";
  1889. }
  1890. }
  1891. #*************************************************************************************************
  1892. # subroutine: gen_pm
  1893. # return: no return, but will generate a ForWindows.pm in "/perl/lib" where your perl install
  1894. #*************************************************************************************************
  1895. sub gen_pm {
  1896. foreach (@INC) {
  1897. if(/^.*:\/Perl\/lib$/) {
  1898. open FILE, ">${_}\/ForWindows.pm";
  1899. print FILE "package ForWindows;\n";
  1900. print FILE "use Win32::OLE qw(in with);\n";
  1901. print FILE "use Win32::OLE::Const 'Microsoft Excel';\n";
  1902. print FILE "\$Win32::OLE::Warn = 3;\n";
  1903. print FILE "1;";
  1904. close(FILE);
  1905. last;
  1906. }
  1907. }
  1908. }
  1909. #****************************************************************************************
  1910. # subroutine: get_sheet
  1911. # return: Excel worksheet no matter it's in merge area or not, and in windows or not
  1912. # input: Specified Excel Sheetname
  1913. #****************************************************************************************
  1914. sub get_sheet {
  1915. my $MEMORY_DEVICE_TYPE = $_[0];
  1916. print $MEMORY_DEVICE_TYPE ;
  1917. if ($os eq "windows") {
  1918. return $Sheet = $Book->Worksheets($MEMORY_DEVICE_TYPE);
  1919. }
  1920. else {
  1921. return $Sheet = $Book->Worksheet($MEMORY_DEVICE_TYPE);
  1922. }
  1923. }
  1924. #****************************************************************************************
  1925. # subroutine: xls_cell_value
  1926. # return: Excel cell value no matter it's in merge area or not, and in windows or not
  1927. # input: $Sheet: Specified Excel Sheet
  1928. # input: $row: Specified row number
  1929. # input: $col: Specified column number
  1930. #****************************************************************************************
  1931. sub xls_cell_value {
  1932. my ($Sheet, $row, $col) = @_;
  1933. if ($os eq "windows") {
  1934. return &trim(&win_xls_cell_value($Sheet, $row, $col));
  1935. }
  1936. else {
  1937. return &trim(&lin_xls_cell_value($Sheet, $row, $col));
  1938. }
  1939. }
  1940. sub win_xls_cell_value
  1941. {
  1942. my ($Sheet, $row, $col) = @_;
  1943. if ($Sheet->Cells($row, $col)->{'MergeCells'})
  1944. {
  1945. my $ma = $Sheet->Cells($row, $col)->{'MergeArea'};
  1946. return ($ma->Cells(1, 1)->{'Value'});
  1947. }
  1948. else
  1949. {
  1950. return ($Sheet->Cells($row, $col)->{'Value'})
  1951. }
  1952. }
  1953. sub lin_xls_cell_value
  1954. {
  1955. my ($Sheet, $row, $col) = @_;
  1956. my $cell = $Sheet->get_cell($row, $col);
  1957. return "" unless (defined $cell);
  1958. my $value = $cell->Value();
  1959. }
  1960. sub write_tag()
  1961. {
  1962. my $project = lc($_[0]);
  1963. my $filesize = 0x0 ;
  1964. my $ddr = -1 ;
  1965. if (-e $INFO_TAG)
  1966. {
  1967. unlink ($INFO_TAG);
  1968. }
  1969. my $temp_path = `dirname $INFO_TAG`;
  1970. `mkdir -p $temp_path`;
  1971. open FILE,">$INFO_TAG";
  1972. print FILE pack("a24", "MTK_BLOADER_INFO_v30"); #MT6763
  1973. # print FILE pack("a24", "MTK_BLOADER_INFO_v00");
  1974. $filesize = $filesize + 24 ;
  1975. seek(FILE, 0x1b, 0);
  1976. $pre_bin = "preloader_${project}.bin";
  1977. print "PROJECT = $project, pre_bin = $pre_bin\n";
  1978. print FILE pack("a64", $pre_bin);
  1979. $filesize = $filesize + 64 ;
  1980. seek(FILE, 0x58, 0);
  1981. print FILE pack("H8", 56313136);
  1982. $filesize = $filesize + 4 ;
  1983. print FILE pack("H8", 22884433);
  1984. $filesize = $filesize + 4 ;
  1985. print FILE pack("H8", "90007000");
  1986. $filesize = $filesize + 4 ;
  1987. print FILE pack("a8", "MTK_BIN");
  1988. $filesize = $filesize + 8 ;
  1989. # print FILE pack("H8", bc000000);
  1990. seek(FILE,0x6c, 0);
  1991. # 1.LPDDR2/LPDDR3/LPDDR4/LPDDR4X/LPDDR4P discrete dram number >= 2
  1992. #[DEL] 2.LPDDR2 discrete dram > 0, LPDDR2 MCP > 0
  1993. #[DEL] 3.LPDDR3 discrete dram > 0, LPDDR3 MCP > 0
  1994. #[DEL] 4.LPDDR4 discrete dram > 0, LPDDR4 MCP > 0
  1995. #[DEL] 5.LPDDR4X discrete dram > 0, LPDDR4X MCP > 0
  1996. if (($Discrete_DDR >= 2))
  1997. #if (($Discrete_DDR >= 2) || (($DIS_LPDDR2 > 0) && ($MCP_LPDDR2 > 0)) || (($DIS_LPDDR3 > 0) && ($MCP_LPDDR3 > 0)))
  1998. {
  1999. print "[EMIgen] Have multiple discrete dram\n";
  2000. print FILE pack("L", $TotalCustemChips+1); # number of emi settings + 1 default value emi_settings.
  2001. }else
  2002. {
  2003. print FILE pack("L", $TotalCustemChips); # number of emi settings.
  2004. }
  2005. $filesize = $filesize + 4 ;
  2006. my $iter = 0 ;
  2007. # 1.LPDDR2/LPDDR3/LPDDR4/LPDDR4X/LPDDR4P discrete dram number >= 2
  2008. #[DEL] 2.LPDDR2 discrete dram > 0, LPDDR2 MCP > 0
  2009. #[DEL] 3.LPDDR3 discrete dram > 0, LPDDR3 MCP > 0
  2010. #[DEL] 4.LPDDR4 discrete dram > 0, LPDDR4 MCP > 0
  2011. #[DEL] 5.LPDDR4X discrete dram > 0, LPDDR4X MCP > 0
  2012. #[DEL] 6.LPDDR4P discrete dram > 0, LPDDR4P MCP > 0
  2013. if (($Discrete_DDR >= 2))
  2014. #if (($Discrete_DDR >= 2) || (($DIS_LPDDR2 > 0) && ($MCP_LPDDR2 > 0)) || (($DIS_LPDDR3 > 0) && ($MCP_LPDDR3 > 0)))
  2015. {
  2016. if ($DEV_TYPE2[0] eq "02")
  2017. {
  2018. $filesize = $filesize + &write_tag_one_element_default_LPDDR2() ;
  2019. }
  2020. elsif ($DEV_TYPE2[0] eq "03")
  2021. {
  2022. $filesize = $filesize + &write_tag_one_element_default_LPDDR3() ;
  2023. }
  2024. elsif ($DEV_TYPE2[0] eq "05")
  2025. {
  2026. $filesize = $filesize + &write_tag_one_element_default_LPDDR4() ;
  2027. }
  2028. elsif ($DEV_TYPE2[0] eq "06")
  2029. {
  2030. $filesize = $filesize + &write_tag_one_element_default_LPDDR4X() ;
  2031. }
  2032. elsif ($DEV_TYPE2[0] eq "07")
  2033. {
  2034. $filesize = $filesize + &write_tag_one_element_default_LPDDR4P() ;
  2035. }
  2036. }
  2037. for $iter (0..$TotalCustemChips-1)
  2038. {
  2039. # generate MCP dram
  2040. if ($DEV_TYPE1[$iter] != "00")
  2041. {
  2042. $filesize = $filesize + &write_tag_one_element ($iter) ;
  2043. }
  2044. }
  2045. for $iter (0..$TotalCustemChips-1)
  2046. {
  2047. # generate discrete dram
  2048. if ($DEV_TYPE1[$iter] == "00")
  2049. {
  2050. $filesize = $filesize + &write_tag_one_element ($iter) ;
  2051. }
  2052. }
  2053. # $filesize = $filesize + 4 ;
  2054. # print "2.file size is $filesize \n";
  2055. print FILE pack("L", $filesize) ;
  2056. close (FILE) ;
  2057. print "$INFO_TAG is generated!\n";
  2058. return ;
  2059. }
  2060. sub write_tag_one_element_default_LPDDR2()
  2061. {
  2062. my $id = $_[0];
  2063. my $fs = 0 ;
  2064. print "in write_tag_one_element_default_LPDDR2";
  2065. print FILE pack ("L", hex (lc("0x0"))) ; # Sub_version checking for flash tool
  2066. $fs = $fs + 4 ;
  2067. if ($DEV_TYPE1[0] eq "0F")
  2068. {
  2069. print FILE pack("L", hex("0x0F02")); #type
  2070. }
  2071. else
  2072. {
  2073. print FILE pack("L", hex("0x0002")); #type
  2074. }
  2075. $fs = $fs + 4 ;
  2076. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  2077. $fs = $fs + 4 ;
  2078. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  2079. $fs = $fs + 4 ;
  2080. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  2081. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2082. {
  2083. print FILE pack ("C", hex ($1)) ; #id
  2084. print FILE pack ("C", hex ($2)) ;
  2085. print FILE pack ("C", hex ($3)) ;
  2086. print FILE pack ("C", hex ($4)) ;
  2087. print FILE pack ("C", hex ($5)) ;
  2088. print FILE pack ("C", hex ($6)) ;
  2089. print FILE pack ("C", hex ($7)) ;
  2090. print FILE pack ("C", hex ($8)) ;
  2091. print FILE pack ("C", hex ($9)) ;
  2092. print FILE pack ("C", hex ($10)) ;
  2093. print FILE pack ("C", hex ($11)) ;
  2094. print FILE pack ("C", hex ($12)) ;
  2095. print FILE pack ("C", hex ($13)) ;
  2096. print FILE pack ("C", hex ($14)) ;
  2097. print FILE pack ("C", hex ($15)) ;
  2098. print FILE pack ("C", hex ($16)) ;
  2099. $fs = $fs + 16 ;
  2100. }
  2101. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  2102. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2103. {
  2104. print FILE pack ("C", hex ($1)) ; #fw id
  2105. print FILE pack ("C", hex ($2)) ;
  2106. print FILE pack ("C", hex ($3)) ;
  2107. print FILE pack ("C", hex ($4)) ;
  2108. print FILE pack ("C", hex ($5)) ;
  2109. print FILE pack ("C", hex ($6)) ;
  2110. print FILE pack ("C", hex ($7)) ;
  2111. print FILE pack ("C", hex ($8)) ;
  2112. $fs = $fs + 8 ;
  2113. }
  2114. print FILE pack ("L", hex (lc("0x0000212E"))) ; # EMI_CONA_VAL
  2115. $fs = $fs + 4 ;
  2116. print FILE pack ("L", hex (lc("0xAA00AA00"))) ; # DRAMC_DRVCTL0_VAL
  2117. $fs = $fs + 4 ;
  2118. print FILE pack ("L", hex (lc("0xAA00AA00"))) ; # DRAMC_DRVCTL1_VAL
  2119. $fs = $fs + 4 ;
  2120. print FILE pack ("L", hex (lc("0x44584493"))) ; # DRAMC_ACTIM_VAL
  2121. $fs = $fs + 4 ;
  2122. print FILE pack ("L", hex (lc("0x01000000"))) ; # DRAMC_GDDR3CTL1_VAL
  2123. $fs = $fs + 4 ;
  2124. print FILE pack ("L", hex (lc("0xF0048683"))) ; # DRAMC_CONF1_VAL
  2125. $fs = $fs + 4 ;
  2126. print FILE pack ("L", hex (lc("0xA00632D1"))) ; # DRAMC_DDR2CTL_VAL
  2127. $fs = $fs + 4 ;
  2128. print FILE pack ("L", hex (lc("0xBF080401"))) ; # DRAMC_TEST2_3_VAL
  2129. $fs = $fs + 4 ;
  2130. print FILE pack ("L", hex (lc("0x0340633F"))) ; # DRAMC_CONF2_VAL
  2131. $fs = $fs + 4 ;
  2132. print FILE pack ("L", hex (lc("0x51642342"))) ; # DRAMC_PD_CTRL_VAL
  2133. $fs = $fs + 4 ;
  2134. print FILE pack ("L", hex (lc("0x00008888"))) ; # DRAMC_PADCTL3_VAL
  2135. $fs = $fs + 4 ;
  2136. print FILE pack ("L", hex (lc("0x88888888"))) ; # DRAMC_DQODLY_VAL
  2137. $fs = $fs + 4 ;
  2138. print FILE pack ("L", hex (lc("0x00000000"))) ; # DRAMC_ADDR_OUTPUT_DLY
  2139. $fs = $fs + 4 ;
  2140. print FILE pack ("L", hex (lc("0x00000000"))) ; # DRAMC_CLK_OUTPUT_DLY
  2141. $fs = $fs + 4 ;
  2142. print FILE pack ("L", hex (lc("0x01000510"))) ; # $DRAMC_ACTIM1_VAL
  2143. $fs = $fs + 4 ;
  2144. print FILE pack ("L", hex (lc("0x07800000"))) ; # DRAMC_MISCTL0_VAL
  2145. $fs = $fs + 4 ;
  2146. print FILE pack ("L", hex (lc("0x04002600"))) ; # $DRAMC_ACTIM05T_VAL
  2147. $fs = $fs + 4 ;
  2148. print FILE pack ("Q", hex ("0")) ; # DRAM_RANK_SIZE[4]
  2149. print FILE pack ("Q", hex ("0")) ;
  2150. print FILE pack ("Q", hex ("0")) ;
  2151. print FILE pack ("Q", hex ("0")) ;
  2152. $fs = $fs + 32 ;
  2153. print FILE pack ("L", hex ("0")) ; #reserved[10]
  2154. print FILE pack ("L", hex ("0")) ;
  2155. print FILE pack ("L", hex ("0")) ;
  2156. print FILE pack ("L", hex ("0")) ;
  2157. print FILE pack ("L", hex ("0")) ;
  2158. print FILE pack ("L", hex ("0")) ;
  2159. print FILE pack ("L", hex ("0")) ;
  2160. print FILE pack ("L", hex ("0")) ;
  2161. print FILE pack ("L", hex ("0")) ;
  2162. print FILE pack ("L", hex ("0")) ;
  2163. $fs = $fs + 40 ;
  2164. if (1)
  2165. {
  2166. #ddr2
  2167. print FILE pack ("L", hex (lc("0x00C30001"))) ; # DDR2_MODE_REG1
  2168. $fs = $fs + 4 ;
  2169. print FILE pack ("L", hex (lc("0x00060002"))) ; # DDR2_MODE_REG2
  2170. $fs = $fs + 4 ;
  2171. print FILE pack ("L", hex (lc("0x00020003"))) ; # DDR2_MODE_REG3
  2172. $fs = $fs + 4 ;
  2173. print FILE pack ("L", hex (lc("0x0"))) ; # DDR2_MODE_REG5
  2174. $fs = $fs + 4 ;
  2175. print FILE pack ("L", hex (lc("0x00FF000A"))) ; # DDR2_MODE_REG10
  2176. $fs = $fs + 4 ;
  2177. print FILE pack ("L", hex (lc("0x0000003F"))) ; # DDR2_MODE_REG63
  2178. $fs = $fs + 4 ;
  2179. }
  2180. # print "1.file size is $fs \n";
  2181. return $fs;
  2182. }
  2183. sub write_tag_one_element_default_LPDDR3()
  2184. {
  2185. my $id = $_[0];
  2186. my $fs = 0 ;
  2187. print "in write_tag_one_element_default_LPDDR3";
  2188. print FILE pack ("L", hex (lc("0x1"))) ; # Sub_version checking for flash tool
  2189. $fs = $fs + 4 ;
  2190. print FILE pack("L", hex("0x0003")); #type
  2191. $fs = $fs + 4 ;
  2192. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  2193. $fs = $fs + 4 ;
  2194. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  2195. $fs = $fs + 4 ;
  2196. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  2197. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2198. {
  2199. print FILE pack ("C", hex ($1)) ; #id
  2200. print FILE pack ("C", hex ($2)) ;
  2201. print FILE pack ("C", hex ($3)) ;
  2202. print FILE pack ("C", hex ($4)) ;
  2203. print FILE pack ("C", hex ($5)) ;
  2204. print FILE pack ("C", hex ($6)) ;
  2205. print FILE pack ("C", hex ($7)) ;
  2206. print FILE pack ("C", hex ($8)) ;
  2207. print FILE pack ("C", hex ($9)) ;
  2208. print FILE pack ("C", hex ($10)) ;
  2209. print FILE pack ("C", hex ($11)) ;
  2210. print FILE pack ("C", hex ($12)) ;
  2211. print FILE pack ("C", hex ($13)) ;
  2212. print FILE pack ("C", hex ($14)) ;
  2213. print FILE pack ("C", hex ($15)) ;
  2214. print FILE pack ("C", hex ($16)) ;
  2215. $fs = $fs + 16 ;
  2216. }
  2217. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  2218. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2219. {
  2220. print FILE pack ("C", hex ($1)) ; #fw id
  2221. print FILE pack ("C", hex ($2)) ;
  2222. print FILE pack ("C", hex ($3)) ;
  2223. print FILE pack ("C", hex ($4)) ;
  2224. print FILE pack ("C", hex ($5)) ;
  2225. print FILE pack ("C", hex ($6)) ;
  2226. print FILE pack ("C", hex ($7)) ;
  2227. print FILE pack ("C", hex ($8)) ;
  2228. $fs = $fs + 8 ;
  2229. }
  2230. print FILE pack ("L", hex (lc("0x0000a052"))) ; # EMI_CONA_VAL
  2231. $fs = $fs + 4 ;
  2232. print FILE pack ("L", hex (lc("0x00000000"))) ; # EMI_CONH_VAL
  2233. $fs = $fs + 4 ;
  2234. print FILE pack ("L", hex (lc("0x070C03A5"))) ; # AC Timing U 00
  2235. $fs = $fs + 4 ;
  2236. print FILE pack ("L", hex (lc("0x1F571801"))) ; # AC Timing U 01
  2237. $fs = $fs + 4 ;
  2238. print FILE pack ("L", hex (lc("0x0D070301"))) ; # AC Timing U 02
  2239. $fs = $fs + 4 ;
  2240. print FILE pack ("L", hex (lc("0x060F0407"))) ; # AC Timing U 03
  2241. $fs = $fs + 4 ;
  2242. print FILE pack ("L", hex (lc("0x28646570"))) ; # AC Timing U 04
  2243. $fs = $fs + 4 ;
  2244. print FILE pack ("L", hex (lc("0x01055054"))) ; # AC Timing U 05
  2245. $fs = $fs + 4 ;
  2246. print FILE pack ("L", hex (lc("0x00000000"))) ; # AC Timing U 06
  2247. $fs = $fs + 4 ;
  2248. print FILE pack ("L", hex (lc("0x00000000"))) ; # AC Timing U 07
  2249. $fs = $fs + 4 ;
  2250. print FILE pack ("Q", hex ("0")) ; # DRAM_RANK_SIZE[4]
  2251. print FILE pack ("Q", hex ("0")) ;
  2252. print FILE pack ("Q", hex ("0")) ;
  2253. print FILE pack ("Q", hex ("0")) ;
  2254. $fs = $fs + 32 ;
  2255. print FILE pack ("L", hex (lc("0x00421000"))) ; # EMI_CONF_VAL
  2256. $fs = $fs + 4 ;
  2257. print FILE pack ("L", hex (lc("0x0000a052"))) ; # CHN0_EMI_CONA_VAL
  2258. $fs = $fs + 4 ;
  2259. print FILE pack ("L", hex (lc("0x00000002"))) ; # CHN1_EMI_CONA_VAL
  2260. $fs = $fs + 4 ;
  2261. print FILE pack ("L", hex (lc("CBT_R0_R1_NORMAL"))) ; # MODE_EXTERN_VAL
  2262. $fs = $fs + 4 ;
  2263. print FILE pack ("L", hex ("0")) ; #reserved[6]
  2264. print FILE pack ("L", hex ("0")) ;
  2265. print FILE pack ("L", hex ("0")) ;
  2266. print FILE pack ("L", hex ("0")) ;
  2267. print FILE pack ("L", hex ("0")) ;
  2268. print FILE pack ("L", hex ("0")) ;
  2269. $fs = $fs + 24 ;
  2270. print FILE pack ("L", hex (lc("0x0"))) ; # DDR2_MODE_REG5
  2271. $fs = $fs + 4 ;
  2272. print FILE pack ("L", hex (lc("0x0"))) ; # pin-mux type for tablet
  2273. $fs = $fs + 4 ;
  2274. # print "1.file size is $fs \n";
  2275. return $fs;
  2276. }
  2277. sub write_tag_one_element_default_LPDDR4()
  2278. {
  2279. my $id = $_[0];
  2280. my $fs = 0 ;
  2281. print "in write_tag_one_element_default_LPDDR4";
  2282. print FILE pack ("L", hex (lc("0x1"))) ; # Sub_version checking for flash tool
  2283. $fs = $fs + 4 ;
  2284. print FILE pack("L", hex("0x0005")); #type
  2285. $fs = $fs + 4 ;
  2286. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  2287. $fs = $fs + 4 ;
  2288. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  2289. $fs = $fs + 4 ;
  2290. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  2291. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2292. {
  2293. print FILE pack ("C", hex ($1)) ; #id
  2294. print FILE pack ("C", hex ($2)) ;
  2295. print FILE pack ("C", hex ($3)) ;
  2296. print FILE pack ("C", hex ($4)) ;
  2297. print FILE pack ("C", hex ($5)) ;
  2298. print FILE pack ("C", hex ($6)) ;
  2299. print FILE pack ("C", hex ($7)) ;
  2300. print FILE pack ("C", hex ($8)) ;
  2301. print FILE pack ("C", hex ($9)) ;
  2302. print FILE pack ("C", hex ($10)) ;
  2303. print FILE pack ("C", hex ($11)) ;
  2304. print FILE pack ("C", hex ($12)) ;
  2305. print FILE pack ("C", hex ($13)) ;
  2306. print FILE pack ("C", hex ($14)) ;
  2307. print FILE pack ("C", hex ($15)) ;
  2308. print FILE pack ("C", hex ($16)) ;
  2309. $fs = $fs + 16 ;
  2310. }
  2311. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  2312. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2313. {
  2314. print FILE pack ("C", hex ($1)) ; #fw id
  2315. print FILE pack ("C", hex ($2)) ;
  2316. print FILE pack ("C", hex ($3)) ;
  2317. print FILE pack ("C", hex ($4)) ;
  2318. print FILE pack ("C", hex ($5)) ;
  2319. print FILE pack ("C", hex ($6)) ;
  2320. print FILE pack ("C", hex ($7)) ;
  2321. print FILE pack ("C", hex ($8)) ;
  2322. $fs = $fs + 8 ;
  2323. }
  2324. print FILE pack ("L", hex (lc("0xf050f154"))) ; # EMI_CONA_VAL
  2325. # print FILE pack ("L", hex (lc("0x0000f050"))) ; # EMI_CONA_VAL
  2326. $fs = $fs + 4 ;
  2327. print FILE pack ("L", hex (lc("0x00000000"))) ; # EMI_CONH_VAL
  2328. $fs = $fs + 4 ;
  2329. print FILE pack ("L", hex (lc("0x06090640"))) ; # AC Timing U 00
  2330. $fs = $fs + 4 ;
  2331. print FILE pack ("L", hex (lc("0x113D1101"))) ; # AC Timing U 01
  2332. $fs = $fs + 4 ;
  2333. print FILE pack ("L", hex (lc("0x0D060301"))) ; # AC Timing U 02
  2334. $fs = $fs + 4 ;
  2335. print FILE pack ("L", hex (lc("0x99080307"))) ; # AC Timing U 03
  2336. $fs = $fs + 4 ;
  2337. print FILE pack ("L", hex (lc("0x224E6561"))) ; # AC Timing U 04
  2338. $fs = $fs + 4 ;
  2339. print FILE pack ("L", hex (lc("0x0B0B0C0C"))) ; # AC Timing U 05
  2340. $fs = $fs + 4 ;
  2341. print FILE pack ("L", hex (lc("0x00054045"))) ; # AC Timing U 06
  2342. $fs = $fs + 4 ;
  2343. print FILE pack ("L", hex (lc("0x00000000"))) ; # AC Timing U 07
  2344. $fs = $fs + 4 ;
  2345. print FILE pack ("Q", hex ("0")) ; # DRAM_RANK_SIZE[4]
  2346. print FILE pack ("Q", hex ("0")) ;
  2347. print FILE pack ("Q", hex ("0")) ;
  2348. print FILE pack ("Q", hex ("0")) ;
  2349. $fs = $fs + 32 ;
  2350. print FILE pack ("L", hex (lc("0x00042100"))) ; # EMI_CONF_VAL
  2351. $fs = $fs + 4 ;
  2352. print FILE pack ("L", hex (lc("0x0400f050"))) ; # CHN0_EMI_CONA_VAL
  2353. $fs = $fs + 4 ;
  2354. # print FILE pack ("L", hex (lc("0x0400f050"))) ; # CHN1_EMI_CONA_VAL
  2355. print FILE pack ("L", hex (lc("0x04000000"))) ; # CHN1_EMI_CONA_VAL
  2356. $fs = $fs + 4 ;
  2357. print FILE pack ("L", hex (lc("CBT_R0_R1_BYTE"))) ; # MODE_EXTERN_VAL
  2358. $fs = $fs + 4 ;
  2359. print FILE pack ("L", hex ("0")) ; #reserved[6]
  2360. print FILE pack ("L", hex ("0")) ;
  2361. print FILE pack ("L", hex ("0")) ;
  2362. print FILE pack ("L", hex ("0")) ;
  2363. print FILE pack ("L", hex ("0")) ;
  2364. print FILE pack ("L", hex ("0")) ;
  2365. $fs = $fs + 24 ;
  2366. print FILE pack ("L", hex (lc("0x0"))) ; # DDR2_MODE_REG5
  2367. $fs = $fs + 4 ;
  2368. print FILE pack ("L", hex (lc("0x0"))) ; # pin-mux type for tablet
  2369. $fs = $fs + 4 ;
  2370. # print "1.file size is $fs \n";
  2371. return $fs;
  2372. }
  2373. sub write_tag_one_element_default_LPDDR4X()
  2374. {
  2375. my $id = $_[0];
  2376. my $fs = 0 ;
  2377. print "in write_tag_one_element_default_LPDDR4X";
  2378. print FILE pack ("L", hex (lc("0x1"))) ; # Sub_version checking for flash tool
  2379. $fs = $fs + 4 ;
  2380. print FILE pack("L", hex("0x0006")); #type
  2381. $fs = $fs + 4 ;
  2382. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  2383. $fs = $fs + 4 ;
  2384. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  2385. $fs = $fs + 4 ;
  2386. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  2387. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2388. {
  2389. print FILE pack ("C", hex ($1)) ; #id
  2390. print FILE pack ("C", hex ($2)) ;
  2391. print FILE pack ("C", hex ($3)) ;
  2392. print FILE pack ("C", hex ($4)) ;
  2393. print FILE pack ("C", hex ($5)) ;
  2394. print FILE pack ("C", hex ($6)) ;
  2395. print FILE pack ("C", hex ($7)) ;
  2396. print FILE pack ("C", hex ($8)) ;
  2397. print FILE pack ("C", hex ($9)) ;
  2398. print FILE pack ("C", hex ($10)) ;
  2399. print FILE pack ("C", hex ($11)) ;
  2400. print FILE pack ("C", hex ($12)) ;
  2401. print FILE pack ("C", hex ($13)) ;
  2402. print FILE pack ("C", hex ($14)) ;
  2403. print FILE pack ("C", hex ($15)) ;
  2404. print FILE pack ("C", hex ($16)) ;
  2405. $fs = $fs + 16 ;
  2406. }
  2407. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  2408. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2409. {
  2410. print FILE pack ("C", hex ($1)) ; #fw id
  2411. print FILE pack ("C", hex ($2)) ;
  2412. print FILE pack ("C", hex ($3)) ;
  2413. print FILE pack ("C", hex ($4)) ;
  2414. print FILE pack ("C", hex ($5)) ;
  2415. print FILE pack ("C", hex ($6)) ;
  2416. print FILE pack ("C", hex ($7)) ;
  2417. print FILE pack ("C", hex ($8)) ;
  2418. $fs = $fs + 8 ;
  2419. }
  2420. print FILE pack ("L", hex (lc("0x0000f050"))) ; # EMI_CONA_VAL
  2421. $fs = $fs + 4 ;
  2422. print FILE pack ("L", hex (lc("0x00000000"))) ; # EMI_CONH_VAL
  2423. $fs = $fs + 4 ;
  2424. print FILE pack ("L", hex (lc("0x06090640"))) ; # AC Timing U 00
  2425. $fs = $fs + 4 ;
  2426. print FILE pack ("L", hex (lc("0x113D1101"))) ; # AC Timing U 01
  2427. $fs = $fs + 4 ;
  2428. print FILE pack ("L", hex (lc("0x0D060301"))) ; # AC Timing U 02
  2429. $fs = $fs + 4 ;
  2430. print FILE pack ("L", hex (lc("0x99080307"))) ; # AC Timing U 03
  2431. $fs = $fs + 4 ;
  2432. print FILE pack ("L", hex (lc("0x224E6561"))) ; # AC Timing U 04
  2433. $fs = $fs + 4 ;
  2434. print FILE pack ("L", hex (lc("0x0B0B0C0C"))) ; # AC Timing U 05
  2435. $fs = $fs + 4 ;
  2436. print FILE pack ("L", hex (lc("0x00054045"))) ; # AC Timing U 06
  2437. $fs = $fs + 4 ;
  2438. print FILE pack ("L", hex (lc("0x00000000"))) ; # AC Timing U 07
  2439. $fs = $fs + 4 ;
  2440. print FILE pack ("Q", hex ("0")) ; # DRAM_RANK_SIZE[4]
  2441. print FILE pack ("Q", hex ("0")) ;
  2442. print FILE pack ("Q", hex ("0")) ;
  2443. print FILE pack ("Q", hex ("0")) ;
  2444. $fs = $fs + 32 ;
  2445. print FILE pack ("L", hex (lc("0x00042100"))) ; # EMI_CONF_VAL
  2446. $fs = $fs + 4 ;
  2447. print FILE pack ("L", hex (lc("0x0400f050"))) ; # CHN0_EMI_CONA_VAL
  2448. $fs = $fs + 4 ;
  2449. print FILE pack ("L", hex (lc("0x04000000"))) ; # CHN1_EMI_CONA_VAL
  2450. $fs = $fs + 4 ;
  2451. print FILE pack ("L", hex (lc("CBT_R0_R1_NORMAL"))) ; # MODE_EXTERN_VAL
  2452. $fs = $fs + 4 ;
  2453. print FILE pack ("L", hex ("0")) ; #reserved[6]
  2454. print FILE pack ("L", hex ("0")) ;
  2455. print FILE pack ("L", hex ("0")) ;
  2456. print FILE pack ("L", hex ("0")) ;
  2457. print FILE pack ("L", hex ("0")) ;
  2458. print FILE pack ("L", hex ("0")) ;
  2459. $fs = $fs + 24 ;
  2460. print FILE pack ("L", hex (lc("0x0"))) ; # DDR2_MODE_REG5
  2461. $fs = $fs + 4 ;
  2462. print FILE pack ("L", hex (lc("0x0"))) ; # pin-mux type for tablet
  2463. $fs = $fs + 4 ;
  2464. # print "1.file size is $fs \n";
  2465. return $fs;
  2466. }
  2467. sub write_tag_one_element_default_LPDDR4P()
  2468. {
  2469. my $id = $_[0];
  2470. my $fs = 0 ;
  2471. print "in write_tag_one_element_default_LPDDR4P";
  2472. print FILE pack ("L", hex (lc("0x1"))) ; # Sub_version checking for flash tool
  2473. $fs = $fs + 4 ;
  2474. print FILE pack("L", hex("0x0007")); #type
  2475. $fs = $fs + 4 ;
  2476. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  2477. $fs = $fs + 4 ;
  2478. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  2479. $fs = $fs + 4 ;
  2480. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  2481. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2482. {
  2483. print FILE pack ("C", hex ($1)) ; #id
  2484. print FILE pack ("C", hex ($2)) ;
  2485. print FILE pack ("C", hex ($3)) ;
  2486. print FILE pack ("C", hex ($4)) ;
  2487. print FILE pack ("C", hex ($5)) ;
  2488. print FILE pack ("C", hex ($6)) ;
  2489. print FILE pack ("C", hex ($7)) ;
  2490. print FILE pack ("C", hex ($8)) ;
  2491. print FILE pack ("C", hex ($9)) ;
  2492. print FILE pack ("C", hex ($10)) ;
  2493. print FILE pack ("C", hex ($11)) ;
  2494. print FILE pack ("C", hex ($12)) ;
  2495. print FILE pack ("C", hex ($13)) ;
  2496. print FILE pack ("C", hex ($14)) ;
  2497. print FILE pack ("C", hex ($15)) ;
  2498. print FILE pack ("C", hex ($16)) ;
  2499. $fs = $fs + 16 ;
  2500. }
  2501. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  2502. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2503. {
  2504. print FILE pack ("C", hex ($1)) ; #fw id
  2505. print FILE pack ("C", hex ($2)) ;
  2506. print FILE pack ("C", hex ($3)) ;
  2507. print FILE pack ("C", hex ($4)) ;
  2508. print FILE pack ("C", hex ($5)) ;
  2509. print FILE pack ("C", hex ($6)) ;
  2510. print FILE pack ("C", hex ($7)) ;
  2511. print FILE pack ("C", hex ($8)) ;
  2512. $fs = $fs + 8 ;
  2513. }
  2514. print FILE pack ("L", hex (lc("0x0000f050"))) ; # EMI_CONA_VAL
  2515. $fs = $fs + 4 ;
  2516. print FILE pack ("L", hex (lc("0x00000000"))) ; # EMI_CONH_VAL
  2517. $fs = $fs + 4 ;
  2518. print FILE pack ("L", hex (lc("0x06090640"))) ; # AC Timing U 00
  2519. $fs = $fs + 4 ;
  2520. print FILE pack ("L", hex (lc("0x113D1101"))) ; # AC Timing U 01
  2521. $fs = $fs + 4 ;
  2522. print FILE pack ("L", hex (lc("0x0D060301"))) ; # AC Timing U 02
  2523. $fs = $fs + 4 ;
  2524. print FILE pack ("L", hex (lc("0x99080307"))) ; # AC Timing U 03
  2525. $fs = $fs + 4 ;
  2526. print FILE pack ("L", hex (lc("0x224E6561"))) ; # AC Timing U 04
  2527. $fs = $fs + 4 ;
  2528. print FILE pack ("L", hex (lc("0x0B0B0C0C"))) ; # AC Timing U 05
  2529. $fs = $fs + 4 ;
  2530. print FILE pack ("L", hex (lc("0x00054045"))) ; # AC Timing U 06
  2531. $fs = $fs + 4 ;
  2532. print FILE pack ("L", hex (lc("0x00000000"))) ; # AC Timing U 07
  2533. $fs = $fs + 4 ;
  2534. print FILE pack ("Q", hex ("0")) ; # DRAM_RANK_SIZE[4]
  2535. print FILE pack ("Q", hex ("0")) ;
  2536. print FILE pack ("Q", hex ("0")) ;
  2537. print FILE pack ("Q", hex ("0")) ;
  2538. $fs = $fs + 32 ;
  2539. print FILE pack ("L", hex (lc("0x00042100"))) ; # EMI_CONF_VAL
  2540. $fs = $fs + 4 ;
  2541. print FILE pack ("L", hex (lc("0x0400f050"))) ; # CHN0_EMI_CONA_VAL
  2542. $fs = $fs + 4 ;
  2543. print FILE pack ("L", hex (lc("0x04000000"))) ; # CHN1_EMI_CONA_VAL
  2544. $fs = $fs + 4 ;
  2545. print FILE pack ("L", hex (lc("CBT_R0_R1_NORMAL"))) ; # MODE_EXTERN_VAL
  2546. $fs = $fs + 4 ;
  2547. print FILE pack ("L", hex ("0")) ; #reserved[6]
  2548. print FILE pack ("L", hex ("0")) ;
  2549. print FILE pack ("L", hex ("0")) ;
  2550. print FILE pack ("L", hex ("0")) ;
  2551. print FILE pack ("L", hex ("0")) ;
  2552. print FILE pack ("L", hex ("0")) ;
  2553. $fs = $fs + 24 ;
  2554. print FILE pack ("L", hex (lc("0x0"))) ; # DDR2_MODE_REG5
  2555. $fs = $fs + 4 ;
  2556. print FILE pack ("L", hex (lc("0x0"))) ; # pin-mux type for tablet
  2557. $fs = $fs + 4 ;
  2558. # print "1.file size is $fs \n";
  2559. return $fs;
  2560. }
  2561. sub write_tag_one_element()
  2562. {
  2563. my $id = $_[0];
  2564. my $type = "0x$DEV_TYPE1[$id]$DEV_TYPE2[$id]" ;
  2565. my $fs = 0 ;
  2566. print FILE pack ("L", hex (lc($Sub_version[$id]))) ; # Sub_version checking for flash tool
  2567. $fs = $fs + 4 ;
  2568. print FILE pack("L", hex($type)); #type
  2569. $fs = $fs + 4 ;
  2570. print FILE pack ("L", scalar($ID_Length[$id])) ; # EMMC ID checking length
  2571. $fs = $fs + 4 ;
  2572. print FILE pack ("L", scalar($FW_ID_Length[$id])) ; # FW ID checking length
  2573. $fs = $fs + 4 ;
  2574. $_ = $ID_String[$id] ;
  2575. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2576. {
  2577. print FILE pack ("C", hex ($1)) ; #id
  2578. print FILE pack ("C", hex ($2)) ;
  2579. print FILE pack ("C", hex ($3)) ;
  2580. print FILE pack ("C", hex ($4)) ;
  2581. print FILE pack ("C", hex ($5)) ;
  2582. print FILE pack ("C", hex ($6)) ;
  2583. print FILE pack ("C", hex ($7)) ;
  2584. print FILE pack ("C", hex ($8)) ;
  2585. print FILE pack ("C", hex ($9)) ;
  2586. print FILE pack ("C", hex ($10)) ;
  2587. print FILE pack ("C", hex ($11)) ;
  2588. print FILE pack ("C", hex ($12)) ;
  2589. print FILE pack ("C", hex ($13)) ;
  2590. print FILE pack ("C", hex ($14)) ;
  2591. print FILE pack ("C", hex ($15)) ;
  2592. print FILE pack ("C", hex ($16)) ;
  2593. $fs = $fs + 16 ;
  2594. }
  2595. $_= $FW_ID_String[$id];
  2596. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  2597. {
  2598. print FILE pack ("C", hex ($1)) ; #fw id
  2599. print FILE pack ("C", hex ($2)) ;
  2600. print FILE pack ("C", hex ($3)) ;
  2601. print FILE pack ("C", hex ($4)) ;
  2602. print FILE pack ("C", hex ($5)) ;
  2603. print FILE pack ("C", hex ($6)) ;
  2604. print FILE pack ("C", hex ($7)) ;
  2605. print FILE pack ("C", hex ($8)) ;
  2606. $fs = $fs + 8 ;
  2607. }
  2608. print FILE pack ("L", hex (lc($EMI_CONA_VAL[$id]))) ; # EMI_CONA_VAL
  2609. $fs = $fs + 4 ;
  2610. print FILE pack ("L", hex (lc($EMI_CONH_VAL[$id]))) ; # EMI_CONH_VAL
  2611. $fs = $fs + 4 ;
  2612. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][0]))) ; # AC Timing U 00
  2613. $fs = $fs + 4 ;
  2614. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][1]))) ; # AC Timing U 01
  2615. $fs = $fs + 4 ;
  2616. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][2]))) ; # AC Timing U 02
  2617. $fs = $fs + 4 ;
  2618. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][3]))) ; # AC Timing U 03
  2619. $fs = $fs + 4 ;
  2620. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][4]))) ; # AC Timing U 04
  2621. $fs = $fs + 4 ;
  2622. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][5]))) ; # AC Timing U 05
  2623. $fs = $fs + 4 ;
  2624. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][6]))) ; # AC Timing U 06
  2625. $fs = $fs + 4 ;
  2626. print FILE pack ("L", hex (lc($AC_TIME_VALUE[$id][7]))) ; # AC Timing U 07
  2627. $fs = $fs + 4 ;
  2628. print FILE pack ("Q", hex (lc($DRAM_RANK0_SIZE[$id]))) ; # DRAM_RANK_SIZE[4]
  2629. print FILE pack ("Q", hex (lc($DRAM_RANK1_SIZE[$id]))) ;
  2630. print FILE pack ("Q", hex ("0")) ;
  2631. print FILE pack ("Q", hex ("0")) ;
  2632. $fs = $fs + 32 ;
  2633. print FILE pack ("L", hex (lc($EMI_CONF_VAL[$id]))) ; # EMI_CONF_VAL
  2634. $fs = $fs + 4 ;
  2635. print FILE pack ("L", hex (lc($CHN0_EMI_CONA_VAL[$id]))) ; # CHN0_EMI_CONA_VAL
  2636. $fs = $fs + 4 ;
  2637. print FILE pack ("L", hex (lc($CHN1_EMI_CONA_VAL[$id]))) ; # CHN1_EMI_CONA_VAL
  2638. $fs = $fs + 4 ;
  2639. print FILE pack ("L", hex ($DIS_CBT_MODE_EXTERN_TYPE[$id])) ; # DIS_CBT_MODE_EXTERN
  2640. $fs = $fs + 4 ;
  2641. print FILE pack ("L", hex ("0")) ; #reserved[6]
  2642. print FILE pack ("L", hex ("0")) ;
  2643. print FILE pack ("L", hex ("0")) ;
  2644. print FILE pack ("L", hex ("0")) ;
  2645. print FILE pack ("L", hex ("0")) ;
  2646. print FILE pack ("L", hex ("0")) ;
  2647. $fs = $fs + 24 ;
  2648. if ($DEV_TYPE2[$id] == "03")
  2649. {
  2650. #ddr3
  2651. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG5[$id]))) ; # LPDDR3_MODE_REG5
  2652. $fs = $fs + 4 ;
  2653. }
  2654. elsif ($DEV_TYPE2[$id] == "05")
  2655. {
  2656. #ddr4
  2657. print FILE pack ("L", hex (lc($LPDDR4_MODE_REG5[$id]))) ; # LPDDR4_MODE_REG5
  2658. $fs = $fs + 4 ;
  2659. }
  2660. elsif ($DEV_TYPE2[$id] == "06")
  2661. {
  2662. #ddr4x
  2663. print FILE pack ("L", hex (lc($LPDDR4X_MODE_REG5[$id]))) ; # LPDDR4X_MODE_REG5
  2664. $fs = $fs + 4 ;
  2665. }
  2666. elsif ($DEV_TYPE2[$id] == "07")
  2667. {
  2668. #ddr4p
  2669. print FILE pack ("L", hex (lc($LPDDR4P_MODE_REG5[$id]))) ; # LPDDR4P_MODE_REG5
  2670. $fs = $fs + 4 ;
  2671. }
  2672. print FILE pack ("L", hex (lc($PIN_MUX_TYPE[$id]))) ; # pin mux type for tablet
  2673. $fs = $fs + 4 ;
  2674. # print "1.file size is $fs \n";
  2675. return $fs;
  2676. }