📄 chap_9.c
字号:
#include "standard.h"
#include "Kernel.h"
#include "D14.h"
#include "USB.h"
extern void Init_D14(void);
extern unsigned int Manufacturer_String[];
extern unsigned int Product_String[];
extern unsigned int String_ID[];
extern unsigned int HS_Device_Descriptor[];
extern unsigned int HS_Device_Qualifier[];
extern unsigned int HS_Interface_Descriptor2[];
extern unsigned int HS_Config_Descriptor[];
extern UC HS_Bulk_In_Descriptor[];
extern UC HS_Bulk_Out_Descriptor[];
extern UC Other_Speed_Config_Descriptor[];
extern void Check_Busy(void);
extern void TaskFile_Update(void);
extern UI Temp;
extern UC Device_Config_Value;
extern KERNEL Kernel_Flag;
extern DMA_INT_FLAG DMA_Int_Flag;
extern USB_INT_FLAG USB_Int_Flag;
extern USBCBW USB_CBW;
extern void Init_Device(void);
extern UC Test_Packet[];
extern void Init_Endpoint(void);
extern void Init_Device(void);
extern void Set_USB(void);
void USB_Setup(void);
void Send_Device_Status(void);
void Send_Interface_Status(void);
void Send_Endpoint_Status(void);
void Vendor_Specific_Command(void);
void Send_Status(unsigned char tran_status);
void Set_Interface_Value(void);
void Get_Interface_Value(void);
void Process_Synch_Frame(void);
void get_status(void);
void clear_feature(void);
void set_feature(void);
void set_address(void);
void get_descriptor(void);
void get_config(void);
void set_config(void);
void get_interface(void);
void set_interface(void);
void Set_Descriptor(void);
void ep0in_ack(void);
void ep0out_ack(void);
void wait_ep0tx(void);
void wait_ep0rx(void);
void read_endpoint(unsigned char endp, int len,unsigned int *buf);
void write_endpoint(unsigned char endp,unsigned int len,unsigned int *buf);
extern unsigned int tt[32][4],ttt;
UI Temp;
KERNEL Kernel_Flag;
USB_INT_FLAG USB_Int_Flag;
USB_DEVICE_REQ USB_Device_Request;
USB_DEVICE USB_Device;
UC *Descriptor_Ptr;
int16 count;
void USB_Debug_Mode(void)
{}
//建立包处理
void USB_Setup(void)
{
unsigned int data[4],req;
//清除EP0 SETUP中断标志
USB_Int_Flag.BITS.EP0SETUP = 0;
//清除总线复位标志
Kernel_Flag.BITS.Bus_Reset = 0;
//选择端点0 SETUP缓冲区
D14_ENDPT_INDEX = 0x20;
//读取USB请求
//读取请求类型
data[0]=D14_DATA_PORT;
data[1]=D14_DATA_PORT;
data[2]=D14_DATA_PORT;
data[3]=D14_DATA_PORT;
D14_CONTROL_FUNCTION = 0x10;
data[1]=((data[1]>>8)&0x00ff)|(((data[1]&0x00ff)<<8)&0xff00);
data[2]=((data[2]>>8)&0x00ff)|(((data[2]&0x00ff)<<8)&0xff00);
// data[3]=((data[3]>>8)&0x00ff)|(((data[3]&0x00ff)<<8)&0xff00);
USB_Device_Request.bmRequestType = data[0];
//读取请求号
USB_Device_Request.bRequest =data[0]>>8;
//读取16bit请求数据
USB_Device_Request.wValue = data[1];
//读取16bit请求索引
USB_Device_Request.wIndex =data[2];
//读取16bit长度
USB_Device_Request.wLength =data[3];
req = USB_Device_Request.bRequest & 0x0f;
// (*StandardDeviceRequest[req])();//调用标准请求
switch(USB_Device_Request.bRequest)
{
case 0:
get_status();
break;
case 1:
clear_feature();
break;
case 3:
set_feature();
break;
case 5:
set_address();
break;
case 6:
get_descriptor();
break;
case 8:
get_config();
break;
case 9:
set_config();
break;
case 10:
get_interface();
break;
case 11:
set_interface();
break;
default:
break;
}
}
//Get_Descriptor()获取描述符
void get_descriptor(void)
{
switch((USB_Device_Request.wValue)&0x00ff)
{
case 1://设备描述符
write_endpoint(1,18,HS_Device_Descriptor);
//wait_ep0tx();
//ep0out_ack();
break;
case 2 : //获取配置描述符
if(9 == USB_Device_Request.wLength) //Send only Configuration descriptor
{
write_endpoint(1,9,HS_Config_Descriptor);
//wait_ep0tx();
//ep0out_ack();
}
else
{
write_endpoint(1,32,HS_Interface_Descriptor2);
//wait_ep0tx();
//ep0out_ack();
}
break;
case 3: //获取字符串描述符
if(USB_Device_Request.wValue==0x0003)
write_endpoint(1,4,String_ID);
if(USB_Device_Request.wValue==0x0103)
write_endpoint(1,26,Manufacturer_String);
if(USB_Device_Request.wValue==0x0203)
write_endpoint(1,38,Product_String);
///ep0out_ack();
break;
case 4:
//reserved();
break;
case 5: //获取端点描述符
break;
case 6: //获取设备限制描述符
write_endpoint(1,10,HS_Device_Qualifier); //加上这一句后会使枚举速度大大加快
break;
case 7 ://获取速度配置描述符
break;
case 8:
break;
default :
D14_ENDPT_INDEX = 1;
D14_CONTROL_FUNCTION|= 0x01;
while(!USB_Int_Flag.BITS.EP0SETUP)
{
//读取ISP1581中断寄存器
USB_Int_Flag.VALUE |= D14_INT;
//回写ISP1581中断寄存器
D14_INT = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
break;
}
}
//Set_Address设置地址
void set_address(void)
{
USB_Int_Flag.BITS.EP0RX = 0;
D14_ADDRESS = (USB_Device_Request.wValue >> 8)|0x80;//设置地址
D14_CONTROL_FUNCTION = 2;
//状态响应
ep0in_ack();
}
//Set_Config设置配置
void set_config(void)
{
USB_Int_Flag.BITS.EP0RX = 0;
if(USB_Device_Request.wValue == 0)
{
Device_Config_Value = 0;
ep0in_ack();
}
else if (USB_Device_Request.wValue == 0x0100)
{
//配置设备
Device_Config_Value = (UC ) (USB_Device_Request.wValue >> 8);
ep0in_ack();
}
else
{
D14_ENDPT_INDEX = 1;
D14_CONTROL_FUNCTION |= 0x01;
while(!USB_Int_Flag.BITS.EP0SETUP)
{
//读取ISP1581中断寄存器
USB_Int_Flag.VALUE |= D14_INT;
//回写ISP1581中断寄存器
D14_INT = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
}
D14_ENDPT_INDEX = 3;
asm(" nop");
D14_CONTROL_FUNCTION |= 0x10;
}
//Get_Config获取配置
void get_config(void)
{
}
//Clear_Feature特性清除
void clear_feature(void)
{
}
//Get_Status获取设备状态
void get_status(void)
{
}
//Set_Feature特性设置
//不支持测试模式
void set_feature(void)
{
}
//Get_Interface 获取接口状态
void get_interface(void)
{
}
//Set_Interface 设置接口状态
void set_interface(void)
{
}
//端点0IN状态响应
void ep0in_ack(void)
{
D14_ENDPT_INDEX = 1;
D14_CONTROL_FUNCTION |= 0x02;
wait_ep0tx();
}
//端点0IN状态响应
void wait_ep0tx(void)
{
//end of status stage
while(!USB_Int_Flag.BITS.EP0TX)
{
//读取ISP1581中断寄存器
USB_Int_Flag.VALUE |= D14_INT ;
//回写ISP1581中断寄存器
D14_INT = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0TX = 0;
}
//端点0OUT状态响应
void ep0out_ack(void)
{
//设置状态响应
//acknowledge status stage
D14_ENDPT_INDEX = 0;
D14_CONTROL_FUNCTION|= 0x02;
wait_ep0rx();
}
//端点0OUT状态响应
void wait_ep0rx(void)
{
while(!USB_Int_Flag.BITS.EP0RX)
{
//读取ISP1581中断寄存器
USB_Int_Flag.VALUE |= D14_INT;
//回写ISP1581中断寄存器
D14_INT = USB_Int_Flag.VALUE;
if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
return;
}
USB_Int_Flag.BITS.EP0RX = 0;
}
void read_endpoint(unsigned char endp, int len,unsigned int *buf)
{
int datalen;
D14_ENDPT_INDEX = endp;
datalen = D14_BUFFER_LENGTH;
if(len>datalen)
len=datalen;
while(len > 0)
{
*buf++ = D14_DATA_PORT; //fill up FIFO
len-=2;
}
D14_CONTROL_FUNCTION |= 0x10;
}
void write_endpoint(unsigned char endp,unsigned int len,unsigned int *buf)
{
int datalen,y;
y=0;
D14_ENDPT_INDEX = endp;
D14_BUFFER_LENGTH = len;
if(len%2==0) datalen=len/2;
else datalen=len/2+1;
while(y<datalen)
{
D14_DATA_PORT = buf[y]; //fill up FIFO
y++;
}
// D14_CONTROL_FUNCTION |= 0x08;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -