?? dataio.c
字號:
#include "defusr.h"
#include "macusr.h"
#include "libassp.h"
#include "extern.h"
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Data out start
*-----------------------------------------------------------------------------
* Declaration : void DO_Start(U16 Pipe, U16 Bsize, U8 *Table)
*-----------------------------------------------------------------------------
* Argument : U16 Pipe ; Pipe Number
* : U16 Bsize ; Data Size
* : U8 *Table ; Data Table Address
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void DO_Start(U16 Pipe, U32 Bsize, U8 *Table)
{
if( RprtSTS(DIDO, 0) != YES )
return;
dtcnt[Pipe] = Bsize;
dtptr[Pipe] = (U8 *)Table;
Buffer_Write_Data_Flag[Pipe] = DATA_WAIT;
SetEpPid(Pipe, PID_BUF); /* Set BUF */
EnableIntR(Pipe); /* Enable Ready Interrupt */
}
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Data out
*-----------------------------------------------------------------------------
* Declaration : void Data_Out(U16 Pipe)
*-----------------------------------------------------------------------------
* Argument : U16 Pipe ; Pipe Number
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void Data_Out(U16 Pipe)
{
U16 size, count;
U16 setival = 0;
register U16 even, buffer;
size = dataInSize(Pipe); /* Data size */
/* Readout counter */
if( dtcnt[Pipe] < size) {
count = dtcnt[Pipe];
setival = 1;
dtcnt[Pipe] = 0;
} else {
count = size;
dtcnt[Pipe] -= size;
}
USB_MDF_PAT(CFIFOSEL, Pipe, CURPIPE);
/*
* Cautions !!!
* Depending on the external bus speed of CPU, you may need to wait for 200ns here.
* For details, please look at the data sheet.
*/
/***** The example of reference. *****/
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
/*************************************/
do {
USBRD(CFIFOCTR, buffer);
} while( (buffer & FRDY) == 0 );
USBRD(CFIFOSEL, buffer);
if( (buffer & MBW) == MBW_8 ) { /* 8bit FIFO access mode */
for( even = count; even; --even ) {
USBWR_FF(CFIFO_8, *dtptr[Pipe]);
dtptr[Pipe] += 1;
}
} else { /* 16bit FIFO access mode */
for( even = count / 2; even; --even ) {
USBWR_FF(CFIFO, *((U16 *)dtptr[Pipe]));
dtptr[Pipe] += 2;
}
if( (count % 2) != 0 ) {
USBWR_FF(CFIFO_8, *dtptr[Pipe]);
dtptr[Pipe] += 1;
}
}
if( setival ) {
USBRD(CFIFOCTR, buffer);
if( (buffer & BVAL) == 0 )
USB_SET_PAT(CFIFOCTR, BVAL);
}
if( dtcnt[Pipe] == 0 ) {
DisableIntR(Pipe); /* Disable Ready Interrupt */
Buffer_Write_Data_Flag[Pipe] = DATA_NONE; /* End */
}
}
void DMA_Out(U16 Pipe)
{
U16 size, count;
U16 setival = 0;
// register U16 even, buffer;
size = dataInSize(Pipe); /* Data size */
/* Readout counter */
if( dtcnt[Pipe] < size) {
count = dtcnt[Pipe];
setival = 1;
dtcnt[Pipe] = 0;
} else {
count = size;
dtcnt[Pipe] -= size;
}
if( dtcnt[Pipe] == 0 ) {
DisableIntR(Pipe); /* Disable Ready Interrupt */
Buffer_Write_Data_Flag[Pipe] = DATA_NONE; /* End */
}
}
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Data in start
*-----------------------------------------------------------------------------
* Declaration : void DI_Start(U16 Pipe, U16 Bsize, U8 *Table)
*-----------------------------------------------------------------------------
* Argument : U16 Pipe ; Pipe Number
* : U16 Bsize ; Data Size
* : U8 *Table ; Data Table Address
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void DI_Start(U16 Pipe, U32 Bsize, U8 *Table)
{
if( RprtSTS(DIDO, 0) != YES )
return;
dtcnt[Pipe] = Bsize;
dtptr[Pipe] = (U8 *)Table;
Buffer_Read_Data_Size[Pipe] = 0;
Buffer_Read_Data_Flag[Pipe] = DATA_WAIT;
SetEpPid(Pipe, PID_BUF); /* Set BUF */
#if 0
ClearIntR(Pipe);
EnableIntR(Pipe); /* Enable Ready Interrupt */
#endif
}
#if 0
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Data in
*-----------------------------------------------------------------------------
* Declaration : void Data_In(U16 Pipe)
*-----------------------------------------------------------------------------
* Argument : U16 Pipe ; Pipe Number
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void Data_In(U16 Pipe)
{
U16 size, count, mxps;
register U16 even, buffer;
SetEpPid(Pipe, PID_NAK);
mxps = getMaxPacketSize(Pipe); /* Max Packet Size */
USB_MDF_PAT(CFIFOSEL, Pipe, CURPIPE);
/*
* Cautions !!!
* Depending on the external bus speed of CPU, you may need to wait for 200ns here.
* For details, please look at the data sheet.
*/
/***** The example of reference. *****/
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
/*************************************/
do {
USBRD(CFIFOCTR, buffer);
} while( (buffer & FRDY) == 0 );
USBRD(CFIFOCTR, buffer);
size = buffer & DTLN;
if( dtcnt[Pipe] < size ) { /* Buffer Full ? */
count = 0;
dtcnt[Pipe] = 0;
} else if( size % mxps ) { /* Short Packet ? */
count = size;
dtcnt[Pipe] = 0;
} else {
count = size;
dtcnt[Pipe] -= size;
}
Buffer_Read_Data_Size[Pipe] += count;
if( size == 0 ) { /* 0 length packet */
USBWR(CFIFOCTR, BCLR); /* Clear BVAL */
} else {
USBRD(CFIFOSEL, buffer);
if( (buffer & MBW) == MBW_8 ) { /* 8bit FIFO access mode */
for( even = count; even; --even ) {
USBRD_FF(CFIFO_8, *dtptr[Pipe]);
dtptr[Pipe] += 1;
}
} else {
for( even = count / 2; even; --even ) {
USBRD_FF(CFIFO, *((U16 *)dtptr[Pipe]));
dtptr[Pipe] += 2;
}
if( (count % 2) != 0 ) {
USBRD_FF(CFIFO_8, *dtptr[Pipe]);
dtptr[Pipe] += 1;
}
}
}
if( dtcnt[Pipe] == 0 ) {
DisableIntR(Pipe); /* Disable Ready Interrupt */
Buffer_Read_Data_Flag[Pipe] = DATA_OK;
} else {
SetEpPid(Pipe, PID_BUF); /* Set BUF */
}
}
#endif
#if 1
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Data in
*-----------------------------------------------------------------------------
* Declaration : void Data_In(U16 Pipe)
*-----------------------------------------------------------------------------
* Argument : U16 Pipe ; Pipe Number
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void Data_In(U16 Pipe)
{
U16 size, count, mxps;
register U16 even, buffer;
SetEpPid(Pipe, PID_NAK);
mxps = getMaxPacketSize(Pipe); /* Max Packet Size */
USB_MDF_PAT(CFIFOSEL, Pipe, CURPIPE);
/*
* Cautions !!!
* Depending on the external bus speed of CPU, you may need to wait for 200ns here.
* For details, please look at the data sheet.
*/
/***** The example of reference. *****/
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
USBRD(CFIFOCTR, buffer); /* Wait for About 42ns */
/*************************************/
do {
USBRD(CFIFOCTR, buffer);
} while( (buffer & FRDY) == 0 );
USBRD(CFIFOCTR, buffer);
size = buffer & DTLN;
if( dtcnt[Pipe] < size ) { /* Buffer Full ? */
count = 0;
dtcnt[Pipe] = 0;
} else if( size % mxps ) { /* Short Packet ? */
count = size;
dtcnt[Pipe] = 0;
} else {
count = size;
dtcnt[Pipe] -= size;
}
Buffer_Read_Data_Size[Pipe] += count;
if( size == 0 ) { /* 0 length packet */
USBWR(CFIFOCTR, BCLR); /* Clear BVAL */
} else {
USBRD(CFIFOSEL, buffer);
if( (buffer & MBW) == MBW_8 ) { /* 8bit FIFO access mode */
for( even = count; even; --even ) {
USBRD_FF(CFIFO_8, *dtptr[Pipe]);
dtptr[Pipe] += 1;
}
} else {
for( even = count / 2; even; --even ) {
USBRD_FF(CFIFO, *((U16 *)dtptr[Pipe]));
dtptr[Pipe] += 2;
}
if( (count % 2) != 0 ) {
USBRD_FF(CFIFO_8, *dtptr[Pipe]);
dtptr[Pipe] += 1;
}
}
}
if( dtcnt[Pipe] == 0 ) {
/* DisableIntR(Pipe);*/ /* Disable Ready Interrupt */
/* Buffer_Read_Data_Flag[Pipe] = DATA_NONE; */
Buffer_Read_Data_Flag[Pipe] = DATA_OK;
} else {
SetEpPid(Pipe, PID_BUF); /* Set BUF */
}
}
#endif
void DMA_In(U16 Pipe)
{
U16 size, count, mxps;
register U16 buffer;
SetEpPid(Pipe, PID_NAK);
mxps = getMaxPacketSize(Pipe); /* Max Packet Size */
USBRD(D0FIFOCTR, buffer);
size = buffer & DTLN;
if( dtcnt[Pipe] < size ) { /* Buffer Full ? */
count = 0;
dtcnt[Pipe] = 0;
} else if( size % mxps ) { /* Short Packet ? */
count = size;
dtcnt[Pipe] = 0;
} else {
count = size;
dtcnt[Pipe] -= size;
}
Buffer_Read_Data_Size[Pipe] += count;
if( dtcnt[Pipe] == 0 ) {
DisableIntR(Pipe); /* Disable Ready Interrupt */
Buffer_Read_Data_Flag[Pipe] = DATA_OK;
} else {
SetEpPid(Pipe, PID_BUF); /* Set BUF */
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -