--- 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