阅读:4176回复:4
主机应用程序如何通过SCSI Command与USB Mass Storage Device进行通信!
小弟遇到一个问题:采用Sigmatel芯片的MP3播放器,插在电脑上以后系统会把它当作一个Standard Device来对待,我现在需要写一个这样的测试程序:通过主机端的应用程序(C/C++,VC编译)和Player端的Firmware共同工作,应用程序向处于USBMSC的Device发送16 Bytes的SCSI Command过去,这些Command是由Firmware端的测试程序定义的,Device的SCSI Library收到这些命令后传给Firmware,它成功处理后如果有结果则将结果再通过SCSI Library传给主机的应用程序,应用程序将结果显示在UI上.
测试的内容主要是Key,Display,Contrast等.如果哪位用过Rio的测试程序就很清楚,小弟目前还没有思路,请有经验的大侠指点,谢谢! |
|
最新喜欢:xingzh... |
沙发#
发布于:2005-01-03 10:56
要用vendor命令
|
|
板凳#
发布于:2005-01-03 11:49
能不能请再详细一点说一说,谢谢!
|
|
地板#
发布于:2005-01-07 12:51
并不难,其实就是u盘读写问题,可以搜我以前回复的贴子.
的确不行可以联系我 msn:zsskyler@msn.com |
|
地下室#
发布于:2005-01-07 14:57
我现在已经可以向USB设备发送SCSI命令了,代码如下:
********************************************************** BOOL status = 0; DWORD accessMode = 0, shareMode = 0; HANDLE fileHandle = NULL; //PUCHAR dataBuffer = NULL; SCSI_PASS_THROUGH_WITH_BUFFERS sptwb; SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb; UCHAR buffer[2048]; UCHAR string[25]; ULONG length = 0, errorCode = 0; DWORD returned = 0; strcpy(string, "\\\\.\\"); strcat(string, "I:"); shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; //default accessMode = GENERIC_WRITE | GENERIC_READ; //default fileHandle = CreateFile(string, accessMode, shareMode, NULL, OPEN_EXISTING, 0, NULL); if (fileHandle == INVALID_HANDLE_VALUE) { MessageBox(NULL, "Create file fail", "tester", MB_OK); return false; } ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS)); sptwb.spt.Length = sizeof(SCSI_PASS_THROUGH); sptwb.spt.PathId = 0; sptwb.spt.TargetId = 1; sptwb.spt.Lun = 0; sptwb.spt.CdbLength = CDB6GENERIC_LENGTH; sptwb.spt.SenseInfoLength = 24; sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN; sptwb.spt.DataTransferLength = 192; sptwb.spt.TimeOutValue = 2; sptwb.spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf); sptwb.spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf); sptwb.spt.Cdb[0] = SCSI_OPCODE_HWTEST_COMMAND;//SCSI_OPCODE_SIGMATEL_WRITE_COMMAND;// sptwb.spt.Cdb[1] = HWTEST_DISPLAY_ID; //ALLOCATE_MEDIA; sptwb.spt.Cdb[4] = 192; length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf) + sptwb.spt.DataTransferLength; status = DeviceIoControl(fileHandle, IOCTL_SCSI_PASS_THROUGH, &sptwb, sizeof(SCSI_PASS_THROUGH), &sptwb, length, &returned, FALSE); if (!status) { MessageBox(NULL, "Device I/0 control fail!", "tester", MB_OK); errorCode = GetLastError(); ShowMessage(IntToStr(errorCode)); PrintError(errorCode); CloseHandle(fileHandle); return false; } CloseHandle(fileHandle); return true; ******************************************************* 发送SCSI命令以后,firmware可以作出相应的动作,表明通信畅通. 现在的问题是: (1) DeviceIoControl返回值为0,不知道是什么原因? (2) firmware端收到我发送过去的SCSI命令作完相应的处理以后,会传回一些数据,我的应用程序到哪里去读出这些数据? 请高手指点,谢谢! |
|