📄 main.c
字号:
//-----------------------------------------------------------------------------
// File: fw.c
// Contents: Firmware frameworks task dispatcher and device request parser
// source.
//
// Copyright (c) 2002 Cypress Semiconductor, Inc. All rights reserved
//
// $Archive: /USB/ez811/firmware/Emb_Host/fw.c $
// $Date: 4/03/02 4:32p $
// $Revision: 1 $
//-----------------------------------------------------------------------------
#include "Regs240x.h"
#include "Host_811.h"
extern BOOL HUB_DEVICE; // HUB device = TRUE
extern pHUBDEV uHub; // Struct for downstream device on HUB
extern pUSBDEV uDev[MAX_DEV]; // Multiple USB devices attributes, Max 5 devices
BYTE KeyReport[20];
int *pFPGARam = (int *)0x8000;
int *pStatus = (int *)0xC081;
int *pSendOver = (int *)0xC080;
void initial();
void EZUSB_Delay(unsigned long ms);
void IOinitial();
void Evinitial();
void LightLed(int num, int status);
void timer1int();
int FindFirtIntrEP(BYTE DevAddr)
{
int i;
for(i = 0; i < uDev[DevAddr].bNumOfEPs; i++)
{
if((uDev[DevAddr].bEPAddr[i]&0x80) && (uDev[DevAddr].bAttr[i] == 0x03)) //Interrupt in endpoint
return uDev[DevAddr].bEPAddr[i];
}
return -1;
}
//-----------------------------------------------------------------------------
// Code
//-----------------------------------------------------------------------------
// Task dispatcher
void main(void)
{
int num =0x5a;
int i = 0;
int nEP = 0;
int bReportSend = 0;
initial();
IOinitial();
Evinitial();
timer1int();
sl811h_init();
while(1)
{
slave_detect();
if(HUB_DEVICE && uHub.bPortPresent[HUB_ADDR + 1])
{
nEP = FindFirtIntrEP(HUB_ADDR+1);
if(nEP == -1) continue;
if(DataRW(HUB_ADDR+1, nEP, uDev[HUB_ADDR+1].wPayLoad[nEP&0xF], uDev[HUB_ADDR+1].wPayLoad[nEP&0xF], KeyReport))
{
}
}
}
}
void initial()
{
asm(" setc INTM");
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
SCSR1 = 0X06FE; //the input frequency 12MHz
WDCR = 0x0E8;
IMR = 0x0000;
IFR = 0x0FFFF;
}
void EZUSB_Delay(unsigned long ms)
{
volatile int num;
volatile int flag;
num = ms;
T1CON |= 0x0040; // start Timer1
while (num > 0)
{
flag = ADCTRL2 & 0x0200;
if (flag == 0x0200)
{
ADCTRL2 = ADCTRL2 | 0x4200; //产生一次timer
T1CON |= 0x0040; // start Timer3
num--;
}
}
}
void IOinitial()
{
MCRA = 0x8FE7;
// MCRC = 0x0181;
MCRC = 0x7C7F;
PADATDIR |= 0x1800; //PA.3 & PA.4 standard io
PBDATDIR |= 0x7000; //PB.6 & PB.5 & PB.4 standard io
PEDATDIR |= 0x8000; //PE.7 standard io
PFDATDIR |= 0x0300; //PF.0 & PF.1 standard io
PADATDIR &= 0xFFE7; //PA.3 & PA.4 output low
PBDATDIR &= 0xFF8F; //PB.6 & PB.5 & PB.4 output low
PEDATDIR &= 0xFF7F; //PE.7 output low
PFDATDIR &= 0xFFFC; //PF.0 & PF.1 output low
PFDATDIR |= 0x0404;
PFDATDIR &= 0xFFFB; //generate a pulse to turn off all lights
PCDATDIR |= 0x0100; //Pc.0 standard io
}
void Evinitial()
{
EVAIMRA = 0;
EVAIMRB = 0x01; /* TimeGlobal2 period*/
EVAIMRC = 0; /* Capture1,Capture2*/
EVBIMRA = 0;
EVBIMRB = 0;
EVBIMRC = 0; /* Capture4,Capture5*/
EVAIFRA = 0xffff; /* TimeGlobal1 period */
EVAIFRB = 0xffff; /* TimeGlobal2 period */
EVAIFRC = 0xffff; /* Cap1 Cap2 */
EVBIFRC = 0xffff; /* Cap4 Cap5 */
}
void LightLed(int num, int status)
{
int Tempnum = 0;
int Ledstatus = 0;
Tempnum = num;
Ledstatus = status;
//PADATDIR &= 0x0FF00; // mask the data bit
//PBDATDIR &= 0x0FF00; // mask the data bit
//PEDATDIR &= 0x0FF00; // mask the data bit
//PFDATDIR &= 0x0FF00; // mask the data bit
switch(Tempnum)
{
case 0:
{
if(Ledstatus == 0)
{
PFDATDIR |= 0x0002; // PF.1 light
}
else if(Ledstatus == 1)
{
PFDATDIR &= 0xFFFD; // PF.1 off
}
else
break;
break;
}
case 1:
{
if(Ledstatus == 0)
{
PADATDIR |= 0x0010; // PA.4 light
}
else if(Ledstatus == 1)
{
PADATDIR &= 0xFFEF; // PA.4 off
}
else
break;
break;
}
case 2:
{
if(Ledstatus == 0)
{
PFDATDIR |= 0x0001; // PF.0 light
}
else if(Ledstatus == 1)
{
PFDATDIR &= 0xFFFE; // PF.0 off
}
else
break;
break;
}
case 3:
{
if(Ledstatus == 0)
{
PADATDIR |= 0x0008; // PA.3 light
}
else if(Ledstatus == 1)
{
PADATDIR &= 0xFFF7; // PA.3 off
}
else
break;
break;
}
case 4:
{
if(Ledstatus == 0)
{
PBDATDIR |= 0x0020; // PB.5 light
}
else if(Ledstatus == 1)
{
PBDATDIR &= 0xFFDF; // PB.5 light
}
else
break;
break;
}
case 5:
{
if(Ledstatus == 0)
{
PBDATDIR |= 0x0010; // PB.4 off
}
else if(Ledstatus == 1)
{
PBDATDIR &= 0xFFEF; // PB.4 off
}
else
break;
break;
}
case 6:
{
if(Ledstatus == 0)
{
PBDATDIR |= 0x0040; // PB.6 light
}
else if(Ledstatus == 1)
{
PBDATDIR &= 0xFFBF; // PB.6 light
}
else
break;
break;
}
case 7:
{
if(Ledstatus == 0)
{
PEDATDIR |= 0x0080; // PE.7 light
}
else if(Ledstatus == 1)
{
PEDATDIR &= 0xFF7F; // PE.7 light
}
else
break;
break;
}
}
}
void timer1int()
{
T1CON = 0x160C; /* 12M ->64分频 -> 3/16 0.1875 MHz -> 16/3 5.3us timer1 compare disable autoreload*/
T1PR = 187; // 0xbb = 188-1 --> 定时周期1ms
T1CNT=0X00; // Timer1的计数器清零
T1CMPR = 0xFFFF;
GPTCONA = 0x0100; /*使能T1周期中断标志启动ADC*/
ADCTRL1=0x5000;
asm(" nop");
ADCTRL1=0x30; /*启动/停止模式,级连工作方式,且禁止特殊的两种工作模式*/
ADCTRL2=0x0100; /*可以用EVA的一个事件信号触发AD转换,用中断模式1*/
}
void interrupt nothing(void)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -