Support NAND devices which NAND ID is not fixed-length

来源:互联网 发布:java视频教学网站 编辑:程序博客网 时间:2024/06/12 21:02
--- 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


原创粉丝点击