?? cdrom_drv.c
字號:
//cdrom_drv.c
#include "config.h" /* system configuration */
#include "cdrom_drv.h"
#include "lib_mcu\lcd\lcd_drv.h"
#include "lib_mcu\remote\remote_drv.h"
extern Byte gl_buffer[GL_BUF_SIZE];
extern Byte gl_hdd_buffer[512];
bit initvol = 0;
uchar voltemp,volflag=0;
void Cddelay(uint time)
{
Uint16 i;
for(i = 0; i < time; i++);
}
void distime1(uchar track,uchar minute,uchar second)
{
ReadBusy();
putcomm(0x90);
ReadBusy();
putchar(30+track/10);
ReadBusy();
putchar(30+track%10);
ReadBusy();
putcomm(0x91);
ReadBusy();
putchar(' ');
ReadBusy();
putchar(' ');
ReadBusy();
putcomm(0x92);
ReadBusy();
putchar(30+minute/10);
ReadBusy();
putchar(30+minute%10);
ReadBusy();
putcomm(0x93);
ReadBusy();
putchar(' ');
ReadBusy();
putchar(' ');
ReadBusy();
putcomm(0x94);
ReadBusy();
putchar(30+second/10);
ReadBusy();
putchar(30+second%10);
}
/**********************************************************
*函數名稱:命令初始化函數 *
*用途:初始化命令包,并寫0XA0到命令寄存器 *
***********************************************************/
void do_command()
{
uchar i;
for(i = 0; i < 12; i++)
gl_buffer[20 + i]=0; //gl_buffer[20~31] = change[0~11]
do{ACC = FILE7;}while(BSY||DRQ);
FILE7 = 0xa0;
}
/**********************************************************
*函數名稱:寫光驅命令包函數 *
*用途:寫12字節命令包到光驅數字寄存器 *
***********************************************************/
void command()
{
uchar i;
do{ACC = FILE7;}while(BSY||!DRQ);
for(i = 0; i < 12; i += 2)
{
DAT16H = gl_buffer[20 + i + 1];
FILE0 = gl_buffer[20 + i];
}
}
/**********************************************************
*函數名稱:讀光驅返回數據函數 *
*用途:將光驅的返回數據讀入BUFFER數組 *
***********************************************************/
void GetData()
{
uchar i;
while(!Cdintq);
ACC = FILE7;
if (DRQ == 1)
{
for(i = 0; i < 16;)
{
gl_hdd_buffer[i++] = FILE0;
gl_hdd_buffer[i++] = DAT16H;
}
}
do{
gl_hdd_buffer[100] = FILE0;
FILE7 = ACC;
}while(DRQ);
}
/**********************************************************
*函數名稱:播放CD函數 *
*用途:獲取CD數據,并播放選中的TRACK *
***********************************************************/
void play(uchar n)
{
do_command();
gl_buffer[20 + 0] = 0x43;
gl_buffer[20 + 1] = 0x02;
gl_buffer[20 + 6] = n;
gl_buffer[20 + 8] = 0x0c;
command();//get start track(time)
GetData();
do_command();
gl_buffer[20 + 0]=0x47;
gl_buffer[20 + 3]=gl_hdd_buffer[9];
gl_buffer[20 + 4]=gl_hdd_buffer[10];
gl_buffer[20 + 5]=gl_hdd_buffer[11];
gl_buffer[20 + 6]=gl_buffer[10 + 1];
gl_buffer[20 + 7]=gl_buffer[10 + 2];
command();
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void GetDataVol(void)
{
uchar i;
while(!Cdintq);
ACC = FILE7;
gl_buffer[100] = ACC;
if(DRQ == 1)
for(i = 0; i < 24;)
{
gl_hdd_buffer[i++] = FILE0;
gl_hdd_buffer[i++] = DAT16H;
}
do{
gl_hdd_buffer[100] = FILE0;
FILE7 = ACC;
}while(DRQ);
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void VolCtrl(uchar volume)
{
uchar i;
volflag = 100;
do_command();
gl_buffer[10 + 0] = 0x5a;
gl_buffer[10 + 2] = 0x0e;
gl_buffer[10 + 7] = 0x00;
gl_buffer[10 + 8] = 0x18;
command();
GetDataVol();
voltemp = gl_buffer[20 + 17];
if(volume)
{
if(voltemp < 255)
{
if(voltemp <= 250)
voltemp = 255;
else
voltemp += 5;
gl_buffer[20 + 17] = voltemp;
gl_buffer[20 + 19] = voltemp;
}
}
if(!volume)
{
if(voltemp > 0)
{
if(voltemp <= 5)
voltemp = 0;
else
voltemp -= 5;
gl_buffer[20 + 17] = voltemp;
gl_buffer[20 + 19] = voltemp;
}
}
for(i = 0; i < 8; i++)
gl_buffer[20 + i] = 0;
do_command();
gl_buffer[10 + 0] = 0x55;
gl_buffer[10 + 1] = 0x10;
gl_buffer[10 + 7] = 0x00;
gl_buffer[10 + 8] = 0x18;
command();
while(!Cdintq);
do{ACC = FILE7;}while(!DRQ);
for(i = 0; i < 24; i += 2)
{
DAT16H = gl_buffer[10 + i + 1];
FILE0 = gl_buffer[10 + i];
Cddelay(0x500);
}
}
/**********************************************************
*函數名稱:CD-ROM控制函數 *
*用途:CD-ROM的控制流程 *
***********************************************************/
void CdPlay(void)
{
uchar i,k;
uchar resume;
uchar start,start1;
uchar keytemp;
uchar track;
uchar tracks;
uchar trackc;
uchar openflag;
CdReset = 0;
Cddelay(0xff);
CdReset = 1;
Cddelay(0xff);
do{ACC = FILE7;}while(BSY); //讀狀態寄存器,判斷BSY位
gl_buffer[0] = FILE6; //取驅動器選擇寄存器值
FILE6 = gl_buffer[0]&0xef; //選擇驅動器,MASTER狀態
ACC = FILE4; //讀字節數寄存器低8位
//if(ACC!=0x14){do{LedFig(Error);}while(1);}
ACC = FILE5; //讀字節數寄存器高8位
//if(ACC!=0xeb){do{LedFig(Error);}while(1);}
FILE7 = 0x90; //執行設備診斷命令
do{ACC = FILE7;}while(BSY); //讀狀態寄存器,判斷BSY位
ACC = FILE1;
if(!ILT) printch(0x80,"錯誤 ");
else Cddelay(0x1000);
FILE5 = 0x00;
FILE4 = 0x10;
FILE7 = 0xa1; //檢測是否為ATAPI設備
GetData();
Cddelay(0x1000);
do{ACC = FILE7;}while(BSY||!DRDY);
Cddelay(0x1000); //indetify packet device
RESTART: //Lable RESTART
resume = 0;
start = 0;
track = 0;
for(i = 0;i < 16; i++)
gl_hdd_buffer[i] = 0; //光驅數據寄存器
for(i = 0;i < 3; i++)
gl_buffer[10 + i] = 0; //gl_buffer[10~12] endtime[0~2]
for(i = 0; i < 100; i++)
{
printch(0x80,"檢測光盤...... ");
do_command();
command(); //test unit ready command
GetData();
ACC = FILE7;
if(!ERR) goto READTOC;
for( k = 0; k < 20; k++)
openflag = Remote_Cmd();
if(openflag == 13)
{
openflag = 0;
goto OPEN;
}
}
printch(0x80,"No Disc ");
do{
do_command();
command();
GetData();
ACC = FILE7;
if(!ERR) goto READTOC;
}
while(Remote_Cmd() != 13);
goto OPEN;
READTOC: //Lable READTOC
do_command();
gl_buffer[20 + 0] = 0x43;
gl_buffer[20 + 1] = 0x02;
gl_buffer[20 + 6] = 0xaa;
gl_buffer[20 + 8] = 0x0c;;
command();
GetData();
gl_buffer[10 + 0] = gl_hdd_buffer[3]; //end track
gl_buffer[10 + 1] = gl_hdd_buffer[9]; //end min
gl_buffer[10 + 2] = gl_hdd_buffer[10]; //end sec
distime1(gl_buffer[10 + 0],gl_buffer[10 + 1],gl_buffer[10 + 2]);
printch(0x80,"總曲目 ");
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
if(!initvol)
{
initvol = 1;
do_command();
gl_buffer[20 + 0] = 0x5a; //Mode Sense Command
gl_buffer[20 + 2] = 0x0e; //Audio Control Mode Page Format Current values 音頻頁當前值
gl_buffer[20 + 7] = 0x00;
gl_buffer[20 + 8] = 0x18; //參數長度
command();
GetDataVol(); //get the 24 byte codes of the volume information
gl_hdd_buffer[17] = 50;
gl_hdd_buffer[19] = 50;
for(i = 0; i < 8; i ++)
gl_hdd_buffer[i] = 0;
do_command();
gl_buffer[20 + 0] = 0x55; //Mode Select
gl_buffer[20 + 1] = 0x10;
gl_buffer[20 + 7] = 0x00;
gl_buffer[20 + 8] = 0x18; //參數長度
command();
while(!Cdintq);
do{ACC = FILE7;}while(!DRQ);
for(i = 0; i < 24; i += 2)
{
DAT16H = gl_hdd_buffer[20 + i + 1];
FILE0 = gl_hdd_buffer[20 + i];
Cddelay(0x1000);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
LABLE: do{i = Remote_Cmd();}while(Remote_Cmd() > 12);
if (i < 10)
{
play(i);
goto SUBCH;
}
if(i != 12) goto LABLE;
PLAY: play(1);
goto SUBCH;
KEYWAIT: keytemp = Remote_Cmd();
if (keytemp < 10)
{
track = keytemp;
play(track);
goto SUBCH;
} //seclet track and play
else
switch(keytemp)
{
case 10: {
if (track == gl_buffer[10 + 0])
track = 1;
else
track ++;
play(track);
goto SUBCH;
} //TRACK++
case 11: {
if (track == 1)
track = gl_buffer[10 + 0];
else
track --;
play(track);
goto SUBCH;
} //TRACK--
case 12: {
if (resume == 0)
{
do_command();
gl_buffer[10 + 0] = 0x4b;
gl_buffer[10 + 8] = 0x00;
command();
resume = 1;
printch(0x80,"暫停 ");
Cddelay(0x1000);
while(Remote_Cmd() != 12);
goto RESUME;
} //PAUSE
else
RESUME: {
do_command();
gl_buffer[10 + 0] = 0x4b;
gl_buffer[10 + 8] = 0x01;
command();
resume = 0;
goto SUBCH;
} //RESUME
}//////OVER
case 13 : {
if (start == 0)
OPEN: {
do_command();
gl_buffer[10 + 0] = 0x1b;
gl_buffer[10 + 4] = 0x02;
command();
start = 1;
printch(0x80,"開倉 ");
for(i = 0; i < 20; i++)
Cddelay(0x1000);
while(1)
{
if(Remote_Cmd() == 13)
goto KEYWAIT;
do_command();
command();
GetData();
ACC = FILE7;
if(!ERR) {start = 0;goto READTOC;}
}
}
else {
do_command();
gl_buffer[10 + 0] = 0x1b;
gl_buffer[10 + 4] = 0x03;
command();
start = 0;
printch(0x80,"關倉 ");
for(i = 0; i < 20; i ++)
Cddelay(0x1000);
goto RESTART;
}
}
case 14 : VolCtrl(1); goto SUBCH;
case 15 : VolCtrl(0); goto SUBCH;
//case 16 :
default : goto KEYWAIT;
}
SUBCH :
do{
if(volflag != 0)
volflag--;
else
;
if(cpf)
{
if(track != trackc)
play(trackc);
}
do_command();
gl_buffer[10 + 0] = 0x42;
gl_buffer[10 + 1] = 0x02;
gl_buffer[10 + 2] = 0x40;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -