📄 mainloop.c
字号:
{
// if possiblek check the setup again if there is any new setup came and overwrite the old one. (Jiang Qian)
bISP1581flags.bits.At_IRQL1 = 0;
LowerIRQL();
/*
// After Checking OverWritten Bit, It's sure that Setup Pkt Data is valid.
*/
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;
// cprintf("brequest, x%xh, bmrequest x%xh \r\n",ControlData.DeviceRequest.bRequest, ControlData.DeviceRequest.bmRequestType);
if (ControlData.DeviceRequest.bmRequestType & (UCHAR)USB_ENDPOINT_DIRECTION_MASK)
{
/* get command */
RaiseIRQL();
ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
if((ControlData.DeviceRequest.bRequest == 0) & (ControlData.DeviceRequest.bmRequestType == 0xc0))
{
bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE; // WORKAROUND FIX CONTROL END WITH OUT 1(NO DATA).
#ifdef debug
cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
}
else
{
bISP1581flags.bits.CONTROL_HANDLE_DONE = 1;
bISP1581flags.bits.DCP_state = USBFSM4DCP_REQUESTPROC;
#ifdef debug
cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
}
LowerIRQL();
}
else
{
/* set command */
if (ControlData.DeviceRequest.wLength == 0)
{
/* Set command without Data stage*/
RaiseIRQL();
ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
bISP1581flags.bits.CONTROL_HANDLE_DONE = 1;
bISP1581flags.bits.DCP_state = USBFSM4DCP_REQUESTPROC; // no such command now.
#ifdef debug
cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
LowerIRQL();
}
else
{
/*
// Set command with Data stage
// get Data Buffer
*/
if(ControlData.DeviceRequest.wLength <= MAX_CONTROLDATA_SIZE)
{
/* set command with OUT token */
RaiseIRQL();
bISP1581flags.bits.DCP_state = USBFSM4DCP_DATAOUT;
#ifdef debug
cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
LowerIRQL();
}
else
{
RaiseIRQL();
ISP1581_ClearBuffer(EPINDEX4CONTROL_SETUP);
ISP1581_StallEP0InControlWrite();
bISP1581flags.bits.DCP_state = USBFSM4DCP_STALL;
#ifdef debug
cprintf("^_^%hx\n Unknow set up command\n", bISP1581flags.bits.DCP_state);
#endif
LowerIRQL();
}
}
}
}
else
{
#ifdef debug
cprintf("wrong setup command\r\n");
#endif
bISP1581flags.bits.At_IRQL1 = 0;
LowerIRQL();
Chap9_StallEP0();
}
}
void DeviceRequest_Handler(void)
{
UCHAR type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
#ifdef debug
// cprintf("type = x%hx, req = x%hx\n", type, req);
#else
help_devreq(type, req); /* print out device request */
#endif
if ((type == USB_STANDARD_REQUEST) && (req < MAX_STANDARD_REQUEST))
(*StandardDeviceRequest[req])();
else if ((type == USB_CLASS_REQUEST) && (req <= MAX_CLASS_REQUEST))
(*ClassDeviceRequest[req])();
else if ((type == USB_VENDOR_REQUEST) && (req < MAX_VENDOR_REQUEST))
(*VendorDeviceRequest[req])();
else{
Chap9_StallEP0();
}
}
void help_devreq(UCHAR type, UCHAR req)
{
UCHAR typ = type;
typ >>= 5;
if(type == USB_STANDARD_REQUEST) {
cprintf("\n\r%s Request: %s ", _NAME_USB_REQUEST_TYPE[typ],
_NAME_USB_STANDARD_REQUEST[req]);
// cprintf("\n\rRequest Type = %s, Request = %s ", _NAME_USB_REQUEST_TYPE[typ],
// _NAME_USB_STANDARD_REQUEST[req]);
}
else if(type == USB_VENDOR_REQUEST) {
cprintf("\n\r%s Request: %s ", _NAME_USB_REQUEST_TYPE[typ],
_NAME_USB_VENDOR_REQUEST[req]);
// cprintf("\n\rRequest Type = %s, Request = %s ", _NAME_USB_REQUEST_TYPE[typ],
// _NAME_USB_VENDOR_REQUEST[req]);
}
else if(type == USB_CLASS_REQUEST) {
cprintf("\n\rRequest Type = %s, Request = %s ", _NAME_USB_REQUEST_TYPE[typ],
_NAME_USB_CLASS_REQUEST[req]);
}
else {
if(bISP1581flags.bits.verbose)
cprintf("\n\rRequest Type = %s, bRequest = 0x%x ", _NAME_USB_REQUEST_TYPE[typ],
req);
}
}
void init_port(void)
{
unsigned long phys;
privateBuffer = (unsigned short far *)farmalloc(DMA_BUFFER_SIZE*2L);
if(privateBuffer == NULL) {
cprintf("Error allocation memory!\r\n");
exit(1);
}
phys = (unsigned long)FP_SEG(privateBuffer)*16 + FP_OFF(privateBuffer);
if( (phys&0x0ffffL) == 0 ) {
dmaBuffer = phys;
}
else {
phys &= 0xf0000L;
phys += 0x10000;
dmaBuffer = phys;
}
cprintf("privateBuffer allocated at %p, dmaBuffer at %lx; \r\n",
privateBuffer, dmaBuffer);
privateBuffer = (unsigned short far *)farmalloc(DMA_BUFFER_SIZE*2L);
if(privateBuffer == NULL) {
cprintf("Error allocation memory!\r\n");
exit(1);
}
phys = (unsigned long)FP_SEG(privateBuffer)*16 + FP_OFF(privateBuffer);
if( (phys&0x0ffffL) == 0 ) {
isoBuffer = phys;
}
else {
phys &= 0xf0000L;
phys += 0x10000;
isoBuffer = phys;
}
cprintf("privateBuffer for ISO allocated at %p, isoBuffer at %lx, \r\n",
privateBuffer, isoBuffer);
}
void Initialize( void)
{
init_port();
Hal4Sys_AcquireFPGA();
Hal4Sys_AcquireSerial(); /* AcquireSerial first to output debug info via UART */
Hal4Sys_AcquireKeypad();
Hal4Sys_ResetPCBA();
Hal4Sys_AcquireLED();
Hal4Sys_AcquireTimer0();
ISP1581_Acquire(); /* Acquire ISP1581 last to let ISP1581 connect after complete initialisation */
}
void on_exit(void)
{
UCHAR c;
Hal4Sys_ControlISP1581Interrupt(FALSE);
RaiseIRQL();
// debug, check dma state register
// cprintf("\r\n dma state = %x", ISP1581_GetDMAState());
ISP1581_Release();
Hal4Sys_ReleaseTimer0();
Hal4Sys_ReleaseLED();
Hal4Sys_ReleaseKeypad();
Hal4Sys_ReleaseSerial();
Hal4Sys_ReleaseFPGA();
disconnect_USB();
outportb(0x20,0x20);
LowerIRQL();
//free mem
farfree(privateBuffer);
}
void disconnect_USB(void)
{
/*
// Initialize ISP1581 configuration
*/
ISP1581_SetTestMode(testmode_forcefs);
//You may need some delay here if MPU is very fast.
ISP1581_SetMode( mode_glintena\
|mode_pwroff\
/* |mode_wkupcs*/);
// |mode_softct);
cprintf("disconnect device, D+ pull up removed\r\n");
// ISP1581_ResetDevice();
}
void connect_USB(void)
{
UCHAR c;
USHORT i;
/*
// reset event flags
*/
RaiseIRQL();
bISP1581flags.value = 0;
bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
cprintf("Pull Resister connected, USB_STATES is ^_^%hx4", bISP1581flags.bits.DCP_state);
ISP1581_Initiate();
LowerIRQL();
}
void ISP1581_Initiate(void)
{
// ISP1581_IntClearl(0xff);
// ISP1581_IntClearh(0xff);
ISP1581_SetAddressEnable(0x00, 0x01); // set address to 0 and enable it.
ISP1581_SetMode( mode_glintena
// |mode_wkupcs
|mode_pwroff
|mode_softct
//|mode_clkaon
);
ISP1581_SetTestMode(0); // clear test mode
ISP1581_SetIntConfig(0x0
|intcfg_cdbgmod_as // control interrupt on ack and stall
|intcfg_ddbgmodin_a // IN data interrupt on ack only
|intcfg_ddbgmodout_asy // OUT data on ack and stall and nyet intertupt
//|intcfg_polh); // level interrupt and active high
// |intcfg_edgetrig
);
ISP1581_SetIntEnableLow(int_busreset|int_susp|int_resume
|int_hs_stat|int_dma|int_ep0set
|int_ep0rx|int_ep0tx
|int_ep1rx|int_ep1tx
|int_ep2rx|int_ep2tx
);
ISP1581_SetIntEnableHigh(int_ep3rx|int_ep3tx
|int_ep4rx|int_ep4tx
|int_ep5rx|int_ep5tx
|int_ep6rx|int_ep6tx
|int_ep7rx|int_ep7tx);
ISP1581_ConfigEndpoint(); // default config as a full speed device
ISP1581_SetDMAHDCfg(dmahd_dreqpolh/*|dmahd_dackpolh*/|dmahd_eotpolh/*|dmahd_readpolh|dmahd_writepolh*/);
ISP1581_SetDMAConfig(/*dmacfg_width16|*/dmacfg_modediorw/*|dmacfg_modediorack*/|dmacfg_burst1);
}
void ISP1581_ConfigEndpoint(void)
{
// disable all endpoint firsr;
ISP1581_SetEndpointConfig(EPINDEX4EP01OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP01IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP02OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP02IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP03OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP03IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP04OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP04IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07IN, 0);
ISP1581_SetEPMAXSize(EPINDEX4EP01OUT, maxepsize_16);
ISP1581_SetEPMAXSize(EPINDEX4EP01IN, maxepsize_16);
switch(bISP1581flags.bits.ConnectSpeed)
{
case FullSpeed:
{
globe_variable.maxepsize_bulk = maxepsize_FS;
break;
}
case HighSpeed:
{
globe_variable.maxepsize_bulk = maxepsize_HS;
break;
}
default:
{
globe_variable.maxepsize_bulk = maxepsize_FS;
break;
}
}
ISP1581_SetEPMAXSize(EPINDEX4EP02OUT, globe_variable.maxepsize_bulk);
ISP1581_SetEPMAXSize(EPINDEX4EP02IN, globe_variable.maxepsize_bulk);
ISP1581_SetEPMAXSize(EPINDEX4EP03OUT, maxepsize_256);
ISP1581_SetEPMAXSize(EPINDEX4EP03IN, maxepsize_256);
ISP1581_SetEPMAXSize(EPINDEX4EP04OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP04IN, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP05OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP05IN, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP06OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP06IN, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP07OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP07IN, maxepsize_0);
// set endpoint type;
ISP1581_SetEndpointConfig(EPINDEX4EP01OUT, eptype_bulk|eptype_enable/*|eptype_doublebuf*/);
ISP1581_SetEndpointConfig(EPINDEX4EP01IN, eptype_bulk|eptype_enable);//|eptype_doublebuf);//|eptype_noempkt);
ISP1581_SetEndpointConfig(EPINDEX4EP02OUT, eptype_bulk|eptype_enable|eptype_doublebuf);
ISP1581_SetEndpointConfig(EPINDEX4EP02IN, eptype_bulk|eptype_enable|eptype_doublebuf|eptype_noempkt);
ISP1581_SetEndpointConfig(EPINDEX4EP03OUT, eptype_iso|eptype_enable|eptype_doublebuf);
ISP1581_SetEndpointConfig(EPINDEX4EP03IN, eptype_iso|eptype_enable|eptype_doublebuf);
ISP1581_SetEndpointConfig(EPINDEX4EP04OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP04IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07IN, 0);
ISP1581_ClearBuffer(EPINDEX4EP01OUT);
ISP1581_ClearBuffer(EPINDEX4EP01IN);
ISP1581_ClearBuffer(EPINDEX4EP02OUT);
ISP1581_ClearBuffer(EPINDEX4EP02IN);
ISP1581_ClearBuffer(EPINDEX4EP03OUT);
ISP1581_ClearBuffer(EPINDEX4EP03IN);
}
void reconnect_USB(void)
{
ULONG clk_cnt;
/*
// reconnect USB and On LED 1 second.
*/
// Hal4Sys_ControlLEDPattern(0x00);
disconnect_USB();
/* cprintf("Wait for 1 second ...\r\n");
clk_cnt = Hal4Sys_ClockTicks;
while(Hal4Sys_ClockTicks < clk_cnt + 20)
*/ ;
connect_USB();
}
void Isr_BusReset(void)
{
// cprintf("\r\nMode register value = %x", ISP1581_GetMode());
bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
bISP1581flags.bits.dma_state = DMA_IDLE;
ioRequest.bAddressH = 0;
ioRequest.uAddressL = 0;
ioRequest.uSize = 0;
globe_variable.ioINSize = 0;
globe_variable.ioINCount = 0;
globe_variable.ioOUTSize = 0;
globe_variable.ioOUTCount = 0;
ISP1581_Initiate();
}
void suspend_change(void)
{
// ISP1581_GoSuspend();
return;
}
void ML_ClearBufferEP0(void)
{
}
void ML_Reserved(void)
{
ISP1581_ClearBuffer(EPINDEX4CONTROL_OUT);
}
void Sample_INT(void)
{
Hal4Sys_ControlISP1581Interrupt(TRUE);
Hal4Sys_ControlISP1581Interrupt(FALSE);
}
void Device_Initiate(void)
{
disconnect_USB();
Hal4Sys_ControlISP1581Interrupt(FALSE);
bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
bISP1581flags.bits.dbg =0;
bISP1581flags.bits.verbose =0;
bISP1581flags.bits.ConnectSpeed = FullSpeed;
bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
bISP1581flags.bits.testmode = 0;
bISP1581flags.bits.testmodeen = 0;
bISP1581flags.bits.dma_state = DMA_IDLE;
bISP1581flags.bits.FREE_DMA_CHANNEL = 0;
bISP1581flags.bits.CONTROL_HANDLE_DONE = 0;
bISP1581flags.bits.ISO_CONFIG = 0;
// ISP1581_SetDMAInt(0xffff);//c);
ISP1581_IntClearl(0xffff);
ISP1581_IntClearh(0xffff);
ioRequest.bAddressH = 0;
ioRequest.uAddressL = 0;
ioRequest.uSize = 0;
globe_variable.ioINSize = 0;
globe_variable.ioINCount = 0;
globe_variable.ioOUTSize = 0;
globe_variable.ioOUTCount = 0;
globe_variable.isoINSize = 0;
globe_variable.isoINCount = 0;
globe_variable.isoOUTSize = 0;
globe_variable.isoOUTCount = 0;
Initialize();
cprintf("\r\nISP1581 Evaluation Kit Firmware REV 1.00 \r\n");
ISP1581_ReadChipID();
cprintf("Philips Electronics Singapore PTE LTD - APIC");
cprintf("\r\nhttp://www.semiconductors.philips.com/buses/usb/\r\nEmail: wired.support@philips.com");
cprintf("\r\n");
/* Power on reset, lightup LEDs for 1 sec,
disconnect and reconnect Soft-Connect */
cprintf("Re-connect ISP1581 demo board.\r\n");
/* Hal4Sys_ControlISP1581Interrupt(FALSE);
cprintf("\r\nTest Mode Packet\r\n");
ISP1581_SetTestMode(testmode_prbs|testmode_forcehs);
key2go();
*/
outportb(0x20,0x20);
connect_USB();
return;
}
void Reconnect(void)
{
Hal4Sys_ControlISP1581Interrupt(FALSE);
bISP1581flags.bits.DCP_state = USBFSM4DCP_IDLE;
bISP1581flags.bits.dbg =0;
bISP1581flags.bits.verbose =0;
bISP1581flags.bits.ConnectSpeed = FullSpeed;
bISP1581flags.bits.Vendor_CMD = BULKIN_Idle;
bISP1581flags.bits.testmode = 0;
bISP1581flags.bits.testmodeen = 0;
bISP1581flags.bits.dma_state = DMA_IDLE;
bISP1581flags.bits.CONTROL_HANDLE_DONE = 0;
bISP1581flags.bits.FREE_DMA_CHANNEL = 0;
bISP1581flags.bits.ISO_CONFIG = 0;
// ISP1581_SetDMAInt(0xffff);//c);
ISP1581_IntClearl(0xffff);
ISP1581_IntClearh(0xffff);
ioRequest.bAddressH = 0;
ioRequest.uAddressL = 0;
ioRequest.uSize = 0;
globe_variable.ioINSize = 0;
globe_variable.ioINCount = 0;
globe_variable.ioOUTSize = 0;
globe_variable.ioOUTCount = 0;
globe_variable.isoINSize = 0;
globe_variable.isoINCount = 0;
globe_variable.isoOUTSize = 0;
globe_variable.isoOUTCount = 0;
outportb(0x20,0x20);
connect_USB();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -