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

📄 bootmenu.c

📁 em86xx 完整启动程序,支持网络下载与串通下载
💻 C
📖 第 1 页 / 共 5 页
字号:
	}	else 		return -1;}int bootmenu_mac(int argc, char *argv[]){	unsigned char bufw[8]={0x11,0x33,0x66,0x99,0xaa,0xbb,0xcc,0xdd};	unsigned char sum=0;	unsigned int addr=0xa5;	int i;    if (argc == 1) {#ifndef CONFIG_DISABLE_HELP_MSGS        uart_puts(s_help_mac_brief);        uart_puts(s_help_mac);#else        uart_puts(no_help_msg);#endif        return 0;    }    if (strcmp(argv[1], "read") == 0) {		if (mac_read(bufw) == -1) 			uart_printf("mac read error: sum=%02x\n",bufw[7]);		for(i=0;i<6;i++) 			uart_printf("%02x ",bufw[i]);		uart_printf("\n");    } else if (strcmp(argv[1], "write") == 0 ) {		for(i=0;i<6;i++) {			if (argc > (i+2))				bufw[i] = htoi(argv[i+2]);			uart_printf("%02x ",bufw[i]);			sum+=bufw[i];		}		bufw[6] = SIGN;		sum+=bufw[6];		bufw[7] = (unsigned char)(-sum);		sum += bufw[7];		uart_printf("%02x %02x sum=0x%02x\n",bufw[6],bufw[7],sum);		for(i=0;i<8;i++) 			hwi2c_write(addr, i, &bufw[i], 1, 200);//		hwi2c_write(addr, 0, &bufw[0], 8, 200);		mac_offset = 0x100 - 8; 	} #ifdef CONFIG_ENABLE_FULLFUNCTION	else if(strcmp(argv[1], "dump") == 0 ) {		mac_dump(argc, argv);	} else if(strcmp(argv[1], "subwrite") == 0 ) {		mac_subwrite(argc, argv);	}#endif 	return 0; }#endif //TANGO15int bootmenu_dump(int argc, char *argv[]){    static unsigned int addr = 0;    int i;    unsigned int num = 0x100, unit = 1;    for (i = 1; (i < argc) && (argv[i][0] == '-'); ++i) {        switch (argv[i][1]) {        case 'l' : unit = 4; break;        case 'w' : unit = 2; break;        case 'b' : unit = 1; break;        }    }                if (argc > i)        addr = atoi(argv[i++]);    if (argc > i)        num = atoi(argv[i++]);    dump_memory(NULL, addr, num, unit);    addr += num;        return 0;}#ifdef CONFIG_ENABLE_FLASHint bootmenu_flash(int argc, char *argv[]){    int flash_inited = 0;    if (argc > 1 && strcmp(argv[1], "probe") == 0) {        unsigned int addr = LOADER_FLASHBASE;        if (argc > 2)            addr = atoi(argv[2]);        flash_probe(addr, 1, 1);	goto flash_out;    } else if (!flash_found()) {        flash_inited = 1;        flash_probe(LOADER_FLASHBASE, 0, 0);        if (!flash_found()) {            if (argc == 1 || strcmp(argv[1], "test") != 0) 		goto flash_out;        }    }        if (argc == 1) {        if (!flash_inited) {#ifndef CONFIG_DISABLE_HELP_MSGS            uart_puts(s_help_flash_brief);            uart_puts(s_help_flash);#else            uart_puts(no_help_msg);#endif        }	goto flash_out;    }    if (strcmp(argv[1], "list") == 0) {        flash_list(NULL);    } else if (strcmp(argv[1], "boot") == 0 || strcmp(argv[1], "romfs") == 0 #ifdef ENABLE_ENCRYPTED_OPT_ROM            || strcmp(argv[1], "romfscrypt1") == 0            || strcmp(argv[1], "romfscrypt2") == 0            || strcmp(argv[1], "romfscrypt3") == 0            || strcmp(argv[1], "romfscrypt4") == 0#endif #ifdef ENABLE_SIGNED_OPT_ROM            || strcmp(argv[1], "romfssign1") == 0            || strcmp(argv[1], "romfssign2") == 0            || strcmp(argv[1], "romfssign3") == 0            || strcmp(argv[1], "romfssign4") == 0#endif #ifdef CONFIG_ENABLE_2NDBOOT		|| strcmp(argv[1], "2ndboot") == 0#endif#ifdef CONFIG_ENABLE_USERPREF		|| strcmp(argv[1], "userpref") == 0#endif	) {        int target = 0;        unsigned int flashaddr = 0;        unsigned int ramaddr = 0;        unsigned int start, end, blocksize;        if (argv[1][0] == 'b') {            target = DOWNLOAD_BOOT;            flashaddr = LOADER_FLASHBASE;        }        else if (argv[1][0] == 'r') {            target = DOWNLOAD_ROMFS;            flashaddr = LOADER_FLASH_ROMFSADDR;#ifdef ENABLE_ENCRYPTED_OPT_ROM            if( strcmp(argv[1], "romfscrypt1") == 0 ){                flashaddr= ENCRYPTED_OPT_ROM1_ADDR;            }else if( strcmp(argv[1], "romfscrypt2") == 0 ){                flashaddr = ENCRYPTED_OPT_ROM2_ADDR;            }else if( strcmp(argv[1], "romfscrypt3") == 0 ){                flashaddr = ENCRYPTED_OPT_ROM3_ADDR;            }else if( strcmp(argv[1], "romfscrypt4") == 0 ){                flashaddr = ENCRYPTED_OPT_ROM4_ADDR;            }#endif /* ENABLE_ENCRYPTED_OPT_ROM */#ifdef ENABLE_SIGNED_OPT_ROM            if( strcmp(argv[1], "romfssign1") == 0 ){                flashaddr= SIGNED_OPT_ROM1_ADDR;            }else if( strcmp(argv[1], "romfssign2") == 0 ){                flashaddr = SIGNED_OPT_ROM2_ADDR;            }else if( strcmp(argv[1], "romfssign3") == 0 ){                flashaddr = SIGNED_OPT_ROM3_ADDR;            }else if( strcmp(argv[1], "romfssign4") == 0 ){                flashaddr = SIGNED_OPT_ROM4_ADDR;            }#endif /* ENABLE_SIGNED_OPT_ROM */        }#ifdef CONFIG_ENABLE_2NDBOOT        else if (argv[1][0] == '2') {            target = DOWNLOAD_2NDBOOT;            flashaddr = LOADER_FLASH_STAGE2ADDR;        }#endif#ifdef CONFIG_ENABLE_USERPREF        else if (argv[1][0] == 'u') {            target = DOWNLOAD_USERPREF;            /* Use last 64KB */            flashaddr = LOADER_FLASHBASE + flash_getsize() - MAX_USERPREF_SIZE;        }#endif         ramaddr = g_download_info[target].addr;        if (!g_download_info[target].download)             uart_printf(dl_ram_msg, "binary image");        else {            if (g_download_info[target].len > flash_getsize()) {                uart_puts("The image is too big (parallel flash).\n");                goto flash_out;            }            if (target == DOWNLOAD_BOOT) {                // check signature                loaderconfig_t *pconfig = (loaderconfig_t *) ramaddr;                if (pconfig->signature != LOADER_CONFIGSIGN) {                    uart_puts("Invalid boot loader image (parallel flash)\n");	            goto flash_out;                }            }             else if (target == DOWNLOAD_ROMFS) {                if (g_download_info[target].len > (MAX_ROMFS_SIZE << 10)) {                    uart_puts("ROMFS image is too big.\n");                    goto flash_out;                }#ifdef ENABLE_ENCRYPTED_OPT_ROM                /* Additional checks for optional encrypted romfs */#define CHECK_ENCRYPTED_OPT_ROM(addr, size);                                            \                if ((flashaddr == (addr)) && (g_download_info[target].len > (size))) {  \                    uart_puts("ROMFS image is too big.\n");                             \                    goto flash_out;                                                     \                }                CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_ROM0_ADDR, ENCRYPTED_ROM0_SIZE);                CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM1_ADDR, ENCRYPTED_OPT_ROM1_SIZE);                CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM2_ADDR, ENCRYPTED_OPT_ROM2_SIZE);                CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM3_ADDR, ENCRYPTED_OPT_ROM3_SIZE);                CHECK_ENCRYPTED_OPT_ROM(ENCRYPTED_OPT_ROM4_ADDR, ENCRYPTED_OPT_ROM4_SIZE);#endif /* ENABLE_ENCRYPTED_OPT_ROM */#ifdef ENABLE_SIGNED_OPT_ROM                /* Additional checks for optional signed romfs */#define CHECK_SIGNED_OPT_ROM(addr, size);                                            \                if ((flashaddr == (addr)) && (g_download_info[target].len > (size))) {  \                    uart_puts("ROMFS image is too big.\n");                             \                    goto flash_out;                                                     \                }                CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM1_ADDR, SIGNED_OPT_ROM1_SIZE);                CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM2_ADDR, SIGNED_OPT_ROM2_SIZE);                CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM3_ADDR, SIGNED_OPT_ROM3_SIZE);                CHECK_SIGNED_OPT_ROM(SIGNED_OPT_ROM4_ADDR, SIGNED_OPT_ROM4_SIZE);#endif /* ENABLE_SIGNED_OPT_ROM */            }#ifdef CONFIG_ENABLE_2NDBOOT            else if (target == DOWNLOAD_2NDBOOT) {                unsigned long *ptr = (unsigned long *)(ramaddr + CFG_2NDBOOT);                if (*ptr != LOADER_CONFIGSIGN) {                    /* It still might be an encrypted image */                    ptr = (unsigned long *)(ramaddr + g_download_info[target].len - 8);                    if (*ptr != LOADER_CONFIGSIGN){                        uart_puts("Invalid 2ndboot loader image\n");                        goto flash_out;                    }                }	    }#endif#ifdef CONFIG_ENABLE_USERPREF	    else if (target == DOWNLOAD_USERPREF) {            if (g_download_info[target].len > MAX_USERPREF_SIZE) {                uart_puts("userpref image is too big.\n");                goto flash_out;            }        }#endif            uart_printf("Writing data on RAM 0x%08x to flash 0x%08x\n", ramaddr, flashaddr);                        flash_calcblock(flashaddr, &start, &blocksize);             flash_calcblock(flashaddr + g_download_info[target].len - 1, &end, &blocksize);            end += blocksize - 1;            uart_printf("  0x%08x - 0x%08x will be erased\n", start, end);            uart_printf("  0x%08x - 0x%08x will be written\n", flashaddr, flashaddr + g_download_info[target].len - 1);	     #ifdef SET_SERVER_IP_FOR_DOWNLOAD	     fip_write_text(0, fiptext = "ERASING", FIP_LEFT);	     #endif             uart_puts("Erasing : ");            flash_erase_region(flashaddr, g_download_info[target].len);		 //flash_erase_region(0x46000000+0x380000, 0x80000);	       //goto flash_out;				     #ifdef SET_SERVER_IP_FOR_DOWNLOAD	     fip_write_text(0, fiptext = "WRITING", FIP_LEFT);	     #endif             uart_puts("\nWriting : ");            flash_write_data(flashaddr, (unsigned char *) ramaddr, g_download_info[target].len);            uart_printf("\nVerifying (flash 0x%08x, RAM 0x%08x, size %d) : ",                        flashaddr, ramaddr, g_download_info[target].len);				     #ifdef SET_SERVER_IP_FOR_DOWNLOAD	     	{	     	      int err_cmp;		      err_cmp=memcmp((const void *)flashaddr, (const void *)ramaddr, 	                      g_download_info[target].len);		      if(err_cmp==0){			  	fip_write_text(0, fiptext = "WRITE OK", FIP_CENTER);			  	uart_puts("OK.");		      	}			else{				fip_write_text(0, fiptext = "WRITE ERR", FIP_CENTER);				uart_puts("Failed.");			}	     	}	     #else            uart_puts((memcmp((const void *)flashaddr, (const void *)ramaddr,                       g_download_info[target].len) == 0) ? "OK." : "Failed.");	     #endif 		             uart_puts("\n");        }    } #ifdef CONFIG_ENABLE_FULLFUNCTION    else if (strcmp(argv[1], "erase") == 0) {        char str[128];        unsigned int addr, start, end, len = 0, blocksize;        if (argc == 2) {            uart_puts("Specify address and length to erase\n");	    goto flash_out;        }        addr = atoi(argv[2]);        if (argc > 3)            len = atoi(argv[3]);        flash_calcblock(addr, &start, &blocksize);         if (len == 0)            end = start + blocksize - 1;        else {            flash_calcblock(addr + len - 1, &end, &blocksize);            end += blocksize - 1;        }                uart_printf("This will erase 0x%08x - 0x%08x. Are you sure? (y/N) ", start, end);        uart_gets(str, sizeof str, 0);        if (str[0] == 'Y' || str[0] == 'y') {            uart_puts("Erasing : ");            if (len == 0)                flash_erase_oneblock(start);            else                flash_erase_region(start, len);            uart_puts("\n");        }    } else if (strcmp(argv[1], "eraseall") == 0) {        char str[128];        uart_puts("This will erase entire flash. Are you sure? (y/N) ");        uart_gets(str, sizeof str, 0);        if (str[0] == 'Y' || str[0] == 'y') {            uart_puts("Erasing : ");            flash_erase_all();            uart_puts("\n");        }    } else if (strcmp(argv[1], "writeb") == 0) {        unsigned int addr, data;        if (argc < 4) {            uart_puts(flashw_msg);	    goto flash_out;        }                addr = atoi(argv[2]);        data = atoi(argv[3]);                uart_printf("%08x : %02x => ", addr, *(volatile unsigned char *) addr);        if (flash_write_onebyte(addr, data) != 0)            uart_puts("(FAULT) ");        uart_printf("%02x\n", *(volatile unsigned char *) addr);    } else if (strcmp(argv[1], "writew") == 0) {        unsigned int addr, data;        if (argc < 4) {            uart_puts(flashw_msg);	    goto flash_out;        }        addr = atoi(argv[2]) & ~0x01;        data = atoi(argv[3]);                uart_printf("%08x : %04x => ", addr, *(volatile unsigned short *) addr);        if (flash_write_oneword(addr, data) != 0)            uart_puts("(FAULT) ");        uart_printf("%04x\n", *(volatile unsigned short *) addr);    } else if (strcmp(argv[1], "write") == 0) {        unsigned int to, from, len;        if (argc < 5) {            uart_puts(flashw_msg);	    goto flash_out;        }                to = atoi(argv[2]);        from = atoi(argv[3]);        len = atoi(argv[4]);        uart_puts("Writing : ");        if (flash_write_data(to, (unsigned char *) from, len) != 0)            uart_puts("Erase first before writing");        uart_puts("\n");    }     else if (strcmp(argv[1], "test") == 0) {        flash_test(argc - 2, argv + 2);    } #endif    else         uart_puts("Invalid command\n");        flash_out:    return 0;}#endif#ifdef CONFIG_ENABLE_IDEint bootmenu_ide_checkdrive(char *str, int flag, int exist){    int drive;       if (str == NULL)         uart_puts("Specify drive (0/1)\n");    else {        d

⌨️ 快捷键说明

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