⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LUBBOCK板的BLOB
💻 C
📖 第 1 页 / 共 2 页
字号:

	*numRead = XModemReceive((char *) startAddress, bufLen);

	SerialOutputString("\n\n\n");
	
	if (blob_status.terminalSpeed != blob_status.downloadSpeed) {
		SerialOutputString("\n(Please switch your terminal emulator back to ");
		PrintSerialSpeed(blob_status.terminalSpeed);
		SerialOutputString(" baud)\n");
	}
	
	if(*numRead < 0) {
		/* something went wrong */
		retval = *numRead;
		
		/* reload the correct memory */
		do_reload(argv[1]);

		serial_init(blob_status.terminalSpeed);
		return retval;
	}

	do_md5sum((u32 *)startAddress, *numRead, digest);

	SerialOutputString("Received ");
	SerialOutputDec(*numRead);
	SerialOutputString(" (0x");
	SerialOutputHex(*numRead);
	SerialOutputString(") bytes");
#ifdef BLOB_DEBUG
	SerialOutputString(" at 0x");
	SerialOutputHex((u32) startAddress);
#ifdef CONFIG_MD5_SUPPORT
	SerialOutputString(", MD5: ");
	print_md5_digest(digest);
#endif
#endif
	serial_write('\n');


	serial_init(blob_status.terminalSpeed);

	return 0;
}

static char xdownloadhelp[] = "xdownload {blob|param|kernel|ramdisk}\n"
"Download <argument> image to RAM using xmodem\n";

__commandlist(xdownload, "xdownload", xdownloadhelp);


static int Flash(int argc, char *argv[])
{
	u32 *src;
	u32 *dst;
	u32 numBytes = 0;
	u32 maxSize = 0;
	u32 nwords;
	block_source_t type = fromFlash;
	

	if(argc < 2)
		return -ENOPARAMS;

	if(strncmp(argv[1], "blob", 5) == 0) {
		src = (u32 *)BLOB_RAM_BASE;
		dst = (u32 *)BLOB_FLASH_BASE;
		maxSize = BLOB_FLASH_LEN;
		numBytes = blob_status.blobSize;
		type = blob_status.blobType;
#ifdef PARAM_START
	} else if(strncmp(argv[1], "param", 6) == 0) {
		src = (u32 *)PARAM_RAM_BASE;
		dst = (u32 *)PARAM_FLASH_BASE;
		maxSize = PARAM_FLASH_LEN;
		numBytes = blob_status.paramSize;
		type = blob_status.paramType;
#endif
	} else if(strncmp(argv[1], "kernel", 7) == 0) {
		src = (u32 *)KERNEL_RAM_BASE;
		dst = (u32 *)KERNEL_FLASH_BASE;
		numBytes = blob_status.kernelSize;
		maxSize = KERNEL_FLASH_LEN;
		type = blob_status.kernelType;
	} else if(strncmp(argv[1], "ramdisk", 8) == 0) {
		src = (u32 *)RAMDISK_RAM_BASE;
		dst = (u32 *)RAMDISK_FLASH_BASE;
		numBytes = blob_status.ramdiskSize;
		maxSize = RAMDISK_FLASH_LEN;
		type = blob_status.ramdiskType;
	} else {
		printerror(EINVAL, argv[1]);
		return 0;
	}

	if(type == fromFlash) {
		printerrprefix();
		SerialOutputString(argv[1]);
		SerialOutputString(" not downloaded\n");
		return -EINVAL;
	}

	if(numBytes > maxSize) {
		printerrprefix();
		SerialOutputString("image too large for flash: 0x");
		SerialOutputHex(numBytes);
		SerialOutputString(" > 0x");
		SerialOutputHex(maxSize);
		serial_write('\n');

		return -ETOOLONG;
	}

	nwords = (numBytes + sizeof(u32) - 1) / sizeof(u32);

	SerialOutputString("Saving ");
	SerialOutputString(argv[1]);
	SerialOutputString(" to flash\n");


	flash_write_region(dst, src, nwords);

	return 0;
}

static char flashhelp[] = "flash {blob|param|kernel|ramdisk}\n"
"Write <argument> image to flash\n";

__commandlist(Flash, "flash", flashhelp);




static int SetDownloadSpeed(int argc, char *argv[])
{
	if(argc < 2)
		return -ENOPARAMS;

	if(strncmp(argv[1], "1200", 5) == 0) {
		blob_status.downloadSpeed = baud_1200;
	} else if(strncmp(argv[1], "1k2", 4) == 0) {
		blob_status.downloadSpeed = baud_1200;
	} else if(strncmp(argv[1], "9600", 5) == 0) {
		blob_status.downloadSpeed = baud_9600;
	} else if(strncmp(argv[1], "9k6", 4) == 0) {
		blob_status.downloadSpeed = baud_9600;
	} else if(strncmp(argv[1], "19200", 6) == 0) {
		blob_status.downloadSpeed = baud_19200;
	} else if(strncmp(argv[1], "19k2", 5) == 0) {
		blob_status.downloadSpeed = baud_19200;
	} else if(strncmp(argv[1], "38400", 7) == 0) {
		blob_status.downloadSpeed = baud_38400;
	} else if(strncmp(argv[1], "38k4", 5) == 0) {
		blob_status.downloadSpeed = baud_38400;
	} else if(strncmp(argv[1], "57600", 6) == 0) {
		blob_status.downloadSpeed = baud_57600;
	} else if(strncmp(argv[1], "57k6", 5) == 0) {
		blob_status.downloadSpeed = baud_57600;
	} else if(strncmp(argv[1], "115200", 7) == 0) {
		blob_status.downloadSpeed = baud_115200;
	} else if(strncmp(argv[1], "115k2", 6) == 0) {
		blob_status.downloadSpeed = baud_115200;
	} else if(strncmp(argv[1], "230400", 7) == 0) {
		blob_status.downloadSpeed = baud_230400;
	} else if(strncmp(argv[1], "230k4", 6) == 0) {
		blob_status.downloadSpeed = baud_230400;
	} else {
		return -EINVAL;
	}

	SerialOutputString("Download speed set to ");
	PrintSerialSpeed(blob_status.downloadSpeed);
	SerialOutputString(" baud\n");

	return 0;
}

static char speedhelp[] = "speed [baudrate]\n"
"Set download speed. Valid baudrates are:\n"
"1200, 9600, 19200, 38400, 57600, 115200, 230400,\n"
" 1k2,  9k6,  19k2,  38k4,  57k6,  115k2,  230k4\n";

__commandlist(SetDownloadSpeed, "speed", speedhelp);




static int PrintStatus(int argc, char *argv[])
{
	SerialOutputString(version_str);

	SerialOutputString("Download speed      : ");
	PrintSerialSpeed(blob_status.downloadSpeed);
	SerialOutputString(" baud\n");

	SerialOutputString("Terminal speed      : ");
	PrintSerialSpeed(blob_status.terminalSpeed);
	SerialOutputString(" baud\n");

	SerialOutputString("blob    (0x");
	SerialOutputHex(BLOB_FLASH_BASE);
	SerialOutputString("): ");
	if(blob_status.blobType == fromFlash) {
		SerialOutputString("from flash\n");
	} else {
		SerialOutputString("downloaded at 0x");
		SerialOutputHex(BLOB_RAM_BASE);
		SerialOutputString(", ");
		SerialOutputDec(blob_status.blobSize);
		SerialOutputString(" bytes\n");
#ifdef CONFIG_MD5_SUPPORT
		SerialOutputString("                      MD5: ");
		print_md5_digest(blob_status.blob_md5_digest);
		serial_write('\n');
#endif
	}

#ifdef PARAM_START
	SerialOutputString("param  (0x");
	SerialOutputHex(PARAM_FLASH_BASE);
	SerialOutputString("): ");
	if(blob_status.paramType == fromFlash) {
		SerialOutputString("from flash\n");
	} else {
		SerialOutputString("downloaded at 0x");
		SerialOutputHex(PARAM_RAM_BASE);
		SerialOutputString(", ");
		SerialOutputDec(blob_status.paramSize);
		SerialOutputString(" bytes\n");
#ifdef CONFIG_MD5_SUPPORT
		SerialOutputString("                      MD5: ");
		print_md5_digest(blob_status.param_md5_digest);
		serial_write('\n');
#endif
	}
#else
	SerialOutputString("param               : Not available\n");
#endif

	SerialOutputString("kernel  (0x");
	SerialOutputHex(KERNEL_FLASH_BASE);
	SerialOutputString("): ");
	if(blob_status.kernelType == fromFlash) {
		SerialOutputString("from flash\n");
	} else {
		SerialOutputString("downloaded at 0x");
		SerialOutputHex(KERNEL_RAM_BASE);
		SerialOutputString(", ");
		SerialOutputDec(blob_status.kernelSize);
		SerialOutputString(" bytes\n");
#ifdef CONFIG_MD5_SUPPORT
		SerialOutputString("                      MD5: ");
		print_md5_digest(blob_status.kernel_md5_digest);
		serial_write('\n');
#endif
	}

	SerialOutputString("ramdisk (0x");
	SerialOutputHex(RAMDISK_FLASH_BASE);
	SerialOutputString("): ");
	if(blob_status.ramdiskType == fromFlash) {
		SerialOutputString("from flash\n");
	} else {
		SerialOutputString("downloaded at 0x");
		SerialOutputHex(RAMDISK_RAM_BASE);
		SerialOutputString(", ");
		SerialOutputDec(blob_status.ramdiskSize);
		SerialOutputString(" bytes\n");
#ifdef CONFIG_MD5_SUPPORT
		SerialOutputString("                      MD5: ");
		print_md5_digest(blob_status.ramdisk_md5_digest);
		serial_write('\n');
#endif
	}
	
	return 0;
}

static char statushelp[] = "status\n"
"Display current status\n";

__commandlist(PrintStatus, "status", statushelp);




static int do_reload(char *what)
{
	u32 *dst = 0;
	u32 *src = 0;
	int numWords;

	if(strncmp(what, "blob", 5) == 0) {
		dst = (u32 *)BLOB_RAM_BASE;
		src = (u32 *)BLOB_FLASH_BASE;
		numWords = BLOB_FLASH_LEN / 4;
		blob_status.blobSize = 0;
		blob_status.blobType = fromFlash;
		SerialOutputString("Loading blob from flash ");
#ifdef PARAM_START
	} else if(strncmp(what, "param", 6) == 0) {
		dst = (u32 *)PARAM_RAM_BASE;
		src = (u32 *)PARAM_FLASH_BASE;
		numWords = PARAM_FLASH_LEN / 4;
		blob_status.paramSize = 0;
		blob_status.paramType = fromFlash;
		SerialOutputString("Loading paramater block from flash ");
#endif
	} else if(strncmp(what, "kernel", 7) == 0) {
		dst = (u32 *)KERNEL_RAM_BASE;
		src = (u32 *)KERNEL_FLASH_BASE;
		numWords = KERNEL_FLASH_LEN / 4;
		blob_status.kernelSize = 0;
		blob_status.kernelType = fromFlash;
		SerialOutputString("Loading kernel from flash ");
	} else if(strncmp(what, "ramdisk", 8) == 0) {
		dst = (u32 *)RAMDISK_RAM_BASE;
		src = (u32 *)RAMDISK_FLASH_BASE;
		numWords = RAMDISK_FLASH_LEN / 4;
		blob_status.ramdiskSize = 0;
		blob_status.ramdiskType = fromFlash;
		SerialOutputString("Loading ramdisk from flash ");
	} else {
		printerror(EINVAL, what);
		return 0;
	}

	MyMemCpy(dst, src, numWords);
	SerialOutputString(" done\n");

	return 0;
}




static int Reload(int argc, char *argv[])
{
	if(argc < 2)
		return -ENOPARAMS;

	return do_reload(argv[1]);
}

static char reloadhelp[] = "reload {blob|param|kernel|ramdisk}\n"
"Reload <argument> from flash to RAM\n";

__commandlist(Reload, "reload", reloadhelp);




static void PrintSerialSpeed(serial_baud_t speed)
{
	switch(speed) {
	case baud_1200:
		SerialOutputDec(1200);
		break;

	case baud_9600:
		SerialOutputDec(9600);
		break;

	case baud_19200:
		SerialOutputDec(19200);
		break;

	case baud_38400:
		SerialOutputDec(38400);
		break;

	case baud_57600:
		SerialOutputDec(57600);
		break;

	case baud_115200:
		SerialOutputDec(115200);
		break;

	case baud_230400:
		SerialOutputDec(230400);
		break;

	default:
		SerialOutputString("(unknown)");
		break;
	}
}




static void print_elf_sections(void)
{
#ifdef BLOB_DEBUG
	extern u32 __text_start, __text_end;
	extern u32 __rodata_start, __rodata_end;
	extern u32 __data_start, __data_end;
	extern u32 __got_start, __got_end;
	extern u32 __commandlist_start, __commandlist_end;
	extern u32 __initlist_start, __initlist_end;
	extern u32 __exitlist_start, __exitlist_end;
	extern u32 __ptagtable_begin, __ptagtable_end;
	extern u32 __bss_start, __bss_end;
	extern u32 __stack_start, __stack_end;

	SerialOutputString("ELF sections layout:\n");

#define PRINT_ELF_SECTION(from, to, name) \
	SerialOutputString("  0x"); \
	SerialOutputHex((u32)&(from)); \
	SerialOutputString(" - 0x"); \
	SerialOutputHex((u32)&(to)); \
	SerialOutputString(" " name "\n");


	PRINT_ELF_SECTION(__text_start, __text_end, ".text");
	PRINT_ELF_SECTION(__rodata_start, __rodata_end, ".rodata");
	PRINT_ELF_SECTION(__data_start, __data_end, ".data");
	PRINT_ELF_SECTION(__got_start, __got_end, ".got");
	PRINT_ELF_SECTION(__commandlist_start, __commandlist_end, ".commandlist");
	PRINT_ELF_SECTION(__initlist_start, __initlist_end, ".initlist");
	PRINT_ELF_SECTION(__exitlist_start, __exitlist_end, ".exitlist");
	PRINT_ELF_SECTION(__ptagtable_begin, __ptagtable_end, ".ptaglist");
	PRINT_ELF_SECTION(__bss_start, __bss_end, ".bss");
	PRINT_ELF_SECTION(__stack_start, __stack_end, ".stack (in .bss)");
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -