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"); }
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); }
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; }
/* * 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; }