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

📄 smc.c

📁 image capture billing control system
💻 C
📖 第 1 页 / 共 2 页
字号:
//--------------------------------------------------------------------------
//	STATUS.0 : 0-->Pass		1-->Fail
//	STATUS.5 : 0-->Not Suspended	1-->Suspended
//	STATUS.6 : 0-->Busy		1-->Ready
//	STATUS.7 : 0-->Protected	1-->Not Protected

//void Poll_LCD();
//void Send_Command(Byte);
/*
void USB_Reset();
void LCD_Clear();
void LCD_xy(Byte, Byte);
void Print(Byte *);
void PrintDEC(Dword, Byte);
void PrintHEX(Dword, Byte);
*/
#define	M0MB	0x00
#define	M8MB	0xe6
#define	M16MB	0x73
#define	M32MB	0x75
#define	M64MB	0x76
#define	M128MB	0x79

#define	Start_Block_Write(x, y)		FAT_Write(RD0_BLOCK_INDEX, x, y)
#define	Start_Block_Read(x)			FAT_Read(RD0_BLOCK_INDEX, x)

#define	Download(x)		MMU_Transfer(x, DOWNLOAD_REQ)
#define	Upload(x)		MMU_Transfer(x, UPLOAD_REQ)

#define	BLOCKS_OF_RD	4

//#define	Download_RD()	Download_Blocks(RD0_BLOCK_INDEX, BLOCKS_OF_RD)
#define	Upload_RD()		Upload_Blocks(RD0_BLOCK_INDEX, BLOCKS_OF_RD)

#define	Req(x)			Upload_Byte(x)

//void Status_Change(Byte);
IntExt1()       interrupt	2		// SMC in/out
{
	smi_write_protect = 1;
	smi_erase_enable = 0;
	smi_card_enable = 0;

	if(!cf_card_detect)		// 0: have, 1: don't have
	{
//		if(SMC_Exist) return;
		SMC_Exist = 1;
	}
	else
	{
//		if(!SMC_Exist) return;
		SMC_Exist = 0;
	}
	SMC_In_Out=1;
	SystemStatus = STATUS_STOP;
}

void Volume_Mute();
//void Mem_Reset();
void Status_Change(Byte);
void SMC_In_Out_Check()
{
	if(SMC_In_Out)
	{
		EA=0;
		Volume_Mute();
		Delay(10000);
		SMC_In_Out=0;
		SMC_Refreshed=0;
		Status_Change(STATUS_STOP);
		Yellow_Light(1,1);
		EA=1;
	}
}

Byte SmartMediaStatus (void)
{
	smi_card_enable = 1;
	SMI_Command = 0x70;			// Status Read
	Trigger(smi_t_status);
	smi_card_enable = 0;
	return SMI_Status;
}

Byte Status_Check (void)
{
	SMI_Command = 0x70;			// Status Read
	Trigger(smi_t_status);
	return SMI_Status;
}

void SmartMediaReadID (void)
{
	smi_card_enable = 1;
	SMI_Command = 0x90;
	Trigger (smi_t_id);
	smi_card_enable = 0;
	return;
}

//--------------------------------------------------------------------------
// 8M's BlockNo = 0..1023
//	1 Block = 16 Pages
// 16M's BlockNo = 0..1023
//	1 Block = 32 Pages
/*
Word Block_Addr_Change(Word block)
{
	if(Mem_Select==BIM)
	{
		if(block<Mem1_Blocks)
		{
			Select_Mem1();
		}
		else
		{
			Select_Mem2();
			return(block - Mem1_Blocks);
		}
	}
	else if(Mem_Select==SMC)
	{
		Select_SMC();
	}
	return(block);
}
*/
/*
Dword Page_Addr_Change(Dword page)
{
	if(Mem_Select==BIM)
	{
		if(page<Mem1_Pages)
		{
			Select_Mem1();
			smi_64_128m = Mem1_Over64;
		}
		else
		{
			Select_Mem2();
			smi_64_128m = Mem2_Over64;
			return(page - Mem1_Pages);
		}
	}
	else if(Mem_Select==SMC)
	{
		Select_SMC();
		smi_64_128m = SMC_Over64;
	}
	return(page);
}
*/
/*
Dword Change_BlockAddr(Word block)
{
	if(Mem_Select==BIM)
	{
		if(block<Mem1_Blocks)
		{
			Select_Mem1();
			smi_64_128m = Mem1_Over64;
		}
		else
		{
			Select_Mem2();
			smi_64_128m = Mem2_Over64;
			return(block - Mem1_Blocks);
		}
	}
	else if(Mem_Select==SMC)
	{
		Select_SMC();
		smi_64_128m = SMC_Over64;
	}
	return(block);
}
*/
void Set_PageAddr(Dword block, Dword page)
{
	if(Mem_Select==BIM)
	{
		if(block<Mem1_Blocks)
		{
			Select_Mem1();
			smi_64_128m = Mem1_Over64;
		}
		else
		{
			Select_Mem2();
			smi_64_128m = Mem2_Over64;
			block -= Mem1_Blocks;
		}
	}
	else if(Mem_Select==SMC)
	{
		Select_SMC();
		smi_64_128m = SMC_Over64;
	}

	page = block*32 + page;

	SMI_Address0 = 0;
	SMI_Address1 = page;				// PA 7..0
	SMI_Address2 = page>>8;			// PA 15..8
	SMI_Address3 = page>>16;
}

void Flash_Mem_Reset()
{
	smi_card_enable = 1;
	SMI_Command = 0xff;
	Trigger(smi_t_command);
	while (!smi_ready);
//	Delay_10us(1);
	smi_card_enable = 0;
}

Bool Flash_Mem_Erase(Word block)
{
	Set_PageAddr(block, 0);

	Flash_Mem_Reset();

	smi_card_enable = 1;
	smi_erase_enable = 1;
	smi_write_protect = 0;

	SMI_Command = 0x60;			// Auto Block Erase Setup
	Trigger (smi_t_command_address);

	SMI_Command = 0xD0;			// Erase Command
	Trigger (smi_t_command);
	while (!smi_ready);

	smi_write_protect = 1;
	smi_erase_enable = 0;
	smi_card_enable = 0;

//	Error = SmartMediaStatus()&0x01;
	while ( !(Status_Check() & 0x40) );	// Waitting for status ready

	if(SmartMediaStatus()&0x01)
	{
		Error = 1;
		return(0);
	}
	return(1);
}

//--------------------------------------------------------------------------
//void Mem_Reset();
Bool Bulk_Check()
{
	Dword dwi;
	for( dwi=0; dwi<BULK_TIME_OUT ; dwi++)
	{
		if(Bulk_Complete) return(1);
	}

	return(0);
}

Bool Spare_Area_Write(Dword block, Dword page)
{
//	Red_On();

//	block = Change_BlockAddr(block);
//	page = block*32 + page;
	Set_PageAddr(block, page);

	Flash_Mem_Reset();

	smi_card_enable = 1;
	smi_write_protect = 0;
	smi_xfer_dir = 1;

	SMI_Command = 0x50;
	Trigger(smi_t_command);

	SMI_Command = 0x80;					// Write
/*
	SMI_Address0 = 0;
	SMI_Address1 = page;				// PA 7..0
	SMI_Address2 = page/256;			// PA 15..8
	if(smi_64_128m) SMI_Address3 = page/256/256;
//	SMI_Address3 = page/256/256;
*/
	Trigger (smi_t_command_address);

	MMU_Pointer_Set(4);
	Trigger(smi_t_data);

	SMI_Command = 0x10;			// Page Program
	Trigger(smi_t_command);
//	Delay_10us(50);
	while (!smi_ready);		 	// Waitting for ready
	while ( !(Status_Check() & 0x40) );	// Waitting for status ready

	smi_xfer_dir = 0;
	smi_write_protect = 1;
	smi_card_enable = 0;

//	return(~(SmartMediaStatus()&0x01));
	if(SmartMediaStatus()&0x01)
	{
		Error=1;
		return 0;
	}
	return 1;
//	Red_Off();
}

void Spare_Area_Read(Dword block, Dword page)
{
//	Red_On();

//	block = Change_BlockAddr(block);
//	page = block*32 + page;
	Set_PageAddr(block, page);

	Flash_Mem_Reset();

	smi_card_enable = 1;

	SMI_Command = 0x50;
/*
	SMI_Address0 = 0;			// PA 7..0
	SMI_Address1 = page;				// PA 16..9
	SMI_Address2 = page/256;			// PA 23..17
	if(smi_64_128m) SMI_Address3 = page/256/256;
//	SMI_Address3 = page/256/256;
*/
	Trigger(smi_t_command_address);

//	Delay_10us(5);
	while (!smi_ready);

	MMU_Pointer_Set(4);
	Trigger(smi_t_data);

	smi_card_enable = 0;

//	Red_Off();
}

Bool FAT_Write(Dword block_addr, Byte page_offset, Word content)
{
	MMU_Reset();
	DMA_Mode_Off();

	Write_MMU(0x1fc, content/256);
	Write_MMU(0x1fd, content%256);
	return( Spare_Area_Write(block_addr, page_offset) );
}

Word FAT_Read(Dword block_addr, Byte page_offset)
{
	MMU_Reset();
	DMA_Mode_Off();

//	block_addr=0;
//	page_offset=0;

	Spare_Area_Read(block_addr, page_offset);

	return( Read_MMU(0x1fc)*256 + Read_MMU(0x1fd) );
}
/*
void Start_and_Last_Block_Write(Byte page_offset)
{
//	MMU_Reset();
	DMA_Mode_Off();
	Write_MMU(0x1fc, File_Start_Block/256);
	Write_MMU(0x1fd, File_Start_Block%256);
	Write_MMU(0x1fe, File_Last_Block/256);
	Write_MMU(0x1ff, File_Last_Block%256);
	Spare_Area_Write(RD0_BLOCK_INDEX, page_offset);
}
*/
/*
void Start_and_Last_Block_Read(Byte page_offset)
{
//	MMU_Reset();
	SectorBuffer51Mode();

	Spare_Area_Read(RD0_BLOCK_INDEX, page_offset);

	File_Start_Block = Read_MMU(0x1fc)*256 + Read_MMU(0x1fd);
	File_Last_Block = Read_MMU(0x1fe)*256 + Read_MMU(0x1ff);
}
*/
void Flash_Mem_Write(Dword block, Dword page)
{
//	Red_On();

//	page = Page_Addr_Change(block*32 + page);
	Set_PageAddr(block, page);

//	block = Change_BlockAddr(block);
//	page = block*32 + page;

	Flash_Mem_Reset();

	smi_card_enable = 1;
	smi_write_protect = 0;
	smi_xfer_dir = 1;

	SMI_Command = 0x00;
	Trigger(smi_t_command);

	SMI_Command = 0x80;					// Write

/*
	SMI_Address0 = 0;
	SMI_Address1 = page;				// PA 7..0
	SMI_Address2 = page/256;			// PA 15..8
	if(smi_64_128m) SMI_Address3 = page/256/256;
//	SMI_Address3 = page/256/256;
*/
	Trigger (smi_t_command_address);

	MMU_Pointer_Set(511);
	Trigger(smi_t_data);

	SMI_Command = 0x10;			// Page Program
	Trigger(smi_t_command);
//	Delay_10us(50);
	while (!smi_ready);		 	// Waitting for ready

	smi_xfer_dir = 0;
	smi_write_protect = 1;
	smi_card_enable = 0;

	while ( !(Status_Check() & 0x40) );	// Waitting for status ready

	if(SmartMediaStatus()&0x01) Error=1;
//	Red_Off();
}

void Flash_Mem_Read(Dword block, Dword page)
{
	Set_PageAddr(block, page);
	Flash_Mem_Reset();

	smi_card_enable = 1;

	SMI_Command = 0x00;

	Trigger(smi_t_command_address);

	while (!smi_ready);

//	smi_ecc_page = 0;

	MMU_Pointer_Set(511);
	Trigger(smi_t_data);

	smi_card_enable = 0;
}

//Word Read_FAT(Word);
Dword Size(Dword value, Word size)
{
//	return( value/size + ((value%size) != 0) );		// more code
	Dword y;
	y = value/size;
	if( value%size !=0 ) y++;
	return(y);
}

void RD_Read(Byte file_num)	// read Root Directory
{
/* Root Directory
Address	Bytes	Content
0-127		128		File Name, Extension
128-129		1		Attribute
130-131	2		Time
132-133	2		Date
134-135	2		Start Block Number
136-139	4		File Size (Bytes)
140-141	2		Bit Rate
142-143	1		0:Mp3	1:General
*/

//	File_Start_Block = Start_Block_Read(file_num-1);
//	Start_and_Last_Block_Read(file_num-1);
	MMU_Reset();
	DMA_Mode_Off();
	Flash_Mem_Read(RD0_BLOCK_INDEX+(file_num-1)/32, (file_num-1)%32);
//	File_Start_Block = MMU_Byte2Word(FILE_START_BLOCK_LOCATION);

	File_Bytes = MMU_Byte2Dword(FILE_BYTE_LOCATION);
	File_Pages = Size(File_Bytes, PAGE_SIZE);
	File_Blocks = Size(File_Pages, 32);
	Last_Pages = File_Blocks;
	Last_Pages = Last_Pages*32 - File_Pages;

	File_Start_Block = MMU_Byte2Word(FILE_START_BLOCK_INDEX);
	File_Last_Block = MMU_Byte2Word(FILE_LAST_BLOCK_INDEX);

//	Bit_Rate = MMU_Byte2Word(BIT_RATE_LOCATION);
//	Bit_Rate = 128;
//	Page_Per_Sec = Bit_Rate/4;	// (bit_rate*kilo) / (8*512)

//	MP3 = ( Read_MMU(142) == 0 )? 0 : 1;
	Is_MP3 = Read_MMU(MP3_OR_GF_LOCATION) & 0x01;
}
/*
void RD_Erase(Byte file_num)
{
	Byte i;

	file_num--;		// RD location = file_num - 1

	MMU_Reset();
	DMA_Mode_Off();

	Flash_Mem_Erase(RD1_BLOCK_INDEX);

	for(i=0 ; i<Current_Flash_Mem_Files-1 ; i++)
	{
//		x = (i>=file_num)? 0: 1;
//		Flash_Mem_Read(RD0_BLOCK_INDEX, i+x);
		Flash_Mem_Read(RD0_BLOCK_INDEX, i + (i>=file_num) );
		Flash_Mem_Write(RD1_BLOCK_INDEX, i);
		FAT_Write(RD1_BLOCK_INDEX, i, (FAT_Read(RD0_BLOCK_INDEX, i + (i>=file_num))));
	}

	Flash_Mem_Erase(RD0_BLOCK_INDEX);

	for(i=0 ; i<Current_Flash_Mem_Files-1 ; i++)
	{
		Flash_Mem_Read(RD1_BLOCK_INDEX, i);
		Flash_Mem_Write(RD0_BLOCK_INDEX, i);
		FAT_Write(RD0_BLOCK_INDEX, i, (FAT_Read(RD1_BLOCK_INDEX, i)));
	}
}
*/
Word Unused_Block_Search(Word block_addr)	// Searching start from block_addr
{
	Word wi;
	for(wi=block_addr ; wi<Current_Flash_Mem_Blocks ; wi++)
	{
		if((FAT_Read(wi, VALID_CHECK_LOCATION) == VALID_BLOCK)&&(FAT_Read(wi, NEXT_CHECK_LOCATION) == UNUSED_BLOCK))
		{
			return(wi);
		}
	}
	return(wi);
}
/*
void Block_Move(Dword block1, Dword block2)
{
	Byte i;
	Dword page1, page2;

	page1 = block1*32;
	page2 = block2*32;

	MMU_Reset();
	SectorBuffer51Mode();

	Flash_Mem_Erase(block2);

	for(i=0 ; i<32 ; i++)
	{
		Flash_Mem_Read(page1+i, 0, 512);
		Flash_Mem_Write(page2+i, 0, 512);
	}
}
*/

void MMU_Transfer(Word bytes, Byte request)
{
	MMU_Pointer_Set(bytes-1);

	USBI_BULK = request;	// b'00001011', read request
	while( USBI_BULK & 0x02 );
}

/*
void Upload_End()
{
//	MMU_Reset();
//	SectorBufferCardMode();

	Download(2);
}
*/

Byte Download_Byte()
{
	Download(1);
	return( Read_MMU(511) );
}

Word Download_Word()
{
	MMU_Reset();
	DMA_Mode_Off();

	Download(2);
	return( Read_MMU(510)*256 + Read_MMU(511) );
}

void Upload_Byte(Byte x)
{
	MMU_Reset();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -