📄 usbd12.c
字号:
/************************************************************************
*File : Usbd12.c *
*By : hugang, hgx2000@mail.china.com *
************************************************************************/
#include "armusb.h"
#include "..\inc\44b.h"
extern ARMUSBFLAGS bUSBFlags;
/************************************************************************************************
*设置地址使能命令 *
*命令代码: D0 *
*处理:写一个字节 *
************************************************************************************************/
void UsbSetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0xD0);
if(bEnable) bAddress |= 0x80;
outportb(D12_DATA, bAddress);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
/************************************************************************************************
*设置端点使能命令 *
*命令代码: D8 *
*处理: 写一个字节 *
************************************************************************************************/
void UsbSetEndpointEnable(unsigned char bEnable)
{
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0xD8);
if(bEnable) outportb(D12_DATA, 1);
else outportb(D12_DATA, 0);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
/************************************************************************************************
*设置模式命令 *
*命令代码: F3 *
*处理: 写两个字节 1.模式字节 2.时钟分频系数字节 *
************************************************************************************************/
void UsbSetMode(unsigned char bConfig, unsigned char bClkDiv)
{
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0xF3);
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
/************************************************************************************************
*设置DMA命令 *
*命令代码: F8 *
*处理:写一个字节 *
************************************************************************************************/
void UsbSetDMA(unsigned char bMode)
{
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0xFB);
outportb(D12_DATA, bMode);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
/************************************************************************************************
*读取中断寄存器命令 *
*命令代码: F4 *
*处理: 读两个字节 *
************************************************************************************************/
unsigned short UsbReadInterruptRegister(void)
{
volatile unsigned char b1;
volatile unsigned int j;
outportb(D12_COMMAND, 0xF4);
b1 = inportb(D12_DATA);
j = inportb(D12_DATA);
j <<= 8;
j += b1;
return j;
}
/************************************************************************************************
*选择端点命令 *
*命令代码: 00 + bEndp *
*处理: 写一个字节 *
************************************************************************************************/
unsigned char UsbSelectEndpoint(unsigned char bEndp)
{
volatile unsigned char c;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, bEndp);
c = inportb(D12_DATA);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
return c;
}
/************************************************************************************************
*读取端点最后处理状态 *
*命令代码: 40 + bEndp *
*处理: 读一个字节 *
************************************************************************************************/
unsigned char UsbReadLastTransactionStatus(unsigned char bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp);
return inportb(D12_DATA);
}
/************************************************************************************************
*读取端点状态 *
*命令代码: 80 + bEndp *
*处理: 读一个字节 *
************************************************************************************************/
unsigned char UsbReadEndpointStatus(unsigned char bEndp)
{
volatile unsigned char c;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0x80 + bEndp);
c = inportb(D12_DATA);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
return c;
}
/************************************************************************************************
*设置端点状态 *
*命令代码: 40 + bEndp *
*处理: 写一个字节 *
************************************************************************************************/
void UsbSetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0x40 + bEndp);
outportb(D12_DATA, bStalled);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
/************************************************************************************************
*发送恢复命令 *
*命令代码: F6 *
*处理: 读两个字节 *
************************************************************************************************/
void UsbSendResume(void)
{
outportb(D12_COMMAND, 0xF6);
}
/************************************************************************************************
*读取当前帧标志 *
*命令代码: F5 *
*处理: 读两个字节 *
************************************************************************************************/
unsigned short UsbReadCurrentFrameNumber(void)
{
volatile unsigned short i,j;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, 0xF5);
i= inportb(D12_DATA);
j = inportb(D12_DATA);
i += (j<<8);
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
return i;
}
/************************************************************************************************
*读取端点数据 *
*命令代码: F0 *
*处理: 读n字节,n<len,返回读取字节的长度 *
************************************************************************************************/
unsigned char UsbReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
volatile unsigned char i, j;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
outportb(D12_COMMAND, endp); // 选择端点
if((inportb(D12_DATA) & USB_D12_FULLEMPTY) == 0) { // 判断端点缓冲区状态,若未满则返回
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
return 0;
}
outportb(D12_COMMAND, 0xF0); // 读缓冲命令
j = inportb(D12_DATA);
j = inportb(D12_DATA); // 获取字节长度
if(j > len) j = len;
for(i=0; i<j; i++)
*(buf+i) = inportb(D12_DATA);
outportb(D12_COMMAND, 0xF2); // 缓冲区清零
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
return j;
}
/************************************************************************************************
*把数据写入端点 *
*命令代码: F0 *
*处理: 写n字节,n=len *
************************************************************************************************/
unsigned char UsbWriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len)
{
volatile unsigned char i;
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
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); // 使缓冲区有效
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
return len;
}
/************************************************************************************************
*端点应当处理 *
*命令代码: F1 *
*处理: *
************************************************************************************************/
void UsbAcknowledgeEndpoint(unsigned char endp)
{
outportb(D12_COMMAND, endp); // 选择端点
outportb(D12_COMMAND, 0xF1);
if(endp == 0) outportb(D12_COMMAND, 0xF2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -