Browse Source

添加512MB nandflash TC58NVG2S0HTAI0支持,裁剪uboot大小

huangliang 2 years ago
parent
commit
310fed6244

+ 8 - 0
buildroot-external/board/arkmicro/ark1668e_devb/post_build.sh

@@ -11,8 +11,16 @@
 #ln -sf libEGL.so.1 libEGL.so
 
 #install modules to target
+UBOOT_DIR=${BR2_EXTERNAL_ARK_PATH}/../u-boot
+UBOOT_OUTPUT_DIR=${BR2_EXTERNAL_ARK_PATH}/../output/board/ark1668e_devb/u-boot
+
 source ${BR2_EXTERNAL_ARK_PATH}/../env.source
 cd ${BR2_EXTERNAL_ARK_PATH}/../output/board/ark1668e_devb/linux
 make INSTALL_MOD_PATH=${TARGET_DIR} modules_install
 
+cp -f ${UBOOT_OUTPUT_DIR}/tools/env/fw_printenv ${TARGET_DIR}/usr/bin/
+cp ${UBOOT_DIR}/tools/env/fw_env.config ${TARGET_DIR}/etc
+cd ${TARGET_DIR}/usr/bin/ && \
+   ln -sf fw_printenv fw_setenv
+
 #sed -i '/# GENERIC_SERIAL$/s~^.*#~::respawn:-/bin/sh #~' ${TARGET_DIR}/etc/inittab

+ 1 - 1
linux/drivers/mtd/nand/raw/nand_ids.c

@@ -37,7 +37,7 @@ struct nand_flash_dev nand_flash_ids[] = {
 		  SZ_4K, SZ_512, SZ_256K, 0, 8, 224, NAND_ECC_INFO(4, SZ_512) },
 	{"TC58NVG2S0H 4G 3.3V 8-bit",
 		{ .id = {0x98, 0xdc, 0x90, 0x26, 0x76, 0x16, 0x08, 0x00} },
-		  SZ_4K, SZ_512, SZ_256K, 0, 8, 256, NAND_ECC_INFO(8, SZ_512) },
+		  SZ_4K, SZ_512, SZ_256K, 0, 8, 256, NAND_ECC_INFO(24, SZ_1K) },
 	{"TC58NVG3S0F 8G 3.3V 8-bit",
 		{ .id = {0x98, 0xd3, 0x90, 0x26, 0x76, 0x15, 0x02, 0x08} },
 		  SZ_4K, SZ_1K, SZ_256K, 0, 8, 232, NAND_ECC_INFO(4, SZ_512) },

+ 2 - 3
u-boot/board/arkmicro/ark1668e_devb/ark1668e_devb.c

@@ -263,12 +263,12 @@ int board_late_init(void)
 #endif
 
 	update_flash = env_get("update_from_flash");
-        printf("++++++++++%s+++++++\n",update_flash);
 	need_update = env_get("need_update");
+	printf("###need_update %s,update_flash %s####\n",need_update,update_flash);
 	if (!strcmp(need_update, "yes")) {
 		loadaddr = env_get_hex("loadaddr", 0);
 		if (loadaddr)
-			memset(loadaddr, 0, strlen(ARK1668_UPDATE_MAGIC));
+			memset((void*)loadaddr, 0, strlen(ARK1668_UPDATE_MAGIC));
 		sprintf(cmd, "fatload %s %s %s update-magic", "mmc", env_get("sd_dev_part"), env_get("loadaddr"));
 		run_command(cmd, 0);
 		if (loadaddr && !memcmp((void *)loadaddr, ARK1668_UPDATE_MAGIC, strlen(ARK1668_UPDATE_MAGIC))) {
@@ -301,7 +301,6 @@ int board_late_init(void)
 update_done:
 	if (do_update) {
 		run_command("nand erase.part userdata", 0);
-		env_set("need_update", "no");
 		env_set("do_update", "yes");
 		if (update_from_mmc) {
 			printf("update form mmc...\n");

+ 53 - 19
u-boot/cmd/update_cmd.c

@@ -56,8 +56,6 @@ static int burn_data_2_partition(char *partition_name)
 
 	file_size = env_get_ulong("filesize", 16, 0x2000);
 
-//      sprintf(cmd, "nand write ${loadaddr} %s ${filesize}",partition_name);
-
 	sprintf(cmd, "nand write %s %s 0x%x", env_get("loadaddr"), partition_name, file_size);
 	printf("cmd=%s\n", cmd);
 	ret = run_command(cmd, 0);
@@ -164,10 +162,12 @@ int do_Update_flash(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[])
 	printf("\r\n **** update from update bootloader .....\r\n");
 	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "bootloader", "u-boot.img");
 	printf("cmd=%s\n", cmd);
-	run_command(cmd, 0);
-	sprintf((char *)cmd,"disconfig 15");
-	run_command(cmd, 0);
-
+	ret = run_command(cmd, 0);
+	if(ret == 0)
+	{
+		sprintf((char *)cmd,"disconfig 15");
+		run_command(cmd, 0);
+	}
 
 	printf("\r\n **** update from update fdt .....\r\n");
 	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "fdt", update_fdt);
@@ -178,11 +178,11 @@ int do_Update_flash(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[])
 	{
 		sprintf(cmd, "setenv fdtsize %s",env_get("filesize"));
 		run_command(cmd, 0);
-		printf("cmd=%s\n", cmd);	
+		printf("cmd=%s\n", cmd);
 		mdelay(30);
+		sprintf((char *)cmd,"disconfig 20");
+		run_command(cmd, 0);
 	}
-    sprintf((char *)cmd,"disconfig 20");
-    run_command(cmd, 0);
 
 	printf("\r\n **** update from update kernel .....\r\n");
 	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "kernel", "zImage");
@@ -194,10 +194,10 @@ int do_Update_flash(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[])
 		sprintf(cmd, "setenv kernelsize %s",env_get("filesize"));
 		printf("cmd=%s\n", cmd);
 		run_command(cmd, 0);
+		sprintf((char *)cmd,"disconfig 30");
+		run_command(cmd, 0);
 	}
-    sprintf((char *)cmd,"disconfig 35");
-    run_command(cmd, 0);
-        
+
 	printf("\r\n **** update from update rootfs .....\r\n");
 	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "rootfs", "rootfs.ubi");
 	printf("cmd=%s\n", cmd);
@@ -207,19 +207,53 @@ int do_Update_flash(cmd_tbl_t * cmdtp, int flag, int argc, char *const argv[])
 	{
 		sprintf(cmd, "setenv rootfssize %s",env_get("filesize"));
 		printf("cmd=%s\n", cmd);
-		run_command(cmd, 0);	
+		run_command(cmd, 0);
 		mdelay(30);
+		sprintf((char *)cmd,"disconfig 70");
+		run_command(cmd, 0);
+	}
+
+	printf("\r\n **** update from update bootanimation .....\r\n");
+	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "bootanimation", "bootanimation");
+	printf("cmd=%s\n", cmd);
+	ret = run_command(cmd, 0);
+	mdelay(30);
+	if(ret == 0)
+	{
+		sprintf(cmd, "setenv bootanimationsize %s",env_get("filesize"));
+		printf("cmd=%s\n", cmd);
+		run_command(cmd, 0);
+		mdelay(30);
+		sprintf((char *)cmd,"disconfig 75");
+		run_command(cmd, 0);
+	}
+
+	printf("\r\n **** update from update reversingtrack .....\r\n");
+	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "reversingtrack", "reversingtrack");
+	printf("cmd=%s\n", cmd);
+	ret = run_command(cmd, 0);
+	mdelay(30);
+	if(ret == 0)
+	{
+		sprintf(cmd, "setenv reversingtracksize %s",env_get("filesize"));
+		printf("cmd=%s\n", cmd);
+		run_command(cmd, 0);
+		mdelay(30);
+		sprintf((char *)cmd,"disconfig 80");
+		run_command(cmd, 0);
 	}
-    sprintf((char *)cmd,"disconfig 80");
-    run_command(cmd, 0);
 
 	printf("\r\n **** update from update bootloader back.....\r\n");
-	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "bootloader_back", "u-boot.img");
+	sprintf(cmd, "Updata 0x%x 0x%x %s %s", NFLASH, index, "bootloader_bak", "u-boot.img");
 	printf("cmd=%s\n", cmd);
-	run_command(cmd, 0);
-    sprintf((char *)cmd,"disconfig 90");
-    run_command(cmd, 0);
+	ret = run_command(cmd, 0);
+	if(ret == 0)
+	{
+		sprintf((char *)cmd,"disconfig 90");
+		run_command(cmd, 0);
+	}
 
+	printf("##set update_from_flash no##\n");
 	env_set("update_from_flash", "no");
 	mdelay(10);
 	env_set("need_update", "no");

+ 6 - 11
u-boot/configs/ark1668e_devb_defconfig

@@ -33,17 +33,15 @@ CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_CRC32 is not set
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_MMC=y
-CONFIG_CMD_EMMC=y
 CONFIG_CMD_PART=y
 CONFIG_CMD_USB=y
-CONFIG_CMD_PING=y
 CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
 CONFIG_MTDIDS_DEFAULT="nand0=ark-nand"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ark-nand:128k(bootstrap),512k(bootloader),128k(bootloaderenv),128k(fdt),6m(kernel),5m(bootanimation),4m(reversingtrack),32m(userdata),-(rootfs)"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=ark-nand:256k(bootstrap),1m(bootloader),1m(bootloader_bak),512k(bootloaderenv),512k(bootloaderenv_bak),512k(fdt),6m(kernel),5m(bootanimation),4m(reversingtrack),32m(userdata),100m(rootfs),-(ota)"
+CONFIG_CMD_UBI=y
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_NAND=y
-CONFIG_NET_RANDOM_ETHADDR=y
+# CONFIG_NET is not set
 CONFIG_DM=y
 CONFIG_CLK=y
 CONFIG_DM_GPIO=y
@@ -53,16 +51,13 @@ CONFIG_MMC_DW=y
 CONFIG_NAND=y
 CONFIG_NAND_ARKMICRO=y
 CONFIG_SYS_NAND_U_BOOT_LOCATIONS=y
-CONFIG_SYS_NAND_U_BOOT_OFFS=0x20000
-CONFIG_PHY_REALTEK=y
+CONFIG_SYS_NAND_U_BOOT_OFFS=0x40000
+CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND=0x140000
 CONFIG_DM_ETH=y
-CONFIG_ARK_ETH_QOS=y
 CONFIG_PWM_ARK=y
 CONFIG_CONS_INDEX=0
 CONFIG_DEBUG_UART_PL011=y
 CONFIG_PL011_SERIAL=y
-CONFIG_SPI=y
-CONFIG_ARK_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_ARK=y
@@ -71,6 +66,6 @@ CONFIG_USB_STORAGE=y
 CONFIG_NO_FB_CLEAR=y
 CONFIG_DISPLAY=y
 CONFIG_VIDEO_ARKMICRO=y
+CONFIG_FAT_WRITE=y
 CONFIG_USE_TINY_PRINTF=y
-# CONFIG_REGEX is not set
 CONFIG_SPL_TINY_MEMSET=y

+ 50 - 5
u-boot/drivers/mtd/nand/ark_nand.c

@@ -90,6 +90,32 @@ static struct nand_ecclayout nand_hw_eccoob_128 = { /* large page 2k with 64 byt
     .oobfree = { {2, 42} }
 };
 
+//1024--24
+static struct nand_ecclayout nand_hw_eccoob_256 = {
+    .eccbytes = BIT_24_ECC_BYTE,
+    .eccpos = {88,  89,
+		90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
+		100, 101, 102, 103, 104, 105,106, 107, 108, 109,
+		110, 111, 112, 113, 114, 115,116, 117, 118, 119,
+		120, 121, 122, 123, 124, 125,126, 127, 128, 129,
+		130, 131, 132, 133, 134, 135,136, 137, 138, 139,
+		140, 141, 142, 143, 144, 145,146, 147, 148, 149,
+		150, 151, 152, 153, 154, 155,156, 157, 158, 159,
+		160, 161, 162, 163, 164, 165,166, 167, 168, 169,
+		170, 171, 172, 173, 174, 175,176, 177, 178, 179,
+		180, 181, 182, 183, 184, 185,186, 187, 188, 189,
+		190, 191, 192, 193, 194, 195,196, 197, 198, 199,
+		200, 201, 202, 203, 204, 205,206, 207, 208, 209,
+		210, 211, 212, 213, 214, 215,216, 217, 218, 219,
+		220, 221, 222, 223, 224, 225,226, 227, 228, 229,
+		230, 231, 232, 233, 234, 235,236, 237, 238, 239,
+		240, 241, 242, 243, 244, 245,246, 247, 248, 249,
+		250, 251, 252, 253, 254, 255,
+	},
+    .oobfree = { {2, 86} }
+};
+
+
 
 /*static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
 static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
@@ -1001,7 +1027,7 @@ static int ark_hwecc_nand_init_param(struct nand_chip *chip, struct mtd_info *mt
 		val &= ~(0x7 << 4);
 		val |= (1 << 8) | (1 << 7) | (1 << 4) | (1 << 0);
 		writel(val, rBCH_CR);
-	} else if(mtd->oobsize >= 128) {
+	} else if(mtd->oobsize >= 128 && mtd->oobsize < 256) {
 		chip->ecc.bytes = BIT_24_ECC_BYTE; // should be 13 bytes but the ECC encoder register is in 32 bit word
 		chip->ecc.strength = 24;
 		chip->ecc.layout = &nand_hw_eccoob_128;
@@ -1011,8 +1037,17 @@ static int ark_hwecc_nand_init_param(struct nand_chip *chip, struct mtd_info *mt
 		val &= ~(0x7 << 4);
 		val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
 		writel(val, rBCH_CR);
-	}
-
+	} else if(mtd->oobsize >= 256) {
+		chip->ecc.bytes = BIT_24_ECC_BYTE;
+		chip->ecc.strength = 24;
+		chip->ecc.layout = &nand_hw_eccoob_256;
+		chip->ecc.prepad = nand_hw_eccoob_256.eccpos[0];
+		chip->ecc.postpad = nand_hw_eccoob_256.oobfree[0].offset;
+		val = readl(rBCH_CR);
+		val &= ~(0x7 << 4);
+		val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
+		writel(val, rBCH_CR);
+	 }
 	return 0;
 }
 
@@ -1112,7 +1147,7 @@ static int do_switchecc(cmd_tbl_t *cmdtp, int flag, int argc,
 				val &= ~(0x7 << 4);
 				val |= (1 << 8) | (1 << 7) | (1 << 4) | (1 << 0);
 				writel(val, rBCH_CR);
-			} else if(mtd->oobsize >= 128) {
+			} else if(mtd->oobsize >= 128 && mtd->oobsize <256) {
 				chip->ecc.bytes = BIT_24_ECC_BYTE; // should be 13 bytes but the ECC encoder register is in 32 bit word
 				chip->ecc.strength = 24;
 				chip->ecc.layout = &nand_hw_eccoob_128;
@@ -1122,7 +1157,17 @@ static int do_switchecc(cmd_tbl_t *cmdtp, int flag, int argc,
 				val &= ~(0x7 << 4);
 				val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
 				writel(val, rBCH_CR);
-			}		
+			} else if(mtd->oobsize >= 256) {
+				chip->ecc.bytes = BIT_24_ECC_BYTE;
+				chip->ecc.strength = 24;
+				chip->ecc.layout = &nand_hw_eccoob_256;
+				chip->ecc.prepad = nand_hw_eccoob_256.eccpos[0];
+				chip->ecc.postpad = nand_hw_eccoob_256.oobfree[0].offset;
+				val = readl(rBCH_CR);
+				val &= ~(0x7 << 4);
+				val |= (1 << 8) | (1 << 7) | (2 << 4) | (1 << 0);
+				writel(val, rBCH_CR);
+			}
 		}
 	}
 

+ 11 - 10
u-boot/drivers/mtd/nand/ark_nand_spl.c

@@ -168,18 +168,19 @@ struct nand_dev nand_flash_ids[] = {
 };
 
 static const struct nandflash_info nandflash_devices[] = {
-	{"TC58BVG0S3HTAI0",	0x98, 0xF18015F2, 2048, 128, 128, 64,0},
-	{"K9F1G08U0C",      0xec, 0xf1009540, 2048, 128, 128, 64, 0},
-	{"K9F1G08U0E",      0xec, 0xf1009541, 2048, 128, 128, 64, 0},
-	{"HY27UF081G2A",    0xad, 0xf1801dad, 2048, 128, 128, 64, 0},
-	{"TC58NVG0S3ETA00",	0x98, 0xD1901576, 2048, 128, 128, 64, 0},
-	{"TC58NVG0S3HTA00",	0x98, 0xF1801572, 2048, 128, 128, 128,0},
-	{"TC58NVG1S3HTA00",	0x98, 0xDA901576, 2048, 256, 128, 128,0},
-	{"W29N01GV",	    0xEF, 0xF1809500, 2048, 128, 128, 64, 0},
-	{"FMND1GXXX3D",	    0xF8, 0xF1809500, 2048, 128, 128, 64, 0},
-	{"XT27G02ETSIGA",	    0x2C, 0xDA909506, 2048, 256, 128, 128, 0},
+	{"TC58BVG0S3HTAI0",	0x98, 0xF18015F2, 2048, 128, 128, 64,  0},
+	{"K9F1G08U0C",      0xec, 0xf1009540, 2048, 128, 128, 64,  0},
+	{"K9F1G08U0E",      0xec, 0xf1009541, 2048, 128, 128, 64,  0},
+	{"HY27UF081G2A",    0xad, 0xf1801dad, 2048, 128, 128, 64,  0},
+	{"TC58NVG0S3ETA00",	0x98, 0xD1901576, 2048, 128, 128, 64,  0},
+	{"TC58NVG0S3HTA00",	0x98, 0xF1801572, 2048, 128, 128, 128, 0},
+	{"TC58NVG1S3HTA00",	0x98, 0xDA901576, 2048, 256, 128, 128, 0},
+	{"W29N01GV",	    0xEF, 0xF1809500, 2048, 128, 128, 64,  0},
+	{"FMND1GXXX3D",	    0xF8, 0xF1809500, 2048, 128, 128, 64,  0},
+	{"XT27G02ETSIGA",	0x2C, 0xDA909506, 2048, 256, 128, 128, 0},
 	//此款flash芯片不支持,在此处强制将OOB128字节
 	{"9FU1G8F2AMGF",	0xC8, 0xF1801D42, 2048, 128, 128, 128, 0},
+	{"TC58NVG2S0HTAI0",	0x98, 0xDC902676, 4096, 512, 256, 256, 0},
 };
 
 static struct nand_info nand_info;

+ 15 - 4
u-boot/include/configs/ark1668e_devb.h

@@ -25,7 +25,7 @@
 #define CONFIG_NR_DRAM_BANKS			1
 #define CONFIG_SYS_SDRAM_BASE		0x40000000
 #define CONFIG_SYS_SDRAM_SIZE		SZ_64M
-#define CONFIG_SYS_MALLOC_LEN		0x80000
+#define CONFIG_SYS_MALLOC_LEN		0x400000
 
 #ifdef CONFIG_SPL_BUILD
 #define CONFIG_SYS_INIT_SP_ADDR		0x308000
@@ -94,6 +94,10 @@
 		"nand erase.part reversingtrack; " \
 		"nand write ${loadaddr} reversingtrack ${filesize}; " \
 		"else setenv reversingtracksize 0; fi\0" \
+	"bootloaderupdate_back=if fatload ${update_dev_type} ${update_dev_part} ${loadaddr} u-boot.img; " \
+		"then setenv bootloadersize ${filesize}; " \
+		"nand erase.part bootloader_bak; " \
+		"nand write ${loadaddr} bootloader_bak ${filesize}; fi\0" \
 	"nandargs=setenv bootargs console=ttyS0,115200 " \
 		"earlyprintk  loglevel=8 clk_ignore_unused lpj=2285568 enable_console " \
 		"${mtdparts} " \
@@ -220,8 +224,9 @@
 		"bootz ${kerneladdr} - ${fdtaddr}\0"
 
 /* Environment */
-#define CONFIG_ENV_SIZE			4096	//CONFIG_PARTITION_UBOOT_ENV_SIZE
-#define CONFIG_ENV_OFFSET		0xA0000
+#define CONFIG_ENV_SIZE			8192	//CONFIG_PARTITION_UBOOT_ENV_SIZE
+#define CONFIG_ENV_OFFSET		0x240000
+#define CONFIG_ENV_OFFSET_REDUND	0x2C0000
 
 #define CONFIG_SYS_LOAD_ADDR	(CONFIG_SYS_SDRAM_BASE + 0x1000000)
 
@@ -309,6 +314,7 @@
 	"reversingtrackaddr=0x5ea00000\0" \
 	"reversingtracksize=0\0" \
 	"ipaddr=192.168.5.66\0" \
+	"nandfdt="CONFIG_DEFAULT_FDT_FILE"\0" \
 	NANDARGS
 
 #define CONFIG_BOOTCOMMAND	\
@@ -337,8 +343,13 @@
 		"echo update reversingtrack ...; " \
 		"run reversingtrackupdate; " \
 		"disconfig 90; "\
-		"setenv do_update no; " \
+		"echo update bootloader back ...; " \
+		"run bootloaderupdate_back; " \
 		"disconfig 95; "\
+		"setenv do_update no; " \
+		"echo set need_update no ...; " \
+		"setenv need_update no; " \
+		"disconfig 97; "\
 		"saveenv; " \
 		"disconfig 100; "\
 		"run nandboot; " \

+ 1 - 1
u-boot/tools/env/fw_env.c

@@ -82,7 +82,7 @@ static int dev_current;
 #define DEVTYPE(i)    envdevices[(i)].mtd_type
 #define IS_UBI(i)     envdevices[(i)].is_ubi
 
-#define CUR_ENVSIZE 	0x1000//ENVSIZE(dev_current)
+#define CUR_ENVSIZE 	ENVSIZE(dev_current)
 #define USE_THE_EMMC       0
 
 static unsigned long usable_envsize;

+ 2 - 2
u-boot/tools/env/fw_env.config

@@ -43,6 +43,6 @@
 #/dev/mmcblk0p4		0x000000	0x20000			
 #/dev/mmcblk0p4		0x100000	0x20000	
 
-/dev/mtd3		0x160000	0x1000		0x20000
-
+/dev/mtd3    0x240000	0x2000		0x40000  2
+/dev/mtd4    0x2C0000	0x2000		0x40000  2