📄 mdoc.c
字号:
#include "UART_IrDA.h"
#include "h3_hwTest.h"
static FLByte buff[512];
static FLByte H3DocFound = 0;
volatile unsigned short *pPointer = 0;
static
DOCH_Error ready ( FLSNative devNum,
DOCH_Reg reg,
FLByte mask,
FLByte on_bits,
FLDword millisec )
{
DOCH_Error error = DOCH_OK;
register FLDword tries = millisec * (1000000UL / DOCH_ACCESS_NANOSEC);
FLByte status = 0;
/*Protect tries from being set to "0"
(in conjunction with tries-- might cause a very long delay...)*/
if(tries == 0)
tries = 1;
while (tries-- > 0)
{
status = DOCHREAD_ATA_REG(pPointer, reg);
if ((status & mask) == on_bits)
{
/* read status once again, just to be sure .. */
/*if ((DOCHREAD_ATA_REG(pdev->device[devNum].bRegBase, reg) & mask) == on_bits)*/
return DOCH_OK;
}
/*If an error was detected - return the error code*/
else if( ((status & DOCH_ERROR) == DOCH_ERROR) &&
((status & DOCH_BUSY) != DOCH_BUSY))
{
error = (DOCH_Error)DOCHREAD_ATA_REG(pPointer, DOCH_ERROR_REG);
DBG_PRINT_ERR(FLZONE_ATA, "ready(): ATA Error: ");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("0x%x "), error));
DBG_PRINT_ERR(FLZONE_ATA, "\r\n");
return error;
}
}
DBG_PRINT_ERR(FLZONE_ATA, "\r\nready(): Timed Out\r\n");
return DOCH_TimedOut;
}
FLSNative hal_blk_read_nor ( volatile FLWord * base,
FLSNative reg,
FLByte * buf,
FLSNative bytes )
{
volatile FLWord * reg16 ;
//register FLWord * buf16 ;
register FLSNative max;
FLWord temp;
reg16 = (volatile FLWord *)((FLSNative)base + reg);
//patch - to solve access problem
max = (FLSNative)buf + bytes;
for (; (FLSNative)buf < max; buf+=16)
{
temp = *reg16;
buf[0] = (FLByte)temp;
buf[1] = temp >>0x8;
temp = *reg16;
buf[2] = (FLByte)temp;
buf[3] = temp >>0x8;
temp = *reg16;
buf[4] = (FLByte)temp;
buf[5] = temp >>0x8;
temp = *reg16;
buf[6] = (FLByte)temp;
buf[7] = temp >>0x8;
temp = *reg16;
buf[8] = (FLByte)temp;
buf[9] = temp >>0x8;
temp = *reg16;
buf[10] = (FLByte)temp;
buf[11] = temp >>0x8;
temp = *reg16;
buf[12] = (FLByte)temp;
buf[13] = temp >>0x8;
temp = *reg16;
buf[14] = (FLByte)temp;
buf[15] = temp >>0x8;
}
return 0;
}
void flWrite8bitUsing16bitsSingleShift(volatile FLWord * win, FLWord offset,Reg8bitType val)
{
FLWRITE_IO_WORD((FLWord)val,win+offset+(DOCH_CONT_REG_AREA/2));
}
DOCH_Error io_input ( FLSNative devNum,
DOCH_Registers * regs,
void * buf,
FLNative secNum)
{
FLNative sectors_to_read;
FLNative secPerformed;
FLNative offset = 0;
DOCH_Error rc;
FLSNative status;
FLByte multCount = 0;
/*Calculate how many sectors are to be read*/
/*Note: "0" - 256 Sectors to read*/
sectors_to_read = (secNum ? secNum : 256);
/*Wait for BUSY bit to clear*/
if ((rc = ready(devNum, DOCH_ALT_STATUS_REG, DOCH_BUSY, 0, DOCH_LONG_WAIT)) != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_ATA, "\r\nio_input(): ATA not Ready (before command) \r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
if (rc == DOCH_OK)
{
/*Write ATA registers*/
DOCHWRITE_ATA_REG (pPointer, DOCH_SECTOR_CNT_REG, regs->bSectorCount);
DOCHWRITE_ATA_REG (pPointer, DOCH_SECTOR_NO_REG, regs->bSectorNumber);
DOCHWRITE_ATA_REG (pPointer, DOCH_CYLINDER_LOW_REG, regs->bCylLow);
DOCHWRITE_ATA_REG (pPointer, DOCH_CYLINDER_HIGH_REG, regs->bCylHigh);
DOCHWRITE_ATA_REG (pPointer, DOCH_FEATURES_REG, regs->bFeaturesError);
DOCHWRITE_ATA_REG (pPointer, DOCH_DRIVE_HEAD_REG, regs->bDriveHead);
DOCHWRITE_ATA_REG (pPointer, DOCH_COMMAND_REG, regs->bCommandStatus);
/*Perform per-sector
1. Wait until device is ready to receive data
2. Xfer 1 sector*/
// switch(pdev->device[devNum].dataTransferMode)
switch(0)
{
case DOCH_DATA_MODE_SINGLE:
for(secPerformed=0; secPerformed<sectors_to_read; secPerformed++)
{
/* */
(rc = ready(devNum, DOCH_STATUS_REG, (DOCH_READY | DOCH_DRQ | DOCH_BUSY | DOCH_ERROR),
DOCH_READY | DOCH_DRQ, DOCH_SHORT_WAIT));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_ATA, "\r\nio_input(): ATA not Ready (before data XFER) \r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
if( (DOCHBLK_READ(HIB_START_ADDRESS,
((FLByte*)buf + offset),
1)) != 0)
{
return DOCH_ReadFault;
}
offset += DOCH_SECTOR_SIZE;
}
break;
case DOCH_DATA_MODE_MULT:
multCount = 1;//(FLByte)pdev->device[devNum].dwMulti_Current;
for(secPerformed=0;
secPerformed<sectors_to_read;
secPerformed+=multCount)
{
/* */
(rc = ready(devNum, DOCH_STATUS_REG, (DOCH_READY | DOCH_DRQ | DOCH_BUSY | DOCH_ERROR),
DOCH_READY | DOCH_DRQ, DOCH_SHORT_WAIT));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_ATA, "\r\nio_input(): ATA not Ready\r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
if( (DOCHBLK_READ(HIB_START_ADDRESS,
(FLByte*)(buf) + offset,
(multCount))) != 0)
{
return DOCH_ReadFault;
}
offset += (multCount * DOCH_SECTOR_SIZE);
}
break;
default:
return DOCH_ReadFault;
}
/* wait util device is ready */
rc = ready(devNum, DOCH_STATUS_REG, (DOCH_READY | DOCH_BUSY),
DOCH_READY, DOCH_SHORT_WAIT);
if (rc != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_ATA, "\r\nio_input(): ATA not Ready\r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
/* check operation's status; this also clears IRQ */
status = DOCHREAD_ATA_REG(pPointer, DOCH_STATUS_REG);
if((status & (DOCH_BUSY | DOCH_READY | DOCH_ERROR)) != DOCH_READY)
{
if((status & DOCH_BUSY) == DOCH_BUSY)
return DOCH_ATABusyNotCleared;
else if((status & DOCH_READY) != DOCH_READY)
return DOCH_ATANotReady;
else if((status & DOCH_ERROR) == DOCH_ERROR)
return DOCH_ATAErrorDetected;
}
}
return rc;
}
DOCH_Error io_output ( FLSNative devNum,
DOCH_Registers * regs,
void * buf,
FLNative secNum
)
{
FLNative sectors_to_write;
FLNative secPerformed;
FLNative offset = 0;
DOCH_Error rc;
FLSNative status;
FLByte multCount = 0;
/*Calculate how many sectors are to be written*/
/*Note: "0" - 256 Sectors to write*/
sectors_to_write = (secNum ? secNum : 256);
/*Wait for BUSY bit to clear*/
if ((rc = ready(devNum, DOCH_ALT_STATUS_REG, DOCH_BUSY, 0, DOCH_LONG_WAIT)) != DOCH_OK)
{
UART_Printf(UART2,"\r\nio_output(): ATA not Ready\r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
if (rc == DOCH_OK)
{
/*Write ATA registers*/
DOCHWRITE_ATA_REG (pPointer, DOCH_SECTOR_CNT_REG, regs->bSectorCount);
DOCHWRITE_ATA_REG (pPointer, DOCH_SECTOR_NO_REG, regs->bSectorNumber);
DOCHWRITE_ATA_REG (pPointer, DOCH_CYLINDER_LOW_REG, regs->bCylLow);
DOCHWRITE_ATA_REG (pPointer, DOCH_CYLINDER_HIGH_REG, regs->bCylHigh);
DOCHWRITE_ATA_REG (pPointer, DOCH_FEATURES_REG, regs->bFeaturesError);
DOCHWRITE_ATA_REG (pPointer, DOCH_DRIVE_HEAD_REG, regs->bDriveHead);
DOCHWRITE_ATA_REG (pPointer, DOCH_COMMAND_REG, regs->bCommandStatus);
/*Perform per-sector
1. Wait until device is ready to receive data
2. Xfer 1 sector*/
// switch(pdev->device[devNum].dataTransferMode)
switch(0)
{
case DOCH_DATA_MODE_SINGLE:
for(secPerformed=0; secPerformed<sectors_to_write; secPerformed++)
{
(rc = ready(devNum, DOCH_STATUS_REG, (DOCH_READY | DOCH_DRQ | DOCH_BUSY | DOCH_ERROR),
DOCH_READY | DOCH_DRQ, DOCH_SHORT_WAIT));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_ATA, "\r\nio_output(): ATA not Ready\r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
DOCHBLK_WRITE(HIB_START_ADDRESS, (FLByte*)buf + offset, 1);
offset += DOCH_SECTOR_SIZE;
}
break;
case DOCH_DATA_MODE_MULT:
multCount = 1;//(FLByte)pdev->device[devNum].dwMulti_Current;
for(secPerformed=0;
secPerformed<sectors_to_write;
secPerformed+=multCount)
{
/* */
(rc = ready(devNum, DOCH_STATUS_REG, (DOCH_READY | DOCH_DRQ | DOCH_BUSY | DOCH_ERROR),
DOCH_READY | DOCH_DRQ, DOCH_SHORT_WAIT));
if(rc != DOCH_OK)
{
DBG_PRINT_ERR(FLZONE_ATA, "\r\nio_output(): ATA not Ready\r\n");
DBG_PRINT_ERR_PRM(FLZONE_ATA, (FLTXT("rc = 0x%x \r\n"),rc));
return rc;
}
if( (DOCHBLK_WRITE(pPointer,
(FLByte*)buf + offset,
(multCount))) != 0)
{
return DOCH_WriteFault;
}
offset += (multCount * DOCH_SECTOR_SIZE);
}
break;
default:
return DOCH_WriteFault;
}
/* Wait until device is ready. This might involve yielding the
* CPU and waiting for device interrupt, so we use DOCH_LONG_WAIT.
*/
rc = ready(devNum, DOCH_ALT_STATUS_REG, (DOCH_READY | DOCH_BUSY),
DOCH_READY, DOCH_LONG_WAIT);
/* check operation's status; this also clear IRQ */
status = DOCHREAD_ATA_REG(pPointer, DOCH_STATUS_REG);
if((status & (DOCH_BUSY | DOCH_READY | DOCH_ERROR)) != DOCH_READY)
{
if((status & DOCH_BUSY) == DOCH_BUSY)
return DOCH_ATABusyNotCleared;
else if((status & DOCH_READY) != DOCH_READY)
return DOCH_ATANotReady;
else if((status & DOCH_ERROR) == DOCH_ERROR)
return DOCH_ATAErrorDetected;
}
}
return rc;
}
Reg8bitType flRead8bitUsing16bitsSingleShift(volatile FLWord * win,FLWord offset)
{
int tempp=0;
tempp= ( * (win+offset+(DOCH_CONT_REG_AREA/2)));
return( (Reg8bitType)FLREAD_IO_WORD(win+offset+(DOCH_CONT_REG_AREA/2)) );
}
FLSNative hal_blk_write_nor ( volatile FLByte * base,
FLByte * src,
FLSNative sectors )
{
#define FLWRITE_IO_WORD(val,address) *((volatile FLWord FAR0*)(address))=(FLWord)(val)
volatile FLWord FAR0 * swin = (volatile FLWord FAR0 *)(base + DOCH_DATA_PORT_AREA);
FLSNative count = sectors<<DOCH_SECTOR_SIZE_BITS;
register int i;
/* write in short words */
for (i = 0, count = count >> 1; i < (int)count; i++)
/* while incrementing DiskOnChip offset */
/* but do not increament DiskOnChip offset */
FLWRITE_IO_WORD(((FLWord FAR1 *)src)[i],swin);
return 0;
}
DOCH_Error DOCHGetDiskUserAttributes(IOreq2* ioreq)
{
DOCH_Error rc;
DOCH_Registers in_regs;
// PRINTF("DEBUG:: entered DOCHGetDiskUserAttributes func\n");
/*Update ATA register values*/
/*--------------------------*/
in_regs.bFeaturesError = DOCH_GET_DISK_USER_ATTR;
in_regs.bSectorCount = 0;
in_regs.bSectorNumber = 0;
in_regs.bCylLow = 0;
in_regs.bCylHigh = 0;
in_regs.bDriveHead = (ioreq->irHandle.ataDeviceNum * DOCH_DEVICE);
in_regs.bCommandStatus = DOCH_VSCMD_EXT_DEVICE_CTRL;
/*Activate ATA command*/
/*--------------------*/
rc = io_input (0, &in_regs, ioreq->irData, 1);
if(rc == DOCH_OK)
return DOCH_OK;
else
{
DBG_PRINT_ERR(FLZONE_API, "DOCHGetDiskUserAttributes(): failed with status: ");
DBG_PRINT_ERR_PRM(FLZONE_API, (FLTXT("0x%x \r\n"), rc));
return DOCH_BadFunction;
}
}
DOCH_Error DOCHSetDiskUserAttributes(IOreq2* ioreq)
{
DOCH_Error rc;
DOCH_Registers in_regs;
// PRINTF("DEBUG:: entered DOCHSetDiskUserAttributes func\n");
/*Update ATA register values*/
/*--------------------------*/
in_regs.bFeaturesError = DOCH_SET_DISK_USER_ATTR;
in_regs.bSectorCount = 0;
in_regs.bSectorNumber = 0;
in_regs.bCylLow = 0;
in_regs.bCylHigh = 0;
in_regs.bDriveHead = (ioreq->irHandle.ataDeviceNum * DOCH_DEVICE);
in_regs.bCommandStatus = DOCH_VSCMD_EXT_DEVICE_CTRL;
/*Activate ATA command*/
/*--------------------*/
rc = io_output (0, &in_regs, ioreq->irData, 1);
if(rc == DOCH_OK)
return DOCH_OK;
else
{
UART_Printf(UART2,"DOCHSetDiskUserAttributes(): failed with status: ");
UART_Printf(UART2,"0x%x \r\n", rc);
return DOCH_BadFunction;
}
}
void BufferFillPattern()
{
int i;
for (i=0;i<512;i++)
buff[i] = i;
}
int SearchForH3()
{
unsigned short doc_id1=0, doc_id2=0;
unsigned short registerValue = 0;
unsigned long temp = 0;
DOCH_Error status = DOCH_OK;
FLByte buffIN[512];
IOreq2 ioreq;
*(unsigned int*)0xfffecc14 = 0x7fc044f8;//0x00004278; // EMIFS (nCS1) configuration
*(unsigned int*)0xfffecc54 = 0x00000018;
*(unsigned int*)0x0C00801c = (*(unsigned int*)0x0C00801c)|0x0f; //disable
*(unsigned int*)0x0C00801c = (*(unsigned int*)0x0C00801c)&(~0x0f); //enable
memset(&ioreq,0,sizeof(ioreq));
ioreq.irData = buff;
#ifdef DOCH_32K_SLIDING_WINDOW
#ifndef DOCH_USING_8K_WIN
DOCHWRITE_IO_WORD((FLWord)(PCI_MEM_WIN_1 | BUS_ACESS_16_BIT), (pShort + HIB_PCI_CONTROL_REGISTER));
#endif /* DOCH_USING_8K_WIN */
#endif /*DOCH_32K_SLIDING_WINDOW*/
/*
* read Chip id
*/
UART_Printf(UART2,"\nReading Chip id...");
temp = (unsigned long)HIB_CHIPID1_REG + (unsigned long)pPointer;
// doc_id1 = Read16 (HIB_CHIPID1_REG,pPointer);
doc_id1 = *(FLWord *)temp;
doc_id2 = *(unsigned short*)(HIB_CHIPID2_REG);
// doc_id2 = Read16 (HIB_CHIPID2_REG,pPointer);
if ( (doc_id2 != 0xB7CC) )
{
UART_Printf(UART2,"NO H3 DOC found on platform \r\n");
return 0;
}
UART_Printf(UART2,"Found DiskOnChip H3, with id 0x%x\r\n",(FLWord)doc_id1);
H3DocFound = 1;
// Disk Attributes check
UART_Printf(UART2,"\nPerforming Disk Attributes checking (Sector Write/Read cycle to Flash)...\r\n");
BufferFillPattern();
// set attributes
status = DOCHSetDiskUserAttributes(&ioreq);
if(status != DOCH_OK)
return 1;
// get attributes
memset(buffIN,0,sizeof(buffIN));
memset(&ioreq,0,sizeof(ioreq));
ioreq.irData = buffIN;
status = DOCHGetDiskUserAttributes(&ioreq);
if(status != DOCH_OK)
return 1;
//compare buffs
if(memcmp(buff,buffIN,512) == 0)
UART_Printf(UART2,"\nafter Set/Get Attributes cycle... comparison PASSED!!\r\n");
else
UART_Printf(UART2, "\nafter Set/Get Attributes cycle... comparison FAILED !! \r\n");
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -