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

📄 flash_m25p80.c

📁 某个ARM9板子的实际bootloader 对裁剪
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** Copyright  Storlink Corp 2005.  All rights reserved.                *--------------------------------------------------------------------------* Name			: flash_m25p80.c* Description	: *		Define for flash device driver** History**	Date		Writer		Description*	-----------	-----------	-------------------------------------------------*	05/04/2006	Middle	Create*****************************************************************************/#include <define.h>#include <board_config.h>//#ifdef FLASH_TYPE_SERIAL	//#if defined(FLASH_TYPE_SERIAL) && defined(FLASH_SERIAL_STM)#include <sl2312.h>#include "flash_drv.h"#include "flash_m25p80.h"int schip_en = 0;static int m25p20_erase(void* block, unsigned int size);static int m25p20_program(void* addr, void* data, int len);static int m25p20_page_program(UINT32 address, UINT8 data, UINT32 schip_en);extern void FLASH_CTRL_WRITE_REG(unsigned int addr,unsigned int data);extern unsigned int FLASH_CTRL_READ_REG(unsigned int addr);/* define read/write register utility *//*unsigned int FLASH_CTRL_READ_REG(unsigned int addr){    unsigned int *base;    unsigned int data;        base = (unsigned int *)(SL2312_FLASH_CTRL_BASE + addr);    data = *base;    return (data);}void FLASH_CTRL_WRITE_REG(unsigned int addr,unsigned int data){    unsigned int *base;        base = (unsigned int *)(SL2312_FLASH_CTRL_BASE + addr);    *base = data;    return;}  */  int flash_sst_init(FLASH_INFO_T *info){    unsigned long *add;    // add = 0x54000010 ;		//Add by jason for flash access enable.   // *add = 0x4000 ;		//Add by jason for flash access enable.    FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET,0x4000);    // flash_info.block_size = block_page * dpage_size ; //FLASH_BLOCK_SIZE;    //flash_info.blocks = total_page / block_page;//FLASH_NUM_REGIONS;    //flash_info.start = (void *)FLASH_BASE;    //flash_info.end = (void *)(FLASH_BASE + total_page * dpage_size);//(void *)(FLASH_BASE+ (FLASH_NUM_REGIONS * FLASH_BLOCK_SIZE * FLASH_SERIES));    // Hard wired for now   	info->erase_block 	= (void *)m25p20_erase; //m25p20_bulk_erase;    info->program 		= (void *)m25p20_program;    info->block_size 	= SECTOR_SIZE ; //sector : 0x10000    info->blocks 		= SECTOR_SIZE; //16 sectors    info->start 		= (void *)FLASH_BASE;    info->end 			= (void *)(FLASH_BASE + 0x100000);    //info->vendor		= vendor;    info->chip_id		= 0x0;    info->sub_id1       = 0x0;    info->sub_id2       = 0x0;    return FLASH_ERR_OK;}static int m25p20_erase(void* block, unsigned int size){     	//UINT32 i, *address;     	int res = FLASH_ERR_OK;     	//volatile FLASH_DATA_T* b_p = (FLASH_DATA_T*) (block);     	unsigned char *address=block;     	//address = block;      //  for(i=0; i<16; i++)        {        	////middle //middle delay_ms(580);        	//middle //middle delay_ms(2000);       	  res = m25p20_sector_erase(address, schip_en);       	  // address += SECTOR_SIZE;       	  // printf(".");       	          	}   			return res;}		void m25p20_write_cmd(UINT8 cmd, UINT32 schip_en){      UINT32 opcode,tmp;      UINT32  status;                              opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE | cmd;      #ifdef MIDWAY_DIAG      	opcode|=schip_en;      #endif      FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      while(tmp&0x80000000)      {          tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);          flash_delay();      }      //////      opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ_STATUS;      #ifdef MIDWAY_DIAG      	opcode|=schip_en;      #endif      FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      while(tmp&0x80000000)      {          tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);          flash_delay();      }      //middle delay_ms(130);      status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      //printf("\ncmd =%x  status = %x",cmd,status);      if(cmd==M25P20_WRITE_ENABLE)      {      	//printf("\n**-->enable**  status = %x",status);      	//middle delay_ms(100);      	   while((status&0x03) != 2)      	   {      	   	//if((status&0x9c)!=0)      	  	//    printf("	M25P20_WRITE_ENABLE   Protect Status = %x\n",status);      	  	      	   	  FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      	   	  tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			while(tmp&0x80000000)      			{      			    tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			    //flash_delay();      			}      	       status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      	       //printf("\n**enable**  status = %x",status);      	       flash_delay();      	       //middle delay_ms(100);      	   }      }      else if(cmd==M25P20_WRITE_DISABLE)      {      	   //while((status&0x03) == 2)      	   //   printf("\n**disable**  status = %x",status);      	   //middle delay_ms(100);      	   while((status&0x03) != 0)      	   {	       //m25p20_write_status((status&0xfd),schip_en);      	             	       FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      	       tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      		while(tmp&0x80000000)      		{      		    tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      		    flash_delay();      		}      	       status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      	       //printf("\n**disable**  status = %x",status);      	       flash_delay();      	       //middle delay_ms(50);      	   }      }      else      {      	   //while((status&0x01) !=0)      	   while((status&0x01) !=0)      	   {      	   	  FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      	   	  tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			while(tmp&0x80000000)      			{      			    tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			    flash_delay();      			}      	       status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      	       flash_delay();      	       //middle delay_ms(50);      	   }      }      //////            //printf("\n<--  status = %x",status);}void m25p20_read_status(UINT8 *data, UINT32 schip_en){      UINT32 opcode,status;      UINT32 value;      UINT32 tmp;            opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ_STATUS;      #ifdef MIDWAY_DIAG      	opcode|=schip_en;      #endif      FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);            status=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      while(status&0x80000000)      {          opcode=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);          flash_delay();      }      FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			while(tmp&0x80000000)      			{      			    tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			    flash_delay();      			}      status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      while(status!=0xff)      {      	  FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      	  tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			while(tmp&0x80000000)      			{      			    tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      			    flash_delay();      			}          status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);          flash_delay();          //middle delay_ms(50);      }            value=FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      *data = value & 0xff;		}void m25p20_write_status(UINT8 data, UINT32 schip_en){      UINT32 opcode,status;            opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_WRITE_STATUS;      FLASH_CTRL_WRITE_REG(FLASH_WRITE_DATA_OFFSET, data);      #ifdef MIDWAY_DIAG      	opcode|=schip_en;      #endif      FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode);      status=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);      while(status&0x80000000)      {          status=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);          flash_delay();      }      }

⌨️ 快捷键说明

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