?? usb.c
字號:
#include "usb.h"
#include "d12.h"
#include "MASS_STORAGE.H"
#include "fat.h"
CONTROL_DATA_BUFF Control_Data;
unsigned char buffer[64];
CBW cbw;
CSW csw;
SCSI_DEF SCSI;
unsigned char const *pData;
const unsigned char LANGUAGE_ID[4]={0x04,0x03,0x09,0x04}; //字符串描述符所用的語言種類
const unsigned char device_serial_number[18]= //設備序列號
{0x12,0x03,0x32,0x00,0x30,0x00,0x37,0x00,0x31,0x00,0x30,0x00,0x39,0x00,0x38,0x00,0x32,0x00};
const DEVICE_DESCRIPTOR_STRUCT device_descriptor= //設備描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT), //設備描述符的字節數大小
DEVICE_DESCRIPTOR, //設備描述符類型編號
0x1001, //USB版本號
0x00, //USB分配的設備類代碼
0x00, //USB分配的子類代碼
0x00, //USB分配的設備協議代碼
0x10, //端點0的最大包大小
0x7104, //廠商編號
0xf0ff, //產品編號
// 0x0100, //設備出廠編號
0x0001, //設備出廠編號
0x00, //設備廠商字符串的索引
0x00, //描述產品字符串的索引
0x02, //描述設備序列號字符串的索引
0x01 //可能的配置數量
};
const CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字節數大小
CONFIGURATION_DESCRIPTOR, //配置描述符類型編號
(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256+
(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256,
0x01, //只包含一個接口
0x01, //該配置的編號
0x00, //iConfiguration字段
0x80, //采用總線供電,不支持遠程喚醒
0xC8 //從總線獲取最大電流400mA
},
//interface_descritor //接口描述符
{
sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字節數大小
INTERFACE_DESCRIPTOR, //接口描述符類型編號
0x00, //接口編號為0
0x00, //該接口描述符的編號
ENDPOINT_NUMBER, //非0端點數量為2,只使用端點主端點輸入和輸出
0x08, //USB大容量存儲設備
0x06, //使用的子類,為簡化塊命令
0x50, //使用的協議,這里使用單批量傳輸協議
0x00 //接口描述符字符串索引
},
//endpoint_descriptor[]
{
{ //主端點輸入描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點描述符的字節數大小
ENDPOINT_DESCRIPTOR, //端點描述符類型編號
MAIN_POINT_IN, //端點號,主輸入端點
ENDPOINT_TYPE_BULK, //使用的傳輸類型,批量傳輸
0x4000, //該端點支持的最大包尺寸,64字節
0x00 //中斷掃描時間,對批量傳輸無效
},
{ //主端點輸出描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端點描述符的字節數大小
ENDPOINT_DESCRIPTOR, //端點描述符類型編號
MAIN_POINT_OUT, //端點號,主輸出端點
ENDPOINT_TYPE_BULK, //使用的傳輸類型,批量傳輸
0x4000, //該端點支持的最大包尺寸,64字節
0x00 //中斷掃描時間,對批量傳輸無效
}
}
};
unsigned int SWAP(unsigned short temp) //高低字節交換
{
unsigned short i;
i=temp;
i<<=8;
temp>>=8;
i|=temp;
return i;
}
/*unsigned long int SWAP_long(unsigned long int temp) //四字節交換
{
unsigned long int i;
i=temp<<24;
i|=(temp<<8)&0x00FF0000;
i|=(temp>>8)&0x0000FF00;
i|=(temp>>24)&0x000000FF;
return i;
}*/
unsigned char LSB(unsigned short temp) //取一個整數的低字節
{
return (unsigned char)temp;
}
unsigned char MSB(unsigned short temp) //取一個整數的高字節
{
return (unsigned char)(temp>>8);
}
void clear_feature(unsigned char receiver)
{
receiver=0;
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
void set_feature(unsigned char receiver)
{
receiver=0;
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
void set_descriptor(void)
{
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
void set_configuration(void)
{
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
void get_configuration(void) //獲取配置狀態
{
unsigned char value=0x01;
write_endpoint_buff(1,1,&value);
usb_flags.flags.usb_endp0_in=0;
}
void set_interface(void) //設置接口
{
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
void get_interface(void) //獲取接口狀態
{
unsigned char value=0x01;
write_endpoint_buff(1,1,&value);
usb_flags.flags.usb_endp0_in=0;
}
void get_max_LUN(void) //獲取磁盤最大邏輯單元號
{
unsigned char max_LUN=MAX_LUN; //只有一個邏輯單元
write_endpoint_buff(1,1,&(max_LUN));
usb_flags.flags.usb_endp0_in=0;
}
void mass_storage_reset(void) //USB大容量存儲設備復位
{
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
SCSI.SCSI_Status.Command=1;
SCSI.SCSI_Status.Data=0;
}
void get_descriptor(void) //獲取描述符
{
if(!usb_flags.flags.not_end)
{
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case DEVICE_DESCRIPTOR:
Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
Control_Data.pData=(unsigned char *)(&device_descriptor);
break;
case CONFIGURATION_DESCRIPTOR:
Control_Data.wCount=SWAP(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
Control_Data.pData=(unsigned char *)(&con_int_endp_descriptor);
if( Control_Data.DeviceRequest.wLength == 0x2300)
{
Control_Data.DeviceRequest.wLength = Control_Data.DeviceRequest.wLength;
}
if(Control_Data.wLength<Control_Data.wCount)
Control_Data.wCount=Control_Data.wLength;
break;
case STRING_DESCRIPTOR:
if(LSB(Control_Data.DeviceRequest.wValue)==0)
{
Control_Data.wCount=LANGUAGE_ID[0];
Control_Data.pData=LANGUAGE_ID;
}
if(LSB(Control_Data.DeviceRequest.wValue)==2)
{
Control_Data.wCount=device_serial_number[0];
Control_Data.pData=device_serial_number;
}
break;
}
if(Control_Data.wLength<Control_Data.wCount)
Control_Data.wCount=Control_Data.wLength;
}
if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
{
write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
else usb_flags.flags.usb_endp0_in=0;
return;
}
else
{
write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.usb_endp0_in=0;
return;
}
}
void endp0_out(void) //終端點0輸出中斷處理
{
Last_Status.Register=read_last_status(0);
if(Last_Status.Status.setup_packet)
{
Control_Data.wLength=0;
Control_Data.wCount=0;
if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
{
set_endpoint_status(0,0);
set_endpoint_status(1,0);
return;
}
// Control_Data.DeviceRequest.wValue=SWAP(Control_Data.DeviceRequest.wValue);
// Control_Data.DeviceRequest.wIndex=SWAP(Control_Data.DeviceRequest.wIndex);
// Control_Data.DeviceRequest.wLength=SWAP(Control_Data.DeviceRequest.wLength);
ack_setup(0);
ack_setup(1);
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
usb_flags.flags.not_end=0;
usb_flags.flags.usb_endp0_in=1;
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.setup_packet_out=0;
if(Control_Data.DeviceRequest.bmRequestType&0x80)
{
usb_flags.flags.setup_packet_in=1;return;
}
else
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -