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

📄 mdoc.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 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 + -