📄 ghdd.c
字号:
/*
********************************************************************************
*
* (c) Copyright 2002, Vineyard Technologies, Inc.
*
* Filename : ghdd.c
* Programmer(s): Steve KyeongHyeon Lee
* Created : 2003/05/07
* Modified :
*
* Description :
********************************************************************************
*/
//######################################################################
//
//######################################################################
#include "types.h"
#include "8052reg.h"
#include <stdio.h>
#include <absacc.h>
#include "eprom.h"
#include "gio.h"
#include "hdd_if.h"
#include "types.h"
#include "ghdd.h"
#include "lib.h"
#include "gosd.h"
#ifdef TMP_DEL
#ifdef LANIF
#include "lan.h"
#endif
#endif
#include "key.h"
//######################################################################
//
//######################################################################
extern xdata u8 gv_time_data[6];
extern xdata u8 osdgv_menu_base;
extern xdata u16 gv_hdd_write_interrupt_cnt;
//######################################################################
//
//######################################################################
extern void LBA_write(u8 hddIndex);
extern u32 mktime(u8 timedate[]);
extern void real_time_read(u8 option);
extern u8 get_front_key(void);
//######################################################################
//
//######################################################################
// CB(Control Block) unit is 512
#define HDD_CB_LOH_SIZE 1 // LOG Header structure
#ifdef MORE_EVENT
#define HDD_CB_LOG_SIZE 64 // LOG Body structure
#else
#define HDD_CB_LOG_SIZE 4 // LOG Body structure
#endif
#define HDD_CB_LBA_SIZE 1 // WCurrent pointer
#define HDD_CB_SIG_SIZE 1 // Signature structure
#define HDD_SECT_CNT_SZ1 1
#define HDD_SECT_CNT_SZ8 8
#define BLKEVTCNT 32 // event count for one LBA
#define MAXEVTCNT (HDD_CB_LOG_SIZE*BLKEVTCNT) // one LBA(512) include 32 events
#define HDD_ACCESS_TIMEOUT 30000 // 6 sec
#define HDD_TMPBUFSIZE 4096
//######################################################################
//
//######################################################################
#ifdef DEBUG_HDD_DUMP
xdata u32 gv_HDD_NumOfLBA[2] = {0,0};
#endif
xdata u32 gv_HDD_LastLBA[2] = {0,0}; // Addressable Last LBA
xdata u32 gv_HDD_LogHeadLBA[2] = {0,0}; // Log Head LBA
xdata u32 gv_HDD_LogBodyLBA[2] = {0,0}; // Log Body LBA
xdata u32 gv_HDD_CWLBA[2] = {0,0}; // Current Writting LBA
xdata u32 gv_HDD_EOVLBA[2] = {0,0}; // EOV [End Of Video] LBA
xdata u32 gv_HDD_size[2];
xdata u32 gv_WCurrent_LBA[2];
xdata u32 gv_RCurrent_LBA[2];
xdata u8 gv_HDD_play_hdd_index;
xdata u8 gv_hdd_count = 0;
xdata u8 *gv_hdd_signature = SIGNATURE;
xdata u8 *gv_hdd_rom_ver_name = ROM_VERSION_NAME;
xdata u8 gv_hdd_error_flag = 0;
xdata u8 gv_HDD_format_index;
xdata u8 gv_hdd_tmp_buf[HDD_TMPBUFSIZE];
xdata u8 gv_HDD_usage[2];
xdata u8 gv_HDD_exist[2];
xdata u8 gv_evt_msg2read = FALSE;
xdata EvtHead gv_evt_head;
xdata EvtNode gv_evt_buf[MAXEVTCNT];
xdata u8 gv_HDD_48bit_address[2]={0,0};
xdata u8 gv_hdd_cache_disable_data = 0;
//######################################################################
//
//######################################################################
#ifndef PWRCV2
u8 hdd_check_signature(u8 hddIndex, u8* disk_id);
#endif
void hdd_write_root_sector(u8 hddIndex);
void hdd_sector_read(u8 hddIndex, u32 lba, u8 size, u8* buf);
void hdd_sector_write(u8 hddIndex, u32 lba, u8 size, u8* buf);
void hdd_sector_set(u8 hddIndex, u32 Lba, u8 sector_counter);
//void hdd_cache(u8 hddIndex, u8 enable_flag );
void hdd_cmd(u8 hddIndex, u8 Command_Id );
char hdd_select(u8 hddIndex);
char hdd_wait_busy_free(void);
char hdd_wait_dev_ready(void);
char hdd_wait_rw_ready(void);
static u8 hdd_evt_check2(u32 elba_s, u32 elba_e, u32 plba_s, u32 plba_e, u32 EndOfDisk);
static u8 hdd_evt_check(u32 elba_s, u32 elba_e, u32 lba);
//xdata u8 temp_arr[44];
/*===============================================================================
Checking HDD
MASTER ...
MASTER [NONE]
MASTER [123456789012345678]
MASTER [123456789012345678]-USED
MASTER [123456789012345678]-NEW
DVR NEEDS TO FORMAT HDD
ALL DATA WILL BE LOST
[(SELECT)FORMAT/(MENU)CANCEL]?
FORMAT COMPLETED
FORMAT CANCELED - HDD IGNORED
//===============================================================================*/
char HDD_Initial(void)
{
xdata u8 j;
xdata u16 i;
xdata u16 tdata;
xdata u16 tdata_l;
xdata u32 temp;
xdata u8 dsp_offset = 1 + osdgv_menu_base;
xdata u8 model[25];
#ifdef FONT_SC
xdata u8 *hdd_id_str[2]={"rs-1 ", "rs-2 " };//祑絃-1 祑絃-2
#else
xdata u8 *hdd_id_str[2]={"MASTER", "SLAVE " };
#endif
#ifdef DEBUG_HDD_DUMP
gv_HDD_NumOfLBA[0] = gv_HDD_NumOfLBA[1] = 0;
#endif
gv_HDD_LogHeadLBA[0]= gv_HDD_LogHeadLBA[1] = 0;
gv_HDD_LogBodyLBA[0]= gv_HDD_LogBodyLBA[1] = 0;
gv_HDD_CWLBA[0] = gv_HDD_CWLBA[1] = 0;
gv_HDD_EOVLBA[0] = gv_HDD_EOVLBA[1] = 0;
gv_HDD_LastLBA[0] = gv_HDD_LastLBA[1] = 0;
gv_HDD_size[0] = gv_HDD_size[1] = 0;
gv_WCurrent_LBA[0] = gv_WCurrent_LBA[1] = 0;
gv_RCurrent_LBA[0] = gv_RCurrent_LBA[1] = 0;
gv_HDD_usage[0] = gv_HDD_usage[1] = 0;
gv_HDD_exist[0] = gv_HDD_exist[1] = 0;
gv_hdd_count = 0;
/*#ifdef DEBUG_NO_HDD
return HDD_ERRCODE_NO_HDD;
#endif*/
#ifdef PWRCV2
Val_EPROM_DISKID = EPROM_SetUp_data_Read(EPROM_DISKID);
/*#ifdef DEBUG_PWRCV2
printf("\n\n\rHDD_Init: EPROM-DiskId=%02x", (u16)Val_EPROM_DISKID);
#endif*/
#endif
for (j = 0; j < 2; j++)
{
dsp_offset++;
osd_printf(10,dsp_offset,6,hdd_id_str[j]);
osd_printf(24,dsp_offset,3,"...");
#ifdef DEBUG_MHDD_ONLY
if(j==0)
{
if(!hdd_select(j))
goto HDD_NOT_DETECTED;
}
else
{
goto HDD_NOT_DETECTED;
}
#else
if(!hdd_select(j)) goto HDD_NOT_DETECTED;
#endif
if(!hdd_wait_busy_free()) goto HDD_NOT_DETECTED;
if(!hdd_wait_dev_ready()) goto HDD_NOT_DETECTED;
HDD_DEVICE_CONTROL = HDD_INT_DISABLE;
hdd_sector_set(j, 0, HDD_SECT_CNT_SZ8);
hdd_cmd(j, HDD_SET_MULTIPLE_MODE);
if(!hdd_wait_dev_ready()) goto HDD_NOT_DETECTED;
hdd_cmd(j, HDD_IDENTIFY_DEVICE);
i = HDD_STATUS;
if(!hdd_wait_rw_ready()) goto HDD_NOT_DETECTED;
if(!hdd_wait_busy_free()) goto HDD_NOT_DETECTED;
goto HDD_DETECTED;
HDD_NOT_DETECTED:
#ifdef FONT_SC
osd_printf(24,dsp_offset,6,"[Xrs] ");//礚祑絃
#else
osd_printf(24,dsp_offset,6,"[NONE]");
#endif
continue;
HDD_DETECTED:
// get hdd size
for (i = 0; i <= 255; i++)
{
tdata_l = READ_HDD_LOW_DATA; //XBYTE[0x80A8]
tdata = READ_HDD_HIGH_DATA; //XBYTE[0x80E8]
// Reading HDD Model Number
if (i > 26 && i < 39)
{
// pick 24 characters
model[(i - 27) * 2 + 0] = tdata; //0, 2, 4, 6, 8,.....22
model[(i - 27) * 2 + 1] = tdata_l; //1, 3, 5, 7, 9,.....23
}
// store 32 bit HDD capacity info
tdata = (tdata<<8) | tdata_l;
#ifdef DEBUG_IDENTIFY_HDD
printf("\n\r %04d: %04x", (u16)i, (u16)tdata);
#endif
// Reading 48 bit addressing feature bits
if (i == 83)
{
gv_HDD_48bit_address[j] = 0;
if (tdata & 0x0400)
{
gv_HDD_48bit_address[j] = 1;
#ifdef DEBUG_ATA6
printf("\n\r ATA-6 HDD [%d]", (int)j);
#endif
}
}
// Reading HDD capacity
if (gv_HDD_48bit_address[j] == 0)
{
// under 137GB
if (i == 60)
gv_HDD_LastLBA[j] = tdata;
if (i == 61)
{
temp = tdata;
temp = temp << 16;
gv_HDD_LastLBA[j] = (0x0000FFFF & gv_HDD_LastLBA[j]) | (0xFFFF0000 & temp);
}
}
else
{
// over 137GB
if (i == 100)
gv_HDD_LastLBA[j] = tdata;
if (i == 101)
{
temp = tdata;
temp = temp << 16;
gv_HDD_LastLBA[j] = (0x0000ffff & gv_HDD_LastLBA[j]) | (0xffff0000 & temp);
}
}
} // Get HDD Size
gv_HDD_exist[j] = 1;
#ifdef DEBUG_HDD_DUMP
gv_HDD_NumOfLBA[j] = gv_HDD_LastLBA[j];
#endif
// make it align to 8
for (i = 0; i < 16; i++)
{
if ((gv_HDD_LastLBA[j] % 8) == 0)
break;
#ifdef DEBUG_HDD_ALIGN
printf("\n\r.");
#endif
gv_HDD_LastLBA[j]--;
}
gv_HDD_LastLBA[j]--; // make it last addressable LBA.
#if defined(DEBUG_HDD_REPORT) || defined(DEBUG_HDD_DUMP)
printf("\n\rHDD MODEL = %s", model);
printf("\n\rHDD LastLBA-1 = %lu LBA [%lu MB]", gv_HDD_LastLBA[j]+1, (gv_HDD_LastLBA[j]+1)/(u32)1953);
#endif
gv_hdd_count++;
#ifdef FONT_SC
osd_printf(24,dsp_offset,6,"[rsBC]");//祑絃絋粄
#else
osd_printf(24,dsp_offset,1,"[");
osd_printf(26,dsp_offset,18,model);
osd_printf(62,dsp_offset,1,"]");
#endif
// if there's no signature
i = hdd_check_signature(j, 0);
// i = 2; //for debug FONT_SC
if (i != 0)// incorrect signature or incorrect HDD_FORMAT_VER
{
// format the hard drive & put signature
//osd_printf(23,dsp_offset++,24,"New HDD Format Completed");
if(i==1) // Invalid signature
#ifdef FONT_SC
osd_printf(64,dsp_offset++,4,"-[z]");//穝
#else
osd_printf(64,dsp_offset++,4,"-NEW");
#endif
else if(i==2)// Invalid HDD_FORMAT_VER
#ifdef FONT_SC //123456789012345678901234567890
osd_printf(64,dsp_offset++,5,"-[A] ");//侣
#else
osd_printf(64,dsp_offset++,5,"-USED");
#endif
else;
//osd_printf(14,dsp_offset++,17,"INCOMPATIBLE HDD!");
#ifdef FONT_SC
//12345678901234567890
osd_printf(14, dsp_offset++, 18, "R S r s $ Q!!.....");//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -