X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fchipcon%2Fchipcon.c;h=478e8776d825155f8c709e5df5bd1c7521dc5772;hp=b2a912d28e1e4d32ad1a6de31908adb48ada95bd;hb=eddb0eb08f187dc156a6cb51878104df67d97436;hpb=d64502ed4204f313ae89aa4e2b6c554d5a9c6563 diff --git a/firmware/apps/chipcon/chipcon.c b/firmware/apps/chipcon/chipcon.c index b2a912d..478e877 100644 --- a/firmware/apps/chipcon/chipcon.c +++ b/firmware/apps/chipcon/chipcon.c @@ -132,6 +132,14 @@ void cchandle(unsigned char app, switch(verb){ //CC_PEEK and CC_POKE will come later. + case PEEK: + cmddata[0]=cc_peekirambyte(cmddata[0]); + txdata(app,verb,1); + break; + case POKE: + cmddata[0]=cc_pokeirambyte(cmddata[0],cmddata[1]); + txdata(app,verb,0); + break; case READ: //Write a command and return 1-byte reply. cccmd(len); ccread(1); @@ -267,6 +275,28 @@ void cc_wr_config(unsigned char config){ cccmd(2); ccread(1); } + +//! Locks the chip. +void cc_lockchip(){ + register int i; + + debugstr("Locking chip."); + cc_wr_config(1);//Select Info Flash + if(!(cc_rd_config()&1)) + debugstr("Config forgotten!"); + + //Clear config page. + for(i=0;i<2048;i++) + cc_pokedatabyte(0xf000+i,0); + cc_write_flash_page(0); + if(cc_peekcodebyte(0)) + debugstr("Failed to clear info flash byte."); + + cc_wr_config(0); + if(cc_rd_config()&1) + debugstr("Stuck in info flash mode!"); +} + //! Read the configuration byte. unsigned char cc_rd_config(){ cmddata[0]=CCCMD_RD_CONFIG; //0x24 @@ -353,15 +383,6 @@ const u8 flash_routine[] = { }; -//! Locks the chip. -void cc_lockchip(){ - debugstr("Locking chip."); - cc_wr_config(1);//Select Info Flash - cc_debug(3, 0x75, 0xAF, 0x00);//MOV FWDATA, #00H - //cc_debug(2, 0xF5, 0xAF, 0); //MOV FWDATA, A - -} - //! Copies flash buffer to flash. void cc_write_flash_page(u32 adr){ //Assumes that page has already been written to XDATA 0xF000 @@ -388,18 +409,20 @@ void cc_write_flash_page(u32 adr){ cmddata[1]=0xc7; cmddata[2]=0x51; cc_debug_instr(3); - //debugstr("Loaded bank info."); + debugstr("Loaded bank info."); cc_set_pc(0xf000+FLASHPAGE_SIZE);//execute code fragment cc_resume(); - //debugstr("Executing."); + + debugstr("Executing."); while(!(cc_read_status()&CC_STATUS_CPUHALTED)){ P1OUT^=1;//blink LED while flashing } - //debugstr("Done flashing."); + + debugstr("Done flashing."); P1OUT&=~1;//clear LED } @@ -467,11 +490,11 @@ unsigned char cc_debug(unsigned char len, unsigned char cmd=CCCMD_DEBUG_INSTR+(len&0x3);//0x54+len CCWRITE; cctrans8(cmd); - if(len--) + if(len>0) cctrans8(a); - if(len--) + if(len>1) cctrans8(b); - if(len--) + if(len>2) cctrans8(c); CCREAD; return cctrans8(0x00); @@ -532,21 +555,31 @@ for (n = 0; n < count; n++) { unsigned char cc_peekdatabyte(unsigned int adr){ unsigned char hb=(adr&0xFF00)>>8, - lb=adr&0xFF, - toret; - + lb=adr&0xFF; + //MOV DPTR, adr cc_debug(3, 0x90, hb, lb); //MOVX A, @DPTR //Must be 2, perhaps for clocking? - toret=cc_debug(3, 0xE0, 0, 0); - return toret; - - /* -DEBUG_INSTR(IN: 0x90, HIBYTE(address), LOBYTE(address), OUT: Discard); -for (n = 0; n < count; n++) { - DEBUG_INSTR(IN: 0xE0, OUT: outputArray[n]); - DEBUG_INSTR(IN: 0xA3, OUT: Discard); + return cc_debug(3, 0xE0, 0, 0); } - */ + + +//! Fetch a byte of IRAM. +u8 cc_peekirambyte(u8 adr){ + //CLR A + cc_debug(2, 0xE4, 0, 0); + //MOV A, #iram + return cc_debug(3, 0xE5, adr, 0); +} + +//! Write a byte of IRAM. +u8 cc_pokeirambyte(u8 adr, u8 val){ + //CLR A + cc_debug(2, 0xE4, 0, 0); + //MOV #iram, #val + return cc_debug(3, 0x75, adr, val); + //return cc_debug(3, 0x75, val, adr); } + +