LPC1788做U盘的时候对命令的响应
扫描二维码
随时随地手机看文章
首先是对于端点的数据处理
#ifndef __USBEP2_H_
#define __USBEP2_H_
#include "usb.h"
#include "usbhw.h"
#include "msc.h"
#include "mscuser.h"
void usb_ep2_in_process(void);
void usb_ep2_out_process(void);
#endif
#include "usbep2.h"
//批量输入事件
void usb_ep2_in_process(void)
{
switch(BulkStage)
{
caseMSC_BS_DATA_IN:
switch(CBW.CB[0])
{
caseSCSI_READ10:
MSC_MemoryRead();//读取数据并等待下一次传输
break;
}
break;
caseMSC_BS_DATA_IN_LAST:
MSC_SetCSW();//上一次传输并且传输已经完成
break;
caseMSC_BS_DATA_IN_LAST_STALL:
USB_SetStallEP(MSC_EP_IN);
MSC_SetCSW();
break;
caseMSC_BS_CSW:
BulkStage=MSC_BS_CBW;//简单的进行状态切换
break;
}
}
//批量输出事件
void usb_ep2_out_process(void)
{
BulkLen=USB_ReadEP(MSC_EP_OUT,BulkBuf);//读取缓存
switch(BulkStage)//根据阶段判定
{
caseMSC_BS_CBW://最开始的阶段必然是命令阶段
MSC_GetCBW();//获取并处理cbw命令
break;
caseMSC_BS_DATA_OUT://数据输出阶段
switch(CBW.CB[0])//分辨写入指令
{
caseSCSI_WRITE10:
MSC_MemoryWrite();
break;
caseSCSI_VERIFY10:
MSC_MemoryVerify();
break;
}
break;
default://不支持的状态
USB_SetStallEP(MSC_EP_OUT);
CSW.bStatus=CSW_PHASE_ERROR;
MSC_SetCSW();
break;
}
}
然后再在子程序中对命令详细分析
#ifndef __MSCUSER_H_
#define __MSCUSER_H_
#include "msc.h"
#include "usbhw.h"
#include "memory.h"
//批量传输节点的最大包长度
#define MSC_MAX_PACKET 64
//批量传输节点地址
#define MSC_EP_IN 0x82
#define MSC_EP_OUT 0x02
extern uint8_t BulkStage; //传输状态,指明下一次如何传输
extern uint8_t BulkLen; //输出接点,主机输出的数据长度
extern uint8_t BulkBuf[MSC_MAX_PACKET];//数据缓存中心
extern MSC_CBW CBW; //cbw块
extern MSC_CSW CSW; //csw块
extern uint32_t MemOK; /* 测试mem是否完好 */
#define MSC_DEBUG 0
#if MSC_DEBUG
#define msc_debug_printf(format,args...) printf(format,##args) //变参宏定义
#else
#define msc_debug_printf(x,...) while(0);
#endif
//枚举过程中的重要节点
extern uint32_t MSC_Reset(void);
extern uint32_t MSC_GetMaxLUN(void);
//msc设备的方法
extern void MSC_GetCBW(void);
extern void MSC_SetCSW(void);
void MSC_MemoryRead(void);
void MSC_MemoryWrite(void);
void MSC_MemoryVerify(void);
#endif
#include "mscuser.h"
uint32_t MemOK=__TRUE; /* 测试mem是否完好 */
uint32_t Offset; /* 读取写入的定位 */
uint32_t Length; /* 读取写入的长度 */
uint8_t BulkStage; /* 批量传输的阶段, 数据阶段 命令阶段 状态阶段 */
uint8_t BulkBuf[MSC_MAX_PACKET];/* 读取批量端点传输来的数据 */
uint8_t BulkLen; /* 传输长度 */
MSC_CBW CBW; /*CBW结构体 */
MSC_CSW CSW; /*CSW结构体 */
#if NORFLASH
u8 usb_mac_global_buffer[MSC_MAX_PACKET];
#endif
#if NANDFLASH
u8 usb_mac_global_buffer[MSC_MAX_PACKET];
#endif
//msc设备复位
uint32_t MSC_Reset(void)
{
BulkStage=MSC_BS_CBW;
return(__TRUE);
}
//获取标号
uint32_t MSC_GetMaxLUN(void)
{
EP0Buf[0]=0; //0为一个设备
return(__TRUE);
}
//设备读取数据,在in阶段发送出去
void MSC_MemoryRead(void)
{
uint32_t n;
if(Length>MSC_MAX_PACKET)//根据长度来计算,不能大于包长度
{
n=MSC_MAX_PACKET;
}
else
{
n=Length;
}
if((Offset+n)>MSC_MemorySize)//缓冲区最大长度
{
n=MSC_MemorySize-Offset;
BulkStage=MSC_BS_DATA_IN_LAST_STALL;//传输失败的发送
}
#if NORFLASH
NOR_FLASH_Read_Buffer_Mal(Offset,usb_mac_global_buffer,n);//读取数据
USB_WriteEP(MSC_EP_IN,(u8*)usb_mac_global_buffer,n);
#endif
#if NANDFLASH
while(nandReady==0);
nandReady=0;
NAND_Read_Addr_Mal(Offset,usb_mac_global_buffer,n);
USB_WriteEP(MSC_EP_IN,(u8*)usb_mac_global_buffer,n);
nandReady=1;
#endif
Offset+=n;
Length-=n;//传输完成后对指针进行相应的处理
CSW.dDataResidue-=n;
if(Length==0)
{
BulkStage=MSC_BS_DATA_IN_LAST;//数据传输成功
}
if(BulkStage!=MSC_BS_DATA_IN)//上一次传输为0 ,命令通过
{
CSW.bStatus=CSW_CMD_PASSED;
}
}
u8 norflash_buffer[2048]={0};
//写入数据到设备
void MSC_MemoryWrite(void)
{
if((Offset+BulkLen)>MSC_MemorySize)//防止超界
{
BulkLen=MSC_MemorySize-Offset;
BulkStage=MSC_BS_CSW;
USB_SetStallEP(MSC_EP_OUT);
}
#if NORFLASH
NOR_FLASH_W