📄 procyon.c
字号:
//*****************************************************************
//
// File Name : 'procyon.c'
// Title : Procyon MP3 player main
// Author : Pascal Stang
// Date : 11/22/2000
// Version : 0.1
// Target MCU : ATmega103
// Editor Tabs : 3
//
//*****************************************************************
//#define AVR_AT90S8515
#define AVR_ATMEGA103
#ifndef WIN32
#include <io.h>
#include <signal.h>
#include <interrupt.h>
#endif
#include "global.h"
#include "lcd.h"
#include "systimer.h"
#include "uart.h"
#include "i2c.h"
#include "spi.h"
#include "sta013.h"
#include "ata_if.h"
#include "playmgr.h"
//#include "procyon.h"
// function prototypes
void mainInitPorts(void);
void mainLCDtest(void);
void mainHDItest(void);
void mainSTA013test1(void);
void mainSTA013test2(void);
void mainLoadToBuffer(void);
void mainPlayFromBuffer(void);
void mainLoadToDisk(void);
void mainPlayFromDisk(void);
void mainPlayFromDisk2(void);
void mainDumpFromDisk(void);
void mainInitDecoder(void);
void mainInitPorts(void)
{
// general configuration - safe all ports
outp(0x00, DDRA); // initialize PortA to input
outp(0xFF, DDRB); // initialize PortB to input
//outp(0x00, DDRC); // initialize PortC to input
outp(0x00, DDRD); // initialize PortD to input
outp(0x00, DDRE); // initialize PortE to input
// specific configuration
// STA013 data request
cbi(STA013_DEMAND_PORT-1,STA013_DEMAND_PIN); // set demand pin as input
}
int main(void)
{
unsigned int i;
unsigned int j;
unsigned char run;
unsigned char s,r;
//outp(0x7D, XDIV); // set division ratio F_CPU/(129-d)
//outp(0x7F, XDIV); // set division ratio F_CPU/(129-d)
//sbi(XDIV, XDIVEN); // enable clock division
mainInitPorts(); // initialize I/O ports
timerInit0(); // initialize and start timebase
uartInit(); // initialize uart
i2c_init(); // initialize I2C interface
spiInit(); // initialize spi interface
ataInit(); // initialize ATA driver
sbi(MCUCR, SRE); // enable RAM interface
timerPause(200); // wait for hardware get up and running
lcdInit(); // initialize LCD
timerPause(200); // wait for hardware get up and running
lcdGotoXY(0,0); lcdPrintStr("--- Procyon MP3 ---");
i = 0;
j = 0;
s = 0;
r = 0;
uartPrintStr("\r\n\n--- Procyon MP3 ---\r\n");
//uartSendBuffer("Procyon MP3\n\r",13);
uartPrintStr("Press ""?"" for help.\r\n");
run = TRUE;
while(run)
{
// print prompt
uartPrintStr("\r\nProcyon MP3>");
while(!uartReceiveByte(&s));
uartPrintChar(s);
uartPrintStr("\r\n\n");
switch(s)
{
case '1':
mainSTA013test1();
break;
case '2':
mainPlayFromDisk2();
break;
case 'd':
mainLCDtest();
break;
case 'h':
mainHDItest();
break;
case 'i':
mainInitDecoder();
break;
case 'k':
mainLoadToBuffer();
break;
case 'l':
mainLoadToDisk();
break;
case 'q':
mainPlayFromBuffer();
break;
case 'p':
mainPlayFromDisk();
break;
case 'u':
mainDumpFromDisk();
break;
case '?':
uartPrintStr("Commands:\r\n");
uartPrintStr("(h) hard disk test\r\n");
uartPrintStr("(d) lcd display test\r\n");
uartPrintStr("(1) mp3 decoder test from serial port\r\n");
uartPrintStr("(i) mp3 decoder initialize\r\n");
uartPrintStr("(k) load data into buffer from serial port\r\n");
uartPrintStr("(q) play mp3 from buffer\r\n");
uartPrintStr("(l) load data into disk from serial port\r\n");
uartPrintStr("(p) play mp3 from disk\r\n");
uartPrintStr("(2) play mp3 from disk v2\r\n");
uartPrintStr("(u) dump mp3 from disk to serial port (binary)\r\n");
uartPrintStr("(?) for help\r\n");
uartPrintStr("(e)xit\r\n");
break;
case 'e':
uartPrintStr("Exiting...\r\n");
run = FALSE;
break;
default:
uartPrintStr("Unknown command\r\n");
break;
}
}
cbi(MCUCR, SRE); // disable RAM interface
return 0;
}
void mainLCDtest(void)
{
u08 i,j;
while(1)
{
lcdHome();
for(j=0; j<9; j++)
{
timerPause(500);
for(i=0; i<80; i++)
{
lcdDataWrite(0x30+((i+j)%10));
outp(~i,PORTB);
}
}
}
}
void mainSTA013test1(void)
{
unsigned int i,j;
unsigned char s;
u32 bytesRead;
i = 0;
j = 0;
lcdGotoXY(0,1); lcdPrintStr("Init STA013... ");
if(sta013Init())
{
lcdGotoXY(0,2); lcdPrintStr("No STA013 ");
timerPause(2000);
}
else
{
lcdGotoXY(0,2); lcdPrintStr("STA013 OK ");
timerPause(2000);
}
sta013ResumeDecoder();
//sta013HWReset();
while(j != STA_IDENT)
{
j = sta013ReadReg(STA_REG_IDENT);
lcdGotoXY(0,3); lcdPrintStr("STA013 ID: 0x"); lcdPrintfu08(j);
}
lcdGotoXY(0,2); lcdPrintStr("Bytes read: ");
cbi(DDRB, 7); // set PB7 as input
bytesRead = 0;
i = 0;
while(1)
{
if(bit_is_set(PINB,PB7))
{
// data request high
while(!uartReceiveByte(&s));
spiSendByte(s);
bytesRead++;
lcdGotoXY(0,3);
lcdPrintfu32(bytesRead);
lcdPrintStr(" *");
//lcdPrintfu32(TimeReg1);
//lcdDataWrite(s);
sbi(PORTB, PB6);
//if(i)
//{
// uartSendByte(1);
// i = 0;
//}
}
else
{
// data request low
lcdGotoXY(0,3);
lcdPrintfu32(bytesRead);
lcdPrintStr(" ");
cbi(PORTB, PB6);
//uartSendByte(2);
//i = 1;
}
}
}
void mainInitDecoder(void)
{
// initialize the mp3 decoder
lcdGotoXY(0,1); lcdPrintStr("Init STA013... ");
uartPrintStr("Init STA013...\r\n");
if(sta013Init())
{
lcdGotoXY(0,1); lcdPrintStr("No STA013 ");
uartPrintStr("No STA013\r\n");
timerPause(2000);
}
else
{
lcdGotoXY(0,1); lcdPrintStr("STA013 OK ");
uartPrintStr("STA013 OK\r\n");
timerPause(2000);
}
sta013ResumeDecoder();
uartPrintStr("Done!\r\n");
}
void mainLoadToBuffer(void)
{
unsigned int i,j;
unsigned char s;
unsigned char *buffer;
unsigned char *subbuffer;
u32 LBAsector;
u32 bytesRead;
bytesRead = 0;
i = 0;
j = 0;
// print intro message
uartPrintStr("Load MP3 data into buffer via serial port\r\n");
// setup our local buffer pointing to the big one
buffer = (unsigned char*) MP3PLAY_BUFFER_ADDR;
lcdGotoXY(0,1); lcdPrintStr("Bytes read: ");
bytesRead = 0;
uartPrintStr("Ready for MP3 data...\r\n");
// fill up the play buffer
for(i=0; i < MP3PLAY_BUFFER_SIZE; i++)
{
// get data from serial port
while(!uartReceiveByte(&s));
// store to buffer
buffer[i] = s;
// do some stats
bytesRead++;
lcdGotoXY(0,2); lcdPrintfu32(bytesRead);
//lcdGotoXY(0,3); lcdPrintfu32(j);
}
// store to disk just for fun
/* uartPrintStr("Store to disk just for fun...\r\n");
LBAsector = 0x00000001;
uartPrintfu16((int) buffer);
uartPrintStr("\r\n");
for(j=0; j<(MP3PLAY_BUFFER_SIZE>>9); j++)
{
subbuffer = (buffer+(j*512));
uartPrintStr("Storing sector");
uartPrintfu16(j);
uartPrintStr("\r\n");
uartPrintfu16((int) subbuffer);
uartPrintStr("\r\n");
ataWriteSectorsLBA(0, LBAsector+j, 1, subbuffer );
}
//ataWriteSectorsLBA(0, LBAsector, 0x20, buffer );
*/
uartPrintStr("\r\nDone Loading...\r\n");
timerPause(4000);
uartPrintStr("Flushing Receive Buffer\r\n");
uartFlushReceiveBuffer();
}
void mainPlayFromBuffer(void)
{
unsigned int i,j;
i = 0;
j = 0;
// print intro message
uartPrintStr("Play MP3 data from buffer\r\n");
uartPrintStr("Initializing play manager\r\n");
// initialize the play manager and buffers
playmgrInit();
// set play index to beginning of buffer
PlayBuffer.dataindex = 0;
// go to play
lcdGotoXY(0,1); lcdPrintStr("Play: ");
uartPrintStr("Start Play...\r\n");
playmgrStart();
while(PlayBuffer.dataindex < PlayBuffer.size-0x80)
{
lcdGotoXY(0,2); lcdPrintfu32(PlayBuffer.dataindex);
lcdGotoXY(0,3); lcdPrintfu32(j);
}
playmgrStop();
uartPrintStr("Done!\r\n");
}
void mainLoadToDisk(void)
{
unsigned int i,j;
unsigned char s;
unsigned char *buffer;
u32 LBAsector;
u32 bytesRead;
i = 0;
j = 0;
// print intro message
uartPrintStr("Load MP3 data into disk via serial port\r\n");
// setup our local sector buffer
buffer = (unsigned char*) SECTOR_BUFFER_ADDR;
lcdGotoXY(0,1); lcdPrintStr("Bytes read: ");
bytesRead = 0;
uartPrintStr("Ready for MP3 data...\r\n");
// initialize LBA sector
LBAsector = 0x00010000;
// fill up 32 sectors
for(j=0; j<0x040; j++)
{
// fill up a sector buffer
for(i=0; i<0x200; i++)
{
// get data from serial port
while(!uartReceiveByte(&s));
// store to buffer
buffer[i] = s;
// do some stats
bytesRead++;
lcdGotoXY(0,2); lcdPrintfu32(bytesRead);
//lcdGotoXY(0,3); lcdPrintfu32(j);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -