120 lines
1.8 KiB
C
120 lines
1.8 KiB
C
|
#include <fx2macros.h>
|
||
|
#include <fx2ints.h>
|
||
|
#include <autovector.h>
|
||
|
#include <delay.h>
|
||
|
#include <setupdat.h>
|
||
|
|
||
|
#ifdef DEBUG_FIRMWARE
|
||
|
#include <serial.h>
|
||
|
#include <stdio.h>
|
||
|
#else
|
||
|
#define printf(...)
|
||
|
#endif
|
||
|
|
||
|
volatile __bit dosud = FALSE;
|
||
|
volatile __bit dosuspend = FALSE;
|
||
|
|
||
|
// custom functions
|
||
|
extern void main_loop();
|
||
|
extern void main_init();
|
||
|
|
||
|
void
|
||
|
main()
|
||
|
{
|
||
|
|
||
|
#ifdef DEBUG_FIRMWARE
|
||
|
SETCPUFREQ(CLK_48M);
|
||
|
// main_init can still set this to whatever you want.
|
||
|
sio0_init(57600); // needed for printf if debug defined
|
||
|
#endif
|
||
|
|
||
|
main_init();
|
||
|
|
||
|
// set up interrupts.
|
||
|
USE_USB_INTS();
|
||
|
|
||
|
ENABLE_SUDAV();
|
||
|
ENABLE_USBRESET();
|
||
|
ENABLE_HISPEED();
|
||
|
ENABLE_SUSPEND();
|
||
|
ENABLE_RESUME();
|
||
|
|
||
|
/* global interrupt enable */
|
||
|
EA = 1;
|
||
|
|
||
|
// iic files (c2 load) don't need to renumerate/delay
|
||
|
// trm 3.6
|
||
|
#ifndef NORENUM
|
||
|
RENUMERATE();
|
||
|
#else
|
||
|
USBCS &= ~bmDISCON;
|
||
|
#endif
|
||
|
|
||
|
while (TRUE) {
|
||
|
main_loop();
|
||
|
|
||
|
if (dosud) {
|
||
|
dosud = FALSE;
|
||
|
handle_setupdata();
|
||
|
}
|
||
|
|
||
|
if (dosuspend) {
|
||
|
dosuspend = FALSE;
|
||
|
do {
|
||
|
printf("I'm going to Suspend.\n");
|
||
|
WAKEUPCS |= bmWU | bmWU2; // make sure ext wakeups are cleared
|
||
|
SUSPEND = 1;
|
||
|
PCON |= 1;
|
||
|
__asm
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
nop
|
||
|
__endasm;
|
||
|
} while (!remote_wakeup_allowed && REMOTE_WAKEUP());
|
||
|
printf("I'm going to wake up.\n");
|
||
|
|
||
|
// resume
|
||
|
// trm 6.4
|
||
|
if (REMOTE_WAKEUP()) {
|
||
|
delay(5);
|
||
|
USBCS |= bmSIGRESUME;
|
||
|
delay(15);
|
||
|
USBCS &= ~bmSIGRESUME;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
resume_isr() __interrupt RESUME_ISR {
|
||
|
CLEAR_RESUME();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
sudav_isr() __interrupt SUDAV_ISR {
|
||
|
dosud = TRUE;
|
||
|
CLEAR_SUDAV();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
usbreset_isr() __interrupt USBRESET_ISR {
|
||
|
handle_hispeed(FALSE);
|
||
|
CLEAR_USBRESET();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
hispeed_isr() __interrupt HISPEED_ISR {
|
||
|
handle_hispeed(TRUE);
|
||
|
CLEAR_HISPEED();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
suspend_isr() __interrupt SUSPEND_ISR {
|
||
|
dosuspend = TRUE;
|
||
|
CLEAR_SUSPEND();
|
||
|
}
|