复件 flash16.c
来自「coldfire5307的bootloader 将程序写入flash」· C语言 代码 · 共 791 行 · 第 1/2 页
C
791 行
#include "mcf5307.h" //#include "string.h"#define FLASH_555H 0x555#define FLASH_2AAH 0x2AA#define CHIP_PROTECT #define CHIP_UNPROTECT//#define INTEL_FLASH //注意,根据flash型号定义或屏蔽#define bool unsigned char#define TRUE 1#define True TRUE#define FALSE 0#define False FALSE#define BlockSize 32768 // for intel TE28F800C3T , it's 32 K words at low address !void delay(int); //kangvoid Unlock(void);void Lock(void);bool VerifyBlank(long lBaseAddress,long Size);bool WriteTest(long lBaseAddress);bool sChipErase( long lBaseAddress );bool sSectorErase( long lBaseAddress, long lSectorAddress );bool sSectorUnlock( long lBaseAddress, long lSectorAddress );bool sWriteWord( long lBaseAddress, long lAddress, short sData );bool sVerifyEnd( volatile short *spAddress, short sVerifyData );short sChipManufacturerID( long lBaseAddress );short sChipDeviceID( long lBaseAddress );unsigned short GetFlashStatus( long lBaseAddress );bool WriteBlockData(int lBaseAddress, int BlockStartAddress, volatile unsigned short * SrcAddress, int HowmanyWords); //extern void Printf(char * Index);unsigned char Sta[100000];//at 0xff000000unsigned char StartImg[]={ 0x00,0x00,0x05,0x00,0xff,0x01,0x00,0x00 //第一个是堆栈地址,第二个是复位跳转地址 };//at 0xff010000unsigned char BootImg[]={ #include "..\code-boot\bootloader.txt" //bootloader,自己编写的启动代码 //#include "diskloader.txt" };//at 0xff020000unsigned char AppImg[]={ #include "..\code-boot\linux.txt" //uclinux代码 //0,0,0,0 };//#include "e:\mat-work\1.txt"//unsigned char StartAdd[]={0x00,0x30,0x00,0x00,0xff,0x01,0x00,0x00};//unsigned char StartAdd[]={(0xff000000&(100+sizeof(LinuxImg)))>>24,(0x00ff0000&(100+sizeof(LinuxImg)))>>16,(0x00ff00&(100+sizeof(LinuxImg)))>>8,(0x00ff&(100+sizeof(LinuxImg))),0xff,0x01,0x00,0x00};bool sFlashChip( long lBaseAddress ){ short m_ID,d_ID; bool FlashOp; d_ID = sChipDeviceID( lBaseAddress ); m_ID = sChipManufacturerID( lBaseAddress ); return 1; }void Flash_Test(){ unsigned short m_ID,d_ID; unsigned short *resultP; long baseCS0 = 0xFF000000; char Buf[200]; //unsigned short *Protect=(unsigned short *)0x22800000; int size; //kang //(*Protect)=0xffff; //read ChipDeviceID and ChipManufacturerID //kang第二片 d_ID = sChipDeviceID( 0xFF200000 ); //sprintf(Buf,"Chip ID is: %04x\r\n",d_ID); //Printf(Buf); m_ID = sChipManufacturerID( 0xFF200000 ); //sprintf(Buf,"Vendor ID is: %04x\r\n",m_ID); //Printf(Buf); //read ChipDeviceID and ChipManufacturerID d_ID = sChipDeviceID( baseCS0 ); //sprintf(Buf,"Chip ID is: %04x\r\n",d_ID); //Printf(Buf); m_ID = sChipManufacturerID( baseCS0 ); //sprintf(Buf,"Vendor ID is: %04x\r\n",m_ID); //Printf(Buf); m_ID=WriteBlockData(0xff000000,0x00000000/2, (unsigned short *)StartImg, (sizeof(StartImg)/2));//+0x20 m_ID=WriteBlockData(0xff200000,0x00010000/2, (unsigned short *)BootImg, (sizeof(BootImg)/2)); size=sizeof(AppImg); //kang m_ID=WriteBlockData(0xff000000,0x00020000/2, (unsigned short *)AppImg, (0x1E0000/2)); // ucLINUX在flash1上的部分 // m_ID=WriteBlockData(0xff200000,0x00020000/2, (unsigned short *)AppImg, (0x1E0000/2)); m_ID=WriteBlockData(0xff200000,0x00000000/2, (unsigned short *)((unsigned int)AppImg+(unsigned int)0x1E0000), ((sizeof(AppImg)-0x1E0000)/2)+0x02);//ucLINUX在flash2上的部分 // m_ID=WriteBlockData(0xff200000,0x00000000/2, (unsigned short *)AppImg, (sizeof(AppImg)/2)+0x2); //if(0x01==m_ID) // Printf("bootloader write ok\r\n"); //else // Printf("bootloader write fail\r\n"); //m_ID=WriteBlockData(0xff000000,0x00020000/2, (unsigned short *)Phase_C, 2000); //if(0x01==m_ID) // Printf("linux image write ok\r\n"); //else // Printf("linux image write fail\r\n"); /* Printf("System halted\r\n"); //erase Flash Memory 1 CHIP_UNPROTECT; //if ( !sChipErase( 0xFe000000 ) ) // return; //read ChipDeviceID and ChipManufacturerID d_ID = sChipDeviceID( baseCS0 ); m_ID = sChipManufacturerID( baseCS0 ); // if ( !sSectorErase(baseCS0,0) ) // return; while(1) { if ( !sSectorErase(baseCS0,0) ) return; sWriteWord( baseCS0, 0x0000, 0x0000 ); resultP=(unsigned short *)baseCS0; resultP+=0x0000; m_ID=*resultP; if(m_ID!=0x0) { while(1) { m_ID++; } } if ( !sSectorErase(baseCS0,0x10000) ) return; sWriteWord( baseCS0, 0x10000, 0x1111 ); resultP=(unsigned short *)baseCS0; resultP+=0x10000; m_ID=*resultP; if(m_ID!=0x1111) { while(1) { m_ID++; } } if ( !sSectorErase(baseCS0,0x20000) ) return; sWriteWord( baseCS0, 0x20000, 0x2222 ); resultP=(unsigned short *)baseCS0; resultP+=0x20000; m_ID=*resultP; if(m_ID!=0x2222) { while(1) { m_ID++; } } if ( !sSectorErase(baseCS0,0x30000) ) return; sWriteWord( baseCS0, 0x30000, 0x3333 ); resultP=(unsigned short *)baseCS0; resultP+=0x30000; m_ID=*resultP; if(m_ID!=0x3333) { while(1) { m_ID++; } } if ( !sSectorErase(baseCS0,0x40000) ) return; sWriteWord( baseCS0, 0x40000, 0x4444 ); resultP=(unsigned short *)baseCS0; resultP+=0x40000; m_ID=*resultP; if(m_ID!=0x4444) while(1) { { m_ID++; } } if ( !sSectorErase(baseCS0,0x50000) ) return; sWriteWord( baseCS0, 0x50000, 0x5555 ); resultP=(unsigned short *)baseCS0; resultP+=0x50000; m_ID=*resultP; if(m_ID!=0x5555) { while(1) { m_ID++; } } if ( !sSectorErase(baseCS0,0x3f8000) ) return; sWriteWord( baseCS0, 0x3f8000, 0xABCD ); resultP=(unsigned short *)baseCS0; resultP+=0x3f8000; m_ID=*resultP; if(m_ID!=0xABCD) { while(1) { m_ID++; } } } CHIP_PROTECT;*/}bool sChipErase( long lBaseAddress ){ volatile short *sp; bool retval; sp = (short*)lBaseAddress; *( sp + FLASH_555H ) = 0xAA; *( sp + FLASH_2AAH ) = 0x55; *( sp + FLASH_555H ) = 0x80; *( sp + FLASH_555H ) = 0xAA; *( sp + FLASH_2AAH ) = 0x55; *( sp + FLASH_555H ) = 0x10; retval = sVerifyEnd( sp, 0x80 ); //if operation is finished, DQ7 = 1 return retval;}/************************************************************************Name: sSectorEraseFunction: erase data of a sectorinput: lBaseAddress, the base address of Flash memory to be erased lSectorAddress, the base address the sector to be erasedreturn: True: erase is successful; False: erase is fail*************************************************************************/bool sSectorErase( long lBaseAddress, long lSectorAddress ){ volatile short *sp; bool retval; unsigned short ID; sp = (short*)lBaseAddress; #ifndef INTEL_FLASH *( sp + FLASH_555H ) = 0xAA; *( sp + FLASH_2AAH ) = 0x55; *( sp + FLASH_555H ) = 0x80; *( sp + FLASH_555H ) = 0xAA; *( sp + FLASH_2AAH ) = 0x55; *( sp + lSectorAddress ) = 0x30; //??? lSectorAddress = 0x3000 retval = sVerifyEnd( sp+lSectorAddress, 0x80 ); //if operation is finished, DQ7 = 1 return retval; #else Unlock(); *sp=0x50; //clear flag *sp=0x60; //set config *( sp + lSectorAddress ) = 0xd0; //unlock it! *sp=0x90; //read config ID=*(sp+lSectorAddress+2); //is unlock ? while(0x00!=(ID&0x01)) { ID=*(sp+lSectorAddress+2); } *sp=0x50; //clear flag *( sp + lSectorAddress ) = 0x20; //setup erase *( sp + lSectorAddress ) = 0xd0; //confirm it! ID=*sp; //ready ? while(0x00==(ID&0x80)) { ID=*sp; } ID=*(sp); //all ok? if(0x00==(ID&0x3a)) { *sp=0xff; //set it in read mode return True; } else { *sp=0xff; return False; } #endif }bool sSectorUnlock( long lBaseAddress, long lSectorAddress ){ volatile short *sp; bool retval; unsigned short ID; int i=0; sp = (short*)lBaseAddress; #ifndef INTEL_FLASH return 0x01; #else Unlock(); *sp=0x50; //clear flag *sp=0x60; //set config *( sp + lSectorAddress ) = 0xd0; //unlock it!
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?