📄 mainloop.c
字号:
/*
//*************************************************************************
//
// P H I L I P S P R O P R I E T A R Y
//
// COPYRIGHT (c) 2000-2002 BY PHILIPS SINGAPORE.
// -- ALL RIGHTS RESERVED --
//
// File Name: MainLoop.C
// Created: Jun. 8, 2000
// Modified: Jun. 6, 2002 by wang.zhong.wei@philips.com
// Revision: 1.0
//
//*************************************************************************
// Release History:
// v1.0 (2002-Jun-06 wzw):
// - Support ISP1362 PCI and ISA boards
//*************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>
#include <dos.h>
#include <conio.h>
#include "BasicTyp.h"
#include "common.h"
#include "DcCommon.h"
#include "SysCnfg.h"
#include "USB100.h"
#include "Hal4sys.h"
#include "Hal4ISA.h"
#include "Hal4IKit.h"
#include "Hal4Hc.h"
#include "PHC_Reg.h"
#include "PHC_HcS.h"
#include "HcHandle.h"
#include "Hal4D13.h"
#include "D13_REG.h"
#include "D13_DcS.h"
#include "DcHandle.h"
#include "Hal4OTG.h"
#include "OTGSvc.h"
#include "mainloop.h"
#include "PCI.h"
/*
//*************************************************************************
// Public static data
//*************************************************************************
*/
UCHAR bVerbose = 0;
UCHAR bVerboseHCS = 0;
UCHAR bIRQL =0;
ULONG IRQ4D13_CHNNL;
ULONG IRQ4HC_CHNNL;
ULONG HC_IO_BASE;
ULONG HC_COM;
ULONG HC_DATA;
ULONG DC_COM;
ULONG DC_DATA;
BOOLEAN ISP1362_PCIKIT;
BOOLEAN ISP1362_ISAKIT;
// Task Control Block
extern DC_TCB D13TaskControlBlock;
// USB Device Info
extern USB_DEV_INFO D13_DevInfo;
// USB Default Control Pipe
extern CONTROL_XFER DCPCtrlXfer;
extern OTG_TCB OtgTcb;
extern OTG_REG OtgReg;
/*
//*************************************************************************
// Main Function
//*************************************************************************
*/
void main(void)
{
UCHAR Last_State = 99;
clrscr();
printf("\n==========================================================");
printf("\n| |");
printf("\n| ISP1362 OnTheGo Test Program ver1.0 |");
printf("\n| Philips Semiconductors APIC |");
printf("\n| |");
printf("\n==========================================================");
printf("\n");
MLSup_Init();
prn_menu_message();
/* Main program loop */
do
{
//handle the error messages
switch(OtgTcb.err_code)
{
case OTG_ERR_PLUGA_INSERTED:
printf("OTG port: mini-A plug inserted!\n");
break;
case OTG_ERR_PLUGA_REMOVED:
printf("OTG port: mini-A plug removed!\n");
break;
case OTG_ERR_A_OVERCURRENT:
printf("OTG port: VBUS over current! Press 'D' to return to A_IDLE.\n");
break;
case OTG_ERR_SRP_FAIL:
printf("Error: SRP fail. No repsonse from A-device.\n");
OtgTcb.bus_req = 0;
break;
case OTG_ERR_A_WAIT_BCON_TMOUT:
printf("Error: No response from B-device.\n");
OtgTcb.bus_req = 0;
break;
default:
break;
}
OtgTcb.err_code = 0;
//handle the OTG state changes
if(Last_State != OtgTcb.FSM)
{
Last_State = OtgTcb.FSM;
switch ( Last_State )
{
case A_HOST:
printf("*** HNP State: A_HOST ***\n");
Hc_Handler();
break;
case B_HOST:
printf("*** HNP State: B_HOST ***\n");
Hc_Handler();
break;
case A_PERIPHERAL:
printf("*** HNP State: A_PERIPHERAL ***\n");
break;
case B_PERIPHERAL:
printf("*** HNP State: B_PERIPHERAL ***\n");
// if(1 == OtgTcb.bus_req)
// printf("- B_Device want to become host.\n");
break;
case A_IDLE:
printf("*** HNP State: A_IDLE ***\n");
break;
case B_IDLE:
printf("*** HNP State: B_IDLE ***\n");
break;
case A_VBUS_ERR:
printf("*** HNP State: A_VBUS_ERR ***\n");
break;
case B_SRP_INIT:
printf("*** HNP State: B_SRP_INIT ***\n");
OTG_do_srp();
break;
case A_WAIT_VRISE:
printf("*** HNP State: A_WAIT_VRISE ***\n");
break;
case A_WAIT_BCON:
printf("*** HNP State: A_WAIT_CONN ***\n");
break;
case A_SUSPEND:
printf("*** HNP State: A_SUSPEND ***\n");
break;
case A_WAIT_VFALL:
printf("*** HNP State: A_WAIT_VFALL ***\n");
break;
case B_WAIT_ACON:
printf("*** HNP State: B_WAIT_ACON ***\n");
break;
default:
// printf("*** HNP State: %d ***\n",Last_State);
break;
}
}
//handle the DC request by DC interrupt
switch ( Last_State )
{
case A_PERIPHERAL:
Dc_Handler();
break;
case B_PERIPHERAL:
Dc_Handler();
if(OtgTcb.a_bus_reset == 1 && OtgTcb.TimerID == B_BUS_REQ_TIMER_ID)
OTG_StopTimer(); //stop the B_BUS_REQ_TIMER
break;
default:
break;
}
}while(MLSup_KeypadHandler());
MLSup_Exit();
}
/*
//*************************************************************************
// Subroutines
//*************************************************************************
*/
void MLSup_InitSWStructure (void)
{
UCHAR ch;
// Init Global Vars
//Check if ISP1362 PCI board is present
if( TRUE == findPCIdev(0x00068000,&HC_IO_BASE,&IRQ4D13_CHNNL))
//PCI kit
{
ISP1362_PCIKIT = TRUE;
ISP1362_ISAKIT = FALSE;
IRQ4HC_CHNNL = IRQ4D13_CHNNL;
// printf("\nISP1362 PCI board IO base address = 0x%x",HC_IO_BASE);
// printf("\nISP1362 PCI board IRQ no = 0x%x\n",IRQ4D13_CHNNL);
}
else //ISA kit
{
ISP1362_PCIKIT = FALSE;
ISP1362_ISAKIT = TRUE;
HC_IO_BASE = 0x290;
IRQ4HC_CHNNL = 0x0A;
//select IRQ no for the device controller(INT2). Must be same as jumper setting on the ISA board. default is 9.
printf("Select IRQ no for DC(INT2 of ISP1362). 3/5/9:");
ch = getchar();
fflush(stdin);
if(ch == '3' || ch == '5')
IRQ4D13_CHNNL = ch-'0';
else
IRQ4D13_CHNNL = 9; //default IRQ for INT2 = 9
}
HC_DATA = HC_IO_BASE;
HC_COM = HC_IO_BASE + 2;
DC_DATA = HC_IO_BASE + 4;
DC_COM = HC_IO_BASE + 6;
// Init D13 Vars
{
// Init DC_TCB
D13TaskControlBlock.byValue = 0;
// Init USBDEV_Info
D13_DevInfo.dwValue = 0;
// Init Default Control Pipe
DCPCtrlXfer.FSMState = USBFSM4DCP_IDLE;
}
}
void MLSup_Init(void)
{
UCHAR byTemp;
// Acquire System Resource
// IO Resource, Interrupt Resource, DMA Resource
MLSup_InitSWStructure();
HcS_AcquireHC(); //initiliaze HC(HW config)
DcS_AcquireD13(); //initiliaze DC(HW config)
OTG_Acquire();
}
void MLSup_Exit(void)
{
OTG_Release();
DcS_ReleaseD13();
HcS_ReleaseHC();
}
BOOLEAN MLSup_KeypadHandler(void)
{
int key;
BOOL IsInloop = TRUE;
if( bioskey(1) )
{
key = bioskey(0);
key &= 0xff;
switch(key) {
case 0x1b: /* ESC */
IsInloop = FALSE;
break;
/* case 'v':
case 'V':
if(bVerbose == 0) {
printf("Verbose Mode = ON.\n");
bVerbose = 1;
}
else {
printf("Verbose Mode = OFF.\n");
bVerbose = 0;
}
break;*/
case 'r':
case 'R':
if(OtgTcb.bus_req == 0)
{
printf("Busreq = ON. \n");
OtgTcb.bus_drop = 0;
OtgTcb.bus_req = 1;
OtgTcb.b_srp_done = 0;
}
else
{
printf("Busreq = OFF. \n");
OtgTcb.bus_req = 0;
}
break;
case 'd':
case 'D':
if(OtgTcb.bus_drop == 0 && OtgTcb.id == 0)
{
printf("Busdrop = ON!!! \n");
OtgTcb.bus_req = 0;
OtgTcb.bus_drop = 1;
}
else
{
printf("Busdrop = OFF. \n");
OtgTcb.bus_drop = 0;
}
break;
default:
prn_menu_message();
break;
}
}
return IsInloop;
}
void prn_menu_message(void)
{
printf("=====================================");
printf("\npress 'ESC', Exit! ");
printf("\npress 'R', Toggle Bus_Req ON/OFF! ");
printf("\npress 'D', Toggle Bus_Done ON/OFF! ");
printf("\n=====================================");
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -