emigen.pl 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165
  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. ## option for early porting, only for build pass
  90. ## when this option is set 0, the emigen will generate a dummy custom_emi.c and custom_emi.h
  91. my $enable_EMIGEN=1;
  92. use File::Basename;
  93. my $os = &OsName();
  94. my $build_opt = $ARGV[5];
  95. my $start_num;
  96. BEGIN
  97. {
  98. $LOCAL_PATH = dirname($0);
  99. }
  100. print "LOCAL_PATH: $LOCAL_PATH\n";
  101. #use lib "$LOCAL_PATH/../Spreadsheet";
  102. use lib "$LOCAL_PATH/../";
  103. #require 'ParseExcel.pm';
  104. use pack_dep_gen;
  105. if ($os eq "windows")
  106. {
  107. use strict;
  108. &gen_pm;
  109. require 'ForWindows.pm';
  110. $Win32::OLE::Warn = 3;
  111. $start_num = 1;
  112. }
  113. elsif ($os eq "linux")
  114. {
  115. print "Os = linux\n";
  116. use lib "$LOCAL_PATH/../Spreadsheet";
  117. require 'ParseExcel.pm';
  118. $start_num = 0;
  119. }
  120. else
  121. {
  122. die "unknow OS!\n";
  123. }
  124. # Pregen:it needs pack_dep_gen.pm
  125. #use pack_dep_gen;
  126. #****************************************************************************
  127. # PLATFORM EMI support matrix
  128. #****************************************************************************
  129. my %BBtbl_LPSDRAM =
  130. (
  131. 'MT6755' => 1,
  132. );
  133. #****************************************************************************
  134. # Constants
  135. #****************************************************************************
  136. my $EMIGEN_VERNO = " V0.01";
  137. # V0.01, Zhen Jiang, Porting emigen to DUMA project
  138. #
  139. my $DebugPrint = 1; # 1 for debug; 0 for non-debug
  140. my $COLUMN_VENDOR = $start_num + 0;
  141. my $COLUMN_PART_NUMBER = $COLUMN_VENDOR + 1 ;
  142. my $COLUMN_TYPE = $COLUMN_PART_NUMBER + 1 ;
  143. my $COLUMN_DENSITY = $COLUMN_TYPE + 1 ;
  144. my $COLUMN_BOARD_ID = $COLUMN_DENSITY + 1 ;
  145. my $COLUMN_NAND_EMMC_ID = $COLUMN_BOARD_ID + 1 ;
  146. my $COLUMN_FW_ID = $COLUMN_NAND_EMMC_ID + 1 ;
  147. my $COLUMN_NAND_PAGE_SIZE = $COLUMN_FW_ID + 1 ;
  148. my $COLUMN_PLATFORM = $COLUMN_NAND_PAGE_SIZE + 1 ;
  149. my $CUSTOM_MEMORY_DEVICE_HDR = $ARGV[0]; # src\custom\<project>, need full path for now
  150. #my $MEMORY_DEVICE_LIST_XLS = Win32::GetCwd()."\\memorydevicelist\\".$ARGV[1];
  151. my $MEMORY_DEVICE_LIST_XLS = $ARGV[1];
  152. my $PLATFORM = $ARGV[2]; # MTxxxx
  153. my $PROJECT = $ARGV[3];
  154. my $MTK_EMIGEN_OUT_DIR = $ARGV[4];
  155. #my $MTK_EMIGEN_OUT_DIR = "$ENV{PRODUCT_OUT}/EMIGEN";
  156. print "$CUSTOM_MEMORY_DEVICE_HDR\n$MEMORY_DEVICE_LIST_XLS\n$PLATFORM\n" if ($DebugPrint == 1);
  157. print "$MTK_EMIGEN_OUT_DIR\n" if ($DebugPrint == 1);
  158. # following parameters come from $CUSTOM_MEMORY_DEVICE_HDR
  159. my $MEMORY_DEVICE_TYPE;
  160. # data structure of $part_number if ($MEMORY_DEVICE_TYPE eq 'LPSDRAM')
  161. #
  162. # my $part_info =
  163. # {
  164. # CS => { "0" => { PART_NUMBER => $part_number,
  165. # EXCEL_ROW => $excel_row,
  166. # VENDOR => $vendor,
  167. my $part_info = (); # has different data structures for different $MEMORY_DEVICE_TYPE
  168. my $bank_num = 0; # 0: No memory is attached
  169. # 1: 1 is attached
  170. # 2: 2 are attached
  171. # locations of output EMI settings
  172. # src\custom\<project>\DRV\bootloader\EMI
  173. my $CUSTOM_EMI_H = $CUSTOM_MEMORY_DEVICE_HDR;
  174. #my $CUSTOM_EMI_C = $CUSTOM_MEMORY_DEVICE_HDR;
  175. my $INFO_TAG = $CUSTOM_MEMORY_DEVICE_HDR;
  176. if ($os eq "windows")
  177. {
  178. $CUSTOM_EMI_H = "$MTK_EMIGEN_OUT_DIR/custom_emi.h";
  179. # $CUSTOM_EMI_C = "$MTK_EMIGEN_OUT_DIR/custom_emi.c";
  180. `mkdir output` unless (-d "output");
  181. }
  182. elsif ($os eq "linux")
  183. {
  184. $CUSTOM_EMI_H = "$MTK_EMIGEN_OUT_DIR/custom_emi.h";
  185. # $CUSTOM_EMI_C = "$MTK_EMIGEN_OUT_DIR/custom_emi.c";
  186. $INFO_TAG = "$MTK_EMIGEN_OUT_DIR/MTK_Loader_Info.tag";
  187. }
  188. # Pregen: after we load all perl module, it need to print all depend module
  189. PrintDependModule($0);
  190. print "$CUSTOM_EMI_H\n$INFO_TAG\n" if ($DebugPrint ==1);
  191. # check existance of custom_EMI.h and custom_EMI.c
  192. my $is_existed_h = (-e $CUSTOM_EMI_H)? 1 : 0;
  193. #my $is_existed_c = (-e $CUSTOM_EMI_C)? 1 : 0;
  194. #
  195. #if ( ($is_existed_h == 1) && ($is_existed_c == 1) )
  196. #{
  197. # print "\n\nALL custom_EMI\.h, custom_EMI\.c are existed!!!\n\n\n";
  198. # exit;
  199. #}
  200. #****************************************************************************
  201. # parse custom_MemoryDevice.h to extract MEMORY_DEVICE_TYPE & PART_NUMBER
  202. #****************************************************************************
  203. open CUSTOM_MEMORY_DEVICE_HDR, "<$CUSTOM_MEMORY_DEVICE_HDR" or &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: file error!", __FILE__, __LINE__);
  204. #Pregen: print file name after we open a file which will be read
  205. PrintDependency($CUSTOM_MEMORY_DEVICE_HDR);
  206. # CustCS_CustemChips:
  207. # the number of part number which customer assigned
  208. # in mediatek/custom/$project/preloader/inc/custom_MemoryDevice.h
  209. # TotalCustemChips:
  210. # because one part number may match multiple emmc/nand ID, the TotalCustemChips >= CustCS_CustemChips
  211. # the final number of part number which will use to create emi_setting
  212. # in mediatek/custom/$project/preloader/inc/custom_emi.h
  213. #
  214. my $CustCS_CustemChips = 0 ;
  215. my $TotalCustemChips = 0 ;
  216. #
  217. # arrays
  218. #
  219. # this should be an array of structurs, but it is said perl does not support it.
  220. # these are input, except EMI_GEND
  221. #
  222. # CustCS_PART_NUMBER:
  223. # the content of part number which customer assigned
  224. # in mediatek/custom/$project/preloader/inc/custom_MemoryDevice.h
  225. # Total_PART_NUMBER:
  226. # the final part number which will show
  227. # in mediatek/custom/$project/preloader/inc/custom_emi.h
  228. my $CustCS_PART_NUMBER ;
  229. my $Total_PART_NUMBER ;
  230. ######################################################################################
  231. my $DEV_TYPE;
  232. my $DEV_TYPE1;
  233. my $DEV_TYPE2;
  234. my $NAND_EMMC_ID;
  235. my $FW_ID ;
  236. my $ID_String ;
  237. my $FW_ID_String ;
  238. my $Sub_version;
  239. my $USE_EMMC_ID_LEN=9;
  240. my $MAX_NAND_EMMC_ID_LEN=16;
  241. my $MAX_FW_ID_LEN=8;
  242. my $fw_id_len;
  243. my $NAND_PAGE_SIZE;
  244. my $EMI_CONA_VAL;
  245. my $EMI_CONH_VAL;
  246. my $DRAMC_DRVCTL0_VAL;
  247. my $DRAMC_DRVCTL1_VAL;
  248. my $DRAMC_ACTIM_VAL;
  249. my $DRAMC_GDDR3CTL1_VAL;
  250. my $DRAMC_CONF1_VAL;
  251. my $DRAMC_DDR2CTL_VAL;
  252. my $DRAMC_TEST2_3_VAL;
  253. my $DRAMC_CONF2_VAL;
  254. my $DRAMC_PD_CTRL_VAL;
  255. my $DRAMC_PADCTL3_VAL;
  256. my $DRAMC_DQODLY_VAL;
  257. my $DRAMC_ADDR_OUTPUT_DLY;
  258. my $DRAMC_CLK_OUTPUT_DLY;
  259. my $DRAMC_ACTIM1_VAL;
  260. my $DRAMC_MISCTL0_VAL;
  261. my $DRAMC_ACTIM05T_VAL;
  262. my $DRAMC_RKCFG_VAL;
  263. my $DRAMC_TEST2_4_VAL;
  264. my $DRAM_RANK0_SIZE;
  265. my $DRAM_RANK1_SIZE;
  266. my $Discrete_DDR = 0;
  267. my $MCP_LPDDR2 = 0;
  268. my $MCP_LPDDR3 = 0;
  269. my $MCP_PCDDR3 = 0;
  270. my $DIS_LPDDR2 = 0;
  271. my $DIS_LPDDR3 = 0;
  272. my $DIS_PCDDR3 = 0;
  273. my $DDR1_2_3 ;
  274. #union
  275. #1
  276. my $LPDDR2_MODE_REG1;
  277. my $LPDDR2_MODE_REG2;
  278. my $LPDDR2_MODE_REG3;
  279. my $LPDDR2_MODE_REG5;
  280. my $LPDDR2_MODE_REG10;
  281. my $LPDDR2_MODE_REG63;
  282. #2
  283. my $DDR1_MODE_REG;
  284. my $DDR1_EXT_MODE_REG;
  285. #3
  286. my $PCDDR3_MODE_REG0;
  287. my $PCDDR3_MODE_REG1;
  288. my $PCDDR3_MODE_REG2;
  289. my $PCDDR3_MODE_REG3;
  290. my $PCDDR3_MODE_REG4;
  291. my $PCDDR3_MODE_REG5;
  292. #4
  293. my $LPDDR3_MODE_REG1;
  294. my $LPDDR3_MODE_REG2;
  295. my $LPDDR3_MODE_REG3;
  296. my $LPDDR3_MODE_REG5;
  297. my $LPDDR3_MODE_REG10;
  298. my $LPDDR3_MODE_REG63;
  299. my $EMI_SETTINGS ;
  300. #
  301. # all above are arrays, each represents an user defined chip.
  302. #
  303. # this is the ID of the custom board.
  304. my $CustBoard_ID ;
  305. if ($enable_EMIGEN == 0)
  306. {
  307. &gen_EMI_h();
  308. &gen_EMI_c();
  309. &write_tag($PROJECT);
  310. exit;
  311. }
  312. while (<CUSTOM_MEMORY_DEVICE_HDR>)
  313. {
  314. # matching the following lines
  315. # "#define MEMORY_DEVICE_TYPE LPSDRAM"
  316. # "#define CS0_PART_NUMBER EDK1432CABH60"
  317. # error-checking
  318. if (/^#if|^#ifdef|^#ifndef|^#elif|^#else/)
  319. {
  320. &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: Not allowed to set conditional keywords $_ in custom_MemoryDevice.h!", __FILE__, __LINE__)
  321. unless (/^#ifndef\s+__CUSTOM_MEMORYDEVICE__/);
  322. }
  323. if (/^#define\s+(\w+)\[(\d+)\]\s+\(([-\w]*)\)/ || /^#define\s+(\w+)\[(\d+)\]\s+([-\w]*)/ ||
  324. /^#define\s+(MEMORY_DEVICE_TYPE)\s+\((\w*)\)/ || /^#define\s+(MEMORY_DEVICE_TYPE)\s+(\w*)/ ||
  325. /^#define\s+(BOARD_ID)\s+\((\w*)\)/ || /^#define\s+(BOARD_ID)\s+(\w*)/)
  326. {
  327. if ($1 eq "BOARD_ID")
  328. {
  329. $CustBoard_ID = $2 ;
  330. }
  331. elsif ($1 eq "CS_PART_NUMBER")
  332. {
  333. print "\nCS0 $2, $3\n" ;
  334. $CustCS_PART_NUMBER[$2] = $3 ;
  335. $CustCS_CustemChips = $CustCS_CustemChips + 1 ;
  336. print "$CustCS_PART_NUMBER[$2]\n"
  337. }
  338. }
  339. }
  340. print "\n$CustCS_CustemChips\n" if ($DebugPrint ==1);
  341. close CUSTOM_MEMORY_DEVICE_HDR;
  342. #
  343. #
  344. # we now read in all the needed infomation form custom defination file,
  345. # so close it.
  346. #
  347. #
  348. #
  349. # check if data validate.
  350. #
  351. if ($CustCS_CustemChips > 10)
  352. {
  353. die "\n[Error]CustCS_CustemChips($CustCS_CustemChips) > 10\n" ;
  354. }
  355. if ($CustCS_CustemChips == 0)
  356. {
  357. die "\n[Error]CustCS_CustemChips($CustCS_CustemChips) = 0?\n" ;
  358. }
  359. #****************************************************************************
  360. # read a excel file to get emi settings
  361. #****************************************************************************
  362. # get already active Excel application or open new
  363. if ($os eq "windows")
  364. {
  365. $Excel = Win32::OLE->GetActiveObject('Excel.Application')
  366. || Win32::OLE->new('Excel.Application', 'Quit');
  367. # copy the Excel file to a temp file and open it;
  368. # this will prevent error due to simultaneous Excel access
  369. $Book = $Excel->Workbooks->Open($MEMORY_DEVICE_LIST_XLS);
  370. }
  371. else
  372. {
  373. my $parser = Spreadsheet::ParseExcel->new();
  374. $Book = $parser->Parse($MEMORY_DEVICE_LIST_XLS);
  375. }
  376. #Pregen: print file name after we open a file which will be read
  377. PrintDependency($MEMORY_DEVICE_LIST_XLS);
  378. # select worksheet
  379. my $Sheet;
  380. my $eos_flag = 5; # if this flag counts to '0', it means End Of Sheet
  381. my $iter = 0 ;
  382. my $CustCS_part_number_iter = 0;
  383. my $total_part_number_iter = 0;
  384. while ($iter<$CustCS_CustemChips)
  385. {
  386. $eos_flag = 5;
  387. $total_part_number_iter = &DeviceListParser_LPSDRAM($iter,$total_part_number_iter);
  388. $iter = $iter + 1 ;
  389. }
  390. # if the value read from excel validate
  391. $iter = 0 ;
  392. my $EMMC_NAND_MCP = "00" ;
  393. my $Page_size = "0" ;
  394. print "TotalCustemChips:$TotalCustemChips\n";
  395. while ($iter < $TotalCustemChips)
  396. {
  397. # only one Discrete is allowed
  398. if ($DEV_TYPE1[$iter] eq "00")
  399. {
  400. # if all discrete dram are LPDDR2 or LPDDR3, it is allowed
  401. if ($DEV_TYPE2[$iter] eq "02" || $DEV_TYPE2[$iter] eq "03")
  402. {
  403. my $iter_dis_dram;
  404. $iter_dis_dram = 0;
  405. while ($iter_dis_dram < $TotalCustemChips)
  406. {
  407. if ($iter_dis_dram == $iter)
  408. {
  409. $iter_dis_dram++;
  410. next;
  411. }
  412. {
  413. #comment to avoid build error for the same vendor ID
  414. #=head
  415. if ($DEV_TYPE2[0] eq "02")
  416. {
  417. # check the MODE_REG5(DRAM vendor_ID) are unique
  418. # if have same MODE5 in the list, send the build error
  419. if ( $DEV_TYPE1[$iter_dis_dram] eq "00" && $LPDDR2_MODE_REG5[$iter] eq $LPDDR2_MODE_REG5[$iter_dis_dram])
  420. {
  421. if ( $DRAM_RANK0_SIZE[$iter] eq $DRAM_RANK0_SIZE[$iter_dis_dram] && $DRAM_RANK1_SIZE[$iter] eq $DRAM_RANK1_SIZE[$iter_dis_dram] )
  422. {
  423. print "[Error] Both MODE_REG5(DRAM vendor_ID) and RANK0/RANK1 size should not be the same in the Combo list\n" ;
  424. die "[Error] MODE_REG5(DRAM vendor_ID) and RANK0/RANK1 size should not be the same in the Combo list\n" ;
  425. }
  426. }
  427. }
  428. elsif ($DEV_TYPE2[0] eq "03")
  429. {
  430. # check the MODE_REG5(DRAM vendor_ID) are unique
  431. # if have same MODE5 in the list, send the build error
  432. if ( $DEV_TYPE1[$iter_dis_dram] eq "00" && $LPDDR3_MODE_REG5[$iter] eq $LPDDR3_MODE_REG5[$iter_dis_dram])
  433. {
  434. if ( $DRAM_RANK0_SIZE[$iter] eq $DRAM_RANK0_SIZE[$iter_dis_dram] && $DRAM_RANK1_SIZE[$iter] eq $DRAM_RANK1_SIZE[$iter_dis_dram] )
  435. {
  436. print "[Error] Both MODE_REG5(DRAM vendor_ID) and RANK0/RANK1 size should not be the same in the Combo list\n" ;
  437. die "[Error] MODE_REG5(DRAM vendor_ID) and RANK0/RANK1 size should not be the same in the Combo list\n" ;
  438. }
  439. }
  440. }
  441. #=cut
  442. }
  443. $iter_dis_dram++;
  444. }
  445. $Discrete_DDR = $Discrete_DDR + 1 ;
  446. }
  447. else
  448. {
  449. # DDR1,DDR3 only support one discrete DRAM in the Combo List
  450. # if more then one discrete DRAM in the list, send build error
  451. if ($Discrete_DDR == 0)
  452. {
  453. $Discrete_DDR = $Discrete_DDR + 1 ;
  454. if ($TotalCustemChips > 1)
  455. {
  456. print "[Error]At most one discrete PCDDR3 DRAM is allowed in the Combo MCP list\n" ;
  457. die "[Error]Combo discrete DRAM only support LPDDR2, LPDDR3\n" ;
  458. }
  459. }
  460. else
  461. {
  462. die "[Error]more than 1 Discrete DDR used!\n" ;
  463. }
  464. }
  465. }
  466. else{
  467. }
  468. unless($ENV{PROJECT} eq "mt6755_evb"){
  469. # nand emmc can't used together.
  470. if ($EMMC_NAND_MCP == "00")
  471. {
  472. $EMMC_NAND_MCP = $DEV_TYPE1[$iter] ;
  473. }
  474. elsif ($EMMC_NAND_MCP != $DEV_TYPE1[$iter] && $DEV_TYPE1[$iter] != "00")
  475. {
  476. die "[Error]Both NAND and eMMC are used!\n"
  477. }
  478. }
  479. # NAND can't use different page size.
  480. if ($DEV_TYPE1[$iter] == "01")
  481. {
  482. if ($Page_size == "0")
  483. {
  484. $Page_size = $NAND_PAGE_SIZE[$iter] ;
  485. }
  486. else
  487. {
  488. if ($Page_size != $NAND_PAGE_SIZE[$iter])
  489. {
  490. die "[Error]different MCP page size!$Page_size, $NAND_PAGE_SIZE[$iter]\n" ;
  491. }
  492. }
  493. }
  494. # Nand or eMMC's + FW ID must unique
  495. my $iter2 ;
  496. $iter2 = $iter + 1 ;
  497. while ($iter2 < $TotalCustemChips)
  498. {
  499. if ($DEV_TYPE1[$iter] != "00")
  500. {
  501. if ($NAND_EMMC_ID[$iter] eq $NAND_EMMC_ID[$iter2])
  502. {
  503. if ( $Total_PART_NUMBER[$iter] ne $Total_PART_NUMBER[$iter2] )
  504. {
  505. die "[Error]Different part number:$Total_PART_NUMBER[$iter],$Total_PART_NUMBER[$iter2] with same NAND/eMMC ID:$NAND_EMMC_ID[$iter]"
  506. }
  507. else
  508. { #$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]
  509. if ($FW_ID[$iter] eq $FW_ID[$iter2])
  510. {
  511. 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]"
  512. }
  513. }
  514. }
  515. }
  516. $iter2 = $iter2 + 1 ;
  517. }
  518. $iter = $iter + 1 ;
  519. }
  520. if ($DIS_LPDDR2 > 0 && (($DIS_LPDDR3 > 0) || ($MCP_LPDDR3 > 0) || ($DIS_PCDDR3 > 0)))
  521. {
  522. die "[Error] LPDDR2 and LPDDR3 are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  523. }
  524. if ($DIS_LPDDR3 > 0 && (($DIS_LPDDR2 > 0) || ($MCP_LPDDR2 > 0) || ($DIS_PCDDR3 > 0)))
  525. {
  526. die "[Error] LPDDR2 and LPDDR3 are not allowed to be mixed in the Combo Discrete DRAM list.\n" ;
  527. }
  528. if ($DIS_PCDDR3 > 1)
  529. {
  530. die "[Error] PCDDR3 not support Combo Discrete DRAM feature.\n" ;
  531. }
  532. if (($DIS_PCDDR3 == 1) && ($CustCS_CustemChips>1) )
  533. {
  534. die "[Error] PCDDR3 not support Combo Discrete DRAM feature.\n" ;
  535. }
  536. # close the temp Excel file
  537. if ($os eq "windows")
  538. {
  539. $Book->Close(1);
  540. }
  541. #&error_handler("$CUSTOM_MEMORY_DEVICE_HDR: Incorrect memory device type!", __FILE__, __LINE__) unless $MEMORY_DEVICE_TYPE;
  542. #&error_handler("$CUSTOM_MEMORY_DEVICE_HDR: part number not supported!", __FILE__, __LINE__) if ($is_part_found <= 0);
  543. #&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'));
  544. #&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'));
  545. &gen_EMI_h();
  546. #&gen_EMI_c();
  547. if ($build_opt == 1) # Build Preloader TAG!
  548. {
  549. &write_tag($PROJECT);
  550. }
  551. exit;
  552. sub gen_EMI_h
  553. {
  554. #****************************************************************************
  555. # generate custom_emi.h
  556. #****************************************************************************
  557. if ($build_opt == 0)
  558. {
  559. if ($is_existed_h == 1)
  560. {
  561. unlink ($CUSTOM_EMI_H);
  562. }
  563. my $temp_path = `dirname $CUSTOM_EMI_H`;
  564. `mkdir -p $temp_path`;
  565. open (CUSTOM_EMI_H, ">$CUSTOM_EMI_H") or &error_handler("CUSTOM_EMI_H: file error!", __FILE__, __LINE__);
  566. print CUSTOM_EMI_H &copyright_file_header();
  567. print CUSTOM_EMI_H &description_file_header( "custom_emi.h",
  568. "This Module defines the EMI (external memory interface) related setting.",
  569. "EMI auto generator". $EMIGEN_VERNO);
  570. print CUSTOM_EMI_H &custom_EMI_h_file_body();
  571. close CUSTOM_EMI_H or &error_handler("$CUSTOM_EMI_H: file error!", __FILE__, __LINE__);
  572. print "\n$CUSTOM_EMI_H is generated\n";
  573. } # if ($build_opt == 0)
  574. }
  575. sub gen_EMI_c
  576. {
  577. #****************************************************************************
  578. # generate custom_EMI.c
  579. #****************************************************************************
  580. #if ($is_existed_c == 0)
  581. {
  582. if ($is_existed_c == 1)
  583. {
  584. unlink ($CUSTOM_EMI_C);
  585. }
  586. my $temp_path = `dirname $CUSTOM_EMI_C`;
  587. `mkdir -p $temp_path`;
  588. open (CUSTOM_EMI_C, ">$CUSTOM_EMI_C") or &error_handler("$CUSTOM_EMI_C: file error!", __FILE__, __LINE__);
  589. print CUSTOM_EMI_C &copyright_file_header();
  590. print CUSTOM_EMI_C &description_file_header( "custom_emi.c",
  591. "This Module defines the EMI (external memory interface) related setting.",
  592. "EMI auto generator". $EMIGEN_VERNO);
  593. print CUSTOM_EMI_C &custom_EMI_c_file_body();
  594. close CUSTOM_EMI_C or &error_handler("$CUSTOM_EMI_C: file error!", __FILE__, __LINE__);
  595. print "\n$CUSTOM_EMI_C is generated\n";
  596. } # if ($is_existed_c == 0)
  597. }
  598. #****************************************************************************
  599. # subroutine: trim
  600. # input: $string: trim string
  601. #****************************************************************************
  602. sub trim($)
  603. {
  604. my $string = shift;
  605. $string =~ s/^\s+//;
  606. $string =~ s/\s+$//;
  607. return $string;
  608. }
  609. #****************************************************************************
  610. # subroutine: error_handler
  611. # input: $error_msg: error message
  612. #****************************************************************************
  613. sub error_handler
  614. {
  615. my ($error_msg, $file, $line_no) = @_;
  616. my $final_error_msg = "[Error]EMIGEN ERROR: $error_msg at $file line $line_no\n";
  617. print $final_error_msg;
  618. die $final_error_msg;
  619. }
  620. #****************************************************************************
  621. # subroutine: copyright_file_header
  622. # return: file header -- copyright
  623. #****************************************************************************
  624. sub copyright_file_header
  625. {
  626. my $template = <<"__TEMPLATE";
  627. /*****************************************************************************
  628. * Copyright Statement:
  629. * --------------------
  630. * This software is protected by Copyright and the information contained
  631. * herein is confidential. The software may not be copied and the information
  632. * contained herein may not be used or disclosed except with the written
  633. * permission of MediaTek Inc. (C) 2008
  634. *
  635. * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  636. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  637. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  638. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  639. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  640. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  641. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  642. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  643. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  644. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  645. * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  646. * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  647. *
  648. * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  649. * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  650. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  651. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  652. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  653. *
  654. * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  655. * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  656. * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  657. * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  658. * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  659. *
  660. *****************************************************************************/
  661. __TEMPLATE
  662. return $template;
  663. }
  664. #****************************************************************************
  665. # subroutine: description_file_header
  666. # return: file header -- description
  667. # input: $filename: filename
  668. # input: $description: one line description
  669. # input: $author: optional
  670. #****************************************************************************
  671. sub description_file_header
  672. {
  673. my ($filename, $description, $author) = @_;
  674. my @stat_ar = stat $MEMORY_DEVICE_LIST_XLS;
  675. my ($day, $month, $year) = (localtime($stat_ar[9]))[3,4,5]; $month++; $year+=1900;
  676. my $template = <<"__TEMPLATE";
  677. /*****************************************************************************
  678. *
  679. * Filename:
  680. * ---------
  681. * $filename
  682. *
  683. * Project:
  684. * --------
  685. * Android
  686. *
  687. * Description:
  688. * ------------
  689. * $description
  690. *
  691. * Author:
  692. * -------
  693. * $author
  694. *
  695. * Memory Device database last modified on $year/$month/$day
  696. *
  697. *============================================================================
  698. * HISTORY
  699. * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  700. *------------------------------------------------------------------------------
  701. * \$Revision\$
  702. * \$Modtime\$
  703. * \$Log\$
  704. *
  705. *------------------------------------------------------------------------------
  706. * WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!!
  707. * This file is generated by EMI Auto-gen Tool.
  708. * Please do not modify the content directly!
  709. * It could be overwritten!
  710. *============================================================================
  711. * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  712. *============================================================================
  713. ****************************************************************************/
  714. __TEMPLATE
  715. return $template;
  716. }
  717. #****************************************************************************
  718. # subroutine: HeaderBody_for_lpsdram
  719. # return: content for custom_EMI.h
  720. #****************************************************************************
  721. #sub custom_EMI_h_file_body
  722. #{
  723. ###
  724. # my $template = <<"__TEMPLATE";
  725. #ifndef __CUSTOM_EMI__
  726. #define __CUSTOM_EMI__
  727. #define COMBO_LPDDR2 ($MCP_LPDDR2+$DIS_LPDDR2)
  728. #define COMBO_LPDDR3 ($MCP_LPDDR3+$DIS_LPDDR3)
  729. #define COMBO_PCDDR3 ($MCP_PCDDR3+$DIS_PCDDR3)
  730. #endif /* __CUSTOM_EMI__ */
  731. #__TEMPLATE
  732. # return $template;
  733. #}
  734. #****************************************************************************
  735. # subroutine: custom_EMI_h_file_body
  736. # return:
  737. #****************************************************************************
  738. sub custom_EMI_h_file_body
  739. {
  740. ###
  741. my $EMI_SETTINGS_string = "" ;
  742. my $ddr = -1 ;
  743. $iter = 0 ;
  744. for $iter (0..$TotalCustemChips-1)
  745. {
  746. if ($DEV_TYPE1[$iter] != "00")
  747. {
  748. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$iter] ;
  749. $EMI_SETTINGS_string = $EMI_SETTINGS_string . " ," ;
  750. }
  751. }
  752. for $iter (0..$TotalCustemChips-1)
  753. {
  754. if ($DEV_TYPE1[$iter] == "00")
  755. {
  756. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$iter] ;
  757. $EMI_SETTINGS_string = $EMI_SETTINGS_string . " ," ;
  758. }
  759. }
  760. =head
  761. previous version
  762. while ($iter<$TotalCustemChips)
  763. {
  764. if ($DEV_TYPE1[$iter] == "00")
  765. {
  766. $ddr = $iter ;
  767. print "Discrete ddr found $ddr \n" ;
  768. $iter = $iter + 1 ;
  769. }
  770. else
  771. {
  772. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$iter] ;
  773. $iter = $iter + 1 ;
  774. if ($iter < $TotalCustemChips || $ddr != -1)
  775. {
  776. $EMI_SETTINGS_string = $EMI_SETTINGS_string . " ," ;
  777. }
  778. }
  779. }
  780. # if we have discrete dram, we put them in the end
  781. if ($ddr != -1)
  782. {
  783. $EMI_SETTINGS_string = $EMI_SETTINGS_string . $EMI_SETTINGS[$ddr] ;
  784. }
  785. =cut
  786. my $template = <<"__TEMPLATE";
  787. #ifndef __CUSTOM_EMI__
  788. #define __CUSTOM_EMI__
  789. #include "emi.h"
  790. #define COMBO_LPDDR2 ($MCP_LPDDR2+$DIS_LPDDR2)
  791. #define COMBO_LPDDR3 ($MCP_LPDDR3+$DIS_LPDDR3)
  792. #define COMBO_PCDDR3 ($MCP_PCDDR3+$DIS_PCDDR3)
  793. #define NUM_EMI_RECORD ($TotalCustemChips)
  794. int num_of_emi_records = NUM_EMI_RECORD ;
  795. EMI_SETTINGS emi_settings[] =
  796. {
  797. $EMI_SETTINGS_string
  798. };
  799. #endif /* __CUSTOM_EMI__ */
  800. __TEMPLATE
  801. return $template ;
  802. }
  803. #****************************************************************************
  804. # subroutine: DeviceListParser_LPSDRAM
  805. # input: the number in array
  806. # return: string contain 1 set of EMI setting for input
  807. #****************************************************************************
  808. sub DeviceListParser_LPSDRAM
  809. {
  810. my ($id) ;
  811. my ($CustCS_id) ;
  812. my ($PartNum) ;
  813. my ($iter);
  814. my ($num_part_found);
  815. $num_part_found = 0 ;
  816. $CustCS_id = $_[0]; # CustCS_CustemChips_iter
  817. $id = $_[1] ; # total_part_number_iter
  818. $PartNum = $CustCS_PART_NUMBER[$CustCS_id] ;
  819. print "\nCustCS ID num is $CustCS_id, part number:$CustCS_PART_NUMBER[$CustCS_id]\n" ;
  820. my $row = $start_num + 0 ; # scan from row 2 when $MEMORY_DEVICE_TYPE eq 'LPSDRAM'
  821. my $col = $COLUMN_PART_NUMBER ; # scan column 2 for Part Number
  822. my $rows_part_found; # stores the part numbers found in MDL
  823. $Sheet = get_sheet("mt6755") ;
  824. # find cell address of the specified Nand ID
  825. my $scan_idx = &xls_cell_value($Sheet, $row, $col) ;
  826. print "[Bike Check] scan_idx= $scan_idx eos_flag=$eos_flag\n";
  827. while (defined ($scan_idx) && ($eos_flag > 0))
  828. {
  829. ++$row ;
  830. $scan_idx = &xls_cell_value($Sheet, $row, $col) ;
  831. print "[Bike Check] scan_idx= $scan_idx\n";
  832. unless (defined $scan_idx)
  833. {
  834. print "[$row][scan_idx]No Value, $eos_flag\n" if $DebugPrint == 1 ;
  835. $eos_flag -- ;
  836. next ;
  837. }
  838. if ($scan_idx eq "")
  839. {
  840. print "[$row][scan_idx]EQ null, $eos_flag\n" if $DebugPrint == 1 ;
  841. $eos_flag -- ;
  842. next ;
  843. }
  844. $eos_flag = 5 ;
  845. # remove leading and tailing spaces
  846. $scan_idx =~ s/^\s+// if $DebugPrint == 1 ;
  847. $scan_idx =~ s/\s+$// if $DebugPrint == 1 ;
  848. $scan_idx =~ s/^\s+// ;
  849. $scan_idx =~ s/\s+$// ;
  850. print "$scan_idx ?= $PartNum\n" ;
  851. if ($scan_idx eq $PartNum) # scan column 2 for Part Number
  852. {
  853. my $boardid ;
  854. $boardid = &xls_cell_value($Sheet, $row, $COLUMN_BOARD_ID) ;
  855. if ($CustBoard_ID eq $boardid)
  856. {
  857. $rows_part_found[$num_part_found] = $row;
  858. print "\nPartNum($PartNum==$scan_idx) found in row $row\n" ;
  859. $Total_PART_NUMBER[$TotalCustemChips] = $PartNum;
  860. $num_part_found += 1 ;
  861. $TotalCustemChips += 1;
  862. }
  863. }
  864. }
  865. print("[Bike Check]num_part_found $num_part_found\n");
  866. if ($num_part_found == 0)
  867. {
  868. print "\n[Error]unsupported part number $PartNum\n" ;
  869. die "\n[Error]unsupported part number $PartNum\n" ;
  870. }
  871. $iter = 0;
  872. while ($iter<$num_part_found)
  873. {
  874. $_ = $rows_part_found[$iter] ;
  875. $iter ++;
  876. $VENDOR[$id] = &xls_cell_value($Sheet, $_, $COLUMN_VENDOR) ;
  877. $DENSITY[$id] = &xls_cell_value($Sheet, $_, $COLUMN_DENSITY) ;
  878. # find the correct platform
  879. my $platform_scan_idx = $COLUMN_PLATFORM ; #First EMI controller
  880. my $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx) ;
  881. while (!($tmp_platform =~ $PLATFORM))
  882. {
  883. $platform_scan_idx++;
  884. $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx);
  885. if ($platform_scan_idx > 100)
  886. {
  887. die "[Error][Porting Error] It cannot find the right platform name.Please check platform name in XLS\n";
  888. }
  889. }
  890. &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: $PLATFORM not support LPSDRAM!", __FILE__, __LINE__) if ($platform_scan_idx > $COLUMN_PLATFORM);
  891. $DEV_TYPE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_TYPE) ;
  892. $NAND_EMMC_ID[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_EMMC_ID) ;
  893. $FW_ID[$id] = &xls_cell_value($Sheet, $_, $COLUMN_FW_ID) ;
  894. $NAND_PAGE_SIZE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_PAGE_SIZE) ;
  895. $EMI_CONA_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  896. $EMI_CONH_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  897. $DRAMC_DRVCTL0_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  898. $DRAMC_DRVCTL1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  899. $DRAMC_ACTIM_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  900. $DRAMC_GDDR3CTL1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  901. $DRAMC_CONF1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  902. $DRAMC_DDR2CTL_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  903. $DRAMC_TEST2_3_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  904. $DRAMC_CONF2_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  905. $DRAMC_PD_CTRL_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  906. $DRAMC_PADCTL3_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  907. $DRAMC_DQODLY_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  908. $DRAMC_ADDR_OUTPUT_DLY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  909. $DRAMC_CLK_OUTPUT_DLY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  910. $DRAMC_ACTIM1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  911. $DRAMC_MISCTL0_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  912. $DRAMC_ACTIM05T_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  913. $DRAMC_RKCFG_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  914. $DRAMC_TEST2_4_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  915. $DDR1_2_3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  916. # openoffice saved file workaround START
  917. if ($DEV_TYPE[$id] =~ /DDR1/)
  918. {
  919. $DDR1_2_3[$id] = 'DDR1';
  920. }
  921. elsif ($DEV_TYPE[$id] =~ /LPDDR2/)
  922. {
  923. $DDR1_2_3[$id] = 'LPDDR2';
  924. }
  925. elsif ($DEV_TYPE[$id] =~ /PCDDR3/)
  926. {
  927. $DDR1_2_3[$id] = 'PCDDR3';
  928. }
  929. elsif ($DEV_TYPE[$id] =~ /LPDDR3/)
  930. {
  931. $DDR1_2_3[$id] = 'LPDDR3';
  932. }
  933. # openoffice saved file workaround END
  934. #union
  935. # LPDDR2
  936. if ($DDR1_2_3[$id] eq "LPDDR2")
  937. {
  938. $LPDDR2_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  939. $LPDDR2_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  940. $LPDDR2_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  941. $LPDDR2_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  942. $LPDDR2_MODE_REG10[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  943. $LPDDR2_MODE_REG63[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  944. }
  945. # DDR1
  946. elsif ($DDR1_2_3[$id] eq "DDR1")
  947. {
  948. $DDR1_MODE_REG[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  949. $DDR1_EXT_MODE_REG[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  950. die "[Error][EMIgen] no support DDR1.";
  951. }
  952. # PCDDR3
  953. elsif ($DDR1_2_3[$id] eq "PCDDR3")
  954. {
  955. $PCDDR3_MODE_REG0[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  956. $PCDDR3_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  957. $PCDDR3_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  958. $PCDDR3_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  959. $PCDDR3_MODE_REG4[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  960. $PCDDR3_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  961. }
  962. # LPDDR3
  963. elsif ($DDR1_2_3[$id] eq "LPDDR3")
  964. {
  965. $LPDDR3_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  966. $LPDDR3_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  967. $LPDDR3_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  968. $LPDDR3_MODE_REG5[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  969. $LPDDR3_MODE_REG10[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  970. $LPDDR3_MODE_REG63[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ;
  971. }
  972. if ($DENSITY[$id] eq "8192+8192")
  973. {
  974. $DRAM_RANK0_SIZE[$id] = "0x40000000";
  975. $DRAM_RANK1_SIZE[$id] = "0x40000000";
  976. }
  977. elsif ($DENSITY[$id] eq "8192+4096")
  978. {
  979. $DRAM_RANK0_SIZE[$id] = "0x40000000";
  980. $DRAM_RANK1_SIZE[$id] = "0x20000000";
  981. }
  982. elsif ($DENSITY[$id] eq "4096+4096")
  983. {
  984. $DRAM_RANK0_SIZE[$id] = "0x20000000";
  985. $DRAM_RANK1_SIZE[$id] = "0x20000000";
  986. }
  987. elsif ($DENSITY[$id] eq "2048+2048")
  988. {
  989. $DRAM_RANK0_SIZE[$id] = "0x10000000";
  990. $DRAM_RANK1_SIZE[$id] = "0x10000000";
  991. }
  992. elsif ($DENSITY[$id] eq "4096+2048")
  993. {
  994. $DRAM_RANK0_SIZE[$id] = "0x20000000";
  995. $DRAM_RANK1_SIZE[$id] = "0x10000000";
  996. }
  997. elsif ($DENSITY[$id] eq "6144")
  998. {
  999. $DRAM_RANK0_SIZE[$id] = "0x30000000";
  1000. $DRAM_RANK1_SIZE[$id] = "0";
  1001. }
  1002. elsif ($DENSITY[$id] eq "6144+6144")
  1003. {
  1004. $DRAM_RANK0_SIZE[$id] = "0x30000000";
  1005. $DRAM_RANK1_SIZE[$id] = "0x30000000";
  1006. }
  1007. elsif ($DENSITY[$id] eq "12288+12288")
  1008. {
  1009. $DRAM_RANK0_SIZE[$id] = "0x60000000";
  1010. $DRAM_RANK1_SIZE[$id] = "0x60000000";
  1011. }
  1012. elsif ($DENSITY[$id] eq "16384+16384")
  1013. {
  1014. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1015. $DRAM_RANK1_SIZE[$id] = "0x80000000";
  1016. }
  1017. elsif ($DENSITY[$id] eq "16384+8192")
  1018. {
  1019. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1020. $DRAM_RANK1_SIZE[$id] = "0x40000000";
  1021. }
  1022. elsif ($DENSITY[$id] eq "8192")
  1023. {
  1024. $DRAM_RANK0_SIZE[$id] = "0x40000000";
  1025. $DRAM_RANK1_SIZE[$id] = "0";
  1026. }
  1027. elsif ($DENSITY[$id] eq "4096")
  1028. {
  1029. $DRAM_RANK0_SIZE[$id] = "0x20000000";
  1030. $DRAM_RANK1_SIZE[$id] = "0";
  1031. }
  1032. elsif ($DENSITY[$id] eq "2048")
  1033. {
  1034. $DRAM_RANK0_SIZE[$id] = "0x10000000";
  1035. $DRAM_RANK1_SIZE[$id] = "0";
  1036. }
  1037. elsif ($DENSITY[$id] eq "16384")
  1038. {
  1039. $DRAM_RANK0_SIZE[$id] = "0x80000000";
  1040. $DRAM_RANK1_SIZE[$id] = "0";
  1041. }
  1042. else
  1043. {
  1044. die "[Error]Wrong Density size!!DENSITY:$DENSITY[$id], Please check Density in MDL.\n";
  1045. }
  1046. #the rank size check algorithim should double check with EMI owner when porting.
  1047. #rank size check START
  1048. $hex_val = hex($EMI_CONA_VAL[$id]);
  1049. if ($DENSITY[$id] =~ /\+/)
  1050. {
  1051. if (!($hex_val & 0x20000))
  1052. {
  1053. die "[Error] Wrong CONA value with dual rank:$DENSITY[$id],$EMI_CONA_VAL[$id]"
  1054. }
  1055. }
  1056. else
  1057. {
  1058. if ($hex_val & 0x20000)
  1059. {
  1060. die "[Error] Wrong CONA value with single rank:$DENSITY[$id],$EMI_CONA_VAL[$id]";
  1061. }
  1062. }
  1063. #rank size check END
  1064. if ($DEV_TYPE[$id] eq "Discrete DDR1")
  1065. {
  1066. $DEV_TYPE1[$id] = "00" ;
  1067. $DEV_TYPE2[$id] = "01" ;
  1068. die "[Error][EMIgen] no support DDR1.";
  1069. $NAND_EMMC_ID[$id]="0x00";
  1070. $FW_ID[$id]="0x00"
  1071. }
  1072. elsif ($DEV_TYPE[$id] eq "Discrete LPDDR2")
  1073. {
  1074. $DEV_TYPE1[$id] = "00" ;
  1075. $DEV_TYPE2[$id] = "02" ;
  1076. $DIS_LPDDR2 = $DIS_LPDDR2 + 1 ;
  1077. $NAND_EMMC_ID[$id]="";
  1078. $FW_ID[$id]=""
  1079. }
  1080. elsif ($DEV_TYPE[$id] eq "Discrete LPDDR3")
  1081. {
  1082. $DEV_TYPE1[$id] = "00" ;
  1083. $DEV_TYPE2[$id] = "03" ;
  1084. $DIS_LPDDR3 = $DIS_LPDDR3 + 1 ;
  1085. $NAND_EMMC_ID[$id]="";
  1086. $FW_ID[$id]=""
  1087. }
  1088. elsif ($DEV_TYPE[$id] eq "Discrete PCDDR3")
  1089. {
  1090. $DEV_TYPE1[$id] = "00" ;
  1091. $DEV_TYPE2[$id] = "04" ;
  1092. die "[Error][EMIgen] no support PCDDR3.";
  1093. }
  1094. elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR1)")
  1095. {
  1096. $DEV_TYPE1[$id] = "01" ;
  1097. $DEV_TYPE2[$id] = "01" ;
  1098. die "[Error][EMIgen] no support NAND+DDR1.";
  1099. }
  1100. elsif ($DEV_TYPE[$id] eq "MCP(NAND+LPDDR2)")
  1101. {
  1102. $DEV_TYPE1[$id] = "01" ;
  1103. $DEV_TYPE2[$id] = "02" ;
  1104. $MCP_LPDDR2 = $MCP_LPDDR2 + 1 ;
  1105. die "[Error][EMIgen] no support NAND+LPDDR2.";
  1106. }
  1107. elsif ($DEV_TYPE[$id] eq "MCP(NAND+LPDDR3)")
  1108. {
  1109. $DEV_TYPE1[$id] = "01" ;
  1110. $DEV_TYPE2[$id] = "03" ;
  1111. $MCP_LPDDR3 = $MCP_LPDDR3 + 1 ;
  1112. die "[Error][EMIgen] no support NAND+LPDDR3.";
  1113. }
  1114. elsif ($DEV_TYPE[$id] eq "MCP(NAND+PCDDR3)")
  1115. {
  1116. $DEV_TYPE1[$id] = "01" ;
  1117. $DEV_TYPE2[$id] = "04" ;
  1118. $MCP_PCDDR3 = $MCP_PCDDR3 + 1 ;
  1119. die "[Error][EMIgen] no support NAND+PCDDR3.";
  1120. }
  1121. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR1)")
  1122. {
  1123. $DEV_TYPE1[$id] = "02" ;
  1124. $DEV_TYPE2[$id] = "01" ;
  1125. die "[Error][EMIgen] no support EMMC+DDR1.";
  1126. }
  1127. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDDR2)")
  1128. {
  1129. $DEV_TYPE1[$id] = "02" ;
  1130. $DEV_TYPE2[$id] = "02" ;
  1131. $MCP_LPDDR2 = $MCP_LPDDR2 + 1 ;
  1132. }
  1133. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+LPDDR3)")
  1134. {
  1135. $DEV_TYPE1[$id] = "02" ;
  1136. $DEV_TYPE2[$id] = "03" ;
  1137. $MCP_LPDDR3 = $MCP_LPDDR3 + 1 ;
  1138. }
  1139. elsif ($DEV_TYPE[$id] eq "MCP(eMMC+PCDDR3)")
  1140. {
  1141. $DEV_TYPE1[$id] = "02" ;
  1142. $DEV_TYPE2[$id] = "04" ;
  1143. $MCP_PCDDR3 = $MCP_PCDDR3 + 1 ;
  1144. die "[Error][EMIgen] no support eMMC+PCDDR3.";
  1145. }
  1146. else
  1147. {
  1148. die "[Error] unknown mcp type $DEV_TYPE[$id] \n" ;
  1149. }
  1150. #LPDDR2 MODE_REG5 empty value check START
  1151. if (($DEV_TYPE2[$id] eq "02") && ($LPDDR2_MODE_REG5[$id] eq ''))
  1152. {
  1153. die "[Error](".$id.")MDL error, LPDDR2 but no LPDDR2_MODE_REG5 information, please update the MDL\n";
  1154. }
  1155. if (($DEV_TYPE2[$id] eq "03") && ($LPDDR3_MODE_REG5[$id] eq ''))
  1156. {
  1157. die "[Error](".$id.")MDL error, LPDDR3 but no LPDDR3_MODE_REG5 information, please update the MDL\n";
  1158. }
  1159. #LPDDR2 MODE_REG5 empty value check END
  1160. print "NAND_EMMC_ID:$NAND_EMMC_ID[$id]\n";
  1161. # To parse NAND_EMMC_ID, we only support 12 bytes ID
  1162. if (length($NAND_EMMC_ID[$id]) % 2)
  1163. {
  1164. die "[Error] The wrong NAND_EMMC_ID: $NAND_EMMC_ID[$id] !! It is not byte align";
  1165. }
  1166. if (length($FW_ID[$id]) % 2)
  1167. {
  1168. die "[Error] The wrong FW_ID: $FW_ID[$id] !! It is not byte align";
  1169. }
  1170. $ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  1171. $FW_ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  1172. $Sub_version[$id] = "0x0";
  1173. $ID_Length[$id] = (length($NAND_EMMC_ID[$id])-2)/2;
  1174. $FW_ID_Length[$id] = (length($FW_ID[$id])-2)/2;
  1175. if ($ID_Length[$id] < 0)
  1176. {
  1177. $ID_Length[$id] = 0;
  1178. }
  1179. if ($FW_ID_Length[$id] < 0)
  1180. {
  1181. $FW_ID_Length[$id] = 0;
  1182. }
  1183. $nand_emmc_id_len = $ID_Length[$id];
  1184. print $ID_Length[$id].$FW_ID_Length[$id];
  1185. if ($ID_Length[$id]> 0)
  1186. {
  1187. my @NAND_VECTOR = ($NAND_EMMC_ID[$id] =~ m/([\dA-Fa-f]{2})/gs);
  1188. #create NAND_EMMC_ID string
  1189. $last = pop(@NAND_VECTOR);
  1190. $ID_String[$id] = "{";
  1191. foreach $a (@NAND_VECTOR)
  1192. {
  1193. $ID_String[$id] .= "0x$a,";
  1194. }
  1195. $ID_String[$id] .= "0x$last";
  1196. # To add ZERO in the end
  1197. if ($nand_emmc_id_len < $MAX_NAND_EMMC_ID_LEN)
  1198. {
  1199. for($i = 0; $i <($MAX_NAND_EMMC_ID_LEN - $ID_Length[$id]); $i++)
  1200. {
  1201. $ID_String[$id].= ",0x0"
  1202. }
  1203. }
  1204. $ID_String[$id] .= "}";
  1205. }
  1206. else{
  1207. $ID_Length[$id] = 0;
  1208. }
  1209. print "$ID_String[$id]\n" ;
  1210. #create FW ID string
  1211. if ($FW_ID_Length[$id] > 0)
  1212. {
  1213. my @FW_ID_VECTOR = ($FW_ID[$id] =~ m/([\dA-Fa-f]{2})/gs);
  1214. $last = pop(@FW_ID_VECTOR);
  1215. $FW_ID_String[$id] = "{";
  1216. foreach $a (@FW_ID_VECTOR)
  1217. {
  1218. $FW_ID_String[$id] .= "0x$a,";
  1219. }
  1220. $FW_ID_String[$id] .= "0x$last";
  1221. # To add ZERO in the end
  1222. if ($fw_id_len < $MAX_FW_ID_LEN)
  1223. {
  1224. for($i = 0; $i <($MAX_FW_ID_LEN - $FW_ID_Length[$id]); $i++)
  1225. {
  1226. $FW_ID_String[$id].= ",0x0"
  1227. }
  1228. }
  1229. $FW_ID_String[$id] .= "}";
  1230. }
  1231. else{
  1232. $FW_ID_Length[$id] = 0;
  1233. }
  1234. print "$FW_ID_String[$id]\n" ;
  1235. $EMI_SETTINGS[$id] = "\n\t//$PartNum\n\t{\n\t\t" ;
  1236. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $Sub_version[$id] . ",\t\t/* sub_version */\n\t\t" ;
  1237. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "0x" . $DEV_TYPE1[$id] . $DEV_TYPE2[$id] . ",\t\t/* TYPE */\n\t\t" ;
  1238. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_Length[$id] . ",\t\t/* EMMC ID/FW ID checking length */\n\t\t" ;
  1239. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $FW_ID_Length[$id] . ",\t\t/* FW length */\n\t\t" ;
  1240. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_String[$id] . ",\t\t/* NAND_EMMC_ID */\n\t\t" ;
  1241. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $FW_ID_String[$id] . ",\t\t/* FW_ID */\n\t\t" ;
  1242. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONA_VAL[$id] . ",\t\t/* EMI_CONA_VAL */\n\t\t" ;
  1243. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONH_VAL[$id] . ",\t\t/* EMI_CONH_VAL */\n\t\t" ;
  1244. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DRVCTL0_VAL[$id] . ",\t\t/* DRAMC_DRVCTL0_VAL */\n\t\t" ;
  1245. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DRVCTL1_VAL[$id] . ",\t\t/* DRAMC_DRVCTL1_VAL */\n\t\t" ;
  1246. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ACTIM_VAL[$id] . ",\t\t/* DRAMC_ACTIM_VAL */\n\t\t" ;
  1247. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_GDDR3CTL1_VAL[$id] . ",\t\t/* DRAMC_GDDR3CTL1_VAL */\n\t\t" ;
  1248. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CONF1_VAL[$id] . ",\t\t/* DRAMC_CONF1_VAL */\n\t\t" ;
  1249. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DDR2CTL_VAL[$id] . ",\t\t/* DRAMC_DDR2CTL_VAL */\n\t\t" ;
  1250. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_TEST2_3_VAL[$id] . ",\t\t/* DRAMC_TEST2_3_VAL */\n\t\t" ;
  1251. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CONF2_VAL[$id] . ",\t\t/* DRAMC_CONF2_VAL */\n\t\t" ;
  1252. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_PD_CTRL_VAL[$id] . ",\t\t/* DRAMC_PD_CTRL_VAL */\n\t\t" ;
  1253. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_PADCTL3_VAL[$id] . ",\t\t/* DRAMC_PADCTL3_VAL */\n\t\t" ;
  1254. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DQODLY_VAL[$id] . ",\t\t/* DRAMC_DQODLY_VAL */\n\t\t" ;
  1255. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ADDR_OUTPUT_DLY[$id] . ",\t\t/* DRAMC_ADDR_OUTPUT_DLY */\n\t\t" ;
  1256. #$EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CLK_OUTPUT_DLY[$id] . ",\t\t/* DRAMC_CLK_OUTPUT_DLY */\n\t\t" ;
  1257. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ACTIM1_VAL[$id] . ",\t\t/* DRAMC_ACTIM1_VAL*/\n\t\t" ;
  1258. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_MISCTL0_VAL[$id] . ",\t\t/* DRAMC_MISCTL0_VAL*/\n\t\t" ;
  1259. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ACTIM05T_VAL[$id] . ",\t\t/* DRAMC_ACTIM05T_VAL*/\n\t\t" ;
  1260. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_RKCFG_VAL[$id] . ",\t\t/* DRAMC_RKCFG_VAL*/\n\t\t" ;
  1261. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_TEST2_4_VAL[$id] . ",\t\t/* DRAMC_TEST2_4_VAL*/\n\t\t" ;
  1262. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{" . $DRAM_RANK0_SIZE[$id] . "," . $DRAM_RANK1_SIZE[$id] . ",0,0},\t\t/* DRAM RANK SIZE */\n\t\t" ;
  1263. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{0,0,0,0,0,0,0,0,0,0},\t\t/* reserved 10 */\n\t\t" ;
  1264. #union
  1265. #1 LPDDR2
  1266. if ($DDR1_2_3[$id] eq "LPDDR2")
  1267. {
  1268. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG1[$id] . ",\t\t/* LPDDR2_MODE_REG1 */\n\t\t" ;
  1269. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG2[$id] . ",\t\t/* LPDDR2_MODE_REG2 */\n\t\t" ;
  1270. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG3[$id] . ",\t\t/* LPDDR2_MODE_REG3 */\n\t\t" ;
  1271. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG5[$id] . ",\t\t/* LPDDR2_MODE_REG5 */\n\t\t" ;
  1272. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG10[$id] . ",\t\t/* LPDDR2_MODE_REG10 */\n\t\t" ;
  1273. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR2_MODE_REG63[$id] . ",\t\t/* LPDDR2_MODE_REG63 */\n\t}" ;
  1274. }
  1275. #2 DDR1
  1276. elsif ($DDR1_2_3[$id] eq "DDR1")
  1277. {
  1278. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_MODE_REG[$id] . ",\t\t/* DDR1_MODE_REG */\n\t\t" ;
  1279. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_EXT_MODE_REG[$id] . "\t\t/* DDR1_EXT_MODE_REG */\n\t}" ;
  1280. }
  1281. #3 PCDDR3
  1282. elsif ($DDR1_2_3[$id] eq "PCDDR3")
  1283. {
  1284. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG0[$id] . ",\t\t/* PCDDR3_MODE_REG0 */\n\t\t" ;
  1285. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG1[$id] . ",\t\t/* PCDDR3_MODE_REG1 */\n\t\t" ;
  1286. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG2[$id] . ",\t\t/* PCDDR3_MODE_REG2 */\n\t\t" ;
  1287. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG3[$id] . ",\t\t/* PCDDR3_MODE_REG3 */\n\t\t" ;
  1288. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG4[$id] . ",\t\t/* PCDDR3_MODE_REG4 */\n\t\t" ;
  1289. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $PCDDR3_MODE_REG5[$id] . ",\t\t/* PCDDR3_MODE_REG5 */\n\t}" ;
  1290. }
  1291. #3 LPDDR3
  1292. elsif ($DDR1_2_3[$id] eq "LPDDR3")
  1293. {
  1294. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG1[$id] . ",\t\t/* LPDDR3_MODE_REG1 */\n\t\t" ;
  1295. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG2[$id] . ",\t\t/* LPDDR3_MODE_REG2 */\n\t\t" ;
  1296. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG3[$id] . ",\t\t/* LPDDR3_MODE_REG3 */\n\t\t" ;
  1297. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG5[$id] . ",\t\t/* LPDDR3_MODE_REG5 */\n\t\t" ;
  1298. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG10[$id] . ",\t\t/* LPDDR3_MODE_REG10 */\n\t\t" ;
  1299. $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $LPDDR3_MODE_REG63[$id] . ",\t\t/* LPDDR3_MODE_REG63 */\n\t}" ;
  1300. }
  1301. print $EMI_SETTINGS[$id] ;
  1302. print "\n\n" ;
  1303. $id ++;
  1304. }
  1305. # return total_part_number_iter
  1306. return $id;
  1307. }
  1308. #****************************************************************************************
  1309. # subroutine: OsName
  1310. # return: which os this script is running
  1311. # input: no input
  1312. #****************************************************************************************
  1313. sub OsName {
  1314. my $os = `set os`;
  1315. if(!defined $os) {
  1316. $os = "linux";
  1317. }
  1318. else {
  1319. die "[Error]does not support windows now!!" ;
  1320. $os = "windows";
  1321. }
  1322. }
  1323. #*************************************************************************************************
  1324. # subroutine: gen_pm
  1325. # return: no return, but will generate a ForWindows.pm in "/perl/lib" where your perl install
  1326. #*************************************************************************************************
  1327. sub gen_pm {
  1328. foreach (@INC) {
  1329. if(/^.*:\/Perl\/lib$/) {
  1330. open FILE, ">${_}\/ForWindows.pm";
  1331. print FILE "package ForWindows;\n";
  1332. print FILE "use Win32::OLE qw(in with);\n";
  1333. print FILE "use Win32::OLE::Const 'Microsoft Excel';\n";
  1334. print FILE "\$Win32::OLE::Warn = 3;\n";
  1335. print FILE "1;";
  1336. close(FILE);
  1337. last;
  1338. }
  1339. }
  1340. }
  1341. #****************************************************************************************
  1342. # subroutine: get_sheet
  1343. # return: Excel worksheet no matter it's in merge area or not, and in windows or not
  1344. # input: Specified Excel Sheetname
  1345. #****************************************************************************************
  1346. sub get_sheet {
  1347. my $MEMORY_DEVICE_TYPE = $_[0];
  1348. print $MEMORY_DEVICE_TYPE ;
  1349. if ($os eq "windows") {
  1350. return $Sheet = $Book->Worksheets($MEMORY_DEVICE_TYPE);
  1351. }
  1352. else {
  1353. return $Sheet = $Book->Worksheet($MEMORY_DEVICE_TYPE);
  1354. }
  1355. }
  1356. #****************************************************************************************
  1357. # subroutine: xls_cell_value
  1358. # return: Excel cell value no matter it's in merge area or not, and in windows or not
  1359. # input: $Sheet: Specified Excel Sheet
  1360. # input: $row: Specified row number
  1361. # input: $col: Specified column number
  1362. #****************************************************************************************
  1363. sub xls_cell_value {
  1364. my ($Sheet, $row, $col) = @_;
  1365. if ($os eq "windows") {
  1366. return &trim(&win_xls_cell_value($Sheet, $row, $col));
  1367. }
  1368. else {
  1369. return &trim(&lin_xls_cell_value($Sheet, $row, $col));
  1370. }
  1371. }
  1372. sub win_xls_cell_value
  1373. {
  1374. my ($Sheet, $row, $col) = @_;
  1375. if ($Sheet->Cells($row, $col)->{'MergeCells'})
  1376. {
  1377. my $ma = $Sheet->Cells($row, $col)->{'MergeArea'};
  1378. return ($ma->Cells(1, 1)->{'Value'});
  1379. }
  1380. else
  1381. {
  1382. return ($Sheet->Cells($row, $col)->{'Value'})
  1383. }
  1384. }
  1385. sub lin_xls_cell_value
  1386. {
  1387. my ($Sheet, $row, $col) = @_;
  1388. my $cell = $Sheet->get_cell($row, $col);
  1389. return "" unless (defined $cell);
  1390. my $value = $cell->Value();
  1391. }
  1392. sub write_tag()
  1393. {
  1394. my $project = lc($_[0]);
  1395. my $filesize = 0x0 ;
  1396. my $ddr = -1 ;
  1397. if (-e $INFO_TAG)
  1398. {
  1399. unlink ($INFO_TAG);
  1400. }
  1401. my $temp_path = `dirname $INFO_TAG`;
  1402. `mkdir -p $temp_path`;
  1403. open FILE,">$INFO_TAG";
  1404. print FILE pack("a24", "MTK_BLOADER_INFO_v22");
  1405. #print FILE pack("a24", "MTK_BLOADER_INFO_v00");
  1406. $filesize = $filesize + 24 ;
  1407. seek(FILE, 0x1b, 0);
  1408. $pre_bin = "preloader_${project}.bin";
  1409. print "PROJECT = $project, pre_bin = $pre_bin\n";
  1410. print FILE pack("a64", $pre_bin);
  1411. $filesize = $filesize + 64 ;
  1412. seek(FILE, 0x58, 0);
  1413. print FILE pack("H8", 56313136);
  1414. $filesize = $filesize + 4 ;
  1415. print FILE pack("H8", 22884433);
  1416. $filesize = $filesize + 4 ;
  1417. print FILE pack("H8", "90007000");
  1418. $filesize = $filesize + 4 ;
  1419. print FILE pack("a8", "MTK_BIN");
  1420. $filesize = $filesize + 8 ;
  1421. # print FILE pack("H8", bc000000);
  1422. seek(FILE,0x6c, 0);
  1423. # 1.LPDDR2/LPDDR3 discrete dram number >= 2
  1424. #[DEL] 2.LPDDR2 discrete dram > 0, LPDDR2 MCP > 0
  1425. #[DEL] 3.LPDDR3 discrete dram > 0, LPDDR3 MCP > 0
  1426. if (($Discrete_DDR >= 2))
  1427. #if (($Discrete_DDR >= 2) || (($DIS_LPDDR2 > 0) && ($MCP_LPDDR2 > 0)) || (($DIS_LPDDR3 > 0) && ($MCP_LPDDR3 > 0)))
  1428. {
  1429. print "[EMIgen] Have multiple discrete dram\n";
  1430. print FILE pack("L", $TotalCustemChips+1); # number of emi settings + 1 default value emi_settings.
  1431. }else
  1432. {
  1433. print FILE pack("L", $TotalCustemChips); # number of emi settings.
  1434. }
  1435. $filesize = $filesize + 4 ;
  1436. my $iter = 0 ;
  1437. # 1.LPDDR2/LPDDR3 discrete dram number >= 2
  1438. #[DEL] 2.LPDDR2 discrete dram > 0, LPDDR2 MCP > 0
  1439. #[DEL] 3.LPDDR3 discrete dram > 0, LPDDR3 MCP > 0
  1440. if (($Discrete_DDR >= 2))
  1441. #if (($Discrete_DDR >= 2) || (($DIS_LPDDR2 > 0) && ($MCP_LPDDR2 > 0)) || (($DIS_LPDDR3 > 0) && ($MCP_LPDDR3 > 0)))
  1442. {
  1443. if ($DEV_TYPE2[0] eq "02")
  1444. {
  1445. $filesize = $filesize + &write_tag_one_element_default_LPDDR2() ;
  1446. }
  1447. elsif ($DEV_TYPE2[0] eq "03")
  1448. {
  1449. $filesize = $filesize + &write_tag_one_element_default_LPDDR3() ;
  1450. }
  1451. }
  1452. for $iter (0..$TotalCustemChips-1)
  1453. {
  1454. # generate MCP dram
  1455. if ($DEV_TYPE1[$iter] != "00")
  1456. {
  1457. $filesize = $filesize + &write_tag_one_element ($iter) ;
  1458. }
  1459. }
  1460. for $iter (0..$TotalCustemChips-1)
  1461. {
  1462. # generate discrete dram
  1463. if ($DEV_TYPE1[$iter] == "00")
  1464. {
  1465. $filesize = $filesize + &write_tag_one_element ($iter) ;
  1466. }
  1467. }
  1468. # $filesize = $filesize + 4 ;
  1469. # print "2.file size is $filesize \n";
  1470. print FILE pack("L", $filesize) ;
  1471. close (FILE) ;
  1472. print "$INFO_TAG is generated!\n";
  1473. return ;
  1474. }
  1475. sub write_tag_one_element_default_LPDDR2()
  1476. {
  1477. my $id = $_[0];
  1478. my $fs = 0 ;
  1479. print "in write_tag_one_element_default_LPDDR2";
  1480. print FILE pack ("L", hex (lc("0x0"))) ; # Sub_version checking for flash tool
  1481. $fs = $fs + 4 ;
  1482. print FILE pack("L", hex("0x0002")); #type
  1483. $fs = $fs + 4 ;
  1484. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  1485. $fs = $fs + 4 ;
  1486. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  1487. $fs = $fs + 4 ;
  1488. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  1489. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  1490. {
  1491. print FILE pack ("C", hex ($1)) ; #id
  1492. print FILE pack ("C", hex ($2)) ;
  1493. print FILE pack ("C", hex ($3)) ;
  1494. print FILE pack ("C", hex ($4)) ;
  1495. print FILE pack ("C", hex ($5)) ;
  1496. print FILE pack ("C", hex ($6)) ;
  1497. print FILE pack ("C", hex ($7)) ;
  1498. print FILE pack ("C", hex ($8)) ;
  1499. print FILE pack ("C", hex ($9)) ;
  1500. print FILE pack ("C", hex ($10)) ;
  1501. print FILE pack ("C", hex ($11)) ;
  1502. print FILE pack ("C", hex ($12)) ;
  1503. print FILE pack ("C", hex ($13)) ;
  1504. print FILE pack ("C", hex ($14)) ;
  1505. print FILE pack ("C", hex ($15)) ;
  1506. print FILE pack ("C", hex ($16)) ;
  1507. $fs = $fs + 16 ;
  1508. }
  1509. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  1510. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  1511. {
  1512. print FILE pack ("C", hex ($1)) ; #fw id
  1513. print FILE pack ("C", hex ($2)) ;
  1514. print FILE pack ("C", hex ($3)) ;
  1515. print FILE pack ("C", hex ($4)) ;
  1516. print FILE pack ("C", hex ($5)) ;
  1517. print FILE pack ("C", hex ($6)) ;
  1518. print FILE pack ("C", hex ($7)) ;
  1519. print FILE pack ("C", hex ($8)) ;
  1520. $fs = $fs + 8 ;
  1521. }
  1522. print FILE pack ("L", hex (lc("0x0000212E"))) ; # EMI_CONA_VAL
  1523. $fs = $fs + 4 ;
  1524. print FILE pack ("L", hex (lc("0xAA00AA00"))) ; # DRAMC_DRVCTL0_VAL
  1525. $fs = $fs + 4 ;
  1526. print FILE pack ("L", hex (lc("0xAA00AA00"))) ; # DRAMC_DRVCTL1_VAL
  1527. $fs = $fs + 4 ;
  1528. print FILE pack ("L", hex (lc("0x44584493"))) ; # DRAMC_ACTIM_VAL
  1529. $fs = $fs + 4 ;
  1530. print FILE pack ("L", hex (lc("0x01000000"))) ; # DRAMC_GDDR3CTL1_VAL
  1531. $fs = $fs + 4 ;
  1532. print FILE pack ("L", hex (lc("0xF0048683"))) ; # DRAMC_CONF1_VAL
  1533. $fs = $fs + 4 ;
  1534. print FILE pack ("L", hex (lc("0xA00632D1"))) ; # DRAMC_DDR2CTL_VAL
  1535. $fs = $fs + 4 ;
  1536. print FILE pack ("L", hex (lc("0xBF080401"))) ; # DRAMC_TEST2_3_VAL
  1537. $fs = $fs + 4 ;
  1538. print FILE pack ("L", hex (lc("0x0340633F"))) ; # DRAMC_CONF2_VAL
  1539. $fs = $fs + 4 ;
  1540. print FILE pack ("L", hex (lc("0x51642342"))) ; # DRAMC_PD_CTRL_VAL
  1541. $fs = $fs + 4 ;
  1542. print FILE pack ("L", hex (lc("0x00008888"))) ; # DRAMC_PADCTL3_VAL
  1543. $fs = $fs + 4 ;
  1544. print FILE pack ("L", hex (lc("0x88888888"))) ; # DRAMC_DQODLY_VAL
  1545. $fs = $fs + 4 ;
  1546. print FILE pack ("L", hex (lc("0x00000000"))) ; # DRAMC_ADDR_OUTPUT_DLY
  1547. $fs = $fs + 4 ;
  1548. print FILE pack ("L", hex (lc("0x00000000"))) ; # DRAMC_CLK_OUTPUT_DLY
  1549. $fs = $fs + 4 ;
  1550. print FILE pack ("L", hex (lc("0x01000510"))) ; # $DRAMC_ACTIM1_VAL
  1551. $fs = $fs + 4 ;
  1552. print FILE pack ("L", hex (lc("0x07800000"))) ; # DRAMC_MISCTL0_VAL
  1553. $fs = $fs + 4 ;
  1554. print FILE pack ("L", hex (lc("0x04002600"))) ; # $DRAMC_ACTIM05T_VAL
  1555. $fs = $fs + 4 ;
  1556. print FILE pack ("L", hex ("0")) ; # DRAM_RANK_SIZE[4]
  1557. print FILE pack ("L", hex ("0")) ;
  1558. print FILE pack ("L", hex ("0")) ;
  1559. print FILE pack ("L", hex ("0")) ;
  1560. $fs = $fs + 16 ;
  1561. print FILE pack ("L", hex ("0")) ; #reserved[10]
  1562. print FILE pack ("L", hex ("0")) ;
  1563. print FILE pack ("L", hex ("0")) ;
  1564. print FILE pack ("L", hex ("0")) ;
  1565. print FILE pack ("L", hex ("0")) ;
  1566. print FILE pack ("L", hex ("0")) ;
  1567. print FILE pack ("L", hex ("0")) ;
  1568. print FILE pack ("L", hex ("0")) ;
  1569. print FILE pack ("L", hex ("0")) ;
  1570. print FILE pack ("L", hex ("0")) ;
  1571. $fs = $fs + 40 ;
  1572. if (1)
  1573. {
  1574. #ddr2
  1575. print FILE pack ("L", hex (lc("0x00C30001"))) ; # DDR2_MODE_REG1
  1576. $fs = $fs + 4 ;
  1577. print FILE pack ("L", hex (lc("0x00060002"))) ; # DDR2_MODE_REG2
  1578. $fs = $fs + 4 ;
  1579. print FILE pack ("L", hex (lc("0x00020003"))) ; # DDR2_MODE_REG3
  1580. $fs = $fs + 4 ;
  1581. print FILE pack ("L", hex (lc("0x6"))) ; # DDR2_MODE_REG5
  1582. $fs = $fs + 4 ;
  1583. print FILE pack ("L", hex (lc("0x00FF000A"))) ; # DDR2_MODE_REG10
  1584. $fs = $fs + 4 ;
  1585. print FILE pack ("L", hex (lc("0x0000003F"))) ; # DDR2_MODE_REG63
  1586. $fs = $fs + 4 ;
  1587. }
  1588. # print "1.file size is $fs \n";
  1589. return $fs;
  1590. }
  1591. sub write_tag_one_element_default_LPDDR3()
  1592. {
  1593. my $id = $_[0];
  1594. my $fs = 0 ;
  1595. print "in write_tag_one_element_default_LPDDR3";
  1596. print FILE pack ("L", hex (lc("0x0"))) ; # Sub_version checking for flash tool
  1597. $fs = $fs + 4 ;
  1598. print FILE pack("L", hex("0x0003")); #type
  1599. $fs = $fs + 4 ;
  1600. print FILE pack ("L", scalar("0")) ; # EMMC ID checking length
  1601. $fs = $fs + 4 ;
  1602. print FILE pack ("L", scalar("0")) ; # FW ID checking length
  1603. $fs = $fs + 4 ;
  1604. $_ = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ;
  1605. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  1606. {
  1607. print FILE pack ("C", hex ($1)) ; #id
  1608. print FILE pack ("C", hex ($2)) ;
  1609. print FILE pack ("C", hex ($3)) ;
  1610. print FILE pack ("C", hex ($4)) ;
  1611. print FILE pack ("C", hex ($5)) ;
  1612. print FILE pack ("C", hex ($6)) ;
  1613. print FILE pack ("C", hex ($7)) ;
  1614. print FILE pack ("C", hex ($8)) ;
  1615. print FILE pack ("C", hex ($9)) ;
  1616. print FILE pack ("C", hex ($10)) ;
  1617. print FILE pack ("C", hex ($11)) ;
  1618. print FILE pack ("C", hex ($12)) ;
  1619. print FILE pack ("C", hex ($13)) ;
  1620. print FILE pack ("C", hex ($14)) ;
  1621. print FILE pack ("C", hex ($15)) ;
  1622. print FILE pack ("C", hex ($16)) ;
  1623. $fs = $fs + 16 ;
  1624. }
  1625. $_= "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}";
  1626. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  1627. {
  1628. print FILE pack ("C", hex ($1)) ; #fw id
  1629. print FILE pack ("C", hex ($2)) ;
  1630. print FILE pack ("C", hex ($3)) ;
  1631. print FILE pack ("C", hex ($4)) ;
  1632. print FILE pack ("C", hex ($5)) ;
  1633. print FILE pack ("C", hex ($6)) ;
  1634. print FILE pack ("C", hex ($7)) ;
  1635. print FILE pack ("C", hex ($8)) ;
  1636. $fs = $fs + 8 ;
  1637. }
  1638. print FILE pack ("L", hex (lc("0x00025052"))) ; # EMI_CONA_VAL
  1639. $fs = $fs + 4 ;
  1640. print FILE pack ("L", hex (lc("0x00000000"))) ; # EMI_CONH_VAL
  1641. $fs = $fs + 4 ;
  1642. #print FILE pack ("L", hex (lc("0xAA00AA00"))) ; # DRAMC_DRVCTL0_VAL
  1643. #$fs = $fs + 4 ;
  1644. #print FILE pack ("L", hex (lc("0xAA00AA00"))) ; # DRAMC_DRVCTL1_VAL
  1645. #$fs = $fs + 4 ;
  1646. print FILE pack ("L", hex (lc("0x66CB4619"))) ; # DRAMC_ACTIM_VAL
  1647. $fs = $fs + 4 ;
  1648. print FILE pack ("L", hex (lc("0x11000000"))) ; # DRAMC_GDDR3CTL1_VAL
  1649. $fs = $fs + 4 ;
  1650. print FILE pack ("L", hex (lc("0x000484C3"))) ; # DRAMC_CONF1_VAL
  1651. $fs = $fs + 4 ;
  1652. print FILE pack ("L", hex (lc("0x000053B1"))) ; # DRAMC_DDR2CTL_VAL
  1653. $fs = $fs + 4 ;
  1654. print FILE pack ("L", hex (lc("0xBFC90401"))) ; # DRAMC_TEST2_3_VAL
  1655. $fs = $fs + 4 ;
  1656. print FILE pack ("L", hex (lc("0x00806E60"))) ; # DRAMC_CONF2_VAL
  1657. $fs = $fs + 4 ;
  1658. print FILE pack ("L", hex (lc("0xD1643642"))) ; # DRAMC_PD_CTRL_VAL
  1659. $fs = $fs + 4 ;
  1660. #print FILE pack ("L", hex (lc("0x00008888"))) ; # DRAMC_PADCTL3_VAL
  1661. #$fs = $fs + 4 ;
  1662. #print FILE pack ("L", hex (lc("0x88888888"))) ; # DRAMC_DQODLY_VAL
  1663. #$fs = $fs + 4 ;
  1664. #print FILE pack ("L", hex (lc("0x00000000"))) ; # DRAMC_ADDR_OUTPUT_DLY
  1665. #$fs = $fs + 4 ;
  1666. #print FILE pack ("L", hex (lc("0x00000000"))) ; # DRAMC_CLK_OUTPUT_DLY
  1667. #$fs = $fs + 4 ;
  1668. print FILE pack ("L", hex (lc("0x91001E59"))) ; # $DRAMC_ACTIM1_VAL
  1669. $fs = $fs + 4 ;
  1670. print FILE pack ("L", hex (lc("0x17000000"))) ; # DRAMC_MISCTL0_VAL
  1671. $fs = $fs + 4 ;
  1672. print FILE pack ("L", hex (lc("0x000004F1"))) ; # $DRAMC_ACTIM05T_VAL
  1673. $fs = $fs + 4 ;
  1674. print FILE pack ("L", hex (lc("0x002145C1"))) ; # DRAMC_RKCFG_VAL
  1675. $fs = $fs + 4 ;
  1676. print FILE pack ("L", hex (lc("0x2701110D"))) ; # DRAMC_TEST2_4_VAL
  1677. $fs = $fs + 4 ;
  1678. print FILE pack ("L", hex ("0")) ; # DRAM_RANK_SIZE[4]
  1679. print FILE pack ("L", hex ("0")) ;
  1680. print FILE pack ("L", hex ("0")) ;
  1681. print FILE pack ("L", hex ("0")) ;
  1682. $fs = $fs + 16 ;
  1683. print FILE pack ("L", hex ("0")) ; #reserved[10]
  1684. print FILE pack ("L", hex ("0")) ;
  1685. print FILE pack ("L", hex ("0")) ;
  1686. print FILE pack ("L", hex ("0")) ;
  1687. print FILE pack ("L", hex ("0")) ;
  1688. print FILE pack ("L", hex ("0")) ;
  1689. print FILE pack ("L", hex ("0")) ;
  1690. print FILE pack ("L", hex ("0")) ;
  1691. print FILE pack ("L", hex ("0")) ;
  1692. print FILE pack ("L", hex ("0")) ;
  1693. $fs = $fs + 40 ;
  1694. if (1)
  1695. {
  1696. #ddr2
  1697. print FILE pack ("L", hex (lc("0x00E30001"))) ; # DDR2_MODE_REG1
  1698. $fs = $fs + 4 ;
  1699. print FILE pack ("L", hex (lc("0x00060002"))) ; # DDR2_MODE_REG2
  1700. $fs = $fs + 4 ;
  1701. print FILE pack ("L", hex (lc("0x00020003"))) ; # DDR2_MODE_REG3
  1702. $fs = $fs + 4 ;
  1703. print FILE pack ("L", hex (lc("0x6"))) ; # DDR2_MODE_REG5
  1704. $fs = $fs + 4 ;
  1705. print FILE pack ("L", hex (lc("0x00FF000A"))) ; # DDR2_MODE_REG10
  1706. $fs = $fs + 4 ;
  1707. print FILE pack ("L", hex (lc("0x0000003F"))) ; # DDR2_MODE_REG63
  1708. $fs = $fs + 4 ;
  1709. }
  1710. # print "1.file size is $fs \n";
  1711. return $fs;
  1712. }
  1713. sub write_tag_one_element()
  1714. {
  1715. my $id = $_[0];
  1716. my $type = "0x$DEV_TYPE1[$id]$DEV_TYPE2[$id]" ;
  1717. my $fs = 0 ;
  1718. print FILE pack ("L", hex (lc($Sub_version[$id]))) ; # Sub_version checking for flash tool
  1719. $fs = $fs + 4 ;
  1720. print FILE pack("L", hex($type)); #type
  1721. $fs = $fs + 4 ;
  1722. print FILE pack ("L", scalar($ID_Length[$id])) ; # EMMC ID checking length
  1723. $fs = $fs + 4 ;
  1724. print FILE pack ("L", scalar($FW_ID_Length[$id])) ; # FW ID checking length
  1725. $fs = $fs + 4 ;
  1726. $_ = $ID_String[$id] ;
  1727. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  1728. {
  1729. print FILE pack ("C", hex ($1)) ; #id
  1730. print FILE pack ("C", hex ($2)) ;
  1731. print FILE pack ("C", hex ($3)) ;
  1732. print FILE pack ("C", hex ($4)) ;
  1733. print FILE pack ("C", hex ($5)) ;
  1734. print FILE pack ("C", hex ($6)) ;
  1735. print FILE pack ("C", hex ($7)) ;
  1736. print FILE pack ("C", hex ($8)) ;
  1737. print FILE pack ("C", hex ($9)) ;
  1738. print FILE pack ("C", hex ($10)) ;
  1739. print FILE pack ("C", hex ($11)) ;
  1740. print FILE pack ("C", hex ($12)) ;
  1741. print FILE pack ("C", hex ($13)) ;
  1742. print FILE pack ("C", hex ($14)) ;
  1743. print FILE pack ("C", hex ($15)) ;
  1744. print FILE pack ("C", hex ($16)) ;
  1745. $fs = $fs + 16 ;
  1746. }
  1747. $_= $FW_ID_String[$id];
  1748. if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/)
  1749. {
  1750. print FILE pack ("C", hex ($1)) ; #fw id
  1751. print FILE pack ("C", hex ($2)) ;
  1752. print FILE pack ("C", hex ($3)) ;
  1753. print FILE pack ("C", hex ($4)) ;
  1754. print FILE pack ("C", hex ($5)) ;
  1755. print FILE pack ("C", hex ($6)) ;
  1756. print FILE pack ("C", hex ($7)) ;
  1757. print FILE pack ("C", hex ($8)) ;
  1758. $fs = $fs + 8 ;
  1759. }
  1760. print FILE pack ("L", hex (lc($EMI_CONA_VAL[$id]))) ; # EMI_CONA_VAL
  1761. $fs = $fs + 4 ;
  1762. print FILE pack ("L", hex (lc($EMI_CONH_VAL[$id]))) ; # EMI_CONH_VAL
  1763. $fs = $fs + 4 ;
  1764. #print FILE pack ("L", hex (lc($DRAMC_DRVCTL0_VAL[$id]))) ; # DRAMC_DRVCTL0_VAL
  1765. #$fs = $fs + 4 ;
  1766. #print FILE pack ("L", hex (lc($DRAMC_DRVCTL1_VAL[$id]))) ; # DRAMC_DRVCTL1_VAL
  1767. #$fs = $fs + 4 ;
  1768. print FILE pack ("L", hex (lc($DRAMC_ACTIM_VAL[$id]))) ; # DRAMC_ACTIM_VAL
  1769. $fs = $fs + 4 ;
  1770. print FILE pack ("L", hex (lc($DRAMC_GDDR3CTL1_VAL[$id]))) ; # DRAMC_GDDR3CTL1_VAL
  1771. $fs = $fs + 4 ;
  1772. print FILE pack ("L", hex (lc($DRAMC_CONF1_VAL[$id]))) ; # DRAMC_CONF1_VAL
  1773. $fs = $fs + 4 ;
  1774. print FILE pack ("L", hex (lc($DRAMC_DDR2CTL_VAL[$id]))) ; # DRAMC_DDR2CTL_VAL
  1775. $fs = $fs + 4 ;
  1776. print FILE pack ("L", hex (lc($DRAMC_TEST2_3_VAL[$id]))) ; # DRAMC_TEST2_3_VAL
  1777. $fs = $fs + 4 ;
  1778. print FILE pack ("L", hex (lc($DRAMC_CONF2_VAL[$id]))) ; # DRAMC_CONF2_VAL
  1779. $fs = $fs + 4 ;
  1780. print FILE pack ("L", hex (lc($DRAMC_PD_CTRL_VAL[$id]))) ; # DRAMC_PD_CTRL_VAL
  1781. $fs = $fs + 4 ;
  1782. #print FILE pack ("L", hex (lc($DRAMC_PADCTL3_VAL[$id]))) ; # DRAMC_PADCTL3_VAL
  1783. #$fs = $fs + 4 ;
  1784. #print FILE pack ("L", hex (lc($DRAMC_DQODLY_VAL[$id]))) ; # DRAMC_DQODLY_VAL
  1785. #$fs = $fs + 4 ;
  1786. #print FILE pack ("L", hex (lc($DRAMC_ADDR_OUTPUT_DLY[$id]))) ; # DRAMC_ADDR_OUTPUT_DLY
  1787. #$fs = $fs + 4 ;
  1788. #print FILE pack ("L", hex (lc($DRAMC_CLK_OUTPUT_DLY[$id]))) ; # DRAMC_CLK_OUTPUT_DLY
  1789. #$fs = $fs + 4 ;
  1790. print FILE pack ("L", hex (lc($DRAMC_ACTIM1_VAL[$id]))) ; # $DRAMC_ACTIM1_VAL
  1791. $fs = $fs + 4 ;
  1792. print FILE pack ("L", hex (lc($DRAMC_MISCTL0_VAL[$id]))) ; # DRAMC_MISCTL0_VAL
  1793. $fs = $fs + 4 ;
  1794. print FILE pack ("L", hex (lc($DRAMC_ACTIM05T_VAL[$id]))) ; # $DRAMC_ACTIM05T_VAL
  1795. $fs = $fs + 4 ;
  1796. print FILE pack ("L", hex (lc($DRAMC_RKCFG_VAL[$id]))) ; # DRAMC_RKCFG_VAL
  1797. $fs = $fs + 4 ;
  1798. print FILE pack ("L", hex (lc($DRAMC_TEST2_4_VAL[$id]))) ; # DRAMC_TEST2_4_VAL
  1799. $fs = $fs + 4 ;
  1800. print FILE pack ("L", hex (lc($DRAM_RANK0_SIZE[$id]))) ; # DRAM_RANK_SIZE[4]
  1801. print FILE pack ("L", hex (lc($DRAM_RANK1_SIZE[$id]))) ;
  1802. print FILE pack ("L", hex ("0")) ;
  1803. print FILE pack ("L", hex ("0")) ;
  1804. $fs = $fs + 16 ;
  1805. print FILE pack ("L", hex ("0")) ; #reserved[10]
  1806. print FILE pack ("L", hex ("0")) ;
  1807. print FILE pack ("L", hex ("0")) ;
  1808. print FILE pack ("L", hex ("0")) ;
  1809. print FILE pack ("L", hex ("0")) ;
  1810. print FILE pack ("L", hex ("0")) ;
  1811. print FILE pack ("L", hex ("0")) ;
  1812. print FILE pack ("L", hex ("0")) ;
  1813. print FILE pack ("L", hex ("0")) ;
  1814. print FILE pack ("L", hex ("0")) ;
  1815. $fs = $fs + 40 ;
  1816. if ($DEV_TYPE2[$id] == "02")
  1817. {
  1818. #ddr2
  1819. print FILE pack ("L", hex (lc($LPDDR2_MODE_REG1[$id]))) ; # LPDDR2_MODE_REG1
  1820. $fs = $fs + 4 ;
  1821. print FILE pack ("L", hex (lc($LPDDR2_MODE_REG2[$id]))) ; # LPDDR2_MODE_REG2
  1822. $fs = $fs + 4 ;
  1823. print FILE pack ("L", hex (lc($LPDDR2_MODE_REG3[$id]))) ; # LPDDR2_MODE_REG3
  1824. $fs = $fs + 4 ;
  1825. print FILE pack ("L", hex (lc($LPDDR2_MODE_REG5[$id]))) ; # LPDDR2_MODE_REG5
  1826. $fs = $fs + 4 ;
  1827. print FILE pack ("L", hex (lc($LPDDR2_MODE_REG10[$id]))) ; # LPDDR2_MODE_REG10
  1828. $fs = $fs + 4 ;
  1829. print FILE pack ("L", hex (lc($LPDDR2_MODE_REG63[$id]))) ; # LPDDR2_MODE_REG63
  1830. $fs = $fs + 4 ;
  1831. }
  1832. elsif ($DEV_TYPE2[$id] == "01")
  1833. { # ddr1
  1834. print FILE pack ("L", hex (lc($DDR1_MODE_REG[$id]))) ; # DDR1_MODE_REG;
  1835. $fs = $fs + 4 ;
  1836. print FILE pack ("L", hex (lc($DDR1_EXT_MODE_REG[$id]))) ; # DDR1_EXT_MODE_REG
  1837. $fs = $fs + 4 ;
  1838. print FILE pack ("L", hex ("0")) ;
  1839. $fs = $fs + 4 ;
  1840. print FILE pack ("L", hex ("0")) ;
  1841. $fs = $fs + 4 ;
  1842. print FILE pack ("L", hex ("0")) ;
  1843. $fs = $fs + 4 ;
  1844. print FILE pack ("L", hex ("0")) ;
  1845. $fs = $fs + 4 ;
  1846. }
  1847. elsif ($DEV_TYPE2[$id] == "04")
  1848. { # ddr3
  1849. print FILE pack ("L", hex (lc($PCDDR3_MODE_REG0[$id]))) ; # PCDDR3_MODE_REG0
  1850. $fs = $fs + 4 ;
  1851. print FILE pack ("L", hex (lc($PCDDR3_MODE_REG1[$id]))) ; # PCDDR3_MODE_REG1
  1852. $fs = $fs + 4 ;
  1853. print FILE pack ("L", hex (lc($PCDDR3_MODE_REG2[$id]))) ; # PCDDR3_MODE_REG2
  1854. $fs = $fs + 4 ;
  1855. print FILE pack ("L", hex (lc($PCDDR3_MODE_REG3[$id]))) ; # PCDDR3_MODE_REG3
  1856. $fs = $fs + 4 ;
  1857. print FILE pack ("L", hex (lc($PCDDR3_MODE_REG4[$id]))) ; # PCDDR3_MODE_TESTB
  1858. $fs = $fs + 4 ;
  1859. print FILE pack ("L", hex (lc($PCDDR3_MODE_REG5[$id]))) ;
  1860. $fs = $fs + 4 ;
  1861. }
  1862. elsif ($DEV_TYPE2[$id] == "03")
  1863. {
  1864. #ddr3
  1865. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG1[$id]))) ; # LPDDR3_MODE_REG1
  1866. $fs = $fs + 4 ;
  1867. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG2[$id]))) ; # LPDDR3_MODE_REG2
  1868. $fs = $fs + 4 ;
  1869. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG3[$id]))) ; # LPDDR3_MODE_REG3
  1870. $fs = $fs + 4 ;
  1871. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG5[$id]))) ; # LPDDR3_MODE_REG5
  1872. $fs = $fs + 4 ;
  1873. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG10[$id]))) ; #LPDDR3_MODE_REG10
  1874. $fs = $fs + 4 ;
  1875. print FILE pack ("L", hex (lc($LPDDR3_MODE_REG63[$id]))) ; #LPDDR3_MODE_REG63
  1876. $fs = $fs + 4 ;
  1877. }
  1878. # print "1.file size is $fs \n";
  1879. return $fs;
  1880. }