emigen.pl 74 KB

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