📄 l2_usb.c
字号:
/*++
Copyright (c) 2001 Sunplus Technology Co., Ltd.
Module Name:
L2_usb.c
Abstract:
USB L2 function
Environment:
Keil C51 Compiler
Revision History:
11/12/2001 cclin created
--*/
//=============================================================================
//Header file
//=============================================================================
#include "general.h"
#include "bulkout.h"
#include "main.h"
#include "App.h"
#include "initio.h"
//=============================================================================
//Symbol
//=============================================================================
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
//=============================================================================
//Program
//=============================================================================
#ifdef TestModeEn
//-----------------------------------------------------------------------------
//L2_TestUSB
//-----------------------------------------------------------------------------
/*
routine description:
USB module test.
arguments:
TestLevel - 0: all
1: register read/write test
2: SRAM test
3: others
return value:
0x00 - success
others - error
*/
UCHAR L2_TestUSB(UCHAR TestLevel) USING_0
{
UCHAR status = L2K_SUCCESS;
UCHAR Temp0 = TestLevel;
return(status);
}
#endif
UCHAR L2_BulkInOut(void) USING_0
{
UCHAR BulkOutBufCnt;
UCHAR status = 0;
////printf("bf = %x\n",G_BulkFlash);
// Loop for BulkInToDRAM
//richie@0124 bulk 2
if(XBYTE[0x25C2]==K_USB_AP_IN_ACK_MASK)
{
if(G_BulkFlash==0x00)
{
//PRINT_L2("BulkIn()\n");
XBYTE[0x25C2] = 0x00;
//PRINT_L2("25a1 = %bx", XBYTE[0x25a1]);
//PRINT_L2("\n G_BulkSize = %lx\n", (ULONG)G_BulkSize);
if(G_BulkSize<(ULONG)0x41)
{
//PRINT_L2("Last BulkIn");
XBYTE[0x25a1] = 0x00;
} //BulkIn has completed
else
{
G_BulkSize = G_BulkSize - 0x40;
G_BulkDRAMAddr = G_BulkDRAMAddr + 0x20;
//PRINT_L2("\n G_BulkSize2 = %lx\n", (ULONG)G_BulkSize);
if(G_BulkSize<0x41)
{
//PRINT_L2(" 1. XBYTE[0x25b3] = %bx\n", XBYTE[0x25b3]);
//PRINT_L2(" 1. XBYTE[0x25a1] = %bx\n", XBYTE[0x25a1]);
L2_BulkInFromDRAM(G_BulkDRAMAddr,(USHORT)G_BulkSize);
//PRINT_L2(" 2. XBYTE[0x25b3] = %bx\n", XBYTE[0x25b3]);
//PRINT_L2(" 2. XBYTE[0x25a1] = %bx\n", XBYTE[0x25a1]);
//richie@0124 bulk 2
XBYTE[0x25a1] = K_USB_AP_IN_OPEN;//0x08;
}
else
{
//PRINT_L2("3. XBYTE[0x25b3] = %bx\n", XBYTE[0x25b3]);
//PRINT_L2("3. XBYTE[0x25a1] = %bx\n", XBYTE[0x25a1]);
L2_BulkInFromDRAM(G_BulkDRAMAddr,0X40);
//PRINT_L2("4. XBYTE[0x25b3] = %bx\n", XBYTE[0x25b3]);
//PRINT_L2("4. XBYTE[0x25a1] = %bx\n", XBYTE[0x25a1]);
//richie@0124 bulk 2
XBYTE[0x25a1] = K_USB_AP_IN_OPEN;//0x08;
}
}
} // G_BulkFlash == 0
else if(G_BulkFlash == 0x01)
{
XBYTE[0x25C2] = 0x00;
//PRINT_L2("upload flash function\n");
if(G_BulkSize<(ULONG)0x41)
{
XBYTE[0x25a1] = 0x00;
G_BulkFlash = 0x00;
} // BulkIn has completed
else
{
G_BulkSize = G_BulkSize - 0x40;
G_BulkSRAMAddr = G_BulkSRAMAddr + 0x40;
if (G_BulkSRAMAddr == 512)
{
G_BulkSRAMAddr = 0x00;
L2_SetSRAMDMA(0x0c00);
#if (CFAIDE)
G_BulkFlashAddr = G_BulkFlashAddr + 1;
L1_DMARdCFIDE(1, (UCHAR)(G_BulkFlashAddr>>24), (UCHAR)(G_BulkFlashAddr>>16), (UCHAR)(G_BulkFlashAddr>>8), (UCHAR)G_BulkFlashAddr, 1, 0x200);
#endif
#if (SD)
G_BulkFlashAddr = G_BulkFlashAddr + 512;
L1_DMARdSD(1, G_BulkFlashAddr , 1, 0x200);
#endif
//PRINT_L2("G_BulkSize = %lx ", G_BulkSize);
//PRINT_L2("G_BulkFlashAddr = %lx ", G_BulkFlashAddr);
//PRINT_L2("G_BulkSRAMAddr = %lx\n", G_BulkSRAMAddr);
}
if(G_BulkSize<0x41)
{
L2_SetSRAMDMA((USHORT)G_BulkSRAMAddr+0x0c00);
//richie@0124 bulk 2
L2_SetUSBDMA(K_DMA_UsbDontCare, K_USB_AP_DMA_IN);//for ap
L2_DoDMA(K_DMA_SRAM, K_DMA_USB, G_BulkSize, 0, 0);
//richie@0124 bulk 2
XBYTE[0x25a1] = K_USB_AP_IN_OPEN;//0x08;
G_BulkFlashAddr = 0x00;
G_BulkSize = 0x00;
G_BulkFlash = 0x00;
G_BulkSRAMAddr = 0x00;
}
else
{
L2_SetSRAMDMA((USHORT)G_BulkSRAMAddr+ 0x0c00);
//richie@0124 bulk 2
L2_SetUSBDMA(K_DMA_UsbDontCare, K_USB_AP_DMA_IN);//for ap
L2_DoDMA(K_DMA_SRAM, K_DMA_USB, 0x40, 0, 0);
//richie@0124 bulk 2
XBYTE[0x25a1] = K_USB_AP_IN_OPEN;//0x08;
}
}
//PRINT_L2("G_BulkSize = %lx ", G_BulkSize);
//PRINT_L2("G_BulkFlashAddr = %lx", G_BulkFlashAddr);
//PRINT_L2("G_BulkSRAMAddr = %lx\n", G_BulkSRAMAddr);
} // G_BulkFlash == 0x01
} // if 0x25c2 == 0x01
// Loop for BulkOutToDRAM
//richie@0124 bulk 2
if(XBYTE[0x25C2]==K_USB_AP_OUT_ACK_MASK)
{
if (G_BulkFlash==0x00) // Bulkout to DRAM
{
//PRINT_L2("Bulkout to DRAM\n");
XBYTE[0x25C2] = 0x00;
//PRINT_L2("25a1 = %bx \n", XBYTE[0x25a1]);
//PRINT_L2("25b4 = %bx\n", XBYTE[0x25b4]);
//PRINT_L2(" G_BulkDRAMAddr1 = %lx\n",G_BulkDRAMAddr);
//richie@0124 bulk 2
BulkOutBufCnt = XBYTE[K_USB_AP_OUT_BUF_SIZE];
L2_BulkOutToDRAM(G_BulkDRAMAddr,(USHORT)BulkOutBufCnt);
G_BulkDRAMAddr = G_BulkDRAMAddr + ((ULONG)BulkOutBufCnt/2);
G_BulkOutSize = G_BulkOutSize + (ULONG)BulkOutBufCnt;
//PRINT_L2("G_BulkSize = %lx\n", G_BulkSize);
if(G_BulkOutSize == G_BulkSize)
{
G_LastBulk = 1;
XBYTE[0x25a1] = 0x00;
G_BulkOutSize = 0x00;
G_BulkFlash = 0x00;
//PRINT_L2("Last Bulk\n");
}
//richie@0124 bulk 2
else XBYTE[0x25a1] = K_USB_AP_OUT_OPEN;//0x10;
} // Bulkout to DRAM
else // Bulkout to Flash
{
//PRINT_L2("Download to Flash\n");
XBYTE[0x25C2] = 0x00;
//richie@0124 bulk 2
BulkOutBufCnt = XBYTE[K_USB_AP_OUT_BUF_SIZE];
// DMA to CPU SRAM
L2_SetSRAMDMA((USHORT)G_BulkSRAMAddr+0x0c00);
//richie@0124 bulk 2
L2_SetUSBDMA(K_USB_AP_DMA_OUT, K_DMA_UsbDontCare);//for ap
L2_DoDMA(K_DMA_USB, K_DMA_SRAM, (USHORT)BulkOutBufCnt, 0, 0);
G_BulkSRAMAddr = G_BulkSRAMAddr + ((ULONG)BulkOutBufCnt);
G_BulkOutSize = G_BulkOutSize + (ULONG)BulkOutBufCnt;
if (G_BulkSRAMAddr == 512)
{
L2_SetSRAMDMA(0x0c00);
#if (CFAIDE)
L1_DMAWrCFIDE(1, (UCHAR)(G_BulkFlashAddr>>24), (UCHAR)(G_BulkFlashAddr>>16), (UCHAR)(G_BulkFlashAddr>>8), (UCHAR)G_BulkFlashAddr, 1, 0x200);
G_BulkFlashAddr = G_BulkFlashAddr + 1;
#endif
#if (SD)
L1_DMAWrSD(1, G_BulkFlashAddr , 1, 0x200);
G_BulkFlashAddr = G_BulkFlashAddr + 512;
#endif
G_BulkSRAMAddr = 0x00;
//PRINT_L2("G_BulkSize = %lx ", G_BulkSize);
//PRINT_L2("G_BulkFlashAddr = %lx ", G_BulkFlashAddr);
//PRINT_L2("G_BulkSRAMAddr = %lx\n", G_BulkSRAMAddr);
}
if (G_BulkOutSize == G_BulkSize)
{
G_BulkSRAMAddr = 0x00;
G_BulkOutSize = 0x00;
G_BulkFlashAddr = 0x00;
G_BulkSize = 0x00;
G_BulkFlash = 0x00;
// Bulkout done
}
else
//richie@0124 bulk 2
XBYTE[0x25a1] = K_USB_AP_OUT_OPEN;//0x10;
//PRINT_L2("G_BulkSize = %lx ", G_BulkSize);
//PRINT_L2("G_BulkFlashAddr = %lx ", G_BulkFlashAddr);
//PRINT_L2("G_BulkSRAMAddr = %lx\n", G_BulkSRAMAddr);
} // Bulkout to Flash
} // if 0x25c2 == 0x02
return status;
}
//-----------------------------------------------------------------------------
//L2_BulkInFromDRAM
//-----------------------------------------------------------------------------
/*
routine description:
BulkInFromDRAM to PC
arguments:
return value:
0x00 - success
others - error
*/
UCHAR L2_BulkInFromDRAM(ULONG DRAMAddr, USHORT nByte)
{
UCHAR status;
status = L2_SetDRAMDMA(DRAMAddr);
//richie@0124 bulk 2
status = L2_SetUSBDMA(K_DMA_UsbDontCare, K_USB_AP_DMA_IN);//for ap // USBDMADst: endpoint 7
status = L2_DoDMA(K_DMA_DRAM, K_DMA_USB, nByte, 0, 0); // DMA source DRAM, destination USB
//status = L2_SetSRAMDMA(0x0);
//status = L2_DoDMA(1, 3, nByte, 0, 0);
return(status);
}
//-----------------------------------------------------------------------------
//L2_BulkOutToDRAM
//-----------------------------------------------------------------------------
/*
routine description:
BulkOutToDRAM from PC
arguments:
return value:
0x00 - success
others - error
*/
UCHAR L2_BulkOutToDRAM(ULONG DRAMAddr, USHORT nByte)
{
UCHAR status;
status = L2_SetDRAMDMA(DRAMAddr);
status = L2_SetUSBDMA(K_USB_AP_DMA_OUT, K_DMA_UsbDontCare);//for ap // USBDMASrc: endpoint 8
status = L2_DoDMA(K_DMA_USB, K_DMA_DRAM, nByte, 0, 0); // DMA source DRAM, destination USB
//status = L2_SetSRAMDMA(0x0);
//status = L2_DoDMA(3, 1, nByte, 0, 0);
return(status);
}
//-----------------------------------------------------------------------------
//L2_InitUSB
//-----------------------------------------------------------------------------
UCHAR L2_InitUSB (UCHAR CamMode) USING_0
/*++
Routine Description:
initialize USB function
Arguments:
none
Return Value:
none
--*/
{
UCHAR temp = CamMode;
//richie@isp 0326
G_BulkFlash = 0;
return(1); //cytsai@0131
#if 0
UCHAR status = 0;
UCHAR temp0 = CamMode;
//bit flag
G_btSoftwareResetFlag = 0;
G_btStopStream = 0;
//lock fields of USB device request
G_bRequestLock = 0;
G_bRequestLog = 0;
G_wIndexLock = 0;
G_wValueLock = 0;
//state and error code
G_ucState = 0;
G_ucState2 = 0; //cch@10/15
G_ucState3 = 0; //cch@10/15
G_ulErrorCode = 0;
//type of storage used
//richie@0117 marked
// G_ucStorageType = 0xff;
//storage interface N belongs to which USB class
G_ucStorIntrf1Class = K_MassStorageClassBo;
G_ucStorIntrf2Class = K_StillImageClass;
G_ucPktStorIntrf = K_StorageInterface1; //current packet belongs to which storage interface
G_TurnOnBulkInEn = 0;
G_TurnOnBulkOutEn = 0;
G_TurnOnIntInEn = 0;
G_TurnOnBulkIn2En = 0;
G_TurnOnBulkOut2En = 0;
G_TurnOnIntIn2En = 0;
G_BulkSize = 0;
G_BulkOutSize = 0;
G_BulkDRAMAddr = 0;
G_LastBulk = 0;
G_ISP = 0;
G_ISPDRAMAddr = 0;
G_ISPROMAddr = 0;
G_ISPSecAddr = 0;
G_ISPSecCnt = 0;
G_L1_ModuleID = 0;
G_L2_ModuleID = 0;
G_L1_FuncID = 0;
G_L2_FuncID = 0;
G_BulkFlash = 0;
G_BulkFlashAddr = 0;
G_BulkSRAMAddr = 0;
XBYTE[0x25a0] &= 0xfc; //reject (NAK)
// next EP0 Out packet
// next EP0 In packet
XBYTE[0x25d0] = 0x07; //enable interrupt for
// EP0 Setup packet OK
// EP0 Out packet OK
// EP0 In packet OK
return (status);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -