--- a/mediatek/build/tools/emigen/MT6575/emigen.pl +++ b/mediatek/build/tools/emigen/MT6575/emigen.pl @@ -205,6 +205,15 @@ my $is_existed_c = (-e $CUSTOM_EMI_C)? 1 : 0; #**************************************************************************** open CUSTOM_MEMORY_DEVICE_HDR, "<$CUSTOM_MEMORY_DEVICE_HDR" or &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: file error!", __FILE__, __LINE__); +# CustCS_CustemChips: +# the number of part number which customer assigned +# in mediatek/custom/$project/preloader/inc/custom_MemoryDevice.h +# TotalCustemChips: +# because one part number may matches multiple emmc/nand ID, the TotalCustemChips >= CustCS_CustemChips +# the final number of part number which will use to create emi_setting +# in mediatek/custom/$project/preloader/inc/custom_emi.h +# +my $CustCS_CustemChips = 0 ; my $TotalCustemChips = 0 ; # @@ -213,14 +222,31 @@ my $TotalCustemChips = 0 ; # this should be an array of structurs, but it is said perl does not support it. # these are input, except EMI_GEND # -my $CustCS_PART_NUMBER ; + +# CustCS_PART_NUMBER: +# the content of part number which customer assigned +# in mediatek/custom/$project/preloader/inc/custom_MemoryDevice.h +# Total_PART_NUMBER: +# the final part number which will show +# in mediatek/custom/$project/preloader/inc/custom_emi.h + my $CustCS_PART_NUMBER ; +my $Total_PART_NUMBER ; + ###################################################################################### my $DEV_TYPE; my $DEV_TYPE1; my $DEV_TYPE2; my $NAND_EMMC_ID; +my $FW_ID ; my $ID_String ; +my $FW_ID_String ; +my $Sub_version; +my $USE_EMMC_ID_LEN=9; +my $MAX_NAND_EMMC_ID_LEN=12; +my $MAX_FW_ID_LEN=8; +#my $ORI_ID_Length; +my $fw_id_len; my $NAND_PAGE_SIZE; my $EMI_CONA_VAL; my $DRAMC_DRVCTL0_VAL; @@ -290,13 +316,13 @@ while (<CUSTOM_MEMORY_DEVICE_HDR>) { #print "\nCS0 $2, $3\n" ; $CustCS_PART_NUMBER[$2] = $3 ; - $TotalCustemChips = $TotalCustemChips + 1 ; + $CustCS_CustemChips = $CustCS_CustemChips + 1 ; print "$CustCS_PART_NUMBER[$2]\n" } } } -print "\n$TotalCustemChips\n" if ($DebugPrint ==1); +print "\n$CustCS_CustemChips\n" if ($DebugPrint ==1); close CUSTOM_MEMORY_DEVICE_HDR; # # @@ -309,13 +335,13 @@ close CUSTOM_MEMORY_DEVICE_HDR; # # check if data validate. # -if ($TotalCustemChips > 10) +if ($CustCS_CustemChips > 10) { - die "\nTotalCustemChips($TotalCustemChips) > 30\n" ; + die "\n[Error]CustCS_CustemChips($CustCS_CustemChips) > 30\n" ; } -if ($TotalCustemChips == 0) +if ($CustCS_CustemChips == 0) { - die "\nTotalCustemChips($TotalCustemChips) = 0?\n" ; + die "\n[Error]CustCS_CustemChips($CustCS_CustemChips) = 0?\n" ; } @@ -339,11 +365,15 @@ else } # select worksheet my $Sheet; -my $eos_flag = 7; # if this flag counts to '0', it means End Of Sheet +my $eos_flag = 4; # if this flag counts to '0', it means End Of Sheet my $iter = 0 ; - while ($iter<$TotalCustemChips) +my $CustCS_part_number_iter = 0; +my $total_part_number_iter = 0; + + while ($iter<$CustCS_CustemChips) { - &DeviceListParser_LPSDRAM($iter); + $eos_flag = 4; + $total_part_number_iter = &DeviceListParser_LPSDRAM($iter,$total_part_number_iter); $iter = $iter + 1 ; } @@ -352,6 +382,7 @@ my $iter = 0 ; my $Discrete_DDR = 0 ; my $EMMC_NAND_MCP = "00" ; my $Page_size = "0" ; + print "TotalCustemChips:$TotalCustemChips\n"; while ($iter < $TotalCustemChips) { # only one Discrete is allowed @@ -363,7 +394,7 @@ my $iter = 0 ; } else { - die "more than 1 Discrete DDR used!\n" ; + die "[Error]more than 1 Discrete DDR used!\n" ; } } @@ -374,7 +405,7 @@ my $iter = 0 ; } elsif ($EMMC_NAND_MCP != $DEV_TYPE1[$iter] && $DEV_TYPE1[$iter] != "00") { - die "Both NAND and eMMC are used!\n" + die "[Error]Both NAND and eMMC are used!\n" } # can't use different page size. @@ -388,7 +419,7 @@ my $iter = 0 ; { if ($Page_size != $NAND_PAGE_SIZE[$iter]) { - die "different MCP page size!$Page_size, $NAND_PAGE_SIZE[$iter]\n" ; + die "[Error]different MCP page size!$Page_size, $NAND_PAGE_SIZE[$iter]\n" ; } } } @@ -400,11 +431,16 @@ my $iter = 0 ; { if ($DEV_TYPE1[$iter] != "00") { - if ( $CustCS_PART_NUMBER[iter] == $CustCS_PART_NUMBER[iter2] ) + if ($NAND_EMMC_ID[$iter] eq $NAND_EMMC_ID[$iter2]) { - if ($NAND_EMMC_ID[iter] != $NAND_EMMC_ID[iter2]) + if ( $Total_PART_NUMBER[$iter] ne $Total_PART_NUMBER[$iter2] ) + { + die "[Error]Different part number:$Total_PART_NUMBER[$iter],$Total_PART_NUMBER[$iter2] with same NAND/eMMC ID:$NAND_EMMC_ID[$iter]" + } + else { - die "different NAND/eMMC ID with same part number $CustCS_PART_NUMBER[iter] !\n" ; + die "[Error]Two same part number:$Total_PART_NUMBER[$iter],$Total_PART_NUMBER[$iter2] with same NAND/eMMC ID:$NAND_EMMC_ID[$iter]" + } } } @@ -484,7 +520,7 @@ sub error_handler { my ($error_msg, $file, $line_no) = @_; - my $final_error_msg = "EMIGEN ERROR: $error_msg at $file line $line_no\n"; + my $final_error_msg = "[Error]EMIGEN ERROR: $error_msg at $file line $line_no\n"; print $final_error_msg; die $final_error_msg; } @@ -736,21 +772,23 @@ __TEMPLATE sub DeviceListParser_LPSDRAM { my ($id) ; + my ($CustCS_id) ; my ($PartNum) ; + my ($iter); + my ($num_part_found); - my ($is_part_found) ; # 0: No part number is found - # 1: 1 part number is found - $is_part_found = 0 ; - - $id = $_[0] ; + + $num_part_found = 0 ; + $CustCS_id = $_[0]; # CustCS_CustemChips_iter + $id = $_[1] ; # total_part_number_iter - $PartNum = $CustCS_PART_NUMBER[$id] ; + $PartNum = $CustCS_PART_NUMBER[$CustCS_id] ; + print "\nCustCS ID num is $CustCS_id, part number:$CustCS_PART_NUMBER[$CustCS_id]\n" ; - print "\nnum is $id, nandID is $CustNAND_ID[$id]\n" ; my $row = $start_num + 0 ; # scan from row 2 when $MEMORY_DEVICE_TYPE eq 'LPSDRAM' my $col = $COLUMN_PART_NUMBER ; # scan column 2 for Part Number - my $EXCEL_ROW ; + my $rows_part_found; # stores the part numbers found in MDL $Sheet = get_sheet("mt6575") ; @@ -775,7 +813,7 @@ sub DeviceListParser_LPSDRAM } - $eos_flag = 7 ; + $eos_flag = 4 ; # remove leading and tailing spaces $scan_idx =~ s/^\s+// if $DebugPrint == 1 ; @@ -793,255 +831,346 @@ sub DeviceListParser_LPSDRAM $boardid = &xls_cell_value($Sheet, $row, $COLUMN_BOARD_ID) ; if ($CustBoard_ID eq $boardid) { - $EXCEL_ROW = $row; + $rows_part_found[$num_part_found] = $row; print "\nPartNum($PartNum==$scan_idx) found in row $row\n" ; - - $is_part_found = 1 ; - last ; + $Total_PART_NUMBER[$TotalCustemChips] = $PartNum; + $num_part_found += 1 ; + $TotalCustemChips += 1; } } } - if ($is_part_found != 1) + if ($num_part_found == 0) { - die "\nunsupported part number $PartNum\n" ; + die "\n[Error]unsupported part number $PartNum\n" ; } - $_ = $row ; - - $VENDOR[$id] = &xls_cell_value($Sheet, $_, $COLUMN_VENDOR) ; - - $DENSITY[$id] = &xls_cell_value($Sheet, $_, $COLUMN_DENSITY) ; - + $iter = 0; + while ($iter<$num_part_found) + { - # find the correct platform - my $platform_scan_idx = $COLUMN_PLATFORM ; #First EMI controller - - my $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx) ; - + $_ = $rows_part_found[$iter] ; + $iter ++; + + $VENDOR[$id] = &xls_cell_value($Sheet, $_, $COLUMN_VENDOR) ; + + $DENSITY[$id] = &xls_cell_value($Sheet, $_, $COLUMN_DENSITY) ; + + + # find the correct platform + my $platform_scan_idx = $COLUMN_PLATFORM ; #First EMI controller + + my $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx) ; + + while (!($tmp_platform =~ $PLATFORM)) + { + $platform_scan_idx++; + $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx); + } + + &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: $PLATFORM not support LPSDRAM!", __FILE__, __LINE__) if ($platform_scan_idx > $COLUMN_PLATFORM); + + $DEV_TYPE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_TYPE) ; + $NAND_EMMC_ID[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_EMMC_ID) ; + $NAND_PAGE_SIZE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_PAGE_SIZE) ; + + $EMI_CONA_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_DRVCTL0_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_DRVCTL1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_DLE_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_ACTIM_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_GDDR3CTL1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_CONF1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_DDR2CTL_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_TEST2_3_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_CONF2_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_PD_CTRL_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_PADCTL3_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_DQODLY_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_ADDR_OUTPUT_DLY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DRAMC_CLK_OUTPUT_DLY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + + + $DDR1_2_3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + + # openoffice saved file workaround + + if ($DEV_TYPE[$id] =~ /DDR1/) + { + $DDR1_2_3[$id] = 'DDR1'; + } + elsif ($DEV_TYPE[$id] =~ /DDR2/) + { + $DDR1_2_3[$id] = 'DDR2'; + } + elsif ($DEV_TYPE[$id] =~ /DDR3/) + { + $DDR1_2_3[$id] = 'DDR3'; + } - while (!($tmp_platform =~ $PLATFORM)) - { - $platform_scan_idx++; - $tmp_platform = &xls_cell_value($Sheet, $start_num, $platform_scan_idx); - } - - - &error_handler("$CUSTOM_MEMORY_DEVICE_HDR: $PLATFORM not support LPSDRAM!", __FILE__, __LINE__) if ($platform_scan_idx > $COLUMN_PLATFORM); - - $DEV_TYPE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_TYPE) ; - $NAND_EMMC_ID[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_EMMC_ID) ; - $NAND_PAGE_SIZE[$id] = &xls_cell_value($Sheet, $_, $COLUMN_NAND_PAGE_SIZE) ; - - $EMI_CONA_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_DRVCTL0_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_DRVCTL1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_DLE_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_ACTIM_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_GDDR3CTL1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_CONF1_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_DDR2CTL_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_TEST2_3_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_CONF2_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_PD_CTRL_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_PADCTL3_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_DQODLY_VAL[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_ADDR_OUTPUT_DLY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DRAMC_CLK_OUTPUT_DLY[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - - - $DDR1_2_3[id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - - # openoffice saved file workaround - - if ($DEV_TYPE[$id] =~ /DDR1/) - { - $DDR1_2_3[id] = 'DDR1'; - } - elsif ($DEV_TYPE[$id] =~ /DDR2/) - { - $DDR1_2_3[id] = 'DDR2'; - } - elsif ($DEV_TYPE[$id] =~ /DDR3/) - { - $DDR1_2_3[id] = 'DDR3'; - } - #union #1 DDR2 - if ($DDR1_2_3[id] eq "DDR2") - { - $DDR2_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR2_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR2_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR2_MODE_REG10[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR2_MODE_REG63[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - } + if ($DDR1_2_3[$id] eq "DDR2") + { + $DDR2_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR2_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR2_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR2_MODE_REG10[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR2_MODE_REG63[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + } #2 DDR1 - elsif ($DDR1_2_3[id] eq "DDR1") - { - $DDR1_MODE_REG[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR1_EXT_MODE_REG[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - } + elsif ($DDR1_2_3[$id] eq "DDR1") + { + $DDR1_MODE_REG[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR1_EXT_MODE_REG[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + } #3 DDR3 - elsif ($DDR1_2_3[id] eq "DDR3") - { - $DDR3_MODE_REG0[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR3_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR3_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - $DDR3_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; - } + elsif ($DDR1_2_3[$id] eq "DDR3") + { + $DDR3_MODE_REG0[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR3_MODE_REG1[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR3_MODE_REG2[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + $DDR3_MODE_REG3[$id] = &xls_cell_value($Sheet, $_, $platform_scan_idx++) ; + } + if ($DENSITY[$id] eq "4096+4096") + { + $DRAM_RANK0_SIZE[$id] = "0x20000000"; + $DRAM_RANK1_SIZE[$id] = "0x20000000"; + } + elsif ($DENSITY[$id] eq "2048+2048") + { + $DRAM_RANK0_SIZE[$id] = "0x10000000"; + $DRAM_RANK1_SIZE[$id] = "0x10000000"; + } + elsif ($DENSITY[$id] eq "4096+2048") + { + $DRAM_RANK0_SIZE[$id] = "0x20000000"; + $DRAM_RANK1_SIZE[$id] = "0x10000000"; + } + elsif ($DENSITY[$id] eq "8192") + { + $DRAM_RANK0_SIZE[$id] = "0x40000000"; + $DRAM_RANK1_SIZE[$id] = "0"; + } + elsif ($DENSITY[$id] eq "4096") + { + $DRAM_RANK0_SIZE[$id] = "0x20000000"; + $DRAM_RANK1_SIZE[$id] = "0"; + } + elsif ($DENSITY[$id] eq "2048") + { + $DRAM_RANK0_SIZE[$id] = "0x10000000"; + $DRAM_RANK1_SIZE[$id] = "0"; + } - if ($DENSITY[$id] eq "4096+4096") - { - $DRAM_RANK0_SIZE[$id] = "0x20000000"; - $DRAM_RANK1_SIZE[$id] = "0x20000000"; - } - elsif ($DENSITY[$id] eq "2048+2048") - { - $DRAM_RANK0_SIZE[$id] = "0x10000000"; - $DRAM_RANK1_SIZE[$id] = "0x10000000"; - } - elsif ($DENSITY[$id] eq "4096+2048") - { - $DRAM_RANK0_SIZE[$id] = "0x20000000"; - $DRAM_RANK1_SIZE[$id] = "0x10000000"; - } - elsif ($DENSITY[$id] eq "8192") - { - $DRAM_RANK0_SIZE[$id] = "0x40000000"; - $DRAM_RANK1_SIZE[$id] = "0"; - } - elsif ($DENSITY[$id] eq "4096") - { - $DRAM_RANK0_SIZE[$id] = "0x20000000"; - $DRAM_RANK1_SIZE[$id] = "0"; - } - elsif ($DENSITY[$id] eq "2048") - { - $DRAM_RANK0_SIZE[$id] = "0x10000000"; - $DRAM_RANK1_SIZE[$id] = "0"; - } - - if ($DEV_TYPE[$id] eq "Discrete DDR1") - { - $DEV_TYPE1[$id] = "00" ; - $DEV_TYPE2[$id] = "01" ; - } - elsif ($DEV_TYPE[$id] eq "Discrete DDR2") - { - $DEV_TYPE1[$id] = "00" ; - $DEV_TYPE2[$id] = "02" ; - } - elsif ($DEV_TYPE[$id] eq "Discrete DDR3") - { - $DEV_TYPE1[$id] = "00" ; - $DEV_TYPE2[$id] = "03" ; - } - elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR1)") - { - $DEV_TYPE1[$id] = "01" ; - $DEV_TYPE2[$id] = "01" ; - } - elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR2)") - { - $DEV_TYPE1[$id] = "01" ; - $DEV_TYPE2[$id] = "02" ; - } - elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR3)") - { - $DEV_TYPE1[$id] = "01" ; - $DEV_TYPE2[$id] = "03" ; - } - elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR1)") - { - $DEV_TYPE1[$id] = "02" ; - $DEV_TYPE2[$id] = "01" ; - } - elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR2)") - { - $DEV_TYPE1[$id] = "02" ; - $DEV_TYPE2[$id] = "02" ; - } - elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR3)") - { - $DEV_TYPE1[$id] = "02" ; - $DEV_TYPE2[$id] = "03" ; - } - else - { - die "unknown mcp type $DEV_TYPE[$id] \n" ; - } + if ($DEV_TYPE[$id] eq "Discrete DDR1") + { + $DEV_TYPE1[$id] = "00" ; + $DEV_TYPE2[$id] = "01" ; + } + elsif ($DEV_TYPE[$id] eq "Discrete DDR2") + { + $DEV_TYPE1[$id] = "00" ; + $DEV_TYPE2[$id] = "02" ; + } + elsif ($DEV_TYPE[$id] eq "Discrete DDR3") + { + $DEV_TYPE1[$id] = "00" ; + $DEV_TYPE2[$id] = "03" ; + } + elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR1)") + { + $DEV_TYPE1[$id] = "01" ; + $DEV_TYPE2[$id] = "01" ; + } + elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR2)") + { + $DEV_TYPE1[$id] = "01" ; + $DEV_TYPE2[$id] = "02" ; + } + elsif ($DEV_TYPE[$id] eq "MCP(NAND+DDR3)") + { + $DEV_TYPE1[$id] = "01" ; + $DEV_TYPE2[$id] = "03" ; + } + elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR1)") + { + $DEV_TYPE1[$id] = "02" ; + $DEV_TYPE2[$id] = "01" ; + } + elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR2)") + { + $DEV_TYPE1[$id] = "02" ; + $DEV_TYPE2[$id] = "02" ; + } + elsif ($DEV_TYPE[$id] eq "MCP(eMMC+DDR3)") + { + $DEV_TYPE1[$id] = "02" ; + $DEV_TYPE2[$id] = "03" ; + } + else + { + die "[Error]unknown mcp type $DEV_TYPE[$id] \n" ; + } - $_ = $NAND_EMMC_ID[$id] ; - $ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ; - if ($DEV_TYPE1[$id] == "01" ) - { - if (/([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])/) + $_ = $NAND_EMMC_ID[$id] ; + print "NAND_EMMC_ID:$NAND_EMMC_ID[$id]\n"; + # To parse NAND_EMMC_ID, we only support 12 bytes ID + if (length($NAND_EMMC_ID[$id]) % 2) { - $ID_String[$id] = "{0x$1,0x$2,0x$3,0x$4,0x$5,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ; - print "$ID_String[$id]\n" ; + die "[Error] The wrong NAND_EMMC_ID: $NAND_EMMC_ID[$id] !!"; } - } - elsif ($DEV_TYPE1[$id] == "02" ) - { - if(/([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])([\dA-Fa-f][\dA-Fa-f])/) + $ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ; + $FW_ID_String[$id] = "{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}" ; + $ID_Length[$id] = (length($NAND_EMMC_ID[$id])-2)/2; + my @NAND_VECTOR = ($NAND_EMMC_ID[$id] =~ m/([\dA-Fa-f]{2})/gs); + my @FW_ID_VECTOR; + my $fw_id_len=0; + my $nand_emmc_id_len=0; + my $i; + + + print "To parse EMMC ID & FW ID:$DEV_TYPE1[$id],$ID_Length[$id]\n"; + if ($DEV_TYPE1[$id] == "00" || $DEV_TYPE1[$id] == "01") { - $ID_String[$id] = "{0x$1,0x$2,0x$3,0x$4,0x$5,0x$6,0x$7,0x$8,0x$9,0x0,0x0,0x0}" ; - print "$ID_String[$id]\n" ; + # Do nothing for NAND FW ID + $nand_emmc_id_len = $ID_Length[$id]; + $fw_id_len = 0; + @FW_ID_VECTOR = ""; + # The sub_version will be 1 once we have id_length + if($ID_Length[$id] == 9) + { + $Sub_version[$id] = "0x0"; + } + else + { + $Sub_version[$id] = "0x1"; + } } - } - - $EMI_SETTINGS[$id] = "\n\t//$PartNum\n\t{\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "0x" . $DEV_TYPE1[$id] . $DEV_TYPE2[$id] . ",\t\t/* TYPE */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_String[$id] . ",\t\t/* NAND_EMMC_ID */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONA_VAL[$id] . ",\t\t/* EMI_CONA_VAL */\n\t\t" ; - - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DRVCTL0_VAL[$id] . ",\t\t/* DRAMC_DRVCTL0_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DRVCTL1_VAL[$id] . ",\t\t/* DRAMC_DRVCTL1_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DLE_VAL[$id] . ",\t\t/* DRAMC_DLE_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ACTIM_VAL[$id] . ",\t\t/* DRAMC_ACTIM_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_GDDR3CTL1_VAL[$id] . ",\t\t/* DRAMC_GDDR3CTL1_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CONF1_VAL[$id] . ",\t\t/* DRAMC_CONF1_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DDR2CTL_VAL[$id] . ",\t\t/* DRAMC_DDR2CTL_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_TEST2_3_VAL[$id] . ",\t\t/* DRAMC_TEST2_3_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CONF2_VAL[$id] . ",\t\t/* DRAMC_CONF2_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_PD_CTRL_VAL[$id] . ",\t\t/* DRAMC_PD_CTRL_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_PADCTL3_VAL[$id] . ",\t\t/* DRAMC_PADCTL3_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DQODLY_VAL[$id] . ",\t\t/* DRAMC_DQODLY_VAL */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ADDR_OUTPUT_DLY[$id] . ",\t\t/* DRAMC_ADDR_OUTPUT_DLY */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CLK_OUTPUT_DLY[$id] . ",\t\t/* DRAMC_CLK_OUTPUT_DLY */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{" . $DRAM_RANK0_SIZE[$id] . "," . $DRAM_RANK1_SIZE[$id] . ",0,0},\t\t/* DRAM RANK SIZE */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{0,0,0,0,0,0},\t\t/* reserved 6 */\n\t\t" ; - + elsif ($DEV_TYPE1[$id] == "02" ) + { + $nand_emmc_id_len = $USE_EMMC_ID_LEN; + $fw_id_len = $ID_Length[$id] - $nand_emmc_id_len; + @FW_ID_VECTOR = @NAND_VECTOR[$USE_EMMC_ID_LEN...($ID_Length[$id]-1)]; + foreach(1...$fw_id_len) + { + pop(@NAND_VECTOR); + } + print "EMMC_FW_ID:@FW_ID_VECTOR\n" ; + # for previous emmc version only check 9 bytes. + if($ID_Length[$id] == 9) + { + $Sub_version[$id] = "0x0"; + } + else + { + $Sub_version[$id] = "0x1"; + } + } + if ($fw_id_len > $MAX_FW_ID_LEN) + { + die("[ERROR] The FW ID number is larger then 8."); + } + #create NAND_EMMC_ID string + $last = pop(@NAND_VECTOR); + $ID_String[$id] = "{"; + foreach $a (@NAND_VECTOR) + { + $ID_String[$id] .= "0x$a,"; + } + $ID_String[$id] .= "0x$last"; + # To add ZERO in the end + if ($nand_emmc_id_len < $MAX_NAND_EMMC_ID_LEN) + { + for($i = 0; $i <($MAX_NAND_EMMC_ID_LEN - $nand_emmc_id_len); $i++) + { + $ID_String[$id].= ",0x0" + } + } + $ID_String[$id] .= "}"; + + print "$ID_String[$id]\n" ; + + #create FW ID string + $last = pop(@FW_ID_VECTOR); + if ($fw_id_len != 0) + { + $FW_ID_String[$id] = "{"; + foreach $a (@FW_ID_VECTOR) + { + $FW_ID_String[$id] .= "0x$a,"; + } + $FW_ID_String[$id] .= "0x$last"; + # To add ZERO in the end + if ($fw_id_len < $MAX_FW_ID_LEN) + { + for($i = 0; $i <($MAX_FW_ID_LEN - $fw_id_len); $i++) + { + $FW_ID_String[$id].= ",0x0" + } + } + $FW_ID_String[$id] .= "}"; + } + print "$FW_ID_String[$id]\n" ; + + $EMI_SETTINGS[$id] = "\n\t//$PartNum\n\t{\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "0x" . $DEV_TYPE1[$id] . $DEV_TYPE2[$id] . ",\t\t/* TYPE */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_String[$id] . ",\t\t/* NAND_EMMC_ID */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $EMI_CONA_VAL[$id] . ",\t\t/* EMI_CONA_VAL */\n\t\t" ; + + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DRVCTL0_VAL[$id] . ",\t\t/* DRAMC_DRVCTL0_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DRVCTL1_VAL[$id] . ",\t\t/* DRAMC_DRVCTL1_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DLE_VAL[$id] . ",\t\t/* DRAMC_DLE_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ACTIM_VAL[$id] . ",\t\t/* DRAMC_ACTIM_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_GDDR3CTL1_VAL[$id] . ",\t\t/* DRAMC_GDDR3CTL1_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CONF1_VAL[$id] . ",\t\t/* DRAMC_CONF1_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DDR2CTL_VAL[$id] . ",\t\t/* DRAMC_DDR2CTL_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_TEST2_3_VAL[$id] . ",\t\t/* DRAMC_TEST2_3_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CONF2_VAL[$id] . ",\t\t/* DRAMC_CONF2_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_PD_CTRL_VAL[$id] . ",\t\t/* DRAMC_PD_CTRL_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_PADCTL3_VAL[$id] . ",\t\t/* DRAMC_PADCTL3_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_DQODLY_VAL[$id] . ",\t\t/* DRAMC_DQODLY_VAL */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_ADDR_OUTPUT_DLY[$id] . ",\t\t/* DRAMC_ADDR_OUTPUT_DLY */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DRAMC_CLK_OUTPUT_DLY[$id] . ",\t\t/* DRAMC_CLK_OUTPUT_DLY */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{" . $DRAM_RANK0_SIZE[$id] . "," . $DRAM_RANK1_SIZE[$id] . ",0,0},\t\t/* DRAM RANK SIZE */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . "{0,0},\t\t/* reserved 2 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $FW_ID_String[$id] . ",\t\t/* EMMC FW ID */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $ID_Length[$id] . ",\t\t/* EMMC ID/FW ID checking length */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $Sub_version[$id] . ",\t\t/* sub_version */\n\t\t" ; + #union #1 DDR2 - if ($DDR1_2_3[id] eq "DDR2") - { - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG1[$id] . ",\t\t/* DDR2_MODE_REG1 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG2[$id] . ",\t\t/* DDR2_MODE_REG2 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG3[$id] . ",\t\t/* DDR2_MODE_REG3 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG10[$id] . ",\t\t/* DDR2_MODE_REG10 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG63[$id] . "\t\t/* DDR2_MODE_REG63 */\n\t}" ; - } + if ($DDR1_2_3[$id] eq "DDR2") + { + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG1[$id] . ",\t\t/* DDR2_MODE_REG1 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG2[$id] . ",\t\t/* DDR2_MODE_REG2 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG3[$id] . ",\t\t/* DDR2_MODE_REG3 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG10[$id] . ",\t\t/* DDR2_MODE_REG10 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR2_MODE_REG63[$id] . "\t\t/* DDR2_MODE_REG63 */\n\t}" ; + } #2 DDR1 - elsif ($DDR1_2_3[id] eq "DDR1") - { - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_MODE_REG[$id] . ",\t\t/* DDR1_MODE_REG */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_EXT_MODE_REG[$id] . "\t\t/* DDR1_EXT_MODE_REG */\n\t}" ; - } + elsif ($DDR1_2_3[$id] eq "DDR1") + { + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_MODE_REG[$id] . ",\t\t/* DDR1_MODE_REG */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR1_EXT_MODE_REG[$id] . "\t\t/* DDR1_EXT_MODE_REG */\n\t}" ; + } #3 DDR3 - elsif ($DDR1_2_3[id] eq "DDR3") - { - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG0[$id] . ",\t\t/* DDR3_MODE_REG0 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG1[$id] . ",\t\t/* DDR3_MODE_REG1 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG2[$id] . ",\t\t/* DDR3_MODE_REG2 */\n\t\t" ; - $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG3[$id] . ",\t\t/* DDR3_MODE_REG3 */\n\t}" ; - } - print $EMI_SETTINGS[$id] ; - print "\n\n" ; + elsif ($DDR1_2_3[$id] eq "DDR3") + { + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG0[$id] . ",\t\t/* DDR3_MODE_REG0 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG1[$id] . ",\t\t/* DDR3_MODE_REG1 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG2[$id] . ",\t\t/* DDR3_MODE_REG2 */\n\t\t" ; + $EMI_SETTINGS[$id] = $EMI_SETTINGS[$id] . $DDR3_MODE_REG3[$id] . ",\t\t/* DDR3_MODE_REG3 */\n\t}" ; + } + print $EMI_SETTINGS[$id] ; + print "\n\n" ; + $id ++; + } + # return total_part_number_iter + return $id; + } @@ -1056,7 +1185,7 @@ sub OsName { $os = "linux"; } else { - die "does not support windows now!!" ; + die "[Error]does not support windows now!!" ; $os = "windows"; } } @@ -1131,7 +1260,7 @@ sub lin_xls_cell_value { my ($Sheet, $row, $col) = @_; my $cell = $Sheet->get_cell($row, $col); - exit 1 unless (defined $cell); + return "" unless (defined $cell); my $value = $cell->Value(); } @@ -1282,11 +1411,24 @@ sub write_tag_one_element() print FILE pack ("L", hex ("0")) ; print FILE pack ("L", hex ("0")) ; print FILE pack ("L", hex ("0")) ; - print FILE pack ("L", hex ("0")) ; - print FILE pack ("L", hex ("0")) ; - print FILE pack ("L", hex ("0")) ; - print FILE pack ("L", hex ("0")) ; - $fs = $fs + 40 ; + $fs = $fs + 24 ; + $_ = $FW_ID_String[$id] ; + if (/(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+),(\w+)/) + { + print FILE pack ("C", hex ($1)) ; #fw id + print FILE pack ("C", hex ($2)) ; + print FILE pack ("C", hex ($3)) ; + print FILE pack ("C", hex ($4)) ; + print FILE pack ("C", hex ($5)) ; + print FILE pack ("C", hex ($6)) ; + print FILE pack ("C", hex ($7)) ; + print FILE pack ("C", hex ($8)) ; + $fs = $fs + 8 ; + } + + print FILE pack ("L", scalar($ID_Length[$id])) ; # EMMC ID/FW ID checking length + print FILE pack ("L", hex (lc($Sub_version[$id]))) ; # Sub_version checking for flash tool + $fs = $fs + 8 ; if ($DEV_TYPE2[$id] == "02")
--- a/mediatek/platform/mt6577/preloader/check_size.sh +++ b/mediatek/platform/mt6577/preloader/check_size.sh @@ -1,5 +1,5 @@ PL_MAX_RAM_SIZE=32768 -PL_MAX_ROM_SIZE=111800 +PL_MAX_ROM_SIZE=118000 ROM_RPT_SIZE=500 RAM_RPT_SIZE=500
--- a/mediatek/platform/mt6577/preloader/src/drivers/inc/mt6577_emi.h +++ b/mediatek/platform/mt6577/preloader/src/drivers/inc/mt6577_emi.h @@ -75,7 +75,10 @@ typedef struct int DRAMC_ADDR_OUTPUT_DLY; // for E1 DDR2 only int DRAMC_CLK_OUTPUT_DLY; // for E1 DDR2 only int DRAM_RANK_SIZE[4]; - int reserved[6]; + int reserved[2]; + char fw_id[8]; // To save fw id + int id_length; // EMMC and NAND ID/FW ID checking length + int sub_version; // sub_version: 0x1 for new version union {
--- a/mediatek/platform/mt6577/preloader/src/drivers/mt6577_emi.c +++ b/mediatek/platform/mt6577/preloader/src/drivers/mt6577_emi.c @@ -735,8 +735,10 @@ static int mt6577_get_mdl_number (void) if ((emi_settings[i].type & 0xF00) == 0x100) { /* NAND */ - if (memcmp(id, emi_settings[i].ID, 5) == 0) + if (memcmp(id, emi_settings[i].ID, emi_settings[i].id_length) == 0){ + memset(id + emi_settings[i].id_length, 0, sizeof(id) - emi_settings[i].id_length); break; /* found */ + } } else { @@ -895,6 +897,11 @@ void mt6577_set_emi (void) *(volatile unsigned int *)0xC0003150 = 0x00000830; else if (mt6577_get_dram_type() == 3) *(volatile unsigned int *)0xC0003150 = 0x00000845; + +#ifdef MTK_DISPLAY_HIGH_RESOLUTION + *(volatile unsigned int *)0xC0003158 = 0x00004000; +#endif + *(volatile unsigned int*) 0xC00030F0 = 0x04080008; if (platform_chip_ver() == CHIP_VER_E1) { *(volatile unsigned int *)0xC00030F8 = 0x90000000;
--- a/mediatek/platform/mt6577/preloader/src/drivers/nand.c +++ b/mediatek/platform/mt6577/preloader/src/drivers/nand.c @@ -146,6 +146,7 @@ uint8 ext_id1, ext_id2, ext_id3; static u32 g_u4ChipVer; static u32 g_i4ErrNum; static BOOL g_bInitDone; +BOOL g_bHwEcc=TRUE; /* struct nand_oobinfo mt6577_nand_oob = { @@ -554,7 +555,7 @@ static void ECC_Config (void) ECC_CNFG_ECC4 | ENC_CNFG_NFI | (u4ENCODESize << ENC_CNFG_MSG_SHIFT)); -#ifdef USE_AHB_MODE +#ifndef MANUAL_CORRECT NFI_SET_REG32 (ECC_DECCNFG_REG32, DEC_CNFG_CORRECT); #else NFI_SET_REG32 (ECC_DECCNFG_REG32, DEC_CNFG_EL); @@ -588,13 +589,12 @@ static bool mt6577_nand_check_bch_error (u8 * pDataBuf, u32 u4SecIndex, u32 u4Pa u32 u4ErrorNumDebug, i, u4ErrNum; u32 timeout = 0xFFFF; -#if !USE_AHB_MODE +#ifdef MANUAL_CORRECT u32 au4ErrBitLoc[6]; u32 u4ErrByteLoc, u4BitOffset; u32 u4ErrBitLoc1th, u4ErrBitLoc2nd; #endif - //4 // Wait for Decode Done while (0 == (u2SectorDoneMask & DRV_Reg16 (ECC_DECDONE_REG16))) { timeout--; @@ -603,7 +603,7 @@ static bool mt6577_nand_check_bch_error (u8 * pDataBuf, u32 u4SecIndex, u32 u4Pa return FALSE; } } -#if (USE_AHB_MODE) +#ifndef MANUAL_CORRECT u4ErrorNumDebug = DRV_Reg32 (ECC_DECENUM_REG32); if (0 != (u4ErrorNumDebug & 0xFFFF)) { @@ -613,20 +613,17 @@ static bool mt6577_nand_check_bch_error (u8 * pDataBuf, u32 u4SecIndex, u32 u4Pa u4ErrNum &= 0xF; if (0xF == u4ErrNum) { - //mtd->ecc_stats.failed++; bRet = FALSE; - MSG (INIT, "UnCorrectable at PageAddr=%d, Sector=%d\n", - u4PageAddr, i); + printf("UnCorrectable at PageAddr=%d, Sector=%d with ECC_DECENUM=%x\n", u4PageAddr, i,u4ErrNum); } else { - //mtd->ecc_stats.corrected++; - MSG (INIT, "Correct at PageAddr=%d, Sector=%d\n", - u4ErrNum, u4PageAddr, i); + printf( "Correct %d bit error at PageAddr=%d, Sector=%d\n",u4ErrNum, u4PageAddr, i); } } } #else +/* We will manually correct the error bits in the last sector, not all the sectors of the page!*/ //memset(au4ErrBitLoc, 0x0, sizeof(au4ErrBitLoc)); u4ErrorNumDebug = DRV_Reg32 (ECC_DECENUM_REG32); u4ErrNum = DRV_Reg32 (ECC_DECENUM_REG32) >> (u4SecIndex << 2); @@ -924,10 +921,13 @@ static u8 mt6577_nand_read_byte (void) return DRV_Reg8 (NFI_DATAR_REG32); } -bool getflashid(u8 *id) +bool getflashid(u8 *nand_id, int longest_id_number) { u8 maf_id=0; u8 dev_id=0; + int i=0; + u8 *id=nand_id; + PDN_Power_CONA_DOWN (PDN_PERI_NFI, FALSE); DRV_WriteReg32 (NFI_ACCCON_REG32, NFI_DEFAULT_ACCESS_TIMING); @@ -947,14 +947,12 @@ bool getflashid(u8 *id) } //*id= (dev_id<<8)|maf_id; // *id= (maf_id<<8)|dev_id; - id[0] = maf_id; + id[0] = maf_id; id[1] = dev_id; - id[2] = mt6577_nand_read_byte (); - id[3] = mt6577_nand_read_byte (); - id[4] = mt6577_nand_read_byte (); -#ifdef DBG_PRELOADER - MSG (INIT, "getflashID %x %x %x %x %x successful!!!\n",id[0],id[1],id[2],id[3],id[4]); -#endif + + for(i = 2; i < longest_id_number; i++) + id[i] = mt6577_nand_read_byte (); + return TRUE; } @@ -1185,14 +1183,20 @@ int mt6577_nand_init (void) static void mt6577_nand_stop_read (void) { NFI_CLN_REG16 (NFI_CON_REG16, CON_NFI_BRD); - ECC_Decode_End (); + if(g_bHwEcc) + { + ECC_Decode_End (); + } } //----------------------------------------------------------------------------- static void mt6577_nand_stop_write (void) { NFI_CLN_REG16 (NFI_CON_REG16, CON_NFI_BWR); - ECC_Encode_End (); + if(g_bHwEcc) + { + ECC_Encode_End (); + } } //----------------------------------------------------------------------------- @@ -1219,25 +1223,10 @@ static bool mt6577_nand_read_page_data (u32 * buf) u32 i; u32 *pBuf32; - /* Infinity. No need since it's set in initialization stage */ - /* - NFI_SET_REG16 (NFI_PAGEFMT_REG16, - (PAGEFMT_SPARE_16 << PAGEFMT_SPARE_SHIFT) | PAGEFMT_2K); - */ - #if (USE_AHB_MODE) pBuf32 = (u32 *) buf; NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_BYTE_RW); - // DRV_WriteReg32 (NFI_STRADDR_REG32, pBuf32); -#if 0 - if (i4Interrupt) - { - init_completion (&g_comp_AHB_Done); - DRV_Reg16 (NFI_INTR_REG16); - DRV_WriteReg16 (NFI_INTR_EN_REG16, INTR_AHB_DONE_EN); - } - dmac_inv_range (pDataBuf, pDataBuf + u4Size); -#endif + DRV_Reg16 (NFI_INTR_REG16); DRV_WriteReg16 (NFI_INTR_EN_REG16, INTR_AHB_DONE_EN); NFI_SET_REG16 (NFI_CON_REG16, CON_NFI_BRD); @@ -1261,29 +1250,9 @@ static bool mt6577_nand_read_page_data (u32 * buf) } } -#if 0 - if (i4Interrupt) - { - wait_for_completion (&g_comp_AHB_Done); - } - else - { - // while (u4Size > DRV_Reg16 (NFI_BYTELEN_REG16)) - while ( (u4Size >> 9) > ((DRV_Reg16(NFI_BYTELEN_REG16) & 0xf000) >> 12) ) - { - timeout--; - if (0 == timeout) - { - return FALSE; //4 // AHB Mode Time Out! - } - } -#endif -#if 0 - } -#endif #else NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_BYTE_RW); - DRV_WriteReg32 (NFI_STRADDR_REG32, 0); + //DRV_WriteReg32 (NFI_STRADDR_REG32, 0); NFI_SET_REG16 (NFI_CON_REG16, CON_NFI_BRD); //pBuf32 = (u32*)g_nand_buf; @@ -1291,7 +1260,6 @@ static bool mt6577_nand_read_page_data (u32 * buf) for (i = 0; (i < (u4Size >> 2)) && (timeout > 0);) { - //if (FIFO_RD_REMAIN (DRV_Reg16 (NFI_FIFOSTA_REG16)) >= 4) if (DRV_Reg16(NFI_PIO_DIRDY_REG16) & 1) { *pBuf32++ = DRV_Reg32 (NFI_DATAR_REG32); @@ -1321,16 +1289,7 @@ static bool mt6577_nand_write_page_data (u32 * buf) pBuf32 = (u32 *) buf; NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_BYTE_RW); - // DRV_WriteReg32 (NFI_STRADDR_REG32, pBuf32); -#if 0 - if (i4Interrupt) - { - init_completion (&g_comp_AHB_Done); - DRV_Reg16 (NFI_INTR_REG16); - DRV_WriteReg16 (NFI_INTR_EN_REG16, INTR_AHB_DONE_EN); - } - dmac_clean_range (pDataBuf, pDataBuf + u4Size); -#endif + DRV_Reg16 (NFI_INTR_REG16); DRV_WriteReg16 (NFI_INTR_EN_REG16, INTR_AHB_DONE_EN); NFI_SET_REG16 (NFI_CON_REG16, CON_NFI_BWR); @@ -1342,26 +1301,7 @@ static bool mt6577_nand_write_page_data (u32 * buf) return FALSE; //4 // AHB Mode Time Out! } } -#if 0 - if (i4Interrupt) - { - wait_for_completion (&g_comp_AHB_Done); - } - else - { - // while (u4Size > DRV_Reg16 (NFI_BYTELEN_REG16)) - while ( (u4Size >> 9) > ((DRV_Reg16(NFI_BYTELEN_REG16) & 0xf000) >> 12) ) - { - timeout--; - if (0 == timeout) - { - return FALSE; //4 // AHB Mode Time Out! - } - } -#endif -#if 0 - } -#endif + #else u32 i; u32 *pBuf32; @@ -1372,7 +1312,8 @@ static bool mt6577_nand_write_page_data (u32 * buf) for (i = 0; (i < (u4Size >> 2)) && (timeout > 0);) { - if (FIFO_WR_REMAIN (DRV_Reg16 (NFI_FIFOSTA_REG16)) <= 12) + //if (FIFO_WR_REMAIN (DRV_Reg16 (NFI_FIFOSTA_REG16)) <= 12) + if (DRV_Reg16(NFI_PIO_DIRDY_REG16) & 1) { DRV_WriteReg32 (NFI_DATAW_REG32, *pBuf32++); i++; @@ -1402,10 +1343,8 @@ static void mt6577_nand_read_fdm_data (u32 u4SecNum, u8 * spare_buf) for (i = 0; i < u4SecNum; ++i) { *pBuf32++ = DRV_Reg32 (NFI_FDM0L_REG32 + (i << 3)); - //MSG(ERASE, "NFI_FDM%dL_REG32 (0x%x) = 0x%x\n", i, (NFI_FDM0L_REG32 + (i<<3)), DRV_Reg32(NFI_FDM0L_REG32 + (i<<3))); *pBuf32++ = DRV_Reg32 (NFI_FDM0M_REG32 + (i << 3)); - //MSG(ERASE, "NFI_FDM%dM_REG32 (0x%x) = 0x%x\n", i, (NFI_FDM0M_REG32 + (i<<3)), DRV_Reg32(NFI_FDM0M_REG32 + (i<<3))); - } + } } //----------------------------------------------------------------------------- @@ -1417,12 +1356,8 @@ mt6577_nand_write_fdm_data (u32 u4SecNum, u8 *oob) for (i = 0; i < u4SecNum; ++i) { - //MSG(ERASE, "g_nand_spare %d : 0x%x\n", i, *pBuf32); DRV_WriteReg32 (NFI_FDM0L_REG32 + (i << 3), *pBuf32++); - //MSG(ERASE, "NFI_FDM%dL_REG32 (0x%x) = 0x%x\n", i, (NFI_FDM0L_REG32 + (i<<3)), DRV_Reg32(NFI_FDM0L_REG32 + (i<<3))); - //MSG(ERASE, "g_nand_spare %d : 0x%x\n", i, *pBuf32); DRV_WriteReg32 (NFI_FDM0M_REG32 + (i << 3), *pBuf32++); - //MSG(ERASE, "NFI_FDM%dM_REG32 (0x%x) = 0x%x\n", i, (NFI_FDM0M_REG32 + (i<<3)), DRV_Reg32(NFI_FDM0M_REG32 + (i<<3))); } } @@ -1448,15 +1383,22 @@ static bool mt6577_nand_ready_for_read (u32 page_addr, u32 sec_num, u8 *buf) #if USE_AHB_MODE NFI_SET_REG16 (NFI_CNFG_REG16, CNFG_AHB); - DRV_WriteReg32(NFI_STRADDR_REG32, buf); #else NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_AHB); #endif + DRV_WriteReg32(NFI_STRADDR_REG32, buf); + if(g_bHwEcc) + { + NFI_SET_REG16 (NFI_CNFG_REG16, CNFG_HW_ECC_EN); + }else{ + NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_HW_ECC_EN); + } - NFI_SET_REG16 (NFI_CNFG_REG16, CNFG_HW_ECC_EN); mt6577_nand_set_autoformat (TRUE); - ECC_Decode_Start (); - + if(g_bHwEcc) + { + ECC_Decode_Start (); + } if (!mt6577_nand_set_command (NAND_CMD_READ0)) { goto cleanup; @@ -1511,11 +1453,17 @@ static bool mt6577_nand_ready_for_write (u32 page_addr, u32 sec_num, u8 *buf) NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_AHB); #endif - NFI_SET_REG16 (NFI_CNFG_REG16, CNFG_HW_ECC_EN); - + if(g_bHwEcc) + { + NFI_SET_REG16 (NFI_CNFG_REG16, CNFG_HW_ECC_EN); + }else{ + NFI_CLN_REG16 (NFI_CNFG_REG16, CNFG_HW_ECC_EN); + } mt6577_nand_set_autoformat (TRUE); - - ECC_Encode_Start (); + if(g_bHwEcc) + { + ECC_Encode_Start (); + } if (!mt6577_nand_set_command (NAND_CMD_SEQIN)) { @@ -1595,22 +1543,22 @@ int mt6577_nand_read_page_hw (u32 page, u8 *dat, u8 *oob) { bRet = FALSE; } - - if (!mt6577_nand_check_dececc_done (u4SecNum)) + if(g_bHwEcc) { - bRet = FALSE; - } - - //mt6577_nand_read_fdm_data(u4SecNum, (char*)(buf + 2048)); + if (!mt6577_nand_check_dececc_done (u4SecNum) ) + { + bRet = FALSE; + } + } mt6577_nand_read_fdm_data (u4SecNum, oob); - //mt6577_nand_read_fdm_data(u4SecNum); - - if (!mt6577_nand_check_bch_error(pPageBuf, u4SecNum - 1, page)) + if(g_bHwEcc) { - MSG(ERASE, "check bch error !\n"); - bRet = FALSE; + if (!mt6577_nand_check_bch_error(pPageBuf, u4SecNum - 1, page)) + { + MSG(ERASE, "check bch error !\n"); + bRet = FALSE; + } } - mt6577_nand_stop_read (); } #if 0 @@ -1668,7 +1616,6 @@ int mt6577_nand_write_page_hwecc (unsigned int logical_addr, char *buf) // write bad index into oob if (mapped_block != block) { - // MSG(INIT, "page: 0x%x\n", page_in_block); set_bad_index_to_oob(g_nand_spare, block); } else @@ -1696,19 +1643,7 @@ int mt6577_nand_write_page_hw(u32 page, u8 *dat, u8 *oob) int i, j, start, len; bool empty = TRUE; u8 oob_checksum = 0; - // u32 page_addr = PAGE_NUM (logical_addr); - - -#if 0 - MSG (WRITE, "Dump spare data :\n"); - for (i = 0; i < 32; i++) - { - MSG (WRITE, "g_nand_spare [%d] : 0x%x, usb spare [%d] : 0x%x\n", i, - *(g_nand_spare + i), i, *(buf + 2048 + i)); - } -#endif - - // MSG (WRITE, "write page addr is 0x%x\n", page_addr); + for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && nand_oob->oobfree[i].length; i++) { /* Set the reserved bytes to 0xff */
--- a/mediatek/platform/mt6577/preloader/src/drivers/nand_common_inter.c +++ b/mediatek/platform/mt6577/preloader/src/drivers/nand_common_inter.c @@ -40,6 +40,9 @@ #include "blkdev.h" #include "nand.h" #include "nand_common_inter.h" +#include "part.h" +#include "partition_define.h" + /************************************************************************** * DEBUG CONTROL @@ -116,9 +119,51 @@ static int nand_bwrite(blkdev_t *bdev, u32 blknr, u32 blks, u8 *buf) return 0; } +void Invert_Bits(u8* buff_ptr, u32 bit_pos) +{ + u32 byte_pos = 0; + u8 byte_val = 0; + u8 temp_val = 0; + u32 invert_bit = 0; + + byte_pos = bit_pos >> 3; + invert_bit = bit_pos & ((1<<3)-1); + byte_val = buff_ptr[byte_pos]; + temp_val = byte_val & (1 << invert_bit); + + if(temp_val > 0) + byte_val &= ~temp_val; + else + byte_val |= (1 << invert_bit); + buff_ptr[byte_pos] = byte_val; +} +void compare_page(u8 * testbuff, u8 * sourcebuff,u32 length,char *s){ + u32 errnum=0; + u32 ii=0; + u32 index; + printf("%s",s); + for(index=0;index<length;index++){ + if(testbuff[index]!=sourcebuff[index]){ + u8 t=sourcebuff[index]^testbuff[index]; + for(ii=0;ii<8;ii++){ + if((t>>ii)&0x1==1){ + errnum++; + } + } + printf(" ([%d]=%x) != ([%d]=%x )",index,sourcebuff[index],index,testbuff[index]); + } + + } + if(errnum>0){ + printf(": page have %d mismatch bits\n",errnum); + }else{ + printf(" :the two buffers are same!\n"); + } +} // ========================================================== // NAND Common Interface - Init // ========================================================== +//#define TEST_PIO_ECC u32 nand_init_device(void) { if (!blkdev_get(BOOTDEV_NAND)) { @@ -137,6 +182,97 @@ u32 nand_init_device(void) g_nand_bdev.blkbuf = (u8*)STORAGE_BUFFER_ADDR; g_nand_bdev.type = BOOTDEV_NAND; +#ifdef TEST_PIO_ECC + #define NAND_MAX_PAGE_LENGTH (g_nand_chip.page_size+128) + + int ecc_level=4,sec_index,curr_error_bit,err_bits_per_sec; + int sec_num=g_nand_chip.page_size>>9; + u32 sec_size=g_nand_chip.page_size/sec_num; + u8 *testbuff=malloc(NAND_MAX_PAGE_LENGTH); + u8 *sourcebuff=malloc(NAND_MAX_PAGE_LENGTH); + //part_t *part = part_get(PART_UBOOT); + //u32 offset = (part->startblk) * g_nand_chip.erasesize; + //printf("(part->startblk) =%d * g_nand_chip.erasesize=%d",(part->startblk),g_nand_chip.erasesize); + u32 offset=0x620000; + u32 page_idx=0; + u32 chk_bit_len= sec_size<<3; + u32 errbits=0; + u32 index=0; + u32 page_per_blk=g_nand_chip.erasesize/g_nand_chip.page_size; + + for(err_bits_per_sec=1;err_bits_per_sec<=ecc_level;err_bits_per_sec++){ + offset+=g_nand_chip.erasesize*(err_bits_per_sec-1); + printf("~~~start test ecc correct in "); + #if USE_AHB_MODE + printf(" AHB mode"); + #else + printf(" MCU mode"); + #endif + printf(", every sector have %d bit error~~~\n",err_bits_per_sec); + curr_error_bit=0; + for(page_idx = 0 ; page_idx < page_per_blk; page_idx++){ + printf("~~~start test ecc correct in Page %d \n",offset/g_nand_chip.page_size+page_idx); + g_bHwEcc=TRUE; + nand_read_data(sourcebuff,offset+page_idx*g_nand_chip.page_size); + memcpy(testbuff, sourcebuff, NAND_MAX_PAGE_LENGTH); + for(sec_index = 0 ; sec_index < sec_num && curr_error_bit < chk_bit_len ; sec_index++){ + //printf("insert err bit @ page %d:sector %d : bit ",page_idx+offset/g_nand_chip.page_size,sec_index); + for(errbits=0;errbits<err_bits_per_sec;errbits++){ + Invert_Bits(((u8 *)testbuff)+sec_index*sec_size, curr_error_bit); + //printf("%d, ",curr_error_bit); + curr_error_bit++; + } + //printf("\n"); + } + g_bHwEcc=FALSE; + nand_write_data (testbuff,offset+page_idx*g_nand_chip.page_size); + compare_page(testbuff, sourcebuff,NAND_MAX_PAGE_LENGTH,"source and test buff check "); + g_bHwEcc=TRUE; + nand_read_data(testbuff,offset+page_idx*g_nand_chip.page_size); + compare_page(testbuff, sourcebuff,NAND_MAX_PAGE_LENGTH,"read back check "); + } + } + + //part_t *part2 = part_get(PART_BOOTIMG); + //offset = (part2->startblk) * g_nand_chip.erasesize; + offset=0x680000; + + for(err_bits_per_sec=1;err_bits_per_sec<=ecc_level;err_bits_per_sec++){ + offset+=g_nand_chip.erasesize*(err_bits_per_sec-1); + printf("~~~start test ecc correct in "); + #if USE_AHB_MODE + printf(" AHB mode"); + #else + printf(" MCU mode"); + #endif + printf(", every sector have %d bit error~~~\n",err_bits_per_sec); + curr_error_bit=0; + for(page_idx = 0 ; page_idx < page_per_blk; page_idx++){ + printf("~~~start test ecc correct in Page %d \n",offset/g_nand_chip.page_size+page_idx); + g_bHwEcc=TRUE; + nand_read_data(sourcebuff,offset+page_idx*g_nand_chip.page_size); + memcpy(testbuff, sourcebuff, NAND_MAX_PAGE_LENGTH); + for(sec_index = 0 ; sec_index < sec_num && curr_error_bit < chk_bit_len ; sec_index++){ + //printf("insert err bit @ page %d:sector %d : bit ",page_idx+offset/g_nand_chip.page_size,sec_index); + for(errbits=0;errbits<err_bits_per_sec;errbits++){ + Invert_Bits(((u8 *)testbuff)+sec_index*sec_size, curr_error_bit); + //printf("%d, ",curr_error_bit); + curr_error_bit++; + } + //printf("\n"); + } + g_bHwEcc=FALSE; + nand_write_data (testbuff,offset+page_idx*g_nand_chip.page_size); + compare_page(testbuff, sourcebuff,NAND_MAX_PAGE_LENGTH,"source and test buff check "); + g_bHwEcc=TRUE; + nand_read_data(testbuff,offset+page_idx*g_nand_chip.page_size); + compare_page(testbuff, sourcebuff,NAND_MAX_PAGE_LENGTH,"read back check "); + } + } + + + #endif + blkdev_register(&g_nand_bdev); } @@ -145,12 +281,12 @@ u32 nand_init_device(void) u32 nand_get_device_id(u8 *id, u32 len) { - u8 buf[5]; + u8 buf[16]; - if (TRUE != getflashid(buf)) + if (TRUE != getflashid(buf, len)) return -1; - len = len > 5 ? 5 : len; + len = len > 16 ? 16 : len; memcpy (id, buf, len); @@ -215,7 +351,7 @@ u32 nand_read_data (u8 * buf, u32 offset) if (mt6577_nand_read_page_hwecc (offset, buf) == FALSE) { print ("nand_read_data fail\n"); - ASSERT (0); + return -1; } return offset; @@ -238,7 +374,7 @@ u32 nand_write_data (u8 * buf, u32 offset) return offset; } -#if CFG_LEGACY_USB_DOWNLOAD + // ========================================================== // NAND Common Interface - Erase Function // ========================================================== @@ -295,6 +431,7 @@ bool nand_erase_data (u32 offset, u32 offset_limit, u32 size) return TRUE; } +#if CFG_LEGACY_USB_DOWNLOAD // ========================================================== // NAND Common Interface - Check If Device Is Ready To Use