00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "global.h"
00020 #include "at91sam7s256.h"
00021
00022
00023 #include "at91flash.h"
00024
00025 void at91flashInit(void)
00026 {
00027
00028
00029
00030
00031
00032 AT91C_BASE_MC->MC_FMR = (((F_CPU*2/1000)<<16) & AT91C_MC_FMCN);
00033 }
00034
00035 void at91flashWrite(uint32_t flashaddr, uint8_t* buffer, uint32_t len)
00036 {
00037 int wrlen;
00038
00039
00040 while(len)
00041 {
00042
00043 wrlen = (len<AT91C_IFLASH_PAGE_SIZE)?(len):(AT91C_IFLASH_PAGE_SIZE);
00044
00045 at91flashWritePage(flashaddr, buffer, wrlen);
00046
00047 flashaddr += wrlen;
00048 buffer += wrlen;
00049
00050 len -= wrlen;
00051 }
00052 }
00053
00054 void at91flashWritePage(uint32_t flashaddr, uint8_t* buffer, uint32_t len)
00055 {
00056 int pageword;
00057 unsigned long* wrptr = (unsigned long*)flashaddr;
00058
00059
00060
00061 for(pageword=0; pageword<(len/4); pageword++)
00062 {
00063
00064
00065 *wrptr++ = (buffer[3]<<24) | (buffer[2]<<16) | (buffer[1]<<8) | (buffer[0]<<0);
00066 buffer+=4;
00067 }
00068
00069 if( flashaddr & (AT91C_IFLASH_PAGE_SIZE-1) )
00070 AT91C_BASE_MC->MC_FMR |= AT91C_MC_NEBP;
00071 else
00072 AT91C_BASE_MC->MC_FMR &= ~AT91C_MC_NEBP;
00073
00074 AT91C_BASE_MC->MC_FCR = (0x5A<<24) | (((flashaddr/AT91C_IFLASH_PAGE_SIZE)<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG;
00075
00076 while(!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
00077 }
00078
00079 void at91flashErase(void)
00080 {
00081
00082 AT91C_BASE_MC->MC_FCR = (0x5A<<24) | AT91C_MC_FCMD_ERASE_ALL;
00083
00084 while(!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
00085 }
00086
00087 int at91flashGetLock(uint32_t flashaddr)
00088 {
00089
00090 flashaddr &= (AT91C_IFLASH_SIZE-1);
00091
00092 if( AT91C_BASE_MC->MC_FSR & (1<<(16+(flashaddr/AT91C_IFLASH_LOCK_REGION_SIZE))) )
00093 return 1;
00094 else
00095 return 0;
00096 }
00097
00098 void at91flashSetLock(uint32_t flashaddr, int lockstate)
00099 {
00100
00101
00102
00103 flashaddr &= (AT91C_IFLASH_SIZE-1);
00104
00105
00106 if( at91flashGetLock(flashaddr) == lockstate)
00107 return;
00108
00109 if(lockstate)
00110 AT91C_BASE_MC->MC_FCR = (0x5A<<24) | (((flashaddr/AT91C_IFLASH_PAGE_SIZE)<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_LOCK;
00111 else
00112 AT91C_BASE_MC->MC_FCR = (0x5A<<24) | (((flashaddr/AT91C_IFLASH_PAGE_SIZE)<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_UNLOCK;
00113
00114 while(!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
00115 }