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

📄 bootmenu.c

📁 em86xx 完整启动程序,支持网络下载与串通下载
💻 C
📖 第 1 页 / 共 5 页
字号:
}int bootmenu_download(int argc, char *argv[]){    static unsigned int addr = 0;    int target = DOWNLOAD_NONE;    char *filename = NULL;    unsigned int checksum = 0;#ifdef CONFIG_ENABLE_IRQHANDLER//    unsigned int flags = 0;#endif    if (argc == 1) {#ifndef CONFIG_DISABLE_HELP_MSGS        uart_puts(s_help_download_brief);        uart_puts(s_help_download);#else        uart_puts(no_help_msg);#endif        goto download_out;    }    if (argc == 2) {        uart_puts("Specify target to download\n");	goto download_out;    } else {        static struct {            int target;            char *name;        } s_targetlist[] = {            { DOWNLOAD_BOOT, "boot" },#ifdef CONFIG_ENABLE_2NDBOOT            { DOWNLOAD_2NDBOOT, "2ndboot" },#endif            { DOWNLOAD_ROMFS, "romfs" },            { DOWNLOAD_INITRD, "initrd" },            { DOWNLOAD_KERNEL, "kernel" },            { DOWNLOAD_KERNELFS, "kernelfs" },	    { DOWNLOAD_MISC, "binary" },	    { DOWNLOAD_INSTFILE, "instfile" },#ifdef CONFIG_ENABLE_IRQHANDLER	    { DOWNLOAD_IRQHANDLER, "irqhandler" },#endif#ifdef CONFIG_ENABLE_BITMAPS	    { DOWNLOAD_BITMAP, "bitmap" },#endif#ifdef CONFIG_ENABLE_UCODES	    { DOWNLOAD_UCODE, "ucode" },#endif#ifdef CONFIG_ENABLE_USERPREF	    { DOWNLOAD_USERPREF, "userpref" },#endif#ifdef CONFIG_ENABLE_VSYNCPARAM	    { DOWNLOAD_VSYNCPARAM, "vsyncparam" },#endif#ifdef CONFIG_ENABLE_DVI	    { DOWNLOAD_DVI, "dvi" },#endif            { DOWNLOAD_NONE, NULL },        };        int i;        for (i = 0; s_targetlist[i].target != DOWNLOAD_NONE; ++i) {            if (strcmp(argv[2], s_targetlist[i].name) == 0) {                target = s_targetlist[i].target;                addr = g_download_info[target].addr;                filename = g_download_info[target].filename;                break;            }        }        if (target == DOWNLOAD_NONE) {            uart_puts("Invalid target\n");	    goto download_out;        } else if (target == DOWNLOAD_MISC) {	    if (strncmp(argv[3], "0x", 2) == 0) {		addr = atoi(argv[3]);	    }	}#ifdef CONFIG_ENABLE_IRQHANDLER	else if (target == DOWNLOAD_IRQHANDLER) {	    if (g_download_info[target].download != 0) {		uart_puts("IRQ handler existed.\n");		goto download_out;	    }	}#endif#ifdef CONFIG_ENABLE_UCODES	else if (target == DOWNLOAD_UCODE) {	    if (g_download_info[target].download != 0) {		uart_puts("ucode downloaded already.\n");		goto download_out;	    }	}#endif#ifdef CONFIG_ENABLE_BITMAPS	else if (target == DOWNLOAD_BITMAP) {	    if (g_download_info[target].download != 0) {		uart_puts("bitmap downloaded already.\n");		goto download_out;	    }	}#endif#ifdef CONFIG_ENABLE_USERPREF	else if (target == DOWNLOAD_USERPREF) {	    if (g_download_info[target].download != 0) {		uart_puts("userpref downloaded already.\n");		goto download_out;	    }	}#endif#ifdef CONFIG_ENABLE_VSYNCPARAM	else if (target == DOWNLOAD_VSYNCPARAM) {	    if (g_download_info[target].download != 0) {		uart_puts("vsyncparam downloaded already.\n");		goto download_out;	    }	}#endif#ifdef CONFIG_ENABLE_DVI	else if (target == DOWNLOAD_DVI) {	    if (g_download_info[target].download != 0) {		uart_puts("dvi downloaded already.\n");		goto download_out;	    }	}#endif    }     if (strcmp(argv[1], "serial") == 0) {        int len, gzipped = 0;        unsigned int origaddr = addr;        if (argv[3] && strcmp(argv[3], "gz") == 0) {            gzipped = 1;            origaddr = addr;            addr = loadaddr_temp;        }#ifdef CONFIG_ENABLE_FIP        downloading = 1;#endif        uart_puts("Send uuencoded stream to serial port\n");        if ((len = serial_uudecode((unsigned char *) addr, 0)) >= 0) {            uart_printf(recv_msg, len, len, addr);            if (gzipped) {                uart_printf(unzip_msg, origaddr);                len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip);            }            g_download_info[target].download = 1;            g_download_info[target].len = len;        }#ifdef CONFIG_ENABLE_FIP	downloading = 0;#endif    }#ifdef CONFIG_ENABLE_FULLFUNCTION    else if (strcmp(argv[1], "ram") == 0) {        if (argv[3] == NULL)             uart_puts("Specify address of the image\n");        else if (argv[4] == NULL)            uart_puts("Specify size of the image\n");        else {            unsigned int imgaddr, imgsize;            imgaddr = atoi(argv[3]);            imgsize = atoi(argv[4]);            memmove((void *) addr, (void *) imgaddr, imgsize);            g_download_info[target].download = 1;            g_download_info[target].len = imgsize;        }    }#endif    else if (strcmp(argv[1], "romfs") == 0) {        int len, gzipped = 0;        unsigned int origaddr = addr;	char buf[BOOTCONFIG_PATHLEN + 3];        if (filename == NULL) {            uart_puts(nofile_msg);	    goto download_out;        } else if (argv[3] && strcmp(argv[3], "gz") == 0) {	    gzipped = 1;	    origaddr = addr;	    addr = loadaddr_temp;        } 	strcpy(buf, filename);	if (gzipped)	    strcat(buf, ".gz");	len = load_romfs_file(buf, addr, LOADER_FLASH_ROMFSADDR, LOADER_FLASH_ROMFSADDR + 0x00040000, 0);	if (len > 0) {       	    if (gzipped) {                uart_printf(unzip_msg, origaddr);                len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip);            }       	    g_download_info[target].download = 1;            g_download_info[target].len = len;	}    }#ifdef CONFIG_ENABLE_NETWORK    else if (strcmp(argv[1], "net") == 0) {        int len, gzipped = 0;        unsigned int origaddr = addr;	char buf[BOOTCONFIG_PATHLEN + 3];        if (argv[3]) {            if (strcmp(argv[3], "gz") == 0) {                gzipped = 1;                origaddr = addr;                addr = loadaddr_temp;            } else {		        filename = argv[3];                if (argv[4] && strcmp(argv[4], "gz") == 0) {                    gzipped = 1;                    origaddr = addr;                    addr = loadaddr_temp;                }            }        }        if (bootmenu_net_up(0) != 0)	    goto download_out;        if (!ipv4_ipaddr_valid(g_bootconfig.server)) {            uart_puts("Server address is invalid\n");	    goto download_out;        } else if (filename == NULL) {            uart_puts(nofile_msg);	    goto download_out;        }	strcpy(buf, filename);	if (gzipped)	    strcat(buf, ".gz");#ifdef SET_SERVER_IP_FOR_DOWNLOAD	fip_write_text(0, fiptext = "LOADING", FIP_CENTER);#endif          if (ipv4_tftp(g_bootconfig.server, buf, addr, &len) == 0) {		uart_printf(recv_msg, len, len, addr);		if (gzipped) {			uart_printf(unzip_msg, origaddr);			len = kunzip((char *) addr, (char *) origaddr, loadaddr_heap_unzip);		}		g_download_info[target].download = 1;		g_download_info[target].len = len;        }	else	{		#ifdef SET_SERVER_IP_FOR_DOWNLOAD		fip_write_text(0, fiptext = "LOAD ERR", FIP_CENTER);		#endif 	}    }#endif#ifdef CONFIG_ENABLE_USERPREF#ifdef CONFIG_ENABLE_VSYNCPARAM#ifdef CONFIG_ENABLE_FLASH    else if ((strcmp(argv[1], "flash") == 0) && (target == DOWNLOAD_VSYNCPARAM)) {	if (doload_vsyncparam(g_download_info[target].addr, 1) != 0) 	    g_download_info[target].download = 1;	else	    uart_puts("Invalid vsync image\n");	goto download_out;    }#endif#endif#endif    else {        uart_puts("Unknown media\n");	goto download_out;    }    if (g_download_info[target].len > 0)         uart_printf("Checksum: 0x%x\n", checksum = binfile_crc_check((void *)g_download_info[target].addr, g_download_info[target].len));     else{	#ifdef SET_SERVER_IP_FOR_DOWNLOAD	fip_write_text(0, fiptext = "LOAD ERR", FIP_CENTER);	#endif 	goto download_out;    }    if ((target == DOWNLOAD_INSTFILE) && (g_download_info[target].len > 0)) {	if ((checksum != 0) || (doload_installablefile(g_download_info[target].addr, g_download_info[target].len, 0, 0) == 0)) {		#ifdef SET_SERVER_IP_FOR_DOWNLOAD		fip_write_text(0, fiptext = "LOAD ERR", FIP_CENTER);		#endif 		uart_puts("Invalid installable file.\n");	}	g_download_info[target].download = 0; /* Free it up for further download */	g_download_info[target].len = 0;    }  #ifdef CONFIG_ENABLE_IRQHANDLER    if ((target == DOWNLOAD_IRQHANDLER) && (g_download_info[target].len > 0)) {#ifdef CONFIG_ENABLE_VSYNCPARAM	    if (g_download_info[DOWNLOAD_VSYNCPARAM].download == 0) {		    uart_puts("No VSYNC parameters loaded: blank structure.\n");		    /* clear 32KB */		    memset((void *) g_download_info[DOWNLOAD_VSYNCPARAM].addr, 0, MAX_USERPREF_SIZE/2);		    g_download_info[DOWNLOAD_VSYNCPARAM].download = 1;	    }#endif	if ((checksum != 0) || (doload_irqhandler(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) {	    uart_puts("Invalid IRQ handler.\n");	    g_download_info[target].download = 0;	    g_download_info[target].len = 0;	}    }#endif#ifdef CONFIG_ENABLE_UCODES    /* Assume ucode file only use top reserved area in DRAM0 */    if ((target == DOWNLOAD_UCODE) && (g_download_info[target].len > 0))  {	if ((checksum != 0) || (doload_ucode(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) {	    uart_puts("Invalid ucode image\n");	    g_download_info[target].download = 0;	    g_download_info[target].len = 0;	}    } #endif#ifdef CONFIG_ENABLE_BITMAPS    if ((target == DOWNLOAD_BITMAP) && (g_download_info[target].len > 0))  {	if ((checksum != 0) || (doload_bitmap(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) {	    uart_puts("Invalid bitmap\n");	    g_download_info[target].download = 0;	    g_download_info[target].len = 0;	}     } #endif#ifdef CONFIG_ENABLE_DVI    if ((target == DOWNLOAD_DVI) && (g_download_info[target].len > 0))  {	if ((checksum != 0) || (doload_dvi(g_download_info[target].addr, g_download_info[target].len, 0) == 0)) {	    uart_puts("Invalid dvi\n");	    g_download_info[target].download = 0;	    g_download_info[target].len = 0;	}     } #endifdownload_out:    return 0;}#ifdef CONFIG_ARCH_TANGO15#ifdef CONFIG_ENABLE_FULLFUNCTIONvoid mac_subwrite(int argc, char *argv[]){	unsigned char buffer[256];	unsigned int addr=0xa4, saddr=0, len=8;	int i;	if(argc>2) 		saddr = atoi(argv[2]);	if(argc>3) 		len = atoi(argv[3]);	for(i=0;i<len;i++) {		if (argc > (i+4))			buffer[i] = htoi(argv[i+4]);		else			break;	}	for(i=0;i<len;i++) 		uart_printf("%02x ",buffer[i]);	uart_printf("\naddr=0x%x, subaddr=0x%x, len=0x%x\n",addr, saddr, len);	hwi2c_write(addr, saddr, &buffer[0], len, 20);}void mac_dump(int argc, char *argv[]){	unsigned char buffer[256];	unsigned int addr=0xa5, len=256;	int i;	memset(buffer, 0xff, sizeof(buffer));	if (hwi2c_read_no_subaddr(addr, &buffer[0], len, 200) != 0) {		/* ERROR */		uart_printf("mac dump error\n");	} else {		/* We have the first 8 bytes in buffer */		uart_printf("0x00: ");		for(i=0;i<len;i++) {			uart_printf("%02x ",buffer[i]);			if((i&0xf) == 0xf)				uart_printf("\n0x%02x: ",i+1);		}		uart_printf("\n");	}}#endif //#ifdef CONFIG_ENABLE_FULLFUNCTION#define SIGN 0x5astatic unsigned int mac_offset=0;int mac_read(char *bufr){	unsigned char buf[256];	unsigned char sum=0;	unsigned int offset;	int i;#ifdef BOOTLOADER	offset = mac_offset;#else	offset = 0;#endif	hwi2c_read_no_subaddr(0xa5, buf, 256, 20);	for(i=0;i<8;i++) 		sum += buf[offset+i];	if( (sum ==0) && (buf[offset+6] == SIGN) ) {		memcpy(bufr,&buf[offset],8);		return 0;

⌨️ 快捷键说明

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