|
From: Matt H. <mh...@me...> - 2011-02-20 11:17:05
|
diff -rupN firmware-0.4.2-beta-orig/prog.c firmware-0.4.2-beta/prog.c
--- firmware-0.4.2-beta-orig/prog.c 2011-01-22 11:24:58.000000000 -0500
+++ firmware-0.4.2-beta/prog.c 2011-02-16 02:02:58.050744634 -0500
@@ -182,14 +182,26 @@ char bulk_erase(PICFAMILY picfamily,PICT
pic_send(4,0x00,0x94A6); //BCF EECON1, WREN
break;
case P18F2XXX: //also valid for 18F4XXX
+ case P18F4XK22:
+ case P18LF4XK22:
set_address(picfamily, 0x3C0005);
- pic_send(4,0x0C,0x3F3F); //Write 3F3Fh to 3C0005h
+ if(pictype == P18F2XXX)
+ {
+ pic_send(4,0x0C,0x3F3F); //Write 3F3Fh to 3C0005h
+ } else { // // P18LF/F4XK22
+ pic_send(4,0x0C,0x0F0F); //Write 0F0Fh to 3C0005h
+ }
set_address(picfamily, 0x3C0004);
pic_send(4,0x0C,0x8F8F); //Write 8F8Fh to 3C0004h
pic_send(4,0x00,0x0000); //NOP
lasttick=tick;
pic_send(4,0x00,0x0000); //hold PGD low until erase completes
- DelayMs(P11);
+ if(pictype==P18F2XXX)
+ {
+ DelayMs(P11);
+ } else { // P18LF/F4XK22
+ DelayMs(P11K);
+ }
break;
case P18FX220:
case P18FXX31:
@@ -582,8 +594,12 @@ char write_code(PICFAMILY picfamily, PIC
//}
break;
case P18F2XXX:
+ case P18F4XK22:
+ case P18LF4XK22:
pic_send(4,0x00,0x8EA6); //BSF EECON1, EEPGD
pic_send(4,0x00,0x9CA6); //BCF EECON1, CFGS
+ if((pictype == P18F4XK22)||(pictype == P18LF4XK22))
+ pic_send(4,0x00,0x84A6); //BSF EECON1, WREN
set_address(picfamily, address);
for(blockcounter=0;blockcounter<(blocksize-2);blockcounter+=2)
{
@@ -967,6 +983,11 @@ char write_data(PICFAMILY picfamily, PIC
pic_send(4,0,0x6EA7); //MOVWF EECON2
}
pic_send(4,0x00,0x82A6); //BSF EECON1, WR
+ if((pictype==P18F4XK22)||(pictype==P18LF4XK22))
+ {
+ pic_send(4,0x00,0x0000); //NOP, two NOPs required before polling
+ pic_send(4,0x00,0x0000); //NOP, write starts on 4th clock of this instruction
+ }
//pic_send(4,0x00,0x0000); //NOP, when not polling for the WR bit, the PIC still needs at least 4 clocks
lasttick=tick;
do
@@ -1114,8 +1135,12 @@ char write_config_bits(PICFAMILY picfami
case P18F6X2X:
case P18FXX2:
case P18F2XXX:
+ case P18F4XK22:
+ case P18LF4XK22:
pic_send(4,0x00,0x8EA6); //BSF EECON1, EEPGD
pic_send(4,0x00,0x8CA6); //BSF EECON1, CFGS
+ if((pictype==P18F4XK22)||(pictype==P18LF4XK22))
+ pic_send(4,0x00,0x84A6); //BSF EECON1, WREN
if((pictype==P18FXX2)||(pictype==P18FXX31)||(pictype==P18FXX31))
{
//goto 0x100000
@@ -1130,8 +1155,13 @@ char write_config_bits(PICFAMILY picfami
//LSB first
pic_send(4,0x0F,((unsigned int)*(data+blockcounter))|(((unsigned int)*(data+blockcounter))<<8));
pic_send_n_bits(3, 0);
- PGC=1; //hold PGC high for P9
- DelayMs(P9);
+ PGC=1; //hold PGC high for P9 (or P9A for 4XF/LFK22 config word)
+ if((pictype==P18F4XK22)||(pictype==P18LF4XK22))
+ {
+ DelayMs(P9A);
+ } else {
+ DelayMs(P9);
+ }
PGC=0; //hold PGC low for time P10
DelayMs(P10);
pic_send_word(0x0000); //last part of the nop
@@ -1142,8 +1172,13 @@ char write_config_bits(PICFAMILY picfami
set_address(picfamily, address+((unsigned int)blockcounter)+1);
pic_send(4,0x0F, ((unsigned int)*(data+1+blockcounter))|(((unsigned int)*(data+1+blockcounter))<<8)); //load MSB and start programming
pic_send_n_bits(3, 0);
- PGC=1; //hold PGC high for P9
- DelayMs(P9);
+ PGC=1; //hold PGC high for P9 (or P9A for 4XF/LFK22 config word)
+ if((pictype==P18F4XK22)||(pictype==P18LF4XK22))
+ {
+ DelayMs(P9A);
+ } else {
+ DelayMs(P9);
+ }
PGC=0; //hold PGC low for time P10
DelayMs(P10);
pic_send_word(0x0000); //last part of the nop
diff -rupN firmware-0.4.2-beta-orig/prog.h firmware-0.4.2-beta/prog.h
--- firmware-0.4.2-beta-orig/prog.h 2010-12-13 10:33:41.000000000 -0500
+++ firmware-0.4.2-beta/prog.h 2011-02-16 01:28:31.474548425 -0500
@@ -35,7 +35,7 @@ typedef enum _PICTYPE{
P16F7X,P16F7X7,P16F87X,P16F72,P16F87,P16F54,P16F57,P16F785,P16F59,P16F91X,P16F88X,
P16C6XX,P16C55X,P16C7XX,P16C64x,P14000,P16C50X,P16C432,P17CXX,P17C7XX,
P18FXX39,P18F6X2X,P18FXX80,P18F8410,P18F6XJXX,P18F45J10,P18F97J60,P18F1X30,P18FXX23,P18FXXK20,
- P24FJXXXGA0XX,P24FJXXXGA1,dsP30F,dsP33F,P24H,P10F200,P10F202,P12F61X,P16F716,P18FXX31,P18FX220,
+ P24FJXXXGA0XX,P24FJXXXGA1,dsP30F,dsP33F,P24H,P10F200,P10F202,P12F61X,P16F716,P18FXX31,P18FX220,P18F4XK22,P18LF4XK22,
I2C_EE_1,I2C_EE_2,P12F508,P24FXXKAXXX,
UPP_INVALID_PICTYPE
}PICTYPE;
@@ -61,9 +61,11 @@ unsigned char read_data(PICFAMILY picfam
// delay times according to programming specification for PIC18F:
#define P9 2
+#define P9A 6
#define P10 1
#define P11 10
#define P11A 5
+#define P11K 16
// delay times according to programming specification for PIC16F:
#define Tera 10
diff -rupN firmware-0.4.2-beta-orig/upp.c firmware-0.4.2-beta/upp.c
--- firmware-0.4.2-beta-orig/upp.c 2011-01-07 06:43:16.000000000 -0500
+++ firmware-0.4.2-beta/upp.c 2011-02-04 01:59:53.576524142 -0500
@@ -522,7 +522,9 @@ unsigned char set_pictype(unsigned char*
case P16F716:
case P17C7XX:picfamily=PIC16;break;
case P18F2XXX:
- case P18FXX2:picfamily=PIC18;break;
+ case P18F4XK22:
+ case P18LF4XK22:
+ case P18FXX2:
case P18FXX39:
case P18F6X2X:
case P18FXX80:
|