📄 cmd_scsi.c
字号:
printf ("** 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;}/********************************************************************************* * scsi command intepreter */int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ switch (argc) { case 0: case 1: printf ("Usage:\n%s\n", cmdtp->usage); return 1; case 2: if (strncmp(argv[1],"res",3) == 0) { printf("\nReset SCSI\n"); scsi_bus_reset(); scsi_scan(1); return 0; } if (strncmp(argv[1],"inf",3) == 0) { int i; for (i=0; i<CFG_SCSI_MAX_DEVICE; ++i) { if(scsi_dev_desc[i].type==DEV_TYPE_UNKNOWN) continue; /* list only known devices */ printf ("SCSI dev. %d: ", i); dev_print(&scsi_dev_desc[i]); } return 0; } if (strncmp(argv[1],"dev",3) == 0) { if ((scsi_curr_dev < 0) || (scsi_curr_dev >= CFG_SCSI_MAX_DEVICE)) { printf("\nno SCSI devices available\n"); return 1; } printf ("\n Device %d: ", scsi_curr_dev); dev_print(&scsi_dev_desc[scsi_curr_dev]); return 0; } if (strncmp(argv[1],"scan",4) == 0) { scsi_scan(1); return 0; } if (strncmp(argv[1],"part",4) == 0) { int dev, ok; for (ok=0, dev=0; dev<CFG_SCSI_MAX_DEVICE; ++dev) { if (scsi_dev_desc[dev].type!=DEV_TYPE_UNKNOWN) { ok++; if (dev) printf("\n"); PRINTF("print_part of %x\n",dev); print_part(&scsi_dev_desc[dev]); } } if (!ok) printf("\nno SCSI devices available\n"); return 1; } printf ("Usage:\n%s\n", cmdtp->usage); return 1; case 3: if (strncmp(argv[1],"dev",3) == 0) { int dev = (int)simple_strtoul(argv[2], NULL, 10); printf ("\nSCSI device %d: ", dev); if (dev >= CFG_SCSI_MAX_DEVICE) { printf("unknown device\n"); return 1; } printf ("\n Device %d: ", dev); dev_print(&scsi_dev_desc[dev]); if(scsi_dev_desc[dev].type == DEV_TYPE_UNKNOWN) { return 1; } scsi_curr_dev = dev; printf("... is now current device\n"); return 0; } if (strncmp(argv[1],"part",4) == 0) { int dev = (int)simple_strtoul(argv[2], NULL, 10); if(scsi_dev_desc[dev].type != DEV_TYPE_UNKNOWN) { print_part(&scsi_dev_desc[dev]); } else { printf ("\nSCSI device %d not available\n", dev); } return 1; } printf ("Usage:\n%s\n", cmdtp->usage); return 1; default: /* at least 4 args */ if (strcmp(argv[1],"read") == 0) { ulong addr = simple_strtoul(argv[2], NULL, 16); ulong blk = simple_strtoul(argv[3], NULL, 16); ulong cnt = simple_strtoul(argv[4], NULL, 16); ulong n; printf ("\nSCSI read: device %d block # %ld, count %ld ... ", scsi_curr_dev, blk, cnt); n = scsi_read(scsi_curr_dev, blk, cnt, (ulong *)addr); printf ("%ld blocks read: %s\n",n,(n==cnt) ? "OK" : "ERROR"); return 0; } } /* switch */ printf ("Usage:\n%s\n", cmdtp->usage); return 1;}/**************************************************************************************** * scsi_read */#define SCSI_MAX_READ_BLK 0xFFFF /* almost the maximum amount of the scsi_ext command.. */ulong scsi_read(int device, ulong blknr, ulong blkcnt, ulong *buffer){ ulong start,blks, buf_addr; unsigned short smallblks; ccb* pccb=(ccb *)&tempccb; device&=0xff; /* Setup device */ pccb->target=scsi_dev_desc[device].target; pccb->lun=scsi_dev_desc[device].lun; buf_addr=(unsigned long)buffer; start=blknr; blks=blkcnt; PRINTF("\nscsi_read: dev %d startblk %lx, blccnt %lx buffer %lx\n",device,start,blks,(unsigned long)buffer); do { pccb->pdata=(unsigned char *)buf_addr; if(blks>SCSI_MAX_READ_BLK) { pccb->datalen=scsi_dev_desc[device].blksz * SCSI_MAX_READ_BLK; smallblks=SCSI_MAX_READ_BLK; scsi_setup_read_ext(pccb,start,smallblks); start+=SCSI_MAX_READ_BLK; blks-=SCSI_MAX_READ_BLK; } else { pccb->datalen=scsi_dev_desc[device].blksz * blks; smallblks=(unsigned short) blks; scsi_setup_read_ext(pccb,start,smallblks); start+=blks; blks=0; } PRINTF("scsi_read_ext: startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr); if(scsi_exec(pccb)!=TRUE) { scsi_print_error(pccb); blkcnt-=blks; break; } buf_addr+=pccb->datalen; } while(blks!=0); PRINTF("scsi_read_ext: end startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr); return(blkcnt);}/* copy src to dest, skipping leading and trailing blanks * and null terminate the string */void scsi_ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len){ int start,end; start=0; while(start<len) { if(src[start]!=' ') break; start++; } end=len-1; while(end>start) { if(src[end]!=' ') break; end--; } for( ; start<=end; start++) { *dest++=src[start]; } *dest='\0';}/* Trim trailing blanks, and NUL-terminate string */void scsi_trim_trail (unsigned char *str, unsigned int len){ unsigned char *p = str + len - 1; while (len-- > 0) { *p-- = '\0'; if (*p != ' ') { return; } }}/************************************************************************************ * Some setup (fill-in) routines */void scsi_setup_test_unit_ready(ccb * pccb){ pccb->cmd[0]=SCSI_TST_U_RDY; pccb->cmd[1]=pccb->lun<<5; pccb->cmd[2]=0; pccb->cmd[3]=0; pccb->cmd[4]=0; pccb->cmd[5]=0; pccb->cmdlen=6; pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */}void scsi_setup_read_capacity(ccb * pccb){ pccb->cmd[0]=SCSI_RD_CAPAC; pccb->cmd[1]=pccb->lun<<5; pccb->cmd[2]=0; pccb->cmd[3]=0; pccb->cmd[4]=0; pccb->cmd[5]=0; pccb->cmd[6]=0; pccb->cmd[7]=0; pccb->cmd[8]=0; pccb->cmd[9]=0; pccb->cmdlen=10; pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */}void scsi_setup_read_ext(ccb * pccb, unsigned long start, unsigned short blocks){ pccb->cmd[0]=SCSI_READ10; pccb->cmd[1]=pccb->lun<<5; pccb->cmd[2]=((unsigned char) (start>>24))&0xff; pccb->cmd[3]=((unsigned char) (start>>16))&0xff; pccb->cmd[4]=((unsigned char) (start>>8))&0xff; pccb->cmd[5]=((unsigned char) (start))&0xff; pccb->cmd[6]=0; pccb->cmd[7]=((unsigned char) (blocks>>8))&0xff; pccb->cmd[8]=(unsigned char) blocks & 0xff; pccb->cmd[6]=0; pccb->cmdlen=10; pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */ PRINTF("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n", pccb->cmd[0],pccb->cmd[1], pccb->cmd[2],pccb->cmd[3],pccb->cmd[4],pccb->cmd[5], pccb->cmd[7],pccb->cmd[8]);}void scsi_setup_read6(ccb * pccb, unsigned long start, unsigned short blocks){ pccb->cmd[0]=SCSI_READ6; pccb->cmd[1]=pccb->lun<<5 | (((unsigned char)(start>>16))&0x1f); pccb->cmd[2]=((unsigned char) (start>>8))&0xff; pccb->cmd[3]=((unsigned char) (start))&0xff; pccb->cmd[4]=(unsigned char) blocks & 0xff; pccb->cmd[5]=0; pccb->cmdlen=6; pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */ PRINTF("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n", pccb->cmd[0],pccb->cmd[1], pccb->cmd[2],pccb->cmd[3],pccb->cmd[4]);}void scsi_setup_inquiry(ccb * pccb){ pccb->cmd[0]=SCSI_INQUIRY; pccb->cmd[1]=pccb->lun<<5; pccb->cmd[2]=0; pccb->cmd[3]=0; if(pccb->datalen>255) pccb->cmd[4]=255; else pccb->cmd[4]=(unsigned char)pccb->datalen; pccb->cmd[5]=0; pccb->cmdlen=6; pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */}#endif /* #if (CONFIG_COMMANDS & CFG_CMD_SCSI) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -