📄 usb_fusb150.c
字号:
#include "uart.h"
#include "usb.h"
#include "usblib.h"
#include "usb_dsc.h"
void dld_ReadEndpoint_0(U32 * buf);
typedef struct
{
usb_dev_class_setup_type setup;
} usb_dev_class_control_buf_type;
/*=============================================================================
G L O B A L V A R I A B L E S
=============================================================================*/
extern USB_Control_Block UsbCb;
/*=============================================================================
E X T E R N A L F U N C T I O N S
=============================================================================*/
extern void dld_UsbStandardReq(void);
/*=============================================================================
I N T E R N A L F U N C T I O N S
=============================================================================*/
void UsbControl(void){
if((UsbCb.sControl.setup.bmRequestType & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD)
{
dld_UsbStandardReq();
}
}
void dld_Ep0Rxhandler(void)
{
U8 usbsetupflag = 0;
dld_ReadEndpoint_0((U32 *)(&UsbCb.sControl.setup));
UsbCb.sControl.wLength = UsbCb.sControl.setup.wLength;
UsbCb.sControl.wCount = 0;
if (UsbCb.sControl.setup.bmRequestType & USB_ENP_DIR_MASK )//In
{
usbsetupflag = 1;
}
else//Out
{
if (UsbCb.sControl.setup.wLength == 0)
{
usbsetupflag = 1;
}
mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK);
}
if(usbsetupflag)
{
if((UsbCb.sControl.setup.bmRequestType & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD)
{
dld_UsbStandardReq();
}
}
}
void dld_Ep1TxHandler(void)
{
U16 i = UsbCb.sControl.wLength - UsbCb.sControl.wCount;
if( i >= USB_MAX_PKT_SIZE_ENP0)
{
Wr_ep0(UsbCb.sControl.pData + UsbCb.sControl.wCount, USB_MAX_PKT_SIZE_ENP0);
UsbCb.sControl.wCount += USB_MAX_PKT_SIZE_ENP0;
}
else if( i != 0)
{
Wr_ep0(UsbCb.sControl.pData + UsbCb.sControl.wCount, i);
UsbCb.sControl.wCount += i;
mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK);
}
else if (i == 0)
{
mb_CtlEDCtlCXCMPLTSet(_CtlEDCtlCXCMPLT_ACK);
}
}
void dld_ReadEndpoint_0(U32 * buf){
U32 *p = buf;
*p++ = mw_CtlCmd120C();
*p = mw_CtlCmd1210();
}
void Rd_ep_fifo(U32 endp, U8 *buf, int length){
U32 i, Q, R, *pDWordBuf;
U8 *bpRemainBuf;
if(((U32)buf & 0x3)==0){
Q = length >> 2;
R = length & 0x3;
pDWordBuf = (U32 *)buf;
for(i=0; i<Q; i++)
*pDWordBuf++ = mdw_EDnDataRd(endp);
bpRemainBuf = (U8 *)pDWordBuf;
if( R ){
for(i=0; i < R; i++)
bpRemainBuf[i] = mb_EDnDataRd(endp);
}
}
else{
bpRemainBuf = buf;
for(i=0; i<length; i++)
bpRemainBuf[i] = mb_EDnDataRd(endp);
}
}
void Rd_ep_fifo_CS(U32 endp, U8 *buf, int length){
U32 i;
Rd_ep_fifo(endp, buf, length);
for(i=0; i<length; i++)
checkSum += buf[i];
}
U32 getFifoCnt(U32 endp){
U32 length;
mb_EDnStsDPKTClr(endp);
length = mw_EDnStsBF1LenRd(endp) + mw_EDnStsBF0LenRd(endp);
return length;
}
U16 Rd_ep(U32 endp, U8 * buf){
U16 length;
U32 i, Q, R;
U32 *pDWordBuf;
U8 *bpRemainBuf;
mb_EDnStsDPKTClr(endp);
length = mw_EDnStsBF1LenRd(endp) + mw_EDnStsBF0LenRd(endp);
if(((U32)buf & 0x3)==0){
Q = length >> 2;
R = length & 0x3;
pDWordBuf = (U32 *)buf;
for(i=0; i<Q; i++)
*pDWordBuf++ = mdw_EDnDataRd(endp);
bpRemainBuf = (U8 *)pDWordBuf;
if( R ){
for(i=0; i < R; i++)
bpRemainBuf[i] = mb_EDnDataRd(endp);
}
}
else{
bpRemainBuf = buf;
for(i=0; i<length; i++)
bpRemainBuf[i] = mb_EDnDataRd(endp);
}
return length;
}
void Wr_ep(U32 endp, U8 * buf, U32 length){
U32 i, Q, R, bBufferNum;
const U32 *pDWordBuf;
const U8 *bpRemainBuf;
mb_EDnStsDPKTClr(endp);
bBufferNum = mb_EDnStsBSelRd(endp);
if(((U32)buf & 3)==0){//Aligned
Q = length >> 2;
R = length & 3;
pDWordBuf = (U32 *)buf;
for(i=0; i<Q; i++)
mdw_EDnDataSet(endp, *pDWordBuf++);
bpRemainBuf = (const U8 *)pDWordBuf;
if( R ){
for(i=0; i < R; i++)
mb_EDnDataSet(endp, bpRemainBuf[i]);
}
}
else{//not-Aligned
bpRemainBuf = buf;
for(i=0; i<length; i++)
mb_EDnDataSet(endp, bpRemainBuf[i]);
}
if(bBufferNum) mb_EDnStsBF1RDYSet(endp);
else mb_EDnStsBF0RDYSet(endp);
}
U16 Rd_ep0(U8 * buf){
U16 length;
U32 i, Q, R;
U32 *pDWordBuf;
U8 *bpRemainBuf;
length = mw_CtlEDStsBF0LenRd();
if(((U32)buf & 0x3)==0){
Q = length >> 2;
R = length & 0x3;
pDWordBuf = (U32 *)buf;
for(i=0; i<Q; i++)
*pDWordBuf++ = mdw_CtlEDDataRd();
bpRemainBuf = (U8 *)pDWordBuf;
if( R ){
for(i=0; i < R; i++)
bpRemainBuf[i] = mb_CtlEDDataRd();
}
}
else{
bpRemainBuf = buf;
for(i=0; i<length; i++)
bpRemainBuf[i] = mb_CtlEDDataRd();
}
return length;
}
void Wr_ep0(U8 * buf, U32 length){
U32 i, Q, R;
const U32 *pDWordBuf;
const U8 *bpRemainBuf;
if(((U32)buf & 3)==0){//Aligned
Q = length >> 2;
R = length & 3;
pDWordBuf = (U32 *)buf;
for(i=0; i<Q; i++)
mdw_CtlEDDataSet(*pDWordBuf++);
bpRemainBuf = (const U8 *)pDWordBuf;
if( R ){
for(i=0; i < R; i++)
mb_CtlEDDataSet(bpRemainBuf[i]);
}
}
else{//not-Aligned
bpRemainBuf = buf;
for(i=0; i<length; i++)
mb_CtlEDDataSet(bpRemainBuf[i]);
}
}
void vUsbFIFO_EPxCfg_FS(void){
mb_EDnCtlByte3(EP1, EP1_CFG);
mb_EDnCtlBF0CLRSet(EP1);
mb_EDnCtlBF1CLRSet(EP1);
mb_EDnStsTHOD(EP1,0);
mb_EDnCtlByte1(EP1, DPKT_IE);
mw_Ctl_ED_IESet(EP1);
mb_EDnCtlByte3(EP2, EP2_CFG);
mb_EDnCtlBF0CLRSet(EP2);
mb_EDnCtlBF1CLRSet(EP2);
mb_EDnStsTHOD(EP2,0);
mb_EDnCtlByte1(EP2, DPKT_IE);
mw_Ctl_ED_IESet(EP2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -