?? controlrw.c
字號:
#include "defusr.h"
#include "macusr.h"
#include "libassp.h"
#include "extern.h"
#include <linux/delay.h>
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Control write start
*-----------------------------------------------------------------------------
* Declaration : void CW_Start(U16 Bsize, U8 *Table)
*-----------------------------------------------------------------------------
* Argument : U16 Bsize ; Data Size
* : U8 *Table ; Data Table Address
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void CW_Start(U32 Bsize, U8 *Table)
{
dtcnt[PIPE0] = Bsize;
dtptr[PIPE0] = (U8 *)Table;
USBWR(DCPCTR, SQSET); /* SQSET=1,PID=NAK */
USB_SET_PAT(DCPCFG, DIR); /* DIR=1 */
USB_MDF_PAT(CFIFOSEL, (ISEL | PIPE0), (ISEL | CURPIPE)); /* ISEL=1, CURPIPE=EP0 */
USBWR(CFIFOCTR, BCLR);
Control_Write();
}
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Control write
*-----------------------------------------------------------------------------
* Declaration : void Control_Write(void)
*-----------------------------------------------------------------------------
* Argument : void
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void Control_Write(void)
{
U16 count, max_size, maxp;
register U16 even, buffer;
max_size = dcpMaxPacketSize(); /* MaxPacketSize */
if( dtcnt[PIPE0] < max_size ) {
count = dtcnt[PIPE0];
} else {
count = max_size;
}
USB_CLR_STS(BEMPSTS, BEMP0);
do {
USBRD(CFIFOCTR, buffer);
} while( (buffer & FRDY) == 0 );
USBRD(CFIFOSEL, buffer);
if( (buffer & MBW) == MBW_8 ) {
for( even = count; even; --even ) {
USBWR_FF(CFIFO_8, *dtptr[PIPE0]);
dtptr[PIPE0] += 1;
}
} else {
for( even = count / 2; even; --even ) {
USBWR_FF(CFIFO, *((U16 *)dtptr[PIPE0]));
dtptr[PIPE0] += 2;
}
if( (count % 2) != 0 ) {
USBWR_FF(CFIFO_8, *dtptr[PIPE0]);
dtptr[PIPE0] += 1;
}
}
#if 0
if( dtcnt[PIPE0] < max_size ) {
dtcnt[PIPE0] = 0;
USBRD(CFIFOCTR, buffer);
if( (buffer & BVAL) == 0 )
USBWR(CFIFOCTR, BVAL); /* Short Packet */
} else {
dtcnt[PIPE0] -= count;
}
if( (dtcnt[PIPE0] > 0) || ((count & max_size) == 0) ) {
USB_SET_PAT(BEMPENB, BEMP0);
}
#endif
#if 1
if( dtcnt[PIPE0] < max_size ) {
dtcnt[PIPE0] = 0;
USBRD(CFIFOCTR, buffer);
if( (buffer & BVAL) == 0 )
USBWR(CFIFOCTR, BVAL); /* Short Packet */
USBRD(DCPMAXP, buffer);
maxp = buffer & MAXP;
if ( (count % maxp) == 0 )
USB_SET_PAT(BEMPENB, BEMP0);
}
else {
dtcnt[PIPE0] -= count;
USB_SET_PAT(BEMPENB, BEMP0);
}
#endif
USB_SET_PAT(DCPCTR, PID_BUF);
}
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Control read start
*-----------------------------------------------------------------------------
* Declaration : void CR_Start(U16 Bsize, U8 *Table)
*-----------------------------------------------------------------------------
* Argument : U16 Bsize ; Data Size
* : U8 *Table ; Data Table Address
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void CR_Start(U32 Bsize, U8 *Table)
{
dtcnt[PIPE0] = Bsize;
dtptr[PIPE0] = (U8 *)Table;
USBWR(DCPCTR, SQSET); /* SQSET=1,PID=NAK */
USB_CLR_PAT(DCPCFG, DIR); /* DIR=0 */
USB_MDF_PAT(CFIFOSEL, PIPE0, (ISEL | CURPIPE)); /* ISEL=0, CURPIPE=EP0 */
USBWR(CFIFOCTR, BCLR); /* Buffer Clear */
USB_SET_PAT(BRDYENB, BRDY0);
USB_SET_PAT(DCPCTR, PID_BUF);
}
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Control read
*-----------------------------------------------------------------------------
* Declaration : void Control_Read(void)
*-----------------------------------------------------------------------------
* Argument : void
*-----------------------------------------------------------------------------
* Return : void
*-----------------------------------------------------------------------------
* Note :
*-----------------------------------------------------------------------------
*""FUNC COMMENT END""********************************************************/
void Control_Read(void)
{
U16 count, dtln, max_size;
U16 endflg = 0;
register U16 even, buffer;
SetEpPid(PIPE0, PID_NAK);
do {
USBRD(CFIFOCTR, buffer);
} while( (buffer & FRDY) == 0 );
dtln = buffer & DTLN; /* Get data size */
max_size = dcpMaxPacketSize(); /* MaxPacketSize */
if( dtln < max_size ) {
endflg = 1; /* Short packet */
}
if( dtcnt[PIPE0] < dtln ) {
count = dtcnt[PIPE0];
endflg = 1;
} else {
count = dtln;
}
if( dtln == 0 ) { /* 0 length packet */
USBWR(CFIFOCTR, BCLR); /* Clear BVAL */
} else {
USBRD(CFIFOSEL, buffer);
if( (buffer & MBW) == MBW_8 ) {
for( even = count; even; --even ) {
USBRD_FF(CFIFO_8, *dtptr[PIPE0]);
dtptr[PIPE0] += 1;
}
} else {
for( even = count / 2; even; --even ) {
USBRD_FF(CFIFO, *((U16 *)dtptr[PIPE0]));
dtptr[PIPE0] += 2;
}
if( (count % 2) != 0 ) {
USBRD_FF(CFIFO_8, *dtptr[PIPE0]);
dtptr[PIPE0] += 1;
}
}
}
if( dtcnt[PIPE0] < count ) {
dtcnt[PIPE0] = 0;
} else {
dtcnt[PIPE0] -= count;
}
if( dtcnt[PIPE0] == 0 ) {
endflg = 1;
}
if( endflg == 1 ) {
dtcnt[PIPE0] = 0;
USB_CLR_PAT(BRDYENB, BRDY0);
} else {
USB_SET_PAT(DCPCTR, PID_BUF);
}
}
/*""FUNC COMMENT""*************************************************************
*-----------------------------------------------------------------------------
* Function : Control no data write
*-----------------------------------------------------------------------------
* Declaration : U16 ControlNoWrite(U16 Req, U16 Val, U16 Indx, U16 Len)
*-----------------------------------------------------------------------------
* Argument : U16 Req ; bmRequestType & bRequest
* : U16 Val ; wValue
* : U16 Indx ; wIndex
* : U16 Len ; wLength
*-----------------------------------------------------------------------------
* Return : U16 ; SACK : Done
* : ; SIGN : Error
*-----------------------------------------------------------------------------
* Note :
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -