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

📄 seeddm642_ide.c

📁 合众达的开发板自带测试程序
💻 C
字号:
/********************************************************************/
/*  Copyright 2004 by SEED Incorporated.							*/
/*  All rights reserved. Property of SEED Incorporated.				*/
/*  Restricted rights to use, duplicate or disclose this code are	*/
/*  granted through contract.									    */
/*  															    */
/********************************************************************/

#include "seeddm642_ide.h"
#include "seeddm642.h"

/*******************************************************************/
/*																   */
/*	int ata_reg_read()											   */
/*		描述:读回当前寄存器的状态								   */
/*		参数:寄存器指示										   */
/*		返值:当前状态寄存器的值								   */
/*																   */
/*******************************************************************/
int ata_reg_read(Uint32 regaddr)
{
	int regdata = 0;
	/*延时*/
	SEEDDM642_wait(20);
	/*读寄存器的值*/
	regdata = *((unsigned long *)regaddr);
	return regdata;
	
}
/*******************************************************************/
/*																   */
/*	int ata_reg_write()											   */
/*		描述:设置当前寄存器    								   */
/*		参数:regaddr:寄存器地址								   */
/*			  regdata:寄存器的值                                   */
/*		返值:无												   */
/*																   */
/*******************************************************************/
void ata_reg_write(Uint32 regaddr,Uint32 regdata)
{
	Uint8 *psrc;
	/*延时*/
	SEEDDM642_wait(20);
	/*写入当前寄存器的值*/
	psrc = (Uint8 *)regaddr;
	*psrc = regdata;
}
/*******************************************************************/
/*																   */
/*	int ata_status()											   */
/*		描述:读回当前硬盘的状态								   */
/*		参数:无												   */
/*		返值:当前状态寄存器的值								   */
/*																   */
/*******************************************************************/
int ata_status()
{
	int registervalue = 0;
	/*延时*/
	SEEDDM642_wait(20);
	/*读寄存器的值*/
	registervalue = *((unsigned long *)SEEDDM642_ATA_STATUS);
	return registervalue;
}
/*******************************************************************/
/*																   */
/*	SEEDDM642_ATAHandle ata_open()  							   */
/*		描述:打开有效的硬盘设备								   */
/*		参数:无												   */
/*		返值:有效设备的句柄									   */
/*																   */
/*******************************************************************/
SEEDDM642_ATAHandle ata_open()
{
	int ata_flag = 0xff;
	/*等待2ms*/
	SEEDDM642_waitusec(2000);
	/*读取状态寄存器,判断复位是否结束*/

	do
	{
		ata_flag = ata_status();
		if(ata_flag & ATA_BUS_ERR )
		{
			return (SEEDDM642_ATAHandle)0xff;
		}
		ata_flag = ata_flag & ATA_BUS_BSY;
				
	}while(ata_flag != 0 );
	return (SEEDDM642_ATAHandle)1;	
}
/*******************************************************************/
/*																   */
/*	int ata_command()											   */
/*		描述:设置当前寄存器    								   */
/*		参数:regaddr:寄存器地址								   */
/*			  regdata:寄存器的值                                   */
/*		返值:无												   */
/*																   */
/*******************************************************************/
Bool ata_command(ATA_command *command,Uint32 buffer,Uint32 longth)
{
	int ata_st = 0;
	Uint32 *psrc;
	Uint32 errcount = 0;
	Uint32 i;
	
	psrc = (Uint32 *)buffer;
	/*判断当前总线是否释放*/
	do
	{
		ata_st = ata_status();
		ata_st = (ata_st & ATA_BUS_BSY);
		errcount++;
		if(errcount ==0x10000)
		{
			return FALSE;	
		}
	}while(ata_st !=0);
	/*判断先决条件是否成立*/
	errcount = 0;
	do
	{
		ata_st = ata_status();
		ata_st = (ata_st & (command->prereq));
		errcount++;
		if(errcount ==0x10000)
		{
			return FALSE;	
		}	
	}while(ata_st ==0);
	/*将命令的各个参数写入到相应的寄存器*/
	if(command->features < 0x100)
	{
		ata_reg_write(SEEDDM642_ATA_FEATURES,command->features);
	}
	if(command->sector_count < 0xff)
	{
		ata_reg_write(SEEDDM642_ATA_SECTOR,command->sector_count);
	}
	if(command->LBA_l < 0x100)
	{
		ata_reg_write(SEEDDM642_ATA_LBAL,command->LBA_l);
	}
	if(command->LBA_M < 0x100)
	{
		ata_reg_write(SEEDDM642_ATA_LBAM,command->LBA_M);
	}
	if(command->LBA_H < 0x100)
	{
		ata_reg_write(SEEDDM642_ATA_LBAH,command->LBA_H);
	}
	if(command->device < 0x100)
	{
		ata_reg_write(SEEDDM642_ATA_DEVICE,command->device);
	}
	/*提交命令*/
	ata_reg_write(SEEDDM642_ATA_COM,command->com_code);
	/*等待命令执行完毕:BSY为0*/
	errcount = 0;
	do
	{
		ata_st = ata_status();
		ata_st = (ata_st & ATA_BUS_BSY);
		errcount++;
		if(errcount ==0x10000)
		{
			return FALSE;	
		}
	}while(ata_st !=0);
	/*等待完成条件出现*/
	errcount = 0;
	do
	{
		ata_st = ata_status();
		ata_st = (ata_st & (command->complete_flag));
		errcount++;
		if(errcount ==0x10000)
		{
			return FALSE;	
		}	
	}while(ata_st ==0);
	/*判断是否出错*/
	ata_st = ata_status();
	if((ata_st & 0x1)==1)
	{
		ata_st = ata_reg_read(SEEDDM642_ATA_ERROR);
		return FALSE;	
	}
	/*读取命令结果*/
	for(i = 0;i<longth;i++)
	{
		*psrc++ =ata_reg_read(SEEDDM642_ATA_DATA);	
	}
	ata_st = ata_status();
	if((ata_st & 0x1) != 0 )
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}





⌨️ 快捷键说明

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