Ejemplo n.º 1
0
void lab_cmd_suspend(int argc,const char** argv)
{
	lab_puts("Ok byebye!!\r\n");
	printk("LAB: We are about to \"go down for the count\", as it were. I'll let you know when we wake up.\n");
	pm_suspend(PM_SUSPEND_MEM);
	printk("LAB: Hi. We're awake. I'm going to return you to the main menu now. As a reminder, I own you.\n");
}
Ejemplo n.º 2
0
void lab_cmd_cat(int argc, const char** argv)
{
	char *buf, *p;
	int fd, sz;

	if (argc != 2) {
		lab_puts("cat: syntax: cat <filename>\r\n");
		return;
	}

	if ((fd = sys_open(argv[1], O_RDONLY, 0)) < 0) {
		lab_printf("lab: couldn't open the file, errno=%d\r\n", fd);
		return;
	}

	buf = (char*)vmalloc(4096);

	while ((sz = sys_read(fd, buf, 4096))) {
	        if (sz < 0) break;
		for (p = buf; p < buf + sz; p++) {
			if (*p == '\n')
				lab_puts("\r\n");
			else
				lab_putc(*p);
		}
		if (lab_char_ready()) break;
	}

	lab_puts("\r\n");

	if (sz < 0) {
		lab_printf("lab: couldn't read the file, errno=%d\r\n", sz);
	} else if (sz > 0) {
		lab_printf("lab: user break\r\n");
	}
	
	sys_close(fd);
	vfree(buf);
}
Ejemplo n.º 3
0
char* lab_ymodem_receive(int* length, int ymodemg)
{
	int stop;
	int firstblk;
	unsigned char gotch;
	int pktsize;
	int size = 0;
	char* rxbuf = NULL;
	int rbytes;
	int waitpkts;
		
	stop = 0;
	firstblk = 1;
	lab_delay(6);
	rbytes = 0;
	waitpkts = 16;
	
	while (!stop)
	{
		if (firstblk)
		{
			if (ymodemg)
				lab_putc(GRC);
			else
				lab_putc(CRC);
		}
		
		gotch = getchar();
		if (gotch == 0)		// timeout
		{
			waitpkts--;
			if (!waitpkts)
			{
				printk("WARNING: YMODEM receive timed out!\n");
				if (rxbuf)
					vfree(rxbuf);
				return NULL;
			}
			
			continue;
		}
		
		switch (gotch)
		{
		case SOH:
			pktsize = 128;
			goto havesize;
		case STX:
			pktsize = 1024;
havesize:
		{
			unsigned char blk;
			unsigned char blk255;
			unsigned char dbytes[1028];
			int i;
			
			blk = getchar();
			blk255 = getchar();
			for (i=0; i<pktsize+2; i++)
				dbytes[i] = getchar();
			
			if (crc16_buf(dbytes, pktsize+2))
			{
				/* CRC failed, try again */
				lab_putc(NAK);
				break;
			}
			
			if (blk255 != (255-blk))
			{
				lab_putc(NAK);
				break;
			}
			
			if (firstblk)
			{
				int i;
				char* buf;
				buf = dbytes + strlen(dbytes) + 1;
				i = 0;
				size = 0;
				while (*buf >= '0' && *buf <= '9')
				{
					size *= 10;
					size += *buf - '0';
					buf++;
				}
				
				*length = size;
				size += 1024;
				rxbuf = vmalloc(size+1024); // a little more safety...
				// printk(">>> YMODEM: getting file of size %d (buf addr: %08X)\n", size-1024, rxbuf);
				
				lab_putc(ACK);
				if (ymodemg)
					lab_putc(GRC);
				else
					lab_putc(CRC);
				
				firstblk = 0;
				break;
			}
			
			if ((rbytes + pktsize) > size)
			{
				lab_putc(CAN);
				lab_putc(CAN);
				/* BUFFER OVERRUN!!! */
				stop = 1;
				break;
			}
			
			memcpy(rxbuf+rbytes, dbytes, pktsize);
			rbytes += pktsize;
			
			if (!ymodemg)
				lab_putc(ACK);
			
			break;
		}
		case EOT:
			lab_putc(ACK);
			lab_delay(1);
			lab_putc(CRC);
			lab_delay(1);
			lab_putc(ACK);
			lab_delay(1);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_puts("\x08\x08\x08\x08    \x08\x08\x08\x08");
			
			eatbytes();
			
			stop = 1;
			
			break;
		case CAN:
			lab_putc(CAN);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_puts("\x08\x08\x08\x08    \x08\x08\x08\x08");
			stop = 1;
			
			lab_delay(1);
			lab_puts("YMODEM transfer aborted\r\n");
			
			if (rxbuf)
				vfree(rxbuf);
			
			rxbuf = NULL;
			
			eatbytes();
			
			break;
		case 0x03:
		case 0xFF:
			/* Control-C. We should NAK it if it was line noise,
			 * but it's more likely to be the user banging on the
			 * keyboard trying to abort a screwup.
			 */
			lab_putc(CAN);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_putc(CAN);
			lab_puts("\x08\x08\x08\x08    \x08\x08\x08\x08");
			
			eatbytes();
			
			if (rxbuf)
				vfree(rxbuf);
				
			rxbuf = NULL;
			
			stop=1;
			break;
		default:
			lab_putc(NAK);
		}
	}
	
	return rxbuf;
}
Ejemplo n.º 4
0
/*
 * Main program
 */
void lab_cmd_nanddump(int argc, const char **argv)
{
	unsigned char readbuf[512];
	unsigned char oobbuf[16];
	unsigned long ofs;
	struct mtd_info* mtd = NULL;
	int i, ofd, bs, start_addr, end_addr, pretty_print;
	struct mtd_oob_buf oob = {0, 16, oobbuf};
	unsigned char pretty_buf[120];
	int retlen;
	
	/* Make sure enough arguments were passed */ 
	if (argc < 3 || argv[1][1] != '\0') {
		lab_printf("usage: %s <mtd number> <dumpname> [start addr] [length]\r\n", argv[0]);
		return;
	}

	/* Open MTD device */
	if ((mtd = get_mtd_device(NULL, argv[1][0]-'0')) == NULL) {
		lab_puts("Couldn't open flash\r\n");
		return;
	}

	if (mtd->type != MTD_NANDFLASH) {
		lab_puts("This MTD is not NAND flash. I can't dump this - sorry.\r\n");
		put_mtd_device(mtd);
		return;
	}

	/* Make sure device page sizes are valid */
	if (!(mtd->oobsize == 16 && mtd->oobblock == 512) &&
	    !(mtd->oobsize == 8  && mtd->oobblock == 256)) {
		lab_puts("Unknown flash (not normal NAND)\r\n");
		put_mtd_device(mtd);
		return;
	}

	/* Open output file for writing */
	if ((ofd = sys_open(argv[2], O_WRONLY | O_CREAT, 0644)) == -1) {
		lab_puts("Couldn't open outfile\r\n");
		put_mtd_device(mtd);
		return;
	}

	/* Initialize start/end addresses and block size */
	start_addr = 0;
	end_addr = mtd->size;
	bs = mtd->oobblock;

	/* See if start address and length were specified */
	if (argc == 4) {
		start_addr = simple_strtoul(argv[3], NULL, 0) & ~(bs - 1);
		end_addr = mtd->size;
	} else if (argc == 5) {
		start_addr = simple_strtoul(argv[3], NULL, 0) & ~(bs - 1);
		end_addr = (simple_strtoul(argv[3], NULL, 0) + simple_strtoul(argv[4], NULL, 0)) & ~(bs - 1);
	}

	/* Ask user if they would like pretty output */
	lab_puts("Would you like formatted output? ");
	if (tolower(pretty_buf[0] = lab_getc_seconds(NULL, 0)) != 'y')
		pretty_print = 0;
	else
		pretty_print = 1;
	lab_putc(pretty_buf[0]);

	/* Print informative message */
	lab_printf("\r\nDumping data starting at 0x%08x and ending at 0x%08x...\r\n",
	           start_addr, end_addr);
	lab_printf("OOB size: %d. OOB block: %d\r\n",
	           mtd->oobsize, mtd->oobblock);

	/* Dump the flash contents */
	for (ofs = start_addr; ofs < end_addr ; ofs+=bs) {
		struct nand_oobinfo oobsel;

		oobsel.useecc = 0;
		/* Read page data and exit on failure */
//		if (MTD_READECC(mtd, ofs, bs, &retlen, readbuf, NULL, &oobsel)) {
		if (MTD_READECC(mtd, ofs, bs, &retlen, readbuf, &oobbuf, NULL)) {
			lab_puts("Error in mtdread\r\n");
//			put_mtd_device(mtd);
//			sys_close(ofd);
//			return;
		}

		/* Write out page data */
		if (pretty_print) {
			for (i = 0; i < bs; i += 16) {
				sprintf(pretty_buf,
					"0x%08x: %02x %02x %02x %02x %02x %02x %02x "
					"%02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
					(unsigned int) (ofs + i),  readbuf[i],
					readbuf[i+1], readbuf[i+2],
					readbuf[i+3], readbuf[i+4],
					readbuf[i+5], readbuf[i+6],
					readbuf[i+7], readbuf[i+8],
					readbuf[i+9], readbuf[i+10],
					readbuf[i+11], readbuf[i+12],
					readbuf[i+13], readbuf[i+14],
					readbuf[i+15]);
				sys_write(ofd, pretty_buf, 60);
			}
		} else
			sys_write(ofd, readbuf, bs);

		/* Read OOB data and exit on failure */
		oob.start = ofs;
		if ((ofs & 0xFFFF) == 0x0)
			lab_printf("Dumping %lx\r", ofs);
#if 0
		if (MTD_READOOB(mtd, ofs, mtd->oobsize, &retlen, oobbuf)) {
			lab_puts("ioctl(MEMREADOOB) failed\r\n");
			put_mtd_device(mtd);
			sys_close(ofd);
			return;
		}
#endif
		/* Write out OOB data */
		if (pretty_print) {
			if (mtd->oobsize == 16) {
				sprintf(pretty_buf, "  OOB Data: %02x %02x %02x %02x %02x %02x "
					"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
					oobbuf[0], oobbuf[1], oobbuf[2],
					oobbuf[3], oobbuf[4], oobbuf[5],
					oobbuf[6], oobbuf[7], oobbuf[8],
					oobbuf[9], oobbuf[10], oobbuf[11],
					oobbuf[12], oobbuf[13], oobbuf[14],
					oobbuf[15]);
				sys_write(ofd, pretty_buf, 60);
			} else {
				sprintf(pretty_buf, "  OOB Data: %02x %02x %02x %02x %02x %02x "
					"%02x %02x\n",
					oobbuf[0], oobbuf[1], oobbuf[2],
					oobbuf[3], oobbuf[4], oobbuf[5],
					oobbuf[6], oobbuf[7]);
				sys_write(ofd, pretty_buf, 48);
			}
		} else
			sys_write(ofd, oobbuf, mtd->oobsize);
	}

	/* Close the output file and MTD device */
	put_mtd_device(mtd);
	sys_close(ofd);
	lab_puts("\n");

	/* Exit happy */
	return;
}