📄 usbd.c
字号:
/*
* timer.c: funcitons implement for timer
*/
#include "frame.h"
#include "lib.h"
#include "usbd.h"
#ifdef _DEBUG
#include <stdio.h>
#endif /* _DEBUG */
static void
config_usbd(void)
{
/*Disable suspend mode*/
PWR_REG = DISABLE_SUSPEND;
INDEX_REG = 0;
MAXP_REG = FIFO_SIZE_8;
EP0_CSR = EP0_SERVICED_OUT_PKT_RDY | EP0_SERVICED_SETUP_END;
INDEX_REG = 1;
MAXP_REG = FIFO_SIZE_32;
IN_CSR1_REG = EPI_FIFO_FLUSH | EPI_CLR_DATA_TOGGLE;
/*IN mode, IN_DMA_INT=masked*/
IN_CSR2_REG = EPI_MODE_IN | EPI_IN_DMA_INT_MASK | EPI_BULK;
OUT_CSR1_REG = EPO_CLR_DATA_TOGGLE;
OUT_CSR2_REG = EPO_BULK | EPO_OUT_DMA_INT_MASK;
INDEX_REG = 3;
MAXP_REG = FIFO_SIZE_32;
IN_CSR1_REG = EPI_FIFO_FLUSH | EPI_CLR_DATA_TOGGLE|EPI_BULK;
/*OUT mode, IN_DMA_INT=masked*/
IN_CSR2_REG = EPI_MODE_OUT | EPI_IN_DMA_INT_MASK;
OUT_CSR1_REG = EPO_CLR_DATA_TOGGLE;
OUT_CSR2_REG = EPO_BULK | EPO_OUT_DMA_INT_MASK;
EP_INT_REG = EP0_INT | EP1_INT | EP2_INT | EP3_INT | EP4_INT;
USB_INT_REG = RESET_INT | SUSPEND_INT | RESUME_INT;
EP_INT_EN_REG = EP0_INT | EP1_INT | EP3_INT;
USB_INT_EN_REG = RESET_INT | SUSPEND_INT;
}
static void
usbd_isr(struct contextframe *cf, int irq)
{
unsigned char save_index_reg;
unsigned char usbd_int_pnd;
unsigned char ep_int_pnd;
//printf("usbd_isr\n");
save_index_reg = INDEX_REG;
usbd_int_pnd = USB_INT_REG;
ep_int_pnd = EP_INT_REG;
if(usbd_int_pnd & SUSPEND_INT)
{
USB_INT_REG = SUSPEND_INT;
}
if(usbd_int_pnd & RESUME_INT)
{
USB_INT_REG = RESUME_INT;
}
if(usbd_int_pnd & RESET_INT)
{
//printf("USB reset\n");
config_usbd();
USB_INT_REG = RESET_INT;
}
if(ep_int_pnd & EP0_INT)
{
//printf("ep0_handler\n");
EP_INT_REG = EP0_INT;
ep0_handler();
}
else if(ep_int_pnd & EP1_INT)
{
//printf("ep1_handler\n");
EP_INT_REG = EP1_INT;
ep1_handler();
}else if(ep_int_pnd & EP3_INT)
{
//printf("ep3_handler\n");
EP_INT_REG = EP3_INT;
ep3_handler();
}
INDEX_REG = save_index_reg;
}
static void
change_upll(void)
{
UPLLCON = (U_MDIV<<12) | (U_PDIV<<4) | U_SDIV;
}
void
init_usb(void)
{
change_upll();
init_descriptor();
config_usbd();
ivt[INT_USBD] = usbd_isr;
CLEAR_PENDING(INT_USBD);
INT_ENABLE(INT_USBD);
}
void
read_pkt_ep0( unsigned char *buf, int len)
{
int i;
for(i = 0; i < len; i++)
{
buf[i] = EP0_FIFO;
}
}
void
write_pkt_ep0( unsigned char *buf, int len)
{
int i;
for(i = 0; i < len; i++)
{
EP0_FIFO = buf[i];
}
}
void
write_byte_ep0(unsigned char value)
{
EP0_FIFO = value;
}
void
write_pkt_ep1(unsigned char *buf, int len)
{
int i;
for(i = 0; i < len; i++)
{
EP1_FIFO = buf[i];
}
}
void
read_pkt_ep3(unsigned char *buf, int len)
{
int i;
for(i = 0; i < len; i++)
{
buf[i]=EP3_FIFO;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -