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

📄 at45.c

📁 U-boot源码 ARM7启动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		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);}/*---------------------------------------------------------------------------*//* Function Name       : AT91F_PageErase                                     *//* Object              : Erase a page 					     *//* 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_BlockErase                                    *//* Object              : Erase a Block 					     *//* Input Parameters    : DataFlash Service				     *//*                     : Page concerned					     *//*                     : 						     *//* Return value		: State of the dataflash			     *//*---------------------------------------------------------------------------*/AT91S_DataFlashStatus AT91F_BlockErase(				AT91PS_DataFlash pDataFlash,				unsigned int block){	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_BLOCK_ERASE, cmdsize,					block * 8 *					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 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_TIMEOUT_WRDY);	/*Update the SRAM buffer */	AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src,					AdrInPage, size);	AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					AT91C_TIMEOUT_WRDY);	/* Erase page if a 128 Mbits device */	if (pDataFlash->pDevice->pages_number >= 16384) {		AT91F_PageErase(pDataFlash, page);		/* Rewrite the modified Sram Buffer in the main memory */		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					 AT91C_TIMEOUT_WRDY);	}	/* 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 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 DATAFLASH_ERROR;		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					 AT91C_TIMEOUT_WRDY);		/* 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_TIMEOUT_WRDY);		status = AT91F_PageErase(pDataFlash, page);		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					 AT91C_TIMEOUT_WRDY);		if (!status)			return DATAFLASH_ERROR;		status = AT91F_WriteBufferToMain(pDataFlash,					 DB_BUF1_PAGE_PGM, dest);		if (!status)			return DATAFLASH_ERROR;		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					 AT91C_TIMEOUT_WRDY);		/* 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 DATAFLASH_ERROR;		AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					 AT91C_TIMEOUT_WRDY);	}	return 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_TIMEOUT_WRDY) != DATAFLASH_OK)		return -1;	while (size) {		SizeToRead = (size < 0x8000) ? size : 0x8000;		if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,					AT91C_TIMEOUT_WRDY) !=						DATAFLASH_OK)			return -1;		if (AT91F_DataFlashContinuousRead(pDataFlash, addr,						(uchar *) buffer,						SizeToRead) != DATAFLASH_OK)			return -1;		size -= SizeToRead;		addr += SizeToRead;		buffer += SizeToRead;	}	return 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);}#endif

⌨️ 快捷键说明

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