📄 ide_test.c.bak
字号:
//ide_test.c
//include files
#include <stdio.h>
#include <sysreg.h>
#include <builtins.h>
#include <defTS101.h>
#include <signal.h>
#include "ide_test.h"
/*********************** may be changed by user *******************/
//define BeginGroup of the file to be created(better larger than 3)
#define NEWBEGINGRP 4
//define the length of the file to be created
#define LENGTH 32*512+4
//define source cluster of file needed to copy
#define COPYFILE 4
//define source cluster of the file to be deleted
#define DELFILE 5
//define parameters of the file to be created
#define NEWYEAR 2005
#define NEWMONTH 2
#define NEWDAY 7
#define NEWHOUR 15
#define NEWMINUTE 2
#define NEWSECOND 48 //only be even
//define parameters of the file to be copied
#define COPYYEAR 2005
#define COPYMONTH 2
#define COPYDAY 8
#define COPYHOUR 16
#define COPYMINUTE 15
#define COPYSECOND 30 //only be even
/******************************************************************/
//define global variables
unsigned char uRcvBuffer[512],uRcvBuffer1[512];//used for data transfer
unsigned char FileBuffer[LENGTH];//used for the content of the file to be created
unsigned short atadevinfo[256];
static unsigned short errcount = 0;
static unsigned char status = 0;
static unsigned int groupnum = 0;
static struct PartitionTable MBRTable;
static struct FAT32LogicPartition CPartition;
static struct FileReg OperatorFile, myfile, mycopyfile,mynewfile;
unsigned int uError = 0;
unsigned char temp[512];
unsigned int NxtFreeGrp;
//define functions
void InitDSP();
unsigned char InitIDE();
unsigned char InitMBR();
unsigned char InitCPartition();
unsigned char ListFile();
unsigned char atadev_get_block(unsigned int lba, unsigned char sector_count, unsigned char* buffer);
unsigned char atadev_put_block(unsigned int lba, unsigned char sector_count, unsigned char* buffer);
unsigned char Check_NoRequest();
unsigned char Check_HaveRequest();
unsigned char Check_DateReady();
unsigned char CopyGroup(unsigned int srcgroup, unsigned int dstgroup);
unsigned int newgrp();
unsigned char WriteDFT();
unsigned char CopyFile();
unsigned char DelFile(unsigned int srcgroup);
unsigned char NewFile();
unsigned char WriteNewDFT();
unsigned char WriteFile();
unsigned char WriteGroup(unsigned int dstgroup);
unsigned char WriteWholeGroup(unsigned int dstgroup);
/**************************** main program start *******************************/
// Hard disk test main program
void main()
{
int i;
printf("\n\r ****************** Hard disk test begin ******************\n");
InitDSP();
if(!InitIDE())
printf("\n\r InitIDE error!\n");
else
{
if(InitMBR())
{
if((MBRTable.PartitionType == 0x0b) || (MBRTable.PartitionType == 0x0c))
{
if(InitCPartition())
{ /*
if(ListFile())
printf("\n\r ListFile end!");
else
printf("\n\r ListFile error!");
*/
if(NewFile())
printf("\n\r NewFile end!");
else
printf("\n\r NewFile error!");
if(ListFile())
printf("\n\r ListFile end!");
else
printf("\n\r ListFile error!");
/*
//NOTICE:before CopyFile,you should ListFile to look for the file which to be copied
if(CopyFile())
printf("\n\r CopyFile end!");
else
printf("\n\r CopyFile error!");
if(ListFile())
printf("\n\r ListFile end!");
else
printf("\n\r ListFile error!");
if(DelFile(DELFILE))
printf("\n\r DeleteFile end!");
else
printf("\n\r DeleteFile error!");
if(ListFile())
printf("\n\r ListFile end!");
else
printf("\n\r ListFile error!");
*/
}
else
printf("\n\r InitCPartition error");
}
else
printf("\n\r Partition Type is not FAT32!\n");
}
else
printf("\n\n\n\r InitMBR error!\n");
}
printf("\n\n\r ****************** Hard disk test end ******************");
}
/**************************** main program end *******************************/
/*************************** initialization start ****************************/
// initialize DSP
void InitDSP( void )
{
//------------------------- Init SYSCON and SDRCON ----------------------
__builtin_sysreg_write(__SYSCON, SYSCON_MSH_SLOW |
SYSCON_MSH_WT3 |
SYSCON_MSH_IDLE |
SYSCON_MS1_SLOW |
SYSCON_MS1_WT3 |
SYSCON_MS1_IDLE |
SYSCON_MS0_SLOW |
SYSCON_MS0_WT3 |
SYSCON_MS0_IDLE);
__builtin_sysreg_write(__SDRCON, SDRCON_INIT |
SDRCON_RAS2PC4 |
SDRCON_PC2RAS3 |
SDRCON_REF600 |
SDRCON_PG256 |
SDRCON_CLAT2 |
SDRCON_ENBL);
}
//initialize ide
unsigned char InitIDE()
{
unsigned int i=0;
unsigned char error=0;
if(!Check_NoRequest())
{
printf("\n\r Check_NoRequest : 001");
return 0;
}
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
if(!Check_NoRequest())
{
printf("\n\r Check_NoRequest : 002 ");
return 0;
}
COMMAND = IDENTIFY_DEVICE;
for (i=0;i<10;i++);
if(!Check_HaveRequest())
{
printf("\n\r Check_HaveRequest : 003 ");
return 0;
}
for(i=0;i<256;i++)
atadevinfo[i] = DATA;
for (i=0;i<10;i++);
if(!Check_NoRequest())
{
printf("\n\r Check_NoRequest : 004 ");
return 0;
}
if (status & ERRBIT)
error = ERRORREG;
if (error)
{
printf("\n\r atadevinfo read error : 005 ");
return 0;
}
if(!Check_NoRequest())
{
printf("\n\r Check_NoRequest : 006 ");
return 0;
}
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
if(!Check_NoRequest())
{
printf("\n\r Check_NoRequest : 007 ");
return 0;
}
SECTOR_COUNT = (atadevinfo[47] & 0xFF);
for(i=0;i<10;i++);
if(!Check_DateReady())
{
printf("\n\r Check_DateReady : 008 ");
return 0;
}
COMMAND = SET_MULTIPLE;
for(i=0;i<10;i++);
if(!Check_NoRequest())
{
printf("\n\r Check_NoRequest : 009 ");
return 0;
}
error = 0;
if (status & ERRBIT)
error = ERRORREG;
if (error)
{
printf("\n\r SECTOR_COUNT set error : 010 ");
return 0;
}
return 1;
}
/*************************** initialization end ****************************/
/************************* check Hard disk status start ****************************/
//Hard disk free and have no data request,then return 1 (BSYBIT=0, DRQBIT=0)
unsigned char Check_NoRequest()
{
unsigned int iNumLoops = 0;
while((iNumLoops++ < LOOPTIME) &&
(((status = ATASTATUS) & BSYBIT) || (status & DRQBIT)))
{ }
if(iNumLoops >= LOOPTIME)
return 0;
else
return 1;
}
//Hard disk free and data ready,then return 1 (BSYBIT=0, DRDYBIT=1)
unsigned char Check_DateReady()
{
unsigned int iNumLoops = 0;
while((iNumLoops++ < LOOPTIME)&&
(!((status = ATASTATUS) & DRDYBIT)||(status & BSYBIT)))
{ }
if(iNumLoops >= LOOPTIME)
return 0;
else
return 1;
}
//Hard disk free and have data request,then return 1 (BSYBIT=0, DRQBIT=1)
unsigned char Check_HaveRequest()
{
unsigned int iNumLoops = 0;
while((iNumLoops++ < LOOPTIME)&&
(((status = ATASTATUS) & BSYBIT) || !(status & DRQBIT)))
{ }
if(iNumLoops>=LOOPTIME)
return 0;
else
return 1;
}
/************************* check Hard disk status end ****************************/
/*************** read and write Hard disk program start *****************/
//read Hard disk
unsigned char atadev_get_block(unsigned int lba, unsigned char sector_count, unsigned char* buffer)
{
unsigned char error = 1;
unsigned int i = 0;
errcount = 0;
while (error)
{
if(!Check_NoRequest())
return 0;
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
if(!Check_NoRequest())
return 0;
SECTOR_COUNT = sector_count;
SECTOR_NUMBER = (unsigned char) (lba & 0xFF);
CYLINDER_LOW = (unsigned char) ((lba >> 8) & 0xFF);
CYLINDER_HIGH = (unsigned char) ((lba >> 16) & 0xFF);
DEV_HEAD = ((unsigned char) ((lba >> 24) & 0xF)) | LBAMODE;
for(i=0;i<10;i++);
if(!Check_DateReady())
return 0;
COMMAND = READ_MULTIPLE;
for(i=0;i<10000000;i++);
if(!Check_HaveRequest())
return 0;
for (i = 0; i < 256; i++)
{
((unsigned short *)buffer)[i] = DATA;
}
for(i=0;i<10;i++);
//translate buffer[256] to buffer[512]
for (i = 0; i < 256; i++)
{
temp[2*i] = buffer[i] & 0x000000FF;
temp[2*i+1] = (buffer[i] & 0x0000FF00) >> 8;
}
for (i = 0;i < 512; i++)
buffer[i]=temp[i];
if(!Check_NoRequest())
return 0;
if (status & ERRBIT)
{
error = ERRORREG;
errcount++;
}
else
error = 0;
if (errcount > 10)
break;
}
if(error)
return 0;
else
return 1;
}
//write Hard disk
unsigned char atadev_put_block(unsigned int lba, unsigned char sector_count, unsigned char* buffer)
{
unsigned char error = 1;
unsigned int i = 0;
errcount = 0;
//translate buffer[512] to buffer[256]
for (i = 0; i < 512; i++)
{
temp[i/2] = buffer[i] | buffer[i+1] << 8;
i++;
}
for (i = 0;i < 256; i++)
buffer[i]=temp[i];
while (error)
{
if(!Check_NoRequest())
return 0;
DEV_HEAD = DEV_HEAD & 0xEF;
for(i=0;i<10;i++);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -