?? 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 + -