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

📄 flash_m25p80.c

📁 某个ARM9板子的实际bootloader 对裁剪
💻 C
📖 第 1 页 / 共 2 页
字号:
void m25p20_read(UINT32 address, UINT8 *data, UINT32 schip_en){      UINT32 opcode,status;      UINT32 value;            //opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ;      opcode = 0x80000000 | FLASH_ACCESS_ACTION_SHIFT_ADDRESS_DATA | M25P20_READ;      FLASH_CTRL_WRITE_REG(FLASH_ADDRESS_OFFSET, address);      #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();      }            value=FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      *data = value & 0xff;	}static int m25p20_program(void* addr, void* data, int len){      UINT32 opcode;      UINT32  status;      UINT32 tmp, i, j=0 ;      unsigned char *paddr=(unsigned char *)addr;	  unsigned char *pdata=(unsigned char *)data;	if(paddr >= FLASH_BASE)		paddr-=FLASH_BASE;		    int res = FLASH_ERR_OK;	while (len > 0) {				if(len >= PAGE_SIZE)			tmp = PAGE_SIZE;		else			tmp = len;			    for(i=0;i<tmp;i++)	    {	    	res = m25p20_page_program( (paddr+j*PAGE_SIZE+i),  *(pdata+j*PAGE_SIZE+i),  schip_en);	    }	    len -= PAGE_SIZE;	    j++;	};	return res;}//void m25p20_page_program(UINT32 address, UINT8 data, UINT32 schip_en)static int m25p20_page_program(UINT32 address, UINT8 data, UINT32 schip_en){      UINT32 opcode;      UINT32  status;	  UINT32 tmp, i, j=0 ;	  int res = FLASH_ERR_OK;	  //volatile FLASH_DATA_T* data_ptr = (volatile FLASH_DATA_T*) data;	  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);          if((status&0x02)==0x02)      	  {      	       //middle delay_ms(100);               m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en);          }      	      m25p20_write_cmd(M25P20_WRITE_ENABLE, schip_en);      ////middle delay_ms(10);      opcode = 0x80000000 | FLASH_ACCESS_ACTION_SHIFT_ADDRESS_DATA | M25P20_PAGE_PROGRAM;      FLASH_CTRL_WRITE_REG(FLASH_ADDRESS_OFFSET, address);      FLASH_CTRL_WRITE_REG(FLASH_WRITE_DATA_OFFSET, data);            //status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      //while(status!=data)      //{      //    status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      //    //middle delay_ms(10);      //}            #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=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET);            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();      			}      status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      //while(status&0xfd)      while(status&0x01)      {      	  //if((status&0x9c)!=0)      	  //	printf("  m25p20_page_program	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);          flash_delay();          //middle delay_ms(50);      }      //printf("status = %x, data = %x\n",status,data);      if((status&0x02)==0x02)      {	  //middle delay_ms(100);      	            m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en);      }    //};//while (len > 0)    return res;}static int m25p20_sector_erase(UINT32 address, UINT32 schip_en){      UINT32 opcode;      UINT32  status;      UINT32 tmp;      int res = FLASH_ERR_OK;	//printf("\n-->m25p20_sector_erase");		if(address >= FLASH_BASE)		address-=FLASH_BASE;		      m25p20_write_cmd(M25P20_WRITE_ENABLE, schip_en);      //printf("\n     m25p20_sector_erase : after we-en");      opcode = 0x80000000 | FLASH_ACCESS_ACTION_SHIFT_ADDRESS | M25P20_SECTOR_ERASE;      FLASH_CTRL_WRITE_REG(FLASH_ADDRESS_OFFSET, address);      #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();      			}      status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      //while(status&0xfd)      while(status&0x01)      {      	  //if((status&0x9c)!=0)      	  //	printf("  m25p20_sector_erase	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);          flash_delay();          //middle delay_ms(50);      }      if((status&0x02)==0x02)      {      	  //middle delay_ms(100);          m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en);      }      //printf("\n<--m25p20_sector_erase");      return res;}void m25p20_bulk_erase(UINT32 schip_en){      UINT32 opcode;      UINT32  status;      UINT32 tmp;	      m25p20_write_cmd(M25P20_WRITE_ENABLE, schip_en);            opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE | M25P20_BULK_ERASE;      #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 //middle delay_ms(2000);      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();      			}      status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET);      //while(status&0xfd)      while(status&0x01)      {      	  //if((status&0x9c)!=0)      	  //	printf("  m25p20_bulk_erase	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);          flash_delay();          //middle //middle delay_ms(50);      }      if((status&0x02)==0x02)      {      	  //middle //middle delay_ms(100);          m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en);      }}//#endif //FLASH_TYPE_SERIAL

⌨️ 快捷键说明

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