请选择 进入手机版 | 继续访问电脑版

佳翼科技

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 142|回复: 3

How to send standard NVMe write command to SSD through USB-JMiron adaptor

[复制链接]

1

主题

3

帖子

40

积分

新手上路

Rank: 1

积分
40
发表于 2018-10-4 15:55:33 | 显示全部楼层 |阅读模式
【如题】:通过贵公司的这款USB->NVMe转换器,我应该怎么发送标准的NVMe 读和写的操作给SSD呢?

【产品】:佳翼(JEYI) 红色海豹i9 NVME USB3.1 TYPE C移动硬盘盒JMS583 PCIE ,我从你们的京东链接上买的: https://item.jd.com/29046814090.html

【背景】:我们公司正在基于贵公司的这款USB->NVMe转换器发送标准的读写命令给SSD。如果能够把这个tool做出来,当然会采购更多的转换器用到SSD产线上。但是现在我遇到了这么一个难题,基于你们的这个转换器(JMicron),我怎么才能通过Windows的标准的DeviceIoControl()这个函数,发送读(NVMe OpCode=0x02 write command)命令给SSD呢?

【尝试】:我研究了开源的软件:CrystalDiskInfo, https://crystalmark.info/en/software/crystaldiskinfo/ ,这个软件能够识别到贵公司转接的NVMe SSD。里面用的代码是SCSI_PASS_THROUGH这个结构体,然后通过DeviceIoControl发出去identify 命令的。但是里面的代码却没有对NVMe的写操作。这点我已经和作者交流过,他也没办法知道JMicron的操作办法。
  1. /*---------------------------------------------------------------------------*/
  2. //  NVMe JMicron
  3. /*---------------------------------------------------------------------------*/

  4. BOOL CAtaSmart::DoIdentifyDeviceNVMeJMicron(INT physicalDriveId, INT scsiPort, INT scsiTargetId, IDENTIFY_DEVICE* data)
  5. {
  6.         BOOL        bRet;
  7.         HANDLE        hIoCtrl;
  8.         DWORD        dwReturned;
  9.         DWORD        length;

  10.         SCSI_PASS_THROUGH_WITH_BUFFERS24 sptwb;

  11.         if (data == NULL)
  12.         {
  13.                 return        FALSE;
  14.         }

  15.         ::ZeroMemory(data, sizeof(IDENTIFY_DEVICE));

  16.         hIoCtrl = GetIoCtrlHandle(physicalDriveId);

  17.         if (hIoCtrl == INVALID_HANDLE_VALUE)
  18.         {
  19.                 return        FALSE;
  20.         }

  21.         ::ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS24));

  22.         sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH);
  23.         sptwb.Spt.PathId = 0;
  24.         sptwb.Spt.TargetId = 0;
  25.         sptwb.Spt.Lun = 0;
  26.         sptwb.Spt.SenseInfoLength = 24;
  27.         sptwb.Spt.DataIn = SCSI_IOCTL_DATA_OUT;
  28.         sptwb.Spt.DataTransferLength = IDENTIFY_BUFFER_SIZE;
  29.         sptwb.Spt.TimeOutValue = 2;
  30.         sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf);
  31.         sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, SenseBuf);

  32.         sptwb.Spt.CdbLength = 12;
  33.         sptwb.Spt.Cdb[0] = 0xA1; // NVME PASS THROUGH
  34.         sptwb.Spt.Cdb[1] = 0x80; // ADMIN
  35.         sptwb.Spt.Cdb[2] = 0;
  36.         sptwb.Spt.Cdb[3] = 0;
  37.         sptwb.Spt.Cdb[4] = 2;
  38.         sptwb.Spt.Cdb[5] = 0;
  39.         sptwb.Spt.Cdb[6] = 0;
  40.         sptwb.Spt.Cdb[7] = 0;
  41.         sptwb.Spt.Cdb[8] = 0;
  42.         sptwb.Spt.Cdb[9] = 0;
  43.         sptwb.Spt.Cdb[10]= 0;
  44.         sptwb.Spt.Cdb[11]= 0;
  45.         sptwb.Spt.DataIn = SCSI_IOCTL_DATA_OUT;
  46.         sptwb.DataBuf[0] = 'N';
  47.         sptwb.DataBuf[1] = 'V';
  48.         sptwb.DataBuf[2] = 'M';
  49.         sptwb.DataBuf[3] = 'E';
  50.         sptwb.DataBuf[8] = 0x06; // Identify
  51.         sptwb.DataBuf[0x30] = 0x01;

  52.         length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf) + sptwb.Spt.DataTransferLength;

  53.         bRet = ::DeviceIoControl(hIoCtrl, IOCTL_SCSI_PASS_THROUGH,
  54.                 &sptwb, length,
  55.                 &sptwb, length, &dwReturned, NULL);

  56.         if (bRet == FALSE)
  57.         {
  58.                 ::CloseHandle(hIoCtrl);
  59.                 return        FALSE;
  60.         }

  61. //        ::ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS24));
  62.         sptwb.Spt.Length = sizeof(SCSI_PASS_THROUGH);
  63.         sptwb.Spt.PathId = 0;
  64.         sptwb.Spt.TargetId = 0;
  65.         sptwb.Spt.Lun = 0;
  66.         sptwb.Spt.SenseInfoLength = 24;
  67.         sptwb.Spt.DataTransferLength = 512;
  68.         sptwb.Spt.TimeOutValue = 2;
  69.         sptwb.Spt.DataBufferOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf);
  70.         sptwb.Spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, SenseBuf);
  71.        
  72.         sptwb.Spt.CdbLength = 12;
  73.         sptwb.Spt.Cdb[0] = 0xA1; // NVME PASS THROUGH
  74.         sptwb.Spt.Cdb[1] = 0x82; // ADMIN + DMA-IN
  75.         sptwb.Spt.Cdb[2] = 0;
  76.         sptwb.Spt.Cdb[3] = 0;
  77.         sptwb.Spt.Cdb[4] = 2;
  78.         sptwb.Spt.Cdb[5] = 0;
  79.         sptwb.Spt.Cdb[6] = 0;
  80.         sptwb.Spt.Cdb[7] = 0;
  81.         sptwb.Spt.Cdb[8] = 0;
  82.         sptwb.Spt.Cdb[9] = 0;
  83.         sptwb.Spt.Cdb[10]= 0;
  84.         sptwb.Spt.Cdb[11]= 0;
  85.         sptwb.Spt.DataIn = SCSI_IOCTL_DATA_IN;

  86.         length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS24, DataBuf) + sptwb.Spt.DataTransferLength;


  87.         bRet = ::DeviceIoControl(hIoCtrl, IOCTL_SCSI_PASS_THROUGH,
  88.                 &sptwb, length,
  89.                 &sptwb, length, &dwReturned, NULL);

  90.         if (bRet == FALSE)
  91.         {
  92.                 ::CloseHandle(hIoCtrl);
  93.                 return        FALSE;
  94.         }

  95.         DWORD count = 0;
  96.         for (int i = 0; i < 512; i++)
  97.         {
  98.                 count += sptwb.DataBuf[i];
  99.         }
  100.         if (count == 0 || count == 317)
  101.         {
  102.                 ::CloseHandle(hIoCtrl);
  103.                 return        FALSE;
  104.         }

  105.         memcpy_s(data, sizeof(IDENTIFY_DEVICE), sptwb.DataBuf, sizeof(IDENTIFY_DEVICE));

  106.         ::CloseHandle(hIoCtrl);

  107.         return TRUE;
  108. }
复制代码


希望能够得到你们工程师的支持,把写的操作能够实现。
回复

使用道具 举报

67

主题

82

帖子

411

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
411
发表于 2018-10-4 20:26:33 | 显示全部楼层
您好,正值中国国庆节假期,7号上班时再让工程师分析处理,有进展会及时联系您。
回复

使用道具 举报

1

主题

3

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2018-10-5 08:48:51 | 显示全部楼层
Admin 发表于 2018-10-4 20:26
您好,正值中国国庆节假期,7号上班时再让工程师分析处理,有进展会及时联系您。

嗯,好的。谢谢管理员帮忙确认。昨天我同时也发了一封email 给你们的官方邮件。 jeyi@jeyi.com
回复

使用道具 举报

1

主题

3

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2018-10-11 14:38:13 | 显示全部楼层
有更新么,是否需要我配合做点什么呀?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|留言板|加入佳翼|佳翼科技 ( 粤ICP备17119303号 )

GMT+8, 2018-10-23 00:37

Powered by JEYI

© 2001-2018 JEYI Group

快速回复 返回顶部 返回列表