📄 al576ctl.cpp
字号:
#include "stdafx.h"
#include "AL242.h"
#include "PlayDMO.h"
#include "PlayDMODlg.h"
#include "ProgressBox.h"
extern int m_contrast;
extern int m_brightness;
extern int m_saturation;
extern int m_hue;
CProgressBox* ProgressBox;
#define VideoLocation 0x00000
#define AudioLocation 0x20000
#define ParaLocation 0x800000 - 0x1000
ULONG Set_AL242_1C60[] = {
0x2afeff01,0x2a000001,0x2a010101,0x2a024e01,0x2a030001,0x2a04dd01,0x2a053201,0x2a060a01,0x2a072001,0x2a088001
,0x2a094001,0x2a0a8001,0x2a0b2001,0x2a0c8a01,0x2a0d0701,0x2a0ee001,0x2a0f2c01,0x2a100a01,0x2a119901,0x2a121001
,0x2a13b401,0x2a148001,0x2a152001,0x2a167401,0x2a170b01,0x2a182d01,0x2a19d101,0x2a1a7401,0x2a1b5d01,0x2a1c2b01
,0x2a1d3301,0x2a1e3301,0x2a1f3301,0x2a203e01,0x2a213e01,0x2a220001,0x2a238001,0x2a24e001,0x2a25e001,0x2a262d01
,0x2a275001,0x2a28e001,0x2a29e001,0x2a2ad601,0x2a2b4e01,0x2a2c3201,0x2a2d4501,0x2a2e8201,0x2a2f5001,0x2a302201
,0x2a316101,0x2a327001,0x2a330e01,0x2a346e01,0x2a359001,0x2a367001,0x2a370e01,0x2a384001,0x2a390a01,0x2a3a0e01
,0x2a3b0001,0x2a3c0001,0x2a3d0001,0x2a3e0001,0x2a3f0001,0x2a400501,0x2a41e701,0x2a429601,0x2a430001,0x2a440001
,0x2a450001,0x2a460001,0x2a470001,0x2a480001,0x2a490001,0x2a4a0001,0x2a4b0001,0x2a4c0001,0x2a4d0001,0x2a4e0001
,0x2a4f0001,0x2a500001,0x2a510001,0x2a520001,0x2a530001,0x2a540001,0x2a550001,0x2a560001,0x2a574401,0x2a580401
,0x2a591b01,0x2a5a0001,0x2a5b1201,0x2a5cdb01,0x2a5d1501,0x2a5e9a01,0x2a5fbe01,0x2a60b401,0x2a617c01,0x2a620001
,0x2a630001,0x2a643c01,0x2a650001,0x2a666401,0x2a676401,0x2a685a01,0x2a690101,0x2a6a4001,0x2a6b0101,0x2a6c0401
,0x2a6d0001,0x2a6e0001,0x2a6f0001,0x2a702b01,0x2a713001,0x2a722701,0x2a733301,0x2a742d01,0x2a75d001,0x2a761901
,0x2a774901,0x2a780401,0x2a790001,0x2a7a6501,0x2a7b0001,0x2a7cb701,0x2a7dfe01,0x2a7ee001,0x2a7f0001,0x2a800401
,0x2a81e001,0x2a824201,0x2a836f01,0x2a840701,0x2a852001,0x2a860301,0x2a871001,0x2a88e001,0x2a89e001,0x2a8a0a01
,0x2a8b0101,0x2a8ce001,0x2a8d0a01,0x2a8ec801,0x2a8fb901,0x2a90e001,0x2a91e001,0x2a92e001,0x2a93e001,0x2a94e001
,0x2a95e001,0x2a96e001,0x2a97e001,0x2a98e001,0x2a99e001,0x2a9ae001,0x2a9be001,0x2a9ce001,0x2a9de001,0x2a9ee001
,0x2a9fe001,0x2aa0e001,0x2aa1e001,0x2aa2e001,0x2aa3e001,0x2aa4e001,0x2aa5e001,0x2aa6e001,0x2aa7e001,0x2aa8e001
,0x2aa9e001,0x2aaae001,0x2aabe001,0x2aace001,0x2aade001,0x2aaee001,0x2aafe001,0x2ab04201,0x2ab19001,0x2ab20201
,0x2ab30301,0x2ab40401,0x2ab50701,0x2ab60801,0x2ab70101,0x2ab80001,0x2ab92201,0x2aba1801,0x2abb3501,0x2abc2b01
,0x2abd8e01,0x2abe3801,0x2abf0301,0x2ac0d401,0x2ac11b01,0x2ac24001,0x2ac3c001,0x2ac40701,0x2ac51001,0x2ac6e001
,0x2ac7e001,0x2ac85101,0x2ac93101,0x2aca2601,0x2acbea01,0x2acc1001,0x2acdc801,0x2ace5001,0x2acf2001,0x2ad0ff01
,0x2ad1e001,0x2ad21001,0x2ad3fc01,0x2ad43c01,0x2ad50001,0x2ad6e001,0x2ad7e001,0x2ad8e001,0x2ad9e001,0x2adae001
,0x2adbe001,0x2adce001,0x2adde001,0x2adee001,0x2adfe001,0x2ae0e001,0x2ae1e001,0x2ae2e001,0x2ae3e001,0x2ae4e001
,0x2ae5e001,0x2ae6e001,0x2ae7e001,0x2ae8e001,0x2ae9e001,0x2aeae001,0x2aebe001,0x2aece001,0x2aede001,0x2aeee001
,0x2aefe001,0x2af0e001,0x2af1e001,0x2af2e001,0x2af3e001,0x2af4e001,0x2af5e001,0x2af6e001,0x2af7e001,0x2af8e001
,0x2af9e001,0x2afae001,0x2afbe001,0x2afce001,0x2afde001,0x2affe001
};
void CPlayDMODlg::AL576_DownLoad_Firmware(HANDLE hAL576, char *VideoFile,char *AudioFile, char *ParaFile,CProgressBox* ProgressBox)
{
AL576_HCIWrite(hAL576,0xd,0x0);
Sleep(100);
AL576_RegWrite(hAL576,0x1cf4,0x9);
Sleep(100);
AL576_RegWrite(hAL576,0x1CD0,0x18);
Sleep(100);
AL576_RegWrite(hAL576,0x1CE4,0x140041);
Sleep(100);
AL576_RegWrite(hAL576,0x1CE4,0x100d15c5);//141
Sleep(100);
DownloadFile(hAL576, VideoFile,VideoLocation);
Sleep(100);
ProgressBox->SetPos(30);
ProgressBox->StepIt();
DownloadFile(hAL576, AudioFile,AudioLocation);
Sleep(100);
ProgressBox->SetPos(50);
ProgressBox->StepIt();
DownLoadParameterFile(hAL576, ParaFile,ParaLocation);
}
void CPlayDMODlg::DownloadFile(HANDLE hAL576, char *FileName, int location)
{
union{
int buffer;
struct {
char Buf0;
char Buf1;
char Buf2;
char Buf3;
}Byte;
}HaxiData;
char buffer[4];
FILE *fptr;
UINT file_checksum,asic_checksum;
UINT size,addr;
addr = location;
fptr=fopen(FileName,"rb");
if ( fptr == NULL )
{
MessageBox("Failed to Open Firmeware File","ERROR",MB_OK);
fclose(fptr);
return;
}
else
{
file_checksum = asic_checksum = 0;
size = 0;
while( !feof( fptr ) )
{
/* Attempt to read in 10 bytes: */
fread( buffer, sizeof( char ), 4 , fptr ); //read 4 bytes everytime
if( ferror( fptr ) ){
MessageBox("Failed to Read Firmware File","ERROR",MB_OK);
break;
}
/* Total up actual bytes read */
HaxiData.Byte.Buf0=buffer[3];
HaxiData.Byte.Buf1=buffer[2];
HaxiData.Byte.Buf2=buffer[1];
HaxiData.Byte.Buf3=buffer[0];
AL576_MemWrite(hAL576,location,HaxiData.buffer);
file_checksum += (UINT) HaxiData.buffer;
size++;
location += 4;
}
while(size--)
{
asic_checksum += (UINT) AL576_MemRead(hAL576,addr);
addr += 4;
}
if(file_checksum != asic_checksum)
MessageBox("Failed to Download Firmware File,Please Close AP and Reset EVB!","ERROR",MB_OK | MB_ICONERROR);
fclose(fptr);
}
}
void CPlayDMODlg::DownLoadParameterFile(HANDLE hAL576,char *FileName,UINT addr)
{
union{
int buffer;
struct {
char Buf0;
char Buf1;
char Buf2;
char Buf3;
}Byte;
}HaxiData;
FILE *fp;
UINT file_checksum,asic_checksum;
UINT size;
fp = fopen(FileName,"r");
if(fp == NULL){
MessageBox("Failed to Open Parameter File","ERROR",MB_OK);
fclose(fp);
return;
}
file_checksum = asic_checksum = 0;
size = 0;
fseek(fp,0,SEEK_SET);
while(!feof( fp ))
{
fscanf(fp,"%x",&HaxiData.buffer);
if(HaxiData.buffer == 0xffffffff)
break;
AL576_MemWrite(hAL576,addr,HaxiData.buffer);
file_checksum += (UINT) HaxiData.buffer;
addr += 4;
size++;
}
addr = 0x7ff000;
while(size--)
{
asic_checksum += (UINT) AL576_MemRead(hAL576,addr);
addr += 4;
}
if(file_checksum != asic_checksum)
MessageBox("Failed to Download Parameter File,Please Close AP and Reset EVB!","ERROR",MB_OK | MB_ICONERROR);
fclose(fp);
}
void CPlayDMODlg::Set_AL242(HANDLE hAL576)
{
AL576_HCIWrite(hAL576, 0xD,0x0);
Sleep(50);
AL576_RegWrite(hAL576, 0x1c64,0x10);
Sleep(50);
for(int i = 0; i <= 255; i++)
{
AL576_RegWrite(hAL576, 0x1c60, Set_AL242_1C60[i]);
Sleep(50);
}
}
void CPlayDMODlg::StartEncoder(HANDLE hAL576)
{
//AL576_HCIWrite(hAL576, 0xD, 0x0);
//Sleep(100);
//AL576_RegWrite(hAL576,0x1c70,0x1);
//Sleep(100);
//AL576_RegWrite(hAL576,0x1c70,0x0);
//Sleep(100);
//AL576_RegWrite(hAL576, 0x1c64,0x10);
//Sleep(100);
//AL576_HCIWrite(hAL576, 0xD,0x1);
//Sleep(100);
AL576_MemWrite(hAL576, 0x80,0x10000);
Sleep(50);
AL576_MemWrite(hAL576, 0x84,0x2);
Sleep(50);
AL576_RegWrite(hAL576, 0x1C74,0x1);
Sleep(50);
}
void CPlayDMODlg::Halt(HANDLE hAL576)
{
AL576_MemWrite(hAL576,0x80,0x20000);
Sleep(50);
AL576_MemWrite(hAL576,0x84,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c74,0x1);
Sleep(50);
AL576_RegWrite(hAL576,0x1ccc,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c44,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c70,0x1);
Sleep(50);
AL576_RegWrite(hAL576,0x1c70,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x2068,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x2000,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c2c,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c30,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c7c,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1c98,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1ca4,0x0);
Sleep(50);
AL576_RegWrite(hAL576,0x1ca0,0x0);
Sleep(50);
AL576_HCIWrite(hAL576,0xd,0x0);
Sleep(50);
}
unsigned int ResXY[5][2] =
{
{720,480},
{352,288},
{176,144},
{640,480},
{320,240}
};
BOOL MPEG_1_Flag = 0;
void CPlayDMODlg::Set_AL576(HANDLE hAL576, UINT nVideo_format,AL576_MPEG_SET_Ptr Al576_MPEG_Seting,AVI_Info_Ptr Avi_info)
{
int pal_offset = 0;
Commamd_Ptr Par_Set = new COMMAND_PAR;
AL576_HCIWrite(hAL576, 0xD, 0x0); //RISC enable
Sleep(100);
AL576_RegWrite(hAL576,0x1c70,0x1); //Encoder reset
Sleep(50);
AL576_RegWrite(hAL576,0x1c70,0x0);
Sleep(50);
AL576_RegWrite(hAL576, 0x1c64,0x10); //Clock divider controlling I2C clock
Sleep(50);
if(Al576_MPEG_Seting->Stream_Type == MPEG1_SYSTEM || Al576_MPEG_Seting->Stream_Type == MPEG1_VCD)
{
if(!MPEG_1_Flag)
{
DownLoadParameterFile(hAL576, "param1-2.1-vcd.txt",ParaLocation);
MPEG_1_Flag = 1;
}
AL576_HCIWrite(hAL576,0xd,0x1);
Sleep(100);
}
else
{
if(MPEG_1_Flag)
{
DownLoadParameterFile(hAL576, "param1-2.1.txt",ParaLocation);
MPEG_1_Flag = 0;
}
AL576_HCIWrite(hAL576,0xd,0x1);
Sleep(100);
if(nVideo_format == _PAL_I || nVideo_format == _PAL_N || nVideo_format == _PAL_CN || nVideo_format == _PAL_60 || nVideo_format == _SECAMx)
{
AL576_MemWrite(hAL576,0x7ff120,0x1);
AL576_MemWrite(hAL576,0x7ff124,0x2);
if(Al576_MPEG_Seting->Res == 0)
pal_offset = 96;
else
pal_offset = 0;
Par_Set->Command = 0x70000;
Par_Set->P1 = 0;
Par_Set->P2 = ResXY[Al576_MPEG_Seting->Res][0] - 1 - 16;
Avi_info->width = ResXY[Al576_MPEG_Seting->Res][0] - 16;
Par_Set->P3 = 0;
Par_Set->P4 = (ResXY[Al576_MPEG_Seting->Res][1] + pal_offset) / 2 - 1;
Avi_info->high = ResXY[Al576_MPEG_Seting->Res][1] + pal_offset;
Par_Set->P_Num = 4;
Set_AL576_Command(hAL576,Par_Set);
}
else
{
if(nVideo_format != _AUTO)
{
AL576_MemWrite(hAL576,0x7ff120,0x2);
AL576_MemWrite(hAL576,0x7ff124,0x4);
Par_Set->Command = 0x70000;
Par_Set->P1 = 0;
Par_Set->P2 = ResXY[Al576_MPEG_Seting->Res][0] - 1 - 16;
Avi_info->width = ResXY[Al576_MPEG_Seting->Res][0] - 16;
Par_Set->P3 = 0;
Par_Set->P4 = ResXY[Al576_MPEG_Seting->Res][1] / 2 - 1;
Avi_info->high = ResXY[Al576_MPEG_Seting->Res][1];
Par_Set->P_Num = 4;
Set_AL576_Command(hAL576,Par_Set);
}
}
//Set Video Frame Rate
Par_Set->Command = 0xF0000;
if(nVideo_format == _PAL_I || nVideo_format == _PAL_N || nVideo_format == _PAL_CN || nVideo_format == _PAL_60 || nVideo_format == _SECAMx)
{
if(Al576_MPEG_Seting->Frame_Rate > 25)
Par_Set->P1 = 25;
else
Par_Set->P1 = Al576_MPEG_Seting->Frame_Rate;
}
else
Par_Set->P1 = Al576_MPEG_Seting->Frame_Rate;
Avi_info->frame_rate = Par_Set->P1;
Par_Set->P_Num = 1;
Set_AL576_Command(hAL576,Par_Set);
//Set Video encoding type
Par_Set->Command = 0x30000;
Par_Set->P1 = Al576_MPEG_Seting->Encoding_Type;
Par_Set->P2 = 1;
Par_Set->P3 = 0;
Par_Set->P4 = 20;
Par_Set->P_Num = 4;
Set_AL576_Command(hAL576,Par_Set);
//Set stream type
Par_Set->Command = 0x40000;
if(Al576_MPEG_Seting->Stream_Type == AVI)
Par_Set->P1 = PES;
else
Par_Set->P1 = Al576_MPEG_Seting->Stream_Type;
Par_Set->P_Num = 1;
Set_AL576_Command(hAL576,Par_Set);
//Set GOP Structure
UINT N_num,GOP;
if(Al576_MPEG_Seting->Encoding_Type == MPEG2 || Al576_MPEG_Seting->Encoding_Type == MPEG1)
{
if(Al576_MPEG_Seting->GOP == 4)
{
N_num = 1;
GOP = 1;
}
else
{
N_num = Al576_MPEG_Seting->N_Num + 10;
GOP = Al576_MPEG_Seting->GOP;
}
}
else
{
if(Al576_MPEG_Seting->GOP == 3)
{
N_num = 1;
GOP = 1;
}
else
{
N_num = Al576_MPEG_Seting->N_Num + 10;
GOP = Al576_MPEG_Seting->GOP;
}
}
Par_Set->Command = 0x80000;
Par_Set->P1 = N_num;
Par_Set->P2 = GOP;
Par_Set->P_Num = 2;
Set_AL576_Command(hAL576,Par_Set);
//Set video bit rate
double dTemp = 0;
Par_Set->Command = 0x60000;
Par_Set->P1 = Al576_MPEG_Seting->Bit_rate_mode;
if(Al576_MPEG_Seting->Video_bit_rate >= 50)
{
dTemp = Al576_MPEG_Seting->Video_bit_rate;
Par_Set->P2 = (UINT)((dTemp / 100) * 1000000);
}
else
Par_Set->P2 = Al576_MPEG_Seting->Video_bit_rate * 1000000;
Par_Set->P_Num = 2;
Set_AL576_Command(hAL576,Par_Set);
//Set audio bit rate
Par_Set->Command = 0x90000;
Par_Set->P1 = Al576_MPEG_Seting->AudioBitRate;
Avi_info->audio_rate = Al576_MPEG_Seting->AudioBitRate/1000;
Par_Set->P_Num = 1;
Set_AL576_Command(hAL576,Par_Set);
if(Al576_MPEG_Seting->Stream_Type != MPEG1_SYSTEM || Al576_MPEG_Seting->Stream_Type != MPEG1_VCD)
Set_AL576_Res(hAL576,nVideo_format,Al576_MPEG_Seting);
}
delete Par_Set;
}
unsigned int ResReg[5][4] =
{
{0x100,0x100,0x2bf,0xef},
{0x7f,0x9c,0x164,0x92},
{0x40,0x4e,0xb2,0x49 },
{0xe5,0x103,0x284,0xf2},
{0x74,0x83,0x144,0x7a}
};
unsigned int PalResReg[5][4] =
{
{0xfb,0x100,0x2c0,0x120},
{0x7f,0x82,0x164,0x92},
{0x40,0x41,0xb2,0x49 },
{0xe5,0xd8,0x284,0xf2},
{0x74,0x6d,0x144,0x7a}
};
void CPlayDMODlg::Set_AL576_Res(HANDLE hAL576,UINT nVideo_format,AL576_MPEG_SET_Ptr Al576_MPEG_Seting)
{
if(nVideo_format == _PAL_I || nVideo_format == _PAL_N || nVideo_format == _PAL_CN || nVideo_format == _PAL_60 || nVideo_format == _SECAMx)
{
AL576_RegWrite(hAL576, 0x20a4, PalResReg[Al576_MPEG_Seting->Res][0]);
Sleep(50);
AL576_RegWrite(hAL576, 0x20ac, PalResReg[Al576_MPEG_Seting->Res][1]);
Sleep(50);
AL576_RegWrite(hAL576, 0x20b4, PalResReg[Al576_MPEG_Seting->Res][2]);
Sleep(50);
AL576_RegWrite(hAL576, 0x20bc, PalResReg[Al576_MPEG_Seting->Res][3] + 8);
Sleep(50);
AL576_RegWrite(hAL576, 0x2000, 0x0d01);
Sleep(50);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -