⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.c

📁 基于armjx44bo下的USB接口的程序.对应的实验平台是jx44b0x
💻 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 + -