📄 usb.c
字号:
/****************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* USB.C 1.0 */
/* */
/* DESCRIPTION */
/* */
/* JX44B0(S3C44B0X)USB驱动实验 */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* FUNCTIONS : */
/* 在JX44B0教学实验箱进行USB实验 */
/* */
/* DEPENDENCIES */
/* JX44B0-1 */
/* JX44B0-2 */
/* JX44B0-3 */
/* */
/* */
/* NAME: */
/* REMARKS: */
/* */
/* Copyright (C) 2003 Wuhan CVTECH CO.,LTD */
/****************************************************************************/
/****************************************************************************/
/* 学习JX44B0中USB驱动的编程方法: */
/* 注意: */
/* 1. 程序运行之前请将JX44B0 USB正确地与PC端进行连接,具体连接方法请 */
/* 阅读用户手册 */
/* 2. 程序运行之前请先正确安装PC端驱动程序,具体连接方法请阅读用户手册 */
/* USB PC端通讯使用JX44B0光盘tools目录下的usb_loop.exe程序,该程序在 */
/* JX44B0 的USB端口和PC的USB口之间进行通讯,实现回环测试 */
/****************************************************************************/
/* 包含文件 */
#include "44b.h"
#include "44blib.h"
#include "usb.h"
#include "usb_inc.h"
#include "usb_d12_ci.h"
#include "usb_d12_chap9.h"
#include "usb_d12_isr.h"
#include "usb_dbg.h"
void usb_init(void);
void usb_loop_test(void);
extern EPPFLAGS bEPPflags;
extern unsigned char *GenEpBuf;
/********************************************************************
// Function name : Main
// Description : USB回环测试主程序
// Return type : void
// Argument : void
*********************************************************************/
void Main(void)
{
char TestItemSel ;
do
{
Uart_Printf("\n#####################################\r") ;
Uart_Printf("\n# USB TEST ROUTINE #\r") ;
Uart_Printf("\n#####################################\r") ;
Uart_Printf("\n# USB INITIAL - [I] #\r") ;
Uart_Printf("\n# USB EP1/EP2 LOOP TEST - [L] #\r") ;
Uart_Printf("\n# Quit USB Test - [Q] #\r") ;
Uart_Printf("\n#####################################\r") ;
Uart_Printf("\n\rSelect Test Item : ") ; TestItemSel = Uart_Getch() ;
switch(TestItemSel)
{
case 'i' :
case 'I' : usb_init() ; break ;
case 'l' :
case 'L' : usb_loop_test() ; break ;
case 'q' :
case 'Q' : break ;
default : Uart_Printf("\n\nInvalid Test Item Selected") ;
break ;
}
} while ( (TestItemSel != 'Q') && (TestItemSel != 'q') ) ;
}
/********************************************************************
// Function name : usb_init
// Description : USB初始化函数
// Return type : void
// Argument : void
*********************************************************************/
void usb_init(void)
{
rNCACHBE0=0x80002000;//设置非CACHE的开始地址0x2000000,结束地址0x8000000
Uart_Printf("USB chip id : %04x\n", D12_ReadChipID() ) ;
Uart_Printf("USB interrupt reg : %04x\n", D12_ReadInterruptRegister() ) ;
Uart_Printf("USB current frame : %04x\n", D12_ReadCurrentFrameNumber() ) ;
Uart_Printf("USB Read end point status frame : %02x,%02x\n",
D12_ReadEndpointStatus(4), D12_ReadEndpointStatus(5)) ;
Uart_Printf("USB Read last transtaction status : %02x,%02x,%02x,%02x\n",
D12_ReadLastTransactionStatus(0),D12_ReadLastTransactionStatus(1),
D12_ReadLastTransactionStatus(2),D12_ReadLastTransactionStatus(3));
Uart_Printf("USB Read Interrupt register : %04x\n",D12_ReadInterruptRegister());
}
/********************************************************************
// Function name : usb_loop_test
// Description : USB回环测试
// Return type : void
// Argument : void
*********************************************************************/
void usb_loop_test(void)
{
unsigned short i_st;
rNCACHBE0=0x80002000;//设置非CACHE的开始地址0x2000000,结束地址0x8000000
Uart_Printf("loop test......\n");
reconnect_USB();
while(Uart_GetKey()==0x0)
{
i_st = D12_ReadInterruptRegister();
if(i_st != 0)
{
if(i_st & D12_INT_BUSRESET)
{
bus_reset();
bEPPflags.bits.bus_reset = 1;
i_st &= ~D12_INT_BUSRESET;
}
else
{
if(i_st & D12_INT_EOT)
{
dma_eot();
i_st &= ~D12_INT_EOT;
}
if(i_st & D12_INT_SUSPENDCHANGE)
{
bEPPflags.bits.suspend = 1;
i_st &= ~D12_INT_SUSPENDCHANGE;
}
if(i_st & D12_INT_ENDP0IN)
{
ep0_txdone();
i_st &= ~D12_INT_ENDP0IN;
}
if(i_st & D12_INT_ENDP0OUT)
{
ep0_rxdone();
i_st = ~D12_INT_ENDP0OUT;
}
if(i_st & D12_INT_ENDP1IN)
{
ep1_txdone();
i_st &= ~D12_INT_ENDP1IN;
}
if(i_st & D12_INT_ENDP1OUT)
{
ep1_rxdone();
i_st &= ~D12_INT_ENDP1OUT;
}
if(i_st & D12_INT_ENDP2IN)
{
main_txdone();
i_st &= ~D12_INT_ENDP2IN;
}
if(i_st & D12_INT_ENDP2OUT)
{
main_rxdone();
i_st &= ~D12_INT_ENDP2OUT;
}
if(bEPPflags.bits.ep1_rxdone)
{
}
if (bEPPflags.bits.bus_reset) {
DISABLE;
bEPPflags.bits.bus_reset = 0;
ENABLE;
} // if bus reset
if (bEPPflags.bits.suspend) {
DISABLE;
bEPPflags.bits.suspend= 0;
ENABLE;
suspend_change();
} // if suspend change
if (bEPPflags.bits.setup_packet){
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();
} // if setup_packet
if(bEPPflags.bits.setup_dma) {
DISABLE;
bEPPflags.bits.setup_dma = 0;
ENABLE;
//setup_dma();
} // if setup_dma
}
}
}
}
void Usb_Get_Data(unsigned int addr)
{
unsigned short i_st;
unsigned char *paddr = (unsigned char *)(addr - 4);
int length = 0x100000;
int bGetlen = 0;
rNCACHBE0=0x80002000;//设置非CACHE的开始地址0x2000000,结束地址0x8000000
Uart_Printf("Download file from usb......\n");
reconnect_USB();
while(1)
{
i_st = D12_ReadInterruptRegister();
if(i_st != 0)
{
if(i_st & D12_INT_BUSRESET)
{
bus_reset();
bEPPflags.bits.bus_reset = 1;
i_st &= ~D12_INT_BUSRESET;
}
else
{
if(i_st & D12_INT_EOT)
{
dma_eot();
i_st &= ~D12_INT_EOT;
}
if(i_st & D12_INT_SUSPENDCHANGE)
{
bEPPflags.bits.suspend = 1;
i_st &= ~D12_INT_SUSPENDCHANGE;
}
if(i_st & D12_INT_ENDP0IN)
{
ep0_txdone();
i_st &= ~D12_INT_ENDP0IN;
}
if(i_st & D12_INT_ENDP0OUT)
{
ep0_rxdone();
i_st = ~D12_INT_ENDP0OUT;
}
if(i_st & D12_INT_ENDP1IN)
{
ep1_txdone();
i_st &= ~D12_INT_ENDP1IN;
}
if(i_st & D12_INT_ENDP1OUT)
{
{
unsigned char i;
unsigned char len;
D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
len = D12_ReadEndpoint(2, GenEpBuf, sizeof(GenEpBuf));
if(len != 0)
{
memcpy(paddr, GenEpBuf, len);
paddr += len;
if(bGetlen == 0 && (int)paddr >= (int)addr)
{
length = *((unsigned int *)(addr-4));
Uart_Printf("\r\nDownloading, size = %d(0x%x)... \r\n", length, length);
bGetlen = 1;
}
if((int)paddr >= (int)addr + length)
{
Uart_Printf("Download complete\r\n");
return;
}
Uart_Printf("\rpaddr = 0x%08x, addr = 0x%08x", paddr, addr);
bEPPflags.bits.ep1_rxdone = 1;
}
}
i_st &= ~D12_INT_ENDP1OUT;
}
if(i_st & D12_INT_ENDP2IN)
{
main_txdone();
i_st &= ~D12_INT_ENDP2IN;
}
if(i_st & D12_INT_ENDP2OUT)
{
main_rxdone();
i_st &= ~D12_INT_ENDP2OUT;
}
if(bEPPflags.bits.ep1_rxdone)
{
}
if (bEPPflags.bits.bus_reset) {
DISABLE;
bEPPflags.bits.bus_reset = 0;
ENABLE;
} // if bus reset
if (bEPPflags.bits.suspend) {
DISABLE;
bEPPflags.bits.suspend= 0;
ENABLE;
suspend_change();
} // if suspend change
if (bEPPflags.bits.setup_packet){
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();
} // if setup_packet
if(bEPPflags.bits.setup_dma) {
DISABLE;
bEPPflags.bits.setup_dma = 0;
ENABLE;
//setup_dma();
} // if setup_dma
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -