projects
/
goodfet
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Chipcon peek and poke for iram, include SFRs.
[goodfet]
/
firmware
/
apps
/
chipcon
/
chipcon.c
diff --git
a/firmware/apps/chipcon/chipcon.c
b/firmware/apps/chipcon/chipcon.c
index
b2a912d
..
00182f0
100644
(file)
--- 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.
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);
case READ: //Write a command and return 1-byte reply.
cccmd(len);
ccread(1);
@@
-267,6
+275,25
@@
void cc_wr_config(unsigned char config){
cccmd(2);
ccread(1);
}
cccmd(2);
ccread(1);
}
+
+//! Locks the chip.
+void cc_lockchip(){
+ debugstr("Locking chip.");
+ cc_wr_config(1);//Select Info Flash
+ if(!(cc_rd_config()&1))
+ debugstr("Config forgotten!");
+
+ //Clear config page.
+ cc_pokedatabyte(0xf000,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
//! Read the configuration byte.
unsigned char cc_rd_config(){
cmddata[0]=CCCMD_RD_CONFIG; //0x24
@@
-353,15
+380,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
//! Copies flash buffer to flash.
void cc_write_flash_page(u32 adr){
//Assumes that page has already been written to XDATA 0xF000
@@
-392,6
+410,7
@@
void cc_write_flash_page(u32 adr){
cc_set_pc(0xf000+FLASHPAGE_SIZE);//execute code fragment
cc_resume();
cc_set_pc(0xf000+FLASHPAGE_SIZE);//execute code fragment
cc_resume();
+
//debugstr("Executing.");
//debugstr("Executing.");
@@
-399,6
+418,7
@@
void cc_write_flash_page(u32 adr){
P1OUT^=1;//blink LED while flashing
}
P1OUT^=1;//blink LED while flashing
}
+
//debugstr("Done flashing.");
P1OUT&=~1;//clear LED
//debugstr("Done flashing.");
P1OUT&=~1;//clear LED
@@
-467,11
+487,11
@@
unsigned char cc_debug(unsigned char len,
unsigned char cmd=CCCMD_DEBUG_INSTR+(len&0x3);//0x54+len
CCWRITE;
cctrans8(cmd);
unsigned char cmd=CCCMD_DEBUG_INSTR+(len&0x3);//0x54+len
CCWRITE;
cctrans8(cmd);
- if(len
--
)
+ if(len
>0
)
cctrans8(a);
cctrans8(a);
- if(len
--
)
+ if(len
>1
)
cctrans8(b);
cctrans8(b);
- if(len
--
)
+ if(len
>2
)
cctrans8(c);
CCREAD;
return cctrans8(0x00);
cctrans8(c);
CCREAD;
return cctrans8(0x00);
@@
-534,19
+554,26
@@
unsigned char cc_peekdatabyte(unsigned int adr){
hb=(adr&0xFF00)>>8,
lb=adr&0xFF,
toret;
hb=(adr&0xFF00)>>8,
lb=adr&0xFF,
toret;
-
+
//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;
//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);
}
}
- */
+
+
+//! Fetch a byte of IRAM.
+u8 cc_peekirambyte(u8 adr){
+ //MOV A, #iram
+ return cc_debug(3, 0xE5, adr, 0);
+}
+
+//! Write a byte of IRAM.
+u8 cc_pokeirambyte(u8 adr, u8 val){
+ //MOV #iram, #val
+ return cc_debug(3, 0x75, adr, val);
}
}
+
+