emigen.pl 111 KB

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