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

📄 at45.c

📁 基于AT91SAM9260的bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------------------------------*//* Function Name       : AT91F_MainMemoryToBufferTransfert			*//* Object              : Read a page in the SRAM Buffer 1 or 2			*//* Input Parameters    : DataFlash Service					*//*                     : Page concerned						*//*                     : 							*//* Return value		: State of the dataflash				*//*------------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert(	AT91PS_DataFlash pDataFlash,	unsigned char BufferCommand,	unsigned int page){	int cmdsize;	/* Test if the buffer command is legal */	if ((BufferCommand != DB_PAGE_2_BUF1_TRF) && (BufferCommand != DB_PAGE_2_BUF2_TRF))		return AT91C_DATAFLASH_BAD_COMMAND;	/* no data to transmit or receive */    	pDataFlash->pDataFlashDesc->tx_data_size = 0;	cmdsize = 4;	if (pDataFlash->pDevice->pages_number >= 16384)		cmdsize = 5;	return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, cmdsize, page*pDataFlash->pDevice->pages_size));}/*----------------------------------------------------------------------------- *//* Function Name       : AT91F_DataFlashWriteBuffer				*//* Object              : Write data to the internal sram buffer 1 or 2		*//* Input Parameters    : DataFlash Service					*//*			: <BufferCommand> = command to write buffer1 or buffer2	*//*                     : <*dataBuffer> = data buffer to write			*//*                     : <bufferAddress> = address in the internal buffer	*//*                     : <SizeToWrite> = data buffer size			*//* Return value		: State of the dataflash				*//*------------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer (	AT91PS_DataFlash pDataFlash,	unsigned char BufferCommand,	unsigned char *dataBuffer,	unsigned int bufferAddress,	int SizeToWrite ){	int cmdsize;	/* Test if the buffer command is legal */	if ((BufferCommand != DB_BUF1_WRITE) && (BufferCommand != DB_BUF2_WRITE))		return AT91C_DATAFLASH_BAD_COMMAND;	/* buffer address must be lower than page size */	if (bufferAddress > pDataFlash->pDevice->pages_size)		return AT91C_DATAFLASH_BAD_ADDRESS;	if ( (pDataFlash->pDataFlashDesc->state)  != IDLE)		return AT91C_DATAFLASH_BUSY;    	/* Send first Write Command */    pDataFlash->pDataFlashDesc->command[0] = BufferCommand;	pDataFlash->pDataFlashDesc->command[1] = 0;	if (pDataFlash->pDevice->pages_number >= 16384)	{	   	pDataFlash->pDataFlashDesc->command[2] = 0;	   	pDataFlash->pDataFlashDesc->command[3] = (unsigned char)(((unsigned int)(bufferAddress &  pDataFlash->pDevice->byte_mask)) >> 8) ;	   	pDataFlash->pDataFlashDesc->command[4] = (unsigned char)((unsigned int)bufferAddress  & 0x00FF) ;		cmdsize = 5;	}	else	{	   	pDataFlash->pDataFlashDesc->command[2] = (unsigned char)(((unsigned int)(bufferAddress &  pDataFlash->pDevice->byte_mask)) >> 8) ;	   	pDataFlash->pDataFlashDesc->command[3] = (unsigned char)((unsigned int)bufferAddress  & 0x00FF) ;	   	pDataFlash->pDataFlashDesc->command[4] = 0;		cmdsize = 4;	}		    pDataFlash->pDataFlashDesc->tx_cmd_pt 	 = pDataFlash->pDataFlashDesc->command ;    pDataFlash->pDataFlashDesc->tx_cmd_size  = cmdsize ;    pDataFlash->pDataFlashDesc->rx_cmd_pt 	 = pDataFlash->pDataFlashDesc->command ;    pDataFlash->pDataFlashDesc->rx_cmd_size  = cmdsize ;    pDataFlash->pDataFlashDesc->rx_data_pt 	 = dataBuffer ;    pDataFlash->pDataFlashDesc->tx_data_pt 	 = dataBuffer ;    pDataFlash->pDataFlashDesc->rx_data_size = SizeToWrite ;    pDataFlash->pDataFlashDesc->tx_data_size = SizeToWrite ;    return AT91F_SpiWrite(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_STATUS_TIMEOUT);}/*------------------------------------------------------------------------------*//* Function Name       : AT91F_PageErase                                        */             /* Object              : Read a page in the SRAM Buffer 1 or 2					*//* Input Parameters    : DataFlash Service										*//*                     : Page concerned											*//*                     : 														*//* Return value		: State of the dataflash									*//*------------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_PageErase(	AT91PS_DataFlash pDataFlash,	unsigned int page){	int cmdsize;	/* Test if the buffer command is legal */		/* no data to transmit or receive */    	pDataFlash->pDataFlashDesc->tx_data_size = 0;		cmdsize = 4;	if (pDataFlash->pDevice->pages_number >= 16384)		cmdsize = 5;	return(AT91F_DataFlashSendCommand (pDataFlash, DB_PAGE_ERASE, cmdsize, page*pDataFlash->pDevice->pages_size));}/*------------------------------------------------------------------------------*//* Function Name       : AT91F_WriteBufferToMain				*//* Object              : Write buffer to the main memory			*//* Input Parameters    : DataFlash Service					*//*		: <BufferCommand> = command to send to buffer1 or buffer2	*//*                     : <dest> = main memory address				*//* Return value		: State of the dataflash				*//*------------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_WriteBufferToMain (	AT91PS_DataFlash pDataFlash,	unsigned char BufferCommand,	unsigned int dest ){	int cmdsize;	/* Test if the buffer command is correct */	if ((BufferCommand != DB_BUF1_PAGE_PGM) &&	    (BufferCommand != DB_BUF1_PAGE_ERASE_PGM) &&	    (BufferCommand != DB_BUF2_PAGE_PGM) &&	    (BufferCommand != DB_BUF2_PAGE_ERASE_PGM) )		return AT91C_DATAFLASH_BAD_COMMAND;	/* no data to transmit or receive */	pDataFlash->pDataFlashDesc->tx_data_size = 0;	cmdsize = 4;	if (pDataFlash->pDevice->pages_number >= 16384)		cmdsize = 5;	/* Send the command to the dataflash */	return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, cmdsize, dest));}/*------------------------------------------------------------------------------*//* Function Name       : AT91F_PartialPageWrite					*//* Object              : Erase partielly a page					*//* Input Parameters    : <page> = page number					*//*			: <AdrInpage> = adr to begin the fading			*//*                     : <length> = Number of bytes to erase			*//*------------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_PartialPageWrite (	AT91PS_DataFlash pDataFlash,	unsigned char *src,	unsigned int dest,	unsigned int size){	unsigned int page;	unsigned int AdrInPage;	page = dest / (pDataFlash->pDevice->pages_size);	AdrInPage = dest % (pDataFlash->pDevice->pages_size);	/* Read the contents of the page in the Sram Buffer */	AT91F_MainMemoryToBufferTransfert(pDataFlash, DB_PAGE_2_BUF1_TRF, page);	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);		/*Update the SRAM buffer */	AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src, AdrInPage, size);	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);		/* Erase page if a 128 Mbits device */	if (pDataFlash->pDevice->pages_number >= 16384)	{		AT91F_PageErase(pDataFlash, page);		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);	}	/* Rewrite the modified Sram Buffer in the main memory */	return(AT91F_WriteBufferToMain(pDataFlash, DB_BUF1_PAGE_ERASE_PGM, (page*pDataFlash->pDevice->pages_size)));}/*------------------------------------------------------------------------------*//* Function Name       : AT91F_DataFlashWrite             			*//* Object              :							*//* Input Parameters    : <*src> = Source buffer					*//*                     : <dest> = dataflash adress				*//*                     : <size> = data buffer size				*//*------------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_DataFlashWrite(	AT91PS_DataFlash pDataFlash,	unsigned char *src,	int dest,	int size ){	unsigned int length;	unsigned int page;	unsigned int status;	AT91F_SpiEnable(pDataFlash->pDevice->cs);    if ( (dest + size) > (pDataFlash->pDevice->pages_size * (pDataFlash->pDevice->pages_number)))		return AT91C_DATAFLASH_MEMORY_OVERFLOW;    	/* If destination does not fit a page start address */    if ((dest % ((unsigned int)(pDataFlash->pDevice->pages_size)))  != 0 ) {		length = pDataFlash->pDevice->pages_size - (dest % ((unsigned int)(pDataFlash->pDevice->pages_size)));		if (size < length)			length = size;		if(!AT91F_PartialPageWrite(pDataFlash,src, dest, length))			return AT91C_DATAFLASH_ERROR;		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);		/* Update size, source and destination pointers */        	size -= length;        	dest += length;        	src += length;    }    while (( size - pDataFlash->pDevice->pages_size ) >= 0 )     {		/* program dataflash page */				page = (unsigned int)dest / (pDataFlash->pDevice->pages_size);		status = AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src, 0, pDataFlash->pDevice->pages_size);		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);			status = AT91F_PageErase(pDataFlash, page);		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);		if (!status)			return AT91C_DATAFLASH_ERROR;				status = AT91F_WriteBufferToMain (pDataFlash, DB_BUF1_PAGE_PGM, dest);		if(!status)			return AT91C_DATAFLASH_ERROR;		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);			/* Update size, source and destination pointers */	   	size -= pDataFlash->pDevice->pages_size ;	   	dest += pDataFlash->pDevice->pages_size ;	   	src  += pDataFlash->pDevice->pages_size ;    }    /* If still some bytes to read */    if ( size > 0 ) {		/* program dataflash page */		if(!AT91F_PartialPageWrite(pDataFlash, src, dest, size) )			return AT91C_DATAFLASH_ERROR;		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT);	}    return AT91C_DATAFLASH_OK;}/*------------------------------------------------------------------------------*//* Function Name       : AT91F_DataFlashRead 					*//* Object              : Read a block in dataflash				*//* Input Parameters    : 							*//* Return value		: 							*//*------------------------------------------------------------------------------*/int AT91F_DataFlashRead(	AT91PS_DataFlash pDataFlash,	unsigned long addr,	unsigned long size,	char *buffer){	unsigned long SizeToRead;	AT91F_SpiEnable(pDataFlash->pDevice->cs);	if(AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT) != AT91C_DATAFLASH_OK)		return -1;	while (size)	{		SizeToRead = (size < 0x8000)? size:0x8000;		if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91C_DATAFLASH_TIMEOUT) != AT91C_DATAFLASH_OK)			return -1;		if (AT91F_DataFlashContinuousRead (pDataFlash, addr, (unsigned char *)buffer, SizeToRead) != AT91C_DATAFLASH_OK)			return -1;		size -= SizeToRead;		addr += SizeToRead;		buffer += SizeToRead;	}   	return AT91C_DATAFLASH_OK;}/*------------------------------------------------------------------------------*//* Function Name       : AT91F_DataflashProbe 					*//* Object              : 							*//* Input Parameters    : 							*//* Return value	       : Dataflash status register				*//*------------------------------------------------------------------------------*/int AT91F_DataflashProbe(int cs, AT91PS_DataflashDesc pDesc){	AT91F_SpiEnable(cs);   	AT91F_DataFlashGetStatus(pDesc);   	return ((pDesc->command[1] == 0xFF)? 0: (pDesc->command[1] & 0x3C));}

⌨️ 快捷键说明

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