📄 yampp7_usb.c
字号:
//////////////////////////////////////////////////////////////////
sbi(PORTE,BUTTON_1); // pin PE0 is keyboard input, enable pullup
#ifndef PCB_REV_D
cbi(CHARGE_PORT-1,CHARGE_PIN); // set pin as input
sbi(CHARGE_PORT,CHARGE_PIN); // activate pullup
#endif
#if defined (__AVR_ATmega162__)
outp(0, EMCUCR);
set_cpu_speed(CLKDIV); // CPU clock = XTAL / M162CLKDIV
// eg about 3-4MHz
#if (BACKLIGHT_TIME != 0)
outp(0x00, OCR0); // PWM duty = 0%
outp((1<<WGM00) | (1<<COM01) | (1<<CS01) , TCCR0); // Timer 0 normal PWM mode, CLK/8
#endif
#endif
outp((1<<SRE), MCUCR); // enable external SRAM
delayms(50);
usb_init();
wdt_enable(7);
//
// setup timer1 for a 100mS periodic interrupt
//
outp(0, TCCR1A);
outp(4, TCCR1B); // prescaler /256 tPeriod = 32 uS
outp(TI1_H, TCNT1H); // load counter value hi
outp(TI1_L, TCNT1L); // load counter value lo
sbi(TIMSK, TOIE1); // enable timer1 interrupt
// setup some buffers
SectorBuffer = (u08 *) card_sbuf; // 512 bytes
// *********************************************************************
u08 tmp,logo;
// *********************************************************************
sei();
#ifdef LCD_NEGATIV
lcd_init(1);
#else
lcd_init(0);
#endif
tmp = eeprom_rb(EEPROM_LCD_CONTRAST);
if (tmp > 0x58 || tmp < 0x20)
{
tmp = 0x45;
eeprom_wb(EEPROM_LCD_CONTRAST,tmp);
}
lcd_contrast(tmp);
lcd_clrscr();
#if (BACKLIGHT_TIME != 0)
light_mode = eeprom_rb(EEPROM_BACKLIGHT) % 6;
backlight_on();
#endif
logo = 4+lcd_logo(0);
if (logo == 4)
lcd_gotoxy(3,logo);
else
_p_puts(model_txt);
puts(" v.");
_p_puts(version_txt);
// init VS1001
cbi(PORTB,RESET_PIN); // RESET- lo
delayms(2);
sbi(PORTB,RESET_PIN); // RESET- hi
delayms(10);
vs1001_init_io(); // init VS1001
vs1001_setcomp(F_VS1001);
vs1001_reset(0);
if ((volume = eeprom_rb(EEPROM_VOLUME)) > MIN_VOLUME)
volume = MIN_VOLUME / 2; // half scale
balance = eeprom_rb(EEPROM_BALANCE) & 0xfe;
bLoudness = eeprom_rb(EEPROM_LOUDNESS) % 13;
bRandom = eeprom_rb(EEPROM_RANDOM);
Repeat = eeprom_rb(EEPROM_REPEAT) % 4;
timemode = eeprom_rb(EEPROM_TIME);
autolock = eeprom_rb(EEPROM_AUTOLOCK);
curIndex = eeprom_rw(EEPROM_SONGPOS);
curPlaylist = eeprom_rw(EEPROM_PLAYLIST);
vs1001_setvolume(volume,balance);
// Init and wait for CARD ready
puts("\nInit Card...\n");
#ifdef MMC_CARD
MMC_Reset();
#else
ATA_SetDrive(0);
#endif
delayms(10);
#ifndef FIXED_RESET
tmp = 4;
while(tmp--) // for propper CF init after card removing.
{
wdt_reset();
logo = CARD_SW_Reset2(); // for now logo variable is second temp variable
if (logo) // if card is ready
break;
else
beep(SINE_800,50);
}
if (!logo) // if card is not ready
PowerOff(); // power off
#else
wdt_reset();
if (!CARD_SW_Reset2())
{
delayms(800);
PowerOff(); // power off
}
#endif
#ifndef MMC_CARD
WriteBYTE(ATA_SectorCount, SLEEP_TIME); // CF standby time * 5 milisecond (0=disable)
WriteBYTE(ATAPI_Cmd, 0xE3); // set CF standby timer and execute IDLE
ATA_WaitBusy();
#endif
logo = 4+lcd_card_logo();
if (logo == 4)
lcd_clrline(5);
else
lcd_gotoxy(0,2);
puts("Ready!\n");
beep(SINE_1500,100); // Wakeup beep
outp(0x40,ACSR); // Enable Analog Comparator and Bandgap reference
init_stuff();
InitRnd(); // init randomizer table
LoudSet();
if (curPlaylist >= playlist_qty)
curPlaylist = curIndex = 0;
delayms(1000);
wdt_enable(6);
///////////////////////////////////////////////////////////////////////////////
// start things rolling
///////////////////////////////////////////////////////////////////////////////
event_e event = EV_IDLE;
YADL_PLAY_LIST_ENTRY *pListEntry;
set_event(EV_STOP);
//
// main loop
//
while (1)
{
event = get_event();
switch (event)
{
default:
case EV_IDLE:
break;
case EV_MENU:
info_flag = 2; // disable displaying
menu_event = browse_menu() + 1;
if(menu_event)
{
set_event(menu_event);
break;
}
else
{
BROWSE_BREAK: info_flag = 0; // enable displaying
menu_event = EV_IDLE;
if (isPlaying)
Playlist_name(); // show Playlist name
else
set_event(EV_STOP);
break;
}
case EV_CONTRAST:
set_contrast();
break;
#if (BACKLIGHT_TIME != 0)
case EV_LIGHTMODE:
lcd_gotoxy(0,5);
#if defined (__AVR_ATmega162__)
light_mode =(u08)(light_mode + 1) % 6;
if(light_mode == 0)
puts("OFF");
else if(light_mode == 1)
puts("OFF/DIMM");
else if(light_mode == 2)
puts("OFF/ON");
else if(light_mode == 3)
puts("DIMM");
else if(light_mode == 4)
puts("DIMM/ON");
else
puts("ON");
puts(" ");
#else
light_mode =(u08)(light_mode + 1) % 3;
if(light_mode == 0)
puts("OFF");
else if(light_mode == 1)
puts("AUTO");
else
puts("ON");
puts(" ");
#endif
if(light_mode)
backlight_on();
else
backlight_off();
break;
#endif
case EV_TIME:
timemode = !timemode; // change mode of time displaying (normal<->remain)
lcd_gotoxy(0,5);
if(timemode)
puts("REMAIN ");
else
puts("NORMAL ");
sleepcount = 0; // clear shutdown timeout count
break;
case EV_PLAYLIST:
event = EV_IDLE;
info_flag = 2; // disable displaying
u16 Index = browse_songs(); // browse songs within playlist
if (Index == (u16)-1)
goto BROWSE_BREAK;
curIndex = Index;
menu_event = EV_IDLE;
info_flag = 0;
InitRnd();
isPlaying = 0;
case EV_PLAY:
if (menu_event)
{
set_event(menu_event);
time_flag = 0;
continue;
}
if (isPlaying) // Pause function
{
while(get_event() != EV_IDLE) // Wait for release key
wdt_reset();
lobatt_time = 0;
outp(0xA0,MCUCR); // enable SLEEP mode
u08 cc = 6;
isPlaying = 0;
do
{
asm volatile ("sleep"); // go to sleep
asm volatile ("nop");
wdt_reset();
if (cc-- == 0)
cc=8;
lcd_gotoxy(8,3); // position for "Paused" string
if (cc > 4)
{
#if (BACKLIGHT_TIME == 0)
cbi(PORTB,LED_PIN); // LED off
#endif
asm volatile ("nop");
}
else
{
#if (BACKLIGHT_TIME == 0)
sbi(PORTB,LED_PIN); // LED on
#endif
lcd_invert(); // set white on black mode
}
puts("Paused"); // printf string on LCD
lcd_normal(); // set black on white mode
time_flag = 1;
if (lobatt_time > MAX_PAUSE_TIME || !CARD_SW_Reset2())
PowerOff(); // max 15 minutes of pause
get_key();
} while (check_event() != EV_PLAY); // stay within loop until play pressed again
isPlaying = 1;
#if (BACKLIGHT_TIME == 0)
sbi(PORTB,LED_PIN); // LED On
#endif
time_flag = 5;
break;
}
else // Play function
{
BatteryMeasure();
if (lobatt) // low battery
{
lcd_gotoxy(0,logo);
puts("Low Battery !");
send_sinewave_beeps();
delayms(1000);
PowerOff();
}
if(curPlaylist < playlist_qty && playlist_qty > 0)
{
pListEntry = get_pl_entry(curPlaylist);
if(curIndex >= pListEntry->entry_qty)
curIndex = 0;
play_song();
}
break;
}
/*
case EV_PLAY_USB:
lcd_gotoxy(0,logo);
puts("Playing via\nUSB");
usb_play = 1;
isPlaying = 1;
#if (BACKLIGHT_TIME == 0)
sbi(PORTB, LED_PIN); // LED ON
#endif
vs1001_reset(0);
LoudSet();
break;
*/
case EV_STOP:
if (menu_event)
{
time_flag = 40;
break;
}
if (isPlaying)
{
sleepcount = 0; // clear shutdown timeout count
vs1001_reset(0);
vs1001_write(0x0A,0);
InitRnd(); // init randomizer table
isPlaying = 0;
usb_play = 0;
}
// vs1001_write(0x0B,0xffff); // turn off analog part of VS1001, generate a click
info_flag = 0;
lcd_clrscr();
if(lcd_card_logo())
{
lcd_gotoxy(1,2);
puts("yampp-7 ");
}
else
lcd_gotoxy(0,4);
puts("STOP");
BatteryMeasure();
if (lobatt)
lobatt = 2;
status_display();
#if (BACKLIGHT_TIME == 0)
cbi(PORTB,LED_PIN); // Led Off
#endif
if(usb_link)
{
lcd_gotoxy(0,logo-1);
puts("\nPC Link Active\n");
eeprom_update();
usb_response(0);
lobatt_time = 0;
#if defined (__AVR_ATmega162__)
#ifndef MMC_CARD
outp(0xC0, MCUCR); // enable external SRAM 1 waitstate
#endif
set_cpu_speed(0); // CPU clock = XTAL
#endif // eg about 8-14MHz
}
break;
case EV_BALANCE:
if (isPlaying)
{
info_flag = 1;
time_flag = 0;
Playlist_name();
}
break;
case EV_DOWN: // volume down (or balance left)
if (isPlaying)
{
if(info_flag == 1)
{
time_flag = 0;
#ifdef REVERSE_BALANCE
if (balance < 57)
balance +=2;
#else
if (balance > -57)
balance -=2;
#endif
}
else
{
if (volume <= MIN_VOLUME-VOL_STEP)
volume += VOL_STEP;
else
volume = MIN_VOLUME;
}
goto SETVOL;
}
else if (!menu_event)
set_event(EV_CONTRAST);
break;
case EV_UP: // volume up (or balance right)
if (isPlaying)
{
if(info_flag == 1)
{
time_flag = 0;
#ifdef REVERSE_BALANCE
if (balance > -57)
balance -=2;
#else
if (balance < 57)
balance +=2;
#endif
}
else
{
if (volume >= VOL_STEP)
volume -= VOL_STEP;
else
volume = 0;
}
SETVOL: vs1001_setvolume(volume,balance);
status_display();
break;
}
#if (AUTOLOCK_TIME != 0)
else if (!menu_event)
set_event(EV_AUTOLOCK);
break;
case EV_AUTOLOCK:
autolock = !autolock;
status_display();
sleepcount = 0; // clear shutdown timeout count
if (!menu_event)
delayms(500);
#endif
break;
case EV_NEXT:
if (info_flag == 1)
{
set_event(EV_UP); // if balance control active
break;
}
if (menu_event)
{
set_event(EV_MENU); // if menu is active
break;
}
if (isPlaying)
next_song(1); // while playing
else
set_event(EV_MBASS); // while stop
break;
case EV_PREV:
if (info_flag == 1)
{
set_event(EV_DOWN); // if balance control active
break;
}
if (menu_event)
{
set_event(EV_MENU); // if menu active
break;
}
if (isPlaying)
next_song(2); // while playing
else
set_event(EV_RANDOM); // while stop
break;
case EV_NEXTPL:
next_playlist();
goto PLCHG;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -