⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ghdd.c

📁 dvr
💻 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 + -