📄 d12.c
字号:
#include "d12.h"
#include "usb.h"
#include "MASS_STORAGE.H"
extern CBW cbw;
extern CSW csw;
extern CONTROL_DATA_BUFF Control_Data;
Interrupt_Register_DEF Interrupt_Register;
usb_flags_DEF usb_flags;
Last_Status_DEF Last_Status;
//***************** 延时x毫秒函数 ***********
void D12_delay(unsigned int x)
{
unsigned int i;
unsigned int j;
for(i=0;i<x;i++)
for(j=0;j<230;j++);
}
//********************************************
void write_usb_command(unsigned char usb_command) //写USB命令
{
D12Cmd=usb_command;
}
void write_a_usb_data(unsigned char usb_data) //写一字节USB数据
{
D12Dat=usb_data;
}
unsigned char read_a_usb_data(void) //读一字节USB数据
{
unsigned char temp;
temp=D12Dat;
return temp;
}
void read_interrupt_register(void) //读USB中断寄存器
{
write_usb_command(Read_Interrupt_Register);
Interrupt_Register.Register[0]=read_a_usb_data();
Interrupt_Register.Register[1]=read_a_usb_data();
}
void set_usb_addr(unsigned char addr) //设置USB地址
{
write_usb_command(Set_Address);
write_a_usb_data(0x80|addr);
}
void set_endpoint_enable(void) //端点使能
{
write_usb_command(Set_Endpoint_Enable);
write_a_usb_data(0x01);
}
unsigned char select_endpoint(unsigned char endp) //选择终端点
{
write_usb_command(Select_EndPoint+endp);
return read_a_usb_data();
}
unsigned char read_last_status(unsigned char endp) //读端点最后状态
{
write_usb_command(Read_Last_Status+endp);
return read_a_usb_data();
}
void set_endpoint_status(unsigned char endp,unsigned char status) //设置端点状态
{
write_usb_command(0x40+endp);
write_a_usb_data(!status);
}
unsigned char read_endpoint_status(unsigned char endp) //读端点状态
{
write_usb_command(0x80+endp);
return read_a_usb_data();
}
void clear_buffer(void) //清缓冲,在读取缓冲数据后调用
{
write_usb_command(Clear_Buffer);
}
void validate_buffer(void) //缓冲区数据有效,在写缓冲后调用
{
write_usb_command(Validate_Buffer);
}
void ack_setup(unsigned char endp) //应答建立包
{
select_endpoint(endp);
write_usb_command(Ack_Setup);
}
void error(unsigned char number) //出错处理
{
// unsigned char Error[]={"ERROR: "};
// prints(Error);
// printc(number);
number=0;
}
unsigned char read_endpoint_buff(unsigned char endp,unsigned char len,unsigned char * buff) //读终端点缓冲
{
unsigned char i,j;
read_last_status(endp);
if(!(select_endpoint(endp))&0x01){error(0); return 0;}
read_endpoint_status(endp);
write_usb_command(Read_Buffer);
read_a_usb_data();
j=read_a_usb_data();
if(j>len)
j=len;
for(i=0;i<j;i++)
{
*(buff+i)=read_a_usb_data();
}
clear_buffer();
return j;
}
unsigned char write_endpoint_buff(unsigned char endp,unsigned char len,unsigned char const * buff) //写终端点缓冲
{
unsigned char i;
read_last_status(endp);
select_endpoint(endp);
write_usb_command(Write_Buffer);
write_a_usb_data(0);
write_a_usb_data(len);
for(i=0;i<len;i++)
{
write_a_usb_data(*(buff+i));
}
write_a_usb_data(0XFF);
validate_buffer();
return len;
}
void disconnect_usb(void)
{
write_usb_command(0xf3);
write_a_usb_data(0x0e);
write_a_usb_data(0x47);
delay(100);
}
void connect_usb(void) //连接USB
{
write_usb_command(0xf3); //初始化USBD12
write_a_usb_data(0x1e); //连接USB
write_a_usb_data(0x47); //设置频率
}
void init_usb(void) //初始化USB
{
set_usb_addr(0);
set_endpoint_enable();
}
void usb_bus_reset(void) //USB总线复位处理
{
// code unsigned char Usb_Bus_Reset[]={"USB BUS RESET"};
// prints(Usb_Bus_Reset);
usb_flags.Register=0;
set_endpoint_enable();
SCSI.SCSI_Status.Command=1;
SCSI.SCSI_Status.Data=0;
csw.dCSWSignature=0x55534253;
}
void usb_bus_suspend(void) //USB总线挂起处理
{
// code unsigned char Usb_Bus_Suspend[]={"USB BUS SUSPEND"};
// prints(Usb_Bus_Suspend);
// send_to_comport(10);
}
void set_usb_address(void) //设置地址
{
usb_flags.flags.set_addr=1;
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
set_usb_addr(Control_Data.DeviceRequest.wValue);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
void get_status(unsigned char receiver) //获取状态响应
{
unsigned char status[2];
switch (receiver)
{
case 0: //获取设备状态
status[0]=0x00;
status[1]=0x00;
break;
case 1: //获取接口状态
status[0]=0x00;
status[0]=0x00;
break;
case 2: //获取端点状态
status[0]=0x00;
status[1]=0x00;
break;
}
write_endpoint_buff(1,2,status);
usb_flags.flags.usb_endp0_in=0;
}
U32 D12RdChipId(void)
{
U32 tmp;
D12Cmd = 0xfd;
tmp = D12Dat;
tmp = tmp<<8|D12Dat;
return tmp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -