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

📄 cmd_usb.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
📖 第 1 页 / 共 2 页
字号:
int do_usbboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	char *boot_device = NULL;	char *ep;	int dev, part=0, rcode;	ulong cnt;	ulong addr;	disk_partition_t info;	image_header_t *hdr;	block_dev_desc_t *stor_dev;	switch (argc) {	case 1:		addr = CFG_LOAD_ADDR;		boot_device = getenv ("bootdevice");		break;	case 2:		addr = simple_strtoul(argv[1], NULL, 16);		boot_device = getenv ("bootdevice");		break;	case 3:		addr = simple_strtoul(argv[1], NULL, 16);		boot_device = argv[2];		break;	default:		printf ("Usage:\n%s\n", cmdtp->usage);		return 1;	}	if (!boot_device) {		puts ("\n** No boot device **\n");		return 1;	}	dev = simple_strtoul(boot_device, &ep, 16);	stor_dev=usb_stor_get_dev(dev);	if (stor_dev->type == DEV_TYPE_UNKNOWN) {		printf ("\n** Device %d not available\n", dev);		return 1;	}	if (stor_dev->block_read==NULL) {		printf("storage device not initialized. Use usb scan\n");		return 1;	}	if (*ep) {		if (*ep != ':') {			puts ("\n** Invalid boot device, use `dev[:part]' **\n");			return 1;		}		part = simple_strtoul(++ep, NULL, 16);	}	if (get_partition_info (stor_dev, part, &info)) {		/* try to boot raw .... */		strncpy(&info.type[0], BOOT_PART_TYPE, sizeof(BOOT_PART_TYPE));		strncpy(&info.name[0], "Raw", 4);		info.start=0;		info.blksz=0x200;		info.size=2880;		printf("error reading partinfo...try to boot raw\n");	}	if ((strncmp(info.type, BOOT_PART_TYPE, sizeof(info.type)) != 0) &&	    (strncmp(info.type, BOOT_PART_COMP, sizeof(info.type)) != 0)) {		printf ("\n** Invalid partition type \"%.32s\""			" (expect \"" BOOT_PART_TYPE "\")\n",			info.type);		return 1;	}	printf ("\nLoading from USB device %d, partition %d: "		"Name: %.32s  Type: %.32s\n",		dev, part, info.name, info.type);	printf ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",		info.start, info.size, info.blksz);	if (stor_dev->block_read(dev, info.start, 1, (ulong *)addr) != 1) {		printf ("** Read error on %d:%d\n", dev, part);		return 1;	}	hdr = (image_header_t *)addr;	if (hdr->ih_magic == IH_MAGIC) {		print_image_hdr (hdr);		cnt = (hdr->ih_size + sizeof(image_header_t));		cnt += info.blksz - 1;		cnt /= info.blksz;		cnt -= 1;	} else {		printf("\n** Bad Magic Number **\n");		return 1;	}	if (stor_dev->block_read (dev, info.start+1, cnt,		      (ulong *)(addr+info.blksz)) != cnt) {		printf ("\n** Read error on %d:%d\n", dev, part);		return 1;	}	/* Loading ok, update default load address */	load_addr = addr;	flush_cache (addr, (cnt+1)*info.blksz);	/* Check if we should attempt an auto-start */	if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {		char *local_args[2];		extern int do_bootm (cmd_tbl_t *, int, int, char *[]);		local_args[0] = argv[0];		local_args[1] = NULL;		printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);		rcode=do_bootm (cmdtp, 0, 1, local_args);		return rcode;	}	return 0;}#endif /* CONFIG_USB_STORAGE *//********************************************************************************* * usb command intepreter */int do_usb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int i;	struct usb_device *dev = NULL;	block_dev_desc_t *stor_dev;	if ((strncmp(argv[1],"reset",5) == 0) ||		 (strncmp(argv[1],"start",5) == 0)){		usb_stop();		printf("(Re)start USB...\n");		usb_init();		return 0;	}	if (strncmp(argv[1],"stop",4) == 0) {#ifdef CONFIG_USB_KEYBOARD		if (argc==2) {			if (usb_kbd_deregister()!=0) {				printf("USB not stopped: usbkbd still using USB\n");				return 1;			}		}		else { /* forced stop, switch console in to serial */			console_assign(stdin,"serial");			usb_kbd_deregister();		}#endif		printf("stopping USB..\n");		usb_stop();		return 0;	}	if (strncmp(argv[1],"tree",4) == 0) {		printf("\nDevice Tree:\n");		usb_show_tree(usb_get_dev_index(0));		return 0;	}	if (strncmp(argv[1],"inf",3) == 0) {		int d;		if (argc==2) {			for(d=0;d<USB_MAX_DEVICE;d++) {				dev=usb_get_dev_index(d);				if (dev==NULL)					break;				usb_display_desc(dev);				usb_display_config(dev);			}			return 0;		}		else {			int d;			i=simple_strtoul(argv[2], NULL, 16);			printf("config for device %d\n",i);			for(d=0;d<USB_MAX_DEVICE;d++) {				dev=usb_get_dev_index(d);				if (dev==NULL)					break;				if (dev->devnum==i)					break;			}			if (dev==NULL) {				printf("*** NO Device avaiable ***\n");				return 0;			}			else {				usb_display_desc(dev);				usb_display_config(dev);			}		}		return 0;	}#ifdef CONFIG_USB_STORAGE	if (strncmp(argv[1],"scan",4) == 0) {		printf("Scan for storage device:\n");	 	usb_stor_curr_dev=usb_stor_scan(1);		if (usb_stor_curr_dev==-1) {			printf("No device found. Not initialized?\n");			return 1;		}		return 0;	}	if (strncmp(argv[1],"part",4) == 0) {		int devno, ok;		for (ok=0, devno=0; devno<USB_MAX_STOR_DEV; ++devno) {			stor_dev=usb_stor_get_dev(devno);			if (stor_dev->type!=DEV_TYPE_UNKNOWN) {				ok++;				if (devno)					printf("\n");				printf("print_part of %x\n",devno);				print_part(stor_dev);			}		}		if (!ok) {			printf("\nno USB devices available\n");			return 1;		}		return 0;	}	if (strcmp(argv[1],"read") == 0) {		if (usb_stor_curr_dev<0) {			printf("no current device selected\n");			return 1;		}		if (argc==5) {			unsigned long addr = simple_strtoul(argv[2], NULL, 16);			unsigned long blk  = simple_strtoul(argv[3], NULL, 16);			unsigned long cnt  = simple_strtoul(argv[4], NULL, 16);			unsigned long n;			printf ("\nUSB read: device %d block # %ld, count %ld ... ",					usb_stor_curr_dev, blk, cnt);			stor_dev=usb_stor_get_dev(usb_stor_curr_dev);			n = stor_dev->block_read(usb_stor_curr_dev, blk, cnt, (ulong *)addr);			printf ("%ld blocks read: %s\n",n,(n==cnt) ? "OK" : "ERROR");			if (n==cnt)				return 0;			return 1;		}	}	if (strcmp(argv[1],"dev") == 0) {		if (argc==3) {			int dev = (int)simple_strtoul(argv[2], NULL, 10);			printf ("\nUSB device %d: ", dev);			if (dev >= USB_MAX_STOR_DEV) {				printf("unknown device\n");				return 1;			}			printf ("\n    Device %d: ", dev);			stor_dev=usb_stor_get_dev(dev);			dev_print(stor_dev);			if (stor_dev->type == DEV_TYPE_UNKNOWN) {				return 1;			}			usb_stor_curr_dev = dev;			printf("... is now current device\n");			return 0;		}		else {			printf ("\nUSB device %d: ", usb_stor_curr_dev);			stor_dev=usb_stor_get_dev(usb_stor_curr_dev);			dev_print(stor_dev);			if (stor_dev->type == DEV_TYPE_UNKNOWN) {				return 1;			}			return 0;		}		return 0;	}#endif /* CONFIG_USB_STORAGE */	printf ("Usage:\n%s\n", cmdtp->usage);	return 1;}#endif /* (CONFIG_COMMANDS & CFG_CMD_USB) */#if (CONFIG_COMMANDS & CFG_CMD_USB)#ifdef CONFIG_USB_STORAGEU_BOOT_CMD(	usb,	5,	1,	do_usb,	"usb     - USB sub-system\n",	"reset - reset (rescan) USB controller\n"	"usb stop [f]  - stop USB [f]=force stop\n"	"usb tree  - show USB device tree\n"	"usb info [dev] - show available USB devices\n"	"usb scan  - (re-)scan USB bus for storage devices\n"	"usb device [dev] - show or set current USB storage device\n"	"usb part [dev] - print partition table of one or all USB storage devices\n"	"usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"	"    to memory address `addr'\n");U_BOOT_CMD(	usbboot,	3,	1,	do_usbboot,	"usbboot - boot from USB device\n",	"loadAddr dev:part\n");#elseU_BOOT_CMD(	usb,	5,	1,	do_usb,	"usb     - USB sub-system\n",	"reset - reset (rescan) USB controller\n"	"usb  tree  - show USB device tree\n"	"usb  info [dev] - show available USB devices\n");#endif#endif

⌨️ 快捷键说明

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