Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2675641
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: 信息化

2014-12-16 18:23:51


圈圈你好,我已经看过你的书,仔细的阅读了光盘中的程序。你的书确实很适合像我这样的菜鸟!
    我手头上有一块YCL-USB2AD的开发板,MCU是CYPRESS的集成了USB2.0的EZ-USB FX2LP系列芯片。在看完圈圈的程序后我又看了开发板中附带的U盘的固件程序,并与圈圈的UsbDisk以其UsbToIde做了仔细比对,其中积压了很多问题。希望向圈圈请教啊。

    开发板附带的U盘固件程序是基于CYPRESS提供的固件framework写的,老实说这个程序本身还有很多地方我没看懂,这很大一部分因素是由于芯片硬件上的复杂(EZ-USB FX2LP远比51+D12来的让人头疼)当然板子上自带NAND FLASH,所以固件中实现了NAND FLASH读写操作(虽然我发现代码中漏洞百出,不过这个程序还是能够和圈圈的一样正常工作的,能够枚举成功,识别成U盘,虽然读写文件时有些问题),但这些都不是想向圈圈请教的,我想问的主要是和协议相关的部分。

    说了这么多废话,进入正题。
    我用圈圈的程序调试(UsbDisk),发现主机会发如下命令(枚举成功后):
INQUIRY, READ_FORMAT_CAPACITIES, READ_CAPACITY, READ_10,WRITE_10,  REQUEST_SENSE, TEST_UNIT_READY, Mode_Sense6,Prevent/Allow Medium Removal(1Eh).
   圈圈在程序中忽略了对Mode_Sense6(1Ah)和Prevent/Allow Medium Removal(1Eh)这两个命令的处理。如图所示:
   
   其中Mode_Sense6(1Ah)正是圈圈在书中8.8节提到的在UFI中没有,但是在SCSI中有的那个命令,UFI中确实也有个Mode_Sense命令,但OP Code是5Ah,对应SCSI中的Mode_Sense10命令。
    我的推断如下:圈圈并没有实现Mode_Sense6,所以主机发送这个命令时设备返回CSW指示命令执行失败,当主机收到CSW,发现命令失败时,便发送REQUEST_SENSE询问设备为啥子执行命令失败,设备就告诉主机:INVALID COMMAND OPERATION CODE,就是说Mode_Sense6是个非法命令,呵呵,我通过圈圈的程序大胆推测圈圈的想法,到底是不是这样呢?(这是第一个问题)

    但是那个固件程序在这个地方就和圈圈的实现有差异,这部分代码如下(我简化了一下):
 switch(bulk_CBW.CBWCB[0])
      {
          case Inquiry  ... break
          case Mode_Sense6             
          case Mode_Sense  ... break
          case Read10     ... break;
          case Read_Capacity  ... break;
          case Read_Format_Capacities ... break;
          case Test_Unit_Ready ... break;
          case Verify  ... break;
          case Write10 ... break;
          case Medium_Removal ... break;
      }
    它实现了Mode_Sense6,但从具体的响应代码看它其实实现的是UFI的 Mode_Sense(5Ah),也就是说主机发Mode_Sense6(1A),设备响应,但实际响应的是
Mode_Sense(5Ah)这个UFI命令,这个Mode_Sense(5Ah)在SCSI中也有定义,为Mode_Sense10(5Ah)。至于CSW,这个程序中对于所有命令一律返回成功。另一方面,这个固件并没有像圈圈一样实现REQUEST_SENSE,难道是CSW一律返回成功所以固件就认为主机不会发REQUEST_SENSE这个命令了?(真是搅和人啊!)
并且,这里也增加了对 Mode_Sense6,Prevent/Allow Medium Removal(1Eh)的响应,虽然所谓的响应也仅仅是返回成功执行的CSW。
 问题2:
    我发现虽然咱们得按照协议办事,但其实在具体实现上都对协议的内容做了不同程度的简化,我想问的就是哪些是必须的,哪些是属于可选的,锦上添花的?
比如说如果打算就在圈圈你的UsbDisk程序的基础上加一个NAND FLASH实现一个真正意义上的U盘,在固件程序中增加对NAND FLASH的读写操作,这肯定是必须的。但对于以下这些工作:
增加对Mode_Sense6和Prevent/Allow Medium Removal(1Eh)的响应;
按照UFI协议,设备每执行完一个命令,就应该设置SENSE KEY,供主机通过REQUEST_SENSE查询,而不仅仅只是把SENSE KEY固定成INVALID COMMAND OPERATION CODE......
    诸如此类的事当然按照协议实现最好(锦上添花),但不做好像也能让设备转起来,当然我还没有自己去实现,但看圈圈的UsbToIde也并没有考虑这些,不过不也实现了一个USB硬盘?所以说这些工作算是可选的,不需要搞得那么复杂?像这种问题到底该怎么去考虑,去取舍呢?
    已经写的太多了,但是要说清楚问题确实不容易,呵呵,上传了前面提到的开发板附带的U盘固件程序,其中我自己加了些注释,标注了一些和圈圈的UsbDisk细节上的差异以及一些感觉是BUG的地方。圈圈要是有时间能帮我过目一下当然最好,不过不看也没关系,解决问题就好啊!先谢谢了!
阅读(3474) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~