⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_usb_scsi.c

📁 sparc硬件平台上的usb驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
                  + cdbRead10.LogicalBlockAddress[i];
    }
    for(i=0; i<2; i++)
    {
        Bulk_Control_r.Transfer_Length = Bulk_Control_r.Transfer_Length * 0x100
                                            + cdbRead10.TransferLength[i];
    }
    Bulk_Control_r.BufCount = 0;

    /* 将U盘上的数据写入DataBuf缓冲区(一次读取一页)*/
    drv_sd_read(Bulk_Control_r.LogicalBlockAddress, (D_INT32 *)DataBuf, 1);

    /*每次读U盘后,更新Transfer_Length、LogicalBlockAddress*/
    Bulk_Control_r.Transfer_Length--;
    Bulk_Control_r.LogicalBlockAddress++;

    /*每次读U盘数据长度为512,写入USB端点64,所以需要多次写端点
      Bulk_Control_r.BufCount用来标示下次写的数据在DataBuf中的起始位置*/
    Bulk_Control_r.BufCount = 0; 

    bEPPflags.bits.bulk_state = BULK_DATA_TRANS;

    /*设置CSW状态CSW_GOOD,CSW包在所有主机要求的数据传送完毕后才发送*/
    Bulk_ErrorHandler(CSW_GOOD, CBW_bCBWCBLength);

    /* 将缓冲区DataBuf中数据写入EP1(输入端点)*/
    USB_WriteEndpoint(USB_ENDPOINT_TYPE_ISOCHRONOUS, EP1_PACKET_SIZE, DataBuf);
    return TRUE;
#undef  cdbRead10 
}

/*************************************************
  函数名称:           D_BOOL  RBC_ReadCapacity(void)
  函数功能:           主机获取设备介质容量
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
                      Bulk_CSWHandler (): 发送执行状态CSW
                      Bulk_code_transmit (): 批量发送函数
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   ReadCapacityData:设备容量数据
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*********************************************************/
D_BOOL  RBC_ReadCapacity(void)
{
    /*如果nomedia, status置CSW_FAIL, 并且返回CSW信息*/
    if (NoMedia)
    {
        RBC_BuildSenseData(NOT_READY, SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
        Bulk_ErrorHandler(CSW_FAIL, 0); 
        Bulk_CSWHandler();
    }
    /*如果nomedia 为0, 返回设备容量信息ReadCapacityData*/
    else
    {
        Bulk_code_transmit((D_UINT8*)&ReadCapacityData,
                sizeof(READ_CAPACITY_DATA));
    }
    return TRUE;  
}

/*************************************************
  函数名称:           D_BOOL  RBC_ StartStop (void)
  函数功能:           主机启动/停止设备
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
                      Bulk_CSWHandler (): 发送执行状态CSW
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   Bulk_Block:主机发给设备的CBW数据
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  RBC_StartStop(void)
{
    /*如果loej && !start, 设置nomedia变量为1. 并且返回CSW信息*/
    if (Bulk_Block.cbw.CBWCB.RbcCdb_OnOffUnit.Loej 
            && !Bulk_Block.cbw.CBWCB.RbcCdb_OnOffUnit.Start)
    {
        NoMedia = 1;
        RBC_BuildSenseData(NOT_READY, SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
    }
    else
    {
        NoMedia = 0;
    }
    Bulk_ErrorHandler(CSW_GOOD, 0); 
    Bulk_CSWHandler();
    return TRUE;
}

/*************************************************
  函数名称:           D_BOOL  SPC_FormatCapacity (void)
  函数功能:           主机获取设备格式化后的容量
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 差错控制
                      Bulk_CSWHandler (): 发送执行状态CSW
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   无
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  SPC_FormatCapacity(void)
{
    /**************************************************
          目前硬件不支持此命令,
          暂时作illegal request处理
          待硬件支持后在更新代码
    **************************************************/
    
    /*设置处理结果状态数据RequestSenseData*/
    RBC_BuildSenseData(ILLEGAL_REQUEST, SCSI_ADSENSE_ILLEGAL_COMMAND, 0);
    /*构造应答CSW,处理状态CSW_FAIL*/
    Bulk_ErrorHandler(CSW_FAIL, 0); 

    Bulk_CSWHandler();
    return TRUE;
}

/*************************************************
  函数名称:           D_BOOL  SPC_RequestSense(void)
  函数功能:           主机获取设备执行错误信息
  被本函数调用的函数: 
                      Bulk_code_transmit ():批量发送函数
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   RequestSenseData:命令执行结果及状态数据
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  SPC_RequestSense(void)
{
    CSWStatus = CSW_GOOD;                /*必须在发送之前设置*/
    /*返回命令处理错误信息RequestSenseData*/
    Bulk_code_transmit((D_UINT8*)&RequestSenseData,
            sizeof(REQUEST_SENSE_DATA));
    /*将错误信息RequestSenseData置0*/
    RBC_BuildSenseData(NO_SENSE, SCSI_ADSENSE_NO_SENSE, 0);
    return TRUE;
}

/*************************************************
  函数名称:           D_BOOL  SPC_ TestUnit (void)
  函数功能:           主机查询设备是否处于ready状态
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
                      Bulk_CSWHandler (): 发送执行状态CSW
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   SenseData:设备状态数据
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  SPC_TestUnit(void)
{
    /*如果nomedia为1, status置CSW_FAIL, 并且返回CSW信息*/
    if (NoMedia)
    {
        RBC_BuildSenseData(NOT_READY, SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
        Bulk_ErrorHandler(CSW_FAIL, 0); 
    }
    /*如果nomedia为0, status置CSW_GOOD, 并且返回CSW信息*/
    else
    {
        Bulk_ErrorHandler(CSW_GOOD, 0); 
    }
    Bulk_CSWHandler();
    return TRUE;
}

/*************************************************
  函数名称:           D_BOOL  SPC_ Verify10 (void)
  函数功能:           主机验证设备中存储的数据是否正确
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
                      Bulk_CSWHandler (): 发送执行状态CSW
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   无
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  RBC_Verify10(void)
{
    /*没有数据返回, 直接返回CSW信息, status是CSW_GOOD*/
    Bulk_ErrorHandler(CSW_GOOD, 0); 
    Bulk_CSWHandler();
    return TRUE;
}

/*************************************************
  函数名称:           D_BOOL  SPC_ Write10 (void)
  函数功能:           写数据
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   ModeData:设备参数模式
  被修改的全局变量:   
                      Bulk_Control_w: bulk-only传输写数据控制数据
                      bEPPflags: usb状态
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  RBC_Write10(void)
{  
#define cdbWrite10 Bulk_Block.cbw.CBWCB.RbcCdb_Write10

    /*获取要读取的数据的地址、长度、起始块和页*/
    D_INT32 i;
    Bulk_Control_w.LogicalBlockAddress = 0;
    Bulk_Control_w.Transfer_Length = 0;
    for (i=0; i<4; i++)
    {
        Bulk_Control_w.LogicalBlockAddress =  
                    Bulk_Control_w.LogicalBlockAddress * 0x100
                 + cdbWrite10.LogicalBlockAddress[i];
    }
    for (i=0; i<2; i++)
    {
        Bulk_Control_w.Transfer_Length = Bulk_Control_w.Transfer_Length * 0x100
                            + cdbWrite10.TransferLength[i];
    }
    Bulk_Control_w.BufCount = 0;

    /*设置usb为接收数据状态,接收到的数据在ep2_rxdone()中写入u盘中*/
    bEPPflags.bits.bulk_state = BULK_DATA_RECIEVE;
    Bulk_ErrorHandler(CSW_GOOD, CBW_bCBWCBLength);

    return TRUE;
#undef  cdbWrite10
}

/*************************************************
  函数名称:           D_BOOL  SPC_ LockMedia (void)
  函数功能:           主机对设备设置写保护命令
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
                      Bulk_CSWHandler (): 发送执行状态CSW
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   Bulk_Block:主机发给设备的CBW数据
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  SPC_LockMedia(void)
{
    /*prevent为1, 返回CSW信息, 并且置status为CSW_FAIL*/
    if (Bulk_Block.cbw.CBWCB.SpcCdb_Removeal.Prevent)
    {
        RBC_BuildSenseData(ILLEGAL_REQUEST, SCSI_ADSENSE_INVALID_CDB, 0);
        Bulk_ErrorHandler(CSW_FAIL, 0); 
    }
    /*prevent为0, 返回CSW信息, 并且置status为CSW_GOOD*/
    else
    {
        Bulk_ErrorHandler(CSW_GOOD, 0); 
    }
    Bulk_CSWHandler();
    return TRUE;
}

/*************************************************
  函数名称:           D_BOOL  SPC_ Reserve6 (void)
  函数功能:           错误的主机命令处理
  被本函数调用的函数: 
                      Bulk_ErrorHandler (): 错误状态控制
                      Bulk_CSWHandler (): 发送执行状态CSW
                      RBC_BuildSenseData():构造SenseData
  调用本函数的函数:   RBC_Handler():处理批量传输命令
  访问到的全局变量:   IllegalRequestSenseData:非法的请求数据
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
D_BOOL  SPC_Reserve6(void)
{
    RBC_BuildSenseData(ILLEGAL_REQUEST, SCSI_ADSENSE_ILLEGAL_COMMAND, 0);
    Bulk_ErrorHandler(CSW_FAIL, 0); 
    Bulk_CSWHandler();
    return TRUE;
}

/*************************************************
  函数名称:           void  RBC_BuildSenseData(D_UINT8 SenseKey,
                                         D_UINT8 ASC, D_UINT8 ASCQ)
  函数功能:           构造SenseData
  被本函数调用的函数: 无
  调用本函数的函数:   
                      SPC_ModeSense6():主机获取设备参数
                      RBC_ReadCapacity():主机获取设备介质容量
                      SPC_RequestSense():主机获取设备执行错误信息
                      SPC_TestUnit():主机查询设备是否处于ready状态
                      SPC_LockMedia():主机对设备设置写保护命令
                      SPC_Reserve6():错误的主机命令处理
  访问到的全局变量:   RequestSenseData:命令执行结果及状态数据
  被修改的全局变量:   RequestSenseData:命令执行结果及状态数据
  输入参数:           SenseKey:  错误码
                      ASC: Additional Sense codes
                      ASCQ: 0 (目前没有使用)
  输出参数:           无
  函数返回值:         无
  其它:               无
*******************************************************/
void  RBC_BuildSenseData(D_UINT8 SenseKey,
        D_UINT8 ASC, D_UINT8 ASCQ)
{
    RequestSenseData.SenseKey = SenseKey;
    RequestSenseData.ASC = ASC; 
    RequestSenseData.ASCQ = ASCQ; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -