📄 d12_usb.h
字号:
volatile unsigned int D12_data = 0;
//输出数据
void outportb(UINT addr, UINT data)
{
D12_data = data;
if(addr == D12_DATA)
OUTMAC(0,D12_data);
if(addr == D12_COMMAND)
OUTMAC(1,D12_data);
}
//输入数据
UINT inportb(UINT addr)
{
if(addr == D12_DATA)
INMAC(0,D12_data);
if(addr == D12_COMMAND)
INMAC(1,D12_data);
return D12_data;
}
//设置地址使能
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
outportb(D12_COMMAND, 0xD0);//输出指令
if(bEnable)
bAddress |= 0x80;
outportb(D12_DATA, bAddress);//设置地址
}
//设置端点使能
void D12_SetEndpointEnable(unsigned char bEnable)
{
outportb(D12_COMMAND, 0xD8);//输出指令
if(bEnable)
outportb(D12_DATA, 1);//设置端点允许
else
outportb(D12_DATA, 0);//设置端点禁止
}
//模式设置
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
outportb(D12_COMMAND, 0xF3);//设置模式
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
}
//读取中断寄存器
unsigned short D12_ReadInterruptRegister(void)
{
unsigned char b1;
unsigned int j;
outportb(D12_COMMAND, 0xF4);//读取中断寄存器
b1 = inportb(D12_DATA);
j = inportb(D12_DATA);
j <<= 8;
j += b1;
return j;
}
//端点选择
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
unsigned char c;
outportb(D12_COMMAND, bEndp);//端点选择
c = inportb(D12_DATA);
return c;
}
//读取最后传输状态
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
return inportb(D12_DATA);
}
//读取端点状态
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
unsigned char c;
outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
c = inportb(D12_DATA);
return c;
}
//设置端点状态
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
outportb(D12_DATA, bStalled);
}
//读取端点数据
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
unsigned char i, j;
outportb(D12_COMMAND, endp);
if((inportb(D12_DATA) & 0x01) == 0)
return 0;
outportb(D12_COMMAND, 0xF0);
j = inportb(D12_DATA);
j = inportb(D12_DATA);
if(j > len)
j = len;
// P2 = 0x80;
for(i=0; i<j; i++)
{
// if((i+1)%8 == 0)
// P2 = 0x80;
*(buf+i) = inportb(D12_DATA);
}
outportb(D12_COMMAND, 0xF2);
return j;
}
//写端点
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
unsigned char i;
outportb(D12_COMMAND, endp);
i = inportb(D12_DATA);
outportb(D12_COMMAND, 0xF0);
outportb(D12_DATA, 0);
outportb(D12_DATA, len);
for(i=0; i<len; i++){
outportb(D12_DATA, *(buf+i));
}
outportb(D12_COMMAND, 0xFA);
return len;
}
//设置端点应答
void D12_AcknowledgeEndpoint(unsigned char endp)
{
outportb(D12_COMMAND, endp);
outportb(D12_COMMAND, 0xF1);
if(endp == 0)
outportb(D12_COMMAND, 0xF2);
}
//////////////////////
//发送端点号1建立代码
void code_transmit(UCHAR * pRomData, UINT len)
{
EP0_Request_wCount = 0;
if(EP0_Request_wLength > len)
EP0_Request_wLength = len;
EP0_Request_PData = pRomData;
if( EP0_Request_wLength >= 16)
{
D12_WriteEndpoint(1, 16, EP0_Request_PData);//发送16字节数据
EP0_Request_wCount += 16;
EP0_state = TRANSMIT;
}
else
{
D12_WriteEndpoint(1, EP0_Request_wLength, pRomData);//发送16字节内数据
EP0_Request_wCount += EP0_Request_wLength;
EP0_state = IDLE;
}
}
//返回stall应答
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
//从端点号1发送数据
void single_transmit(unsigned char * buf, unsigned char len)
{
if( len <= 16) {
D12_WriteEndpoint(1, len, buf);
}
}
//获取描述符
void get_descriptor(void)
{
unsigned char bDescriptor = (unsigned char)(Recieved_Data.DEVICE_REQUEST.wValue>>8);
if (bDescriptor == 0x01) {//获取设备描述符
code_transmit(DeviceDescr, 18);
} else if (bDescriptor == 0x02) {//获取配置描述符
code_transmit(ConfigDescr, 32);
} else
stall_ep0();
}
//设置地址
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(Recieved_Data.DEVICE_REQUEST.wValue),1);
single_transmit(0, 0);
}
//设置配置状态
void set_configuration(void)
{
if (Recieved_Data.DEVICE_REQUEST.wValue == 0) //设备进入未配置状态
{
single_transmit(0, 0);
D12_SetEndpointEnable(0);
}
else if (Recieved_Data.DEVICE_REQUEST.wValue == 1) //配置设备
{
single_transmit(0, 0);
// D12_SetEndpointEnable(0);
D12_SetEndpointEnable(1);
}
else
stall_ep0();
}
unsigned char GML = 0;
void Get_Max_Lun()
{
D12_SetEndpointEnable(1);
//single_transmit(&GML, 1);
D12_WriteEndpoint(1, 1, &GML);
}
void XINT1_INT()//D12中断
{
static UINT i = 0;
i++;
Set_LED(i);
*XINT1CR = *XINT1CR | 0x8000;//清中断标志
*IFR = 0x0020;
asm(" clrc INTM");//开总中断
return;
}
void D12_init()
{
D12SUSPD_0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -