All pastes #746049 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-10-22 22:22 UTC
rendered paste body
#define                 NOR                             ((unsigned char*)0xA0000000)
#define                 NORWORD                 ((unsigned short int*)0xA0000000)

void eraseblock(int addr);
void writeblock(int block, int length);
unsigned char payload[0x1000];

int main() {
    int i;

    for(i = 0; i < sizeof(payload);) {
	payload[i++] = 'C';
	payload[i++] = 'H';
	payload[i++] = 'R';
	payload[i++] = 'I';
	payload[i++] = 'S';
    }

  eraseblock(0x3e0000);
  writeblock(0x3e0000, 0x1000);
  while (1);
}

void eraseblock(int addr) {
  NOR[addr]=0xFF;
  NOR[addr]=0x60;
  NOR[addr]=0xD0;               //Unlock
  NOR[addr]=0x20;
  NOR[addr]=0xD0;               //Erase
  NOR[addr]=0x50;
  while(NOR[addr]!=0x80);       //wait for it to be ready
}

void writeblock(int addr, int length)
{
  extern unsigned char *payload;

  unsigned int i;
  //first unlock the blocks
  for(i=0;i<length;i+=0x4000) {
    NOR[addr+i]=0xFF;
    NOR[addr+i]=0x60;
    NOR[addr+i]=0xD0;           //Unlock
    NOR[addr+i]=0xFF;
  }
  short int j;
  NOR[0]=0xFF;
  for(i=0;i<length;i+=4) {
    j=*(payload++);             //0
    j+=256*(*(payload++));      //1
    NOR[addr+i]=0x40;
    NORWORD[(addr+i)/2]=j;     //0x1100
    NOR[addr]=0x70;
    while(NOR[addr]!=0x80);     //wait for it to be ready
    NOR[addr]=0xFF;

    j=*(payload++);             //2
    j+=256*(*(payload++));      //3
    NOR[addr+i]=0x40;
    NORWORD[((addr+i)/2)+1]=j;     //0x3322
    NOR[addr]=0x70;
    while(NOR[addr]!=0x80);     //wait for it to be ready
    NOR[addr]=0xFF;
  }
}