这是我的scsi阅读:
#define READ_REPLY_LEN 32
#define READ_CMDLEN 10
void scsi_read()
{
unsigned char Readbuffer[ SCSI_OFF + READ_REPLY_LEN ];
unsigned char cmdblk [ READ_CMDLEN ] =
{ 0x28,/* command */
0,/* lun/reserved */
0,/* lba */
0,/* reserved */
0,/* transfer length */
READ_REPLY_LEN,/* transfer length */
0 };/* reserved/flag/link */
memset(Readbuffer,sizeof(Readbuffer));
memcpy( cmd + SCSI_OFF,cmdblk,sizeof(cmdblk) );
/*
* +------------------+
* | struct sg_header | Failed\n" );
exit(2);
}
hex_dump(Readbuffer,sizeof(Readbuffer));
}
这是我的scsi写道:
void scsi_write ( void )
{
unsigned char Writebuffer[SCSI_OFF];
unsigned char cmdblk [] =
{ 0x2A,/* 0: command */
0,/* 1: lun/reserved */
0,/* 2: LBA */
0,/* 3: LBA */
0,/* 4: LBA */
0,/* 5: LBA */
0,/* 6: reserved */
0,/* 7: transfer length */
0,/* 8: transfer length */
0 };/* 9: control */
memset(Writebuffer,sizeof(Writebuffer));
memcpy( cmd + SCSI_OFF,sizeof(cmdblk) );
cmd[SCSI_OFF+sizeof(cmdblk)+0] = 'A';
cmd[SCSI_OFF+sizeof(cmdblk)+1] = 'b';
cmd[SCSI_OFF+sizeof(cmdblk)+2] = 'c';
cmd[SCSI_OFF+sizeof(cmdblk)+3] = 'd';
cmd[SCSI_OFF+sizeof(cmdblk)+4] = 'e';
cmd[SCSI_OFF+sizeof(cmdblk)+5] = 'f';
cmd[SCSI_OFF+sizeof(cmdblk)+6] = 'g';
cmd[SCSI_OFF+sizeof(cmdblk)+7] = 0;
/*
* +------------------+
* | struct sg_header | Failed\n" );
exit(2);
}
}
在下面的例子中我做了
> scsi阅读
> scsi写道
> scsi阅读
然后我打印写入的数据的十六进制(scsi写入)和读取的内容(scsi读取)
Read(10)
[0000] 00 00 00 44 00 00 00 44 00 00 00 00 00 00 00 00 ...D...D ........
[0010] 00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
[0020] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
[0030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
[0040] 00 00 00 00 ....
Write(10):
[0000] 00 00 00 00 00 00 00 24 00 00 00 00 00 00 00 00 ........ ........
[0010] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
[0020] 00 00 00 00 2A 00 00 00 00 00 00 00 00 00 41 62 ........ ......Ab
[0030] 63 64 65 66 67 00 cdefg.
Read(10):
[0000] 00 00 00 44 00 00 00 44 00 00 00 00 00 00 00 00 ...D...D ........
[0010] 04 00 20 00 70 00 02 00 00 00 00 0A 00 00 00 00 ....p... ........
[0020] 04 00 00 00 41 62 63 64 65 66 67 00 00 00 00 00 ....Abcd efg.....
[0030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
[0040] 00 00 00 00 ....
再次运行三个命令,我应该在第一次读取时阅读Abcdefg.对?但是再次运行它们不会改变任你现在可以假设,我使用的内存仍然是以前功能的数据,但即使我在sys_read()发生之前运行memset(Readbuff,sizeof(Readbuff)),我也会得到相同的结果.
我假设,我尝试写的LBA可能被禁止写,我读了缓存.但是,从0x00-0xFF对LBA地址进行交互不会改变任何东西 – 这意味着,我读取了相同的数据(Abcdefg).
您是否知道使用scsi通用接口进行scsi读取或写入的示例实现?