fix netradio mass_storage
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@270 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
aecf1601d8
commit
620cde72e3
|
@ -22,7 +22,6 @@
|
|||
/* Exported constants --------------------------------------------------------*/
|
||||
#define MAL_OK 0
|
||||
#define MAL_FAIL 1
|
||||
#define MAX_LUN 1
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
|
|
|
@ -15,13 +15,13 @@
|
|||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "platform_config.h"
|
||||
#include "sdcard.h"
|
||||
#include "mass_mal.h"
|
||||
#include "rtthread.h"
|
||||
|
||||
uint32_t Mass_Memory_Size[2];
|
||||
uint32_t Mass_Block_Size[2];
|
||||
uint32_t Mass_Block_Count[2];
|
||||
uint32_t Mass_Memory_Size[3];
|
||||
uint32_t Mass_Block_Size[3];
|
||||
uint32_t Mass_Block_Count[3];
|
||||
uint32_t Max_Lun = 0;
|
||||
|
||||
rt_device_t dev_sdio = RT_NULL;
|
||||
|
||||
|
|
|
@ -17,66 +17,65 @@
|
|||
#include "usb_scsi.h"
|
||||
#include "memory.h"
|
||||
uint8_t Page00_Inquiry_Data[] =
|
||||
{
|
||||
{
|
||||
0x00, /* PERIPHERAL QUALIFIER & PERIPHERAL DEVICE TYPE*/
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00 /* Supported Pages 00*/
|
||||
};
|
||||
};
|
||||
uint8_t Standard_Inquiry_Data[] =
|
||||
{
|
||||
{
|
||||
0x00, /* Direct Access Device */
|
||||
0x80, /* RMB = 1: Removable Medium */
|
||||
0x02, /* Version: No conformance claim to standard */
|
||||
0x02,
|
||||
|
||||
36 - 4, /* Additional Length */
|
||||
36 - 4, /* Additional Length */
|
||||
0x00, /* SCCS = 1: Storage Controller Component */
|
||||
0x00,
|
||||
0x00,
|
||||
/* Vendor Identification */
|
||||
'S', 'T', 'M', ' ', 'C', 'M', '-', '3',
|
||||
'S', 'T', 'M', '3', '2', ' ', ' ', ' ',
|
||||
/* Product Identification */
|
||||
'S', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ',
|
||||
'D', 'i', 's', 'k', ' ', ' ', ' ',
|
||||
'n', 'e', 't', 'r', 'a', 'd', 'i', 'o', ' ',
|
||||
'D', 'I', 'S', 'K', '1', ' ', ' ',
|
||||
/* Product Revision Level */
|
||||
'1', '.', '0', ' '
|
||||
};
|
||||
};
|
||||
uint8_t Standard_Inquiry_Data2[] =
|
||||
{
|
||||
0x00, /* Direct Access Device *///磁盘设备
|
||||
//其中最高位D7为RMB。RMB=0,表示不可移除设备。如果RMB=1,则为可移除设备。
|
||||
{
|
||||
0x00, /* Direct Access Device */
|
||||
0x80, /* RMB = 1: Removable Medium */
|
||||
|
||||
0x02, /* Version: No conformance claim to standard */
|
||||
0x02, //数据响应格式
|
||||
0x02, /* 数据响应格式 */
|
||||
|
||||
36 - 4, //附加数据长度,为31字节
|
||||
36 - 4, /* 附加数据长度,为31字节 */
|
||||
0x00, /* SCCS = 1: Storage Controller Component */
|
||||
0x00,
|
||||
0x00,
|
||||
/* Vendor Identification */
|
||||
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ',
|
||||
'S', 'T', 'M', '3', '2', ' ', ' ', ' ',
|
||||
/* Product Identification */
|
||||
'N', 'A', 'N', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ',
|
||||
'D', 'i', 's', 'k', ' ',
|
||||
'n', 'e', 't', 'r', 'a', 'd', 'i', 'o', ' ',
|
||||
'D', 'I', 'S', 'K', '2', ' ', ' ',
|
||||
/* Product Revision Level */
|
||||
'1', '.', '0', ' '
|
||||
};
|
||||
};
|
||||
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
||||
uint8_t Mode_Sense6_data[] =
|
||||
{
|
||||
{
|
||||
0x03,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
};
|
||||
};
|
||||
|
||||
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
|
||||
|
||||
uint8_t Mode_Sense10_data[] =
|
||||
{
|
||||
{
|
||||
0x00,
|
||||
0x06,
|
||||
0x00,
|
||||
|
@ -85,9 +84,9 @@ uint8_t Mode_Sense10_data[] =
|
|||
0x00,
|
||||
0x00,
|
||||
0x00
|
||||
};
|
||||
};
|
||||
uint8_t Scsi_Sense_Data[] =
|
||||
{
|
||||
{
|
||||
0x70, /*RespCode*/
|
||||
0x00, /*SegmentNumber*/
|
||||
NO_SENSE, /* Sens_Key*/
|
||||
|
@ -106,9 +105,9 @@ uint8_t Scsi_Sense_Data[] =
|
|||
0x00, /*TBD*/
|
||||
0x00,
|
||||
0x00 /*SenseKeySpecific*/
|
||||
};
|
||||
};
|
||||
uint8_t ReadCapacity10_Data[] =
|
||||
{
|
||||
{
|
||||
/* Last Logical Block */
|
||||
0,
|
||||
0,
|
||||
|
@ -120,10 +119,10 @@ uint8_t ReadCapacity10_Data[] =
|
|||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
};
|
||||
|
||||
uint8_t ReadFormatCapacity_Data [] =
|
||||
{
|
||||
{
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
|
@ -140,6 +139,6 @@ uint8_t ReadFormatCapacity_Data [] =
|
|||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
};
|
||||
|
||||
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "usb_conf.h"
|
||||
#include "usb_bot.h"
|
||||
#include "memory.h"
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
|
@ -81,26 +82,21 @@ void Mass_Storage_In (void)
|
|||
void Mass_Storage_Out (void)
|
||||
{
|
||||
uint8_t CMD;
|
||||
CMD = CBW.CB[0];//得到上一次的?
|
||||
//得到端点2接收到的数据长度
|
||||
CMD = CBW.CB[0];
|
||||
Data_Len = GetEPRxCount(ENDP2);
|
||||
|
||||
//print(" MS_Out:");//print_dec(Data_Len);
|
||||
|
||||
//读出数据到 Bulk_Data_Buff
|
||||
/* read data to Bulk_Data_Buff */
|
||||
PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len);
|
||||
|
||||
switch (Bot_State)
|
||||
{
|
||||
case BOT_IDLE://空闲状态 进入CBW解码
|
||||
//print("BOT_IDLE");
|
||||
case BOT_IDLE:
|
||||
CBW_Decode();
|
||||
break;
|
||||
case BOT_DATA_OUT://数据输出状态
|
||||
//print("BOT_DATA_OUT");
|
||||
case BOT_DATA_OUT:
|
||||
if (CMD == SCSI_WRITE10)
|
||||
{
|
||||
//print(" CMD == SCSI_WRITE10");
|
||||
SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen);
|
||||
break;
|
||||
}
|
||||
|
@ -128,18 +124,17 @@ void CBW_Decode(void)
|
|||
{
|
||||
uint32_t Counter;
|
||||
|
||||
//从Bulk_Data_Buff复制数据到CBW
|
||||
/* read data from Bulk_Data_Buff to CBW */
|
||||
for (Counter = 0; Counter < Data_Len; Counter++)
|
||||
{
|
||||
*((uint8_t *)&CBW + Counter) = Bulk_Data_Buff[Counter];
|
||||
}
|
||||
//复制TAG用于返回
|
||||
/* copy return TAG */
|
||||
CSW.dTag = CBW.dTag;
|
||||
CSW.dDataResidue = CBW.dDataLength;
|
||||
//如果数据长度不等于CBW的长度
|
||||
|
||||
if (Data_Len != BOT_CBW_PACKET_LENGTH)
|
||||
{
|
||||
//print(" Data_Len != BOT_CBW_PACKET_LENGTH");
|
||||
Bot_Abort(BOTH_DIR);
|
||||
/* reset the CBW.dSignature to desible the clear feature until receiving a Mass storage reset*/
|
||||
CBW.dSignature = 0;
|
||||
|
@ -148,22 +143,18 @@ void CBW_Decode(void)
|
|||
return;
|
||||
}
|
||||
|
||||
//读写数据
|
||||
if ((CBW.CB[0] == SCSI_READ10 ) || (CBW.CB[0] == SCSI_WRITE10 ))
|
||||
{
|
||||
/* Calculate Logical Block Address */
|
||||
//计算逻辑块地址 每个扇区512字节
|
||||
SCSI_LBA = (CBW.CB[2] << 24) | (CBW.CB[3] << 16) | (CBW.CB[4] << 8) | CBW.CB[5];
|
||||
/* Calculate the Number of Blocks to transfer */
|
||||
//计算传送的块大小 以扇区为单位?
|
||||
SCSI_BlkLen = (CBW.CB[7] << 8) | CBW.CB[8];
|
||||
}
|
||||
|
||||
//USBC
|
||||
/* USBC */
|
||||
if (CBW.dSignature == BOT_CBW_SIGNATURE)
|
||||
{
|
||||
/* Valid CBW */
|
||||
//有效但参数错误
|
||||
if ((CBW.bLUN > Max_Lun) || (CBW.bCBLength < 1) || (CBW.bCBLength > 16))
|
||||
{
|
||||
Bot_Abort(BOTH_DIR);
|
||||
|
@ -202,11 +193,9 @@ void CBW_Decode(void)
|
|||
SCSI_TestUnitReady_Cmd(CBW.bLUN);
|
||||
break;
|
||||
case SCSI_READ10:
|
||||
//读数据
|
||||
SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen);
|
||||
break;
|
||||
case SCSI_WRITE10:
|
||||
//写数据
|
||||
SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA , SCSI_BlkLen);
|
||||
break;
|
||||
case SCSI_VERIFY10:
|
||||
|
@ -266,7 +255,6 @@ void CBW_Decode(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
//无效的CBW
|
||||
/* Invalid CBW */
|
||||
Bot_Abort(BOTH_DIR);
|
||||
Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_COMMAND);
|
||||
|
|
|
@ -23,15 +23,7 @@
|
|||
#include "mass_mal.h"
|
||||
#include "usb_prop.h"
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
#ifdef USE_STM3210B_EVAL
|
||||
uint32_t Max_Lun = 0;
|
||||
#else //USE_STM3210E_EVAL
|
||||
uint32_t Max_Lun = 1;
|
||||
#endif
|
||||
extern uint32_t Max_Lun;
|
||||
|
||||
DEVICE Device_Table =
|
||||
{
|
||||
|
@ -258,13 +250,11 @@ RESULT MASS_Data_Setup(uint8_t RequestNo)
|
|||
{
|
||||
uint8_t *(*CopyRoutine)(uint16_t);
|
||||
|
||||
//print("MASS_Data_Setup");
|
||||
CopyRoutine = NULL;
|
||||
if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
|
||||
&& (RequestNo == GET_MAX_LUN) && (pInformation->USBwValue == 0)
|
||||
&& (pInformation->USBwIndex == 0) && (pInformation->USBwLength == 0x01))
|
||||
{
|
||||
//print(" Get_Max_Lun\r\n");
|
||||
CopyRoutine = Get_Max_Lun;
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in New Issue