mirror of
https://github.com/ole00/afterburner.git
synced 2024-11-26 18:50:05 +00:00
Add GAL6001/GAL6002 read support
This commit is contained in:
parent
7b08a1a749
commit
534b50518f
146
afterburner.ino
146
afterburner.ino
@ -316,7 +316,7 @@ static uint8_t vpp = 0;
|
|||||||
|
|
||||||
char echoEnabled;
|
char echoEnabled;
|
||||||
unsigned char pes[12];
|
unsigned char pes[12];
|
||||||
char line[64];
|
char line[128];
|
||||||
short lineIndex;
|
short lineIndex;
|
||||||
char endOfLine;
|
char endOfLine;
|
||||||
char mapUploaded;
|
char mapUploaded;
|
||||||
@ -1286,6 +1286,12 @@ static char getFuseBit(unsigned short bitPos) {
|
|||||||
return (fusemap[bitPos >> 3] & (1 << (bitPos & 7))) ? 1 : 0;
|
return (fusemap[bitPos >> 3] & (1 << (bitPos & 7))) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setFuseBitVal(unsigned short bitPos, char val) {
|
||||||
|
if (val) {
|
||||||
|
setFuseBit(bitPos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// generic fuse-map reading, fuse-map bits are stored in fusemap array
|
// generic fuse-map reading, fuse-map bits are stored in fusemap array
|
||||||
static void readGalFuseMap(const unsigned char* cfgArray, char useDelay, char doDiscardBits) {
|
static void readGalFuseMap(const unsigned char* cfgArray, char useDelay, char doDiscardBits) {
|
||||||
unsigned short cfgAddr = galinfo[gal].cfgbase;
|
unsigned short cfgAddr = galinfo[gal].cfgbase;
|
||||||
@ -1376,6 +1382,47 @@ static void readGalFuseMap(const unsigned char* cfgArray, char useDelay, char do
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void readGalFuseMap600(const unsigned char* cfgArray) {
|
||||||
|
unsigned short row, bit;
|
||||||
|
unsigned short addr;
|
||||||
|
|
||||||
|
for (row = 0; row < 78; row++)
|
||||||
|
{
|
||||||
|
strobeRow(row);
|
||||||
|
discardBits(20);
|
||||||
|
for (bit = 0; bit < 11; bit++)
|
||||||
|
setFuseBitVal(7296 + 78 * bit + row, receiveBit());
|
||||||
|
for (bit = 0; bit < 64; bit++)
|
||||||
|
setFuseBitVal(114 * bit + row, receiveBit());
|
||||||
|
discardBits(24);
|
||||||
|
}
|
||||||
|
for (row = 0; row < 64; row++)
|
||||||
|
{
|
||||||
|
sendBits(31, 0);
|
||||||
|
for (bit = 0; bit < 64; bit++)
|
||||||
|
sendBit(bit != row);
|
||||||
|
sendBits(24, 0);
|
||||||
|
setSDIN(0);
|
||||||
|
strobe(2);
|
||||||
|
for (bit = 0; bit < 20; bit++)
|
||||||
|
setFuseBitVal(78 + 114 * row + bit, receiveBit());
|
||||||
|
discardBits(83);
|
||||||
|
for (bit = 0; bit < 16; bit++)
|
||||||
|
setFuseBitVal(98 + 114 * row + bit, receiveBit());
|
||||||
|
}
|
||||||
|
// UES
|
||||||
|
strobeRow(galinfo[gal].uesrow);
|
||||||
|
discardBits(20);
|
||||||
|
addr = galinfo[gal].uesfuse;
|
||||||
|
for (bit = 0; bit < 72; bit++)
|
||||||
|
setFuseBitVal(addr + bit, receiveBit());
|
||||||
|
// CFG
|
||||||
|
setRow(galinfo[gal].cfgrow);
|
||||||
|
strobe(2);
|
||||||
|
for (bit = 0; bit < galinfo[gal].cfgbits; bit++)
|
||||||
|
setFuseBitVal(cfgArray[bit], receiveBit());
|
||||||
|
}
|
||||||
|
|
||||||
// generic fuse-map verification, fuse map bits are compared against read bits
|
// generic fuse-map verification, fuse map bits are compared against read bits
|
||||||
static unsigned short verifyGalFuseMap(const unsigned char* cfgArray, char useDelay, char doDiscardBits) {
|
static unsigned short verifyGalFuseMap(const unsigned char* cfgArray, char useDelay, char doDiscardBits) {
|
||||||
unsigned short cfgAddr = galinfo[gal].cfgbase;
|
unsigned short cfgAddr = galinfo[gal].cfgbase;
|
||||||
@ -1537,6 +1584,17 @@ static void readOrVerifyGal(char verify)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GAL6001:
|
||||||
|
case GAL6002:
|
||||||
|
cfgArray = (gal == GAL6001) ? (unsigned char*) cfg6001 : (unsigned char*) cfg6002;
|
||||||
|
//read without delay, no discard
|
||||||
|
if (verify) {
|
||||||
|
i = verifyGalFuseMap(cfgArray, 0, 0);
|
||||||
|
} else {
|
||||||
|
readGalFuseMap600(cfgArray);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case GAL20XV10:
|
case GAL20XV10:
|
||||||
case GAL22V10:
|
case GAL22V10:
|
||||||
case ATF22V10B:
|
case ATF22V10B:
|
||||||
@ -1907,25 +1965,72 @@ static void printJedec()
|
|||||||
Serial.print(F("*QF")); Serial.print(galinfo[gal].fuses + apdFuse, DEC);
|
Serial.print(F("*QF")); Serial.print(galinfo[gal].fuses + apdFuse, DEC);
|
||||||
Serial.println(F("*QV0*F0*G0*X0*"));
|
Serial.println(F("*QV0*F0*G0*X0*"));
|
||||||
|
|
||||||
for( i = k = 0; i < galinfo[gal].bits; i++) {
|
if (gal == GAL6001 || gal == GAL6002) {
|
||||||
unused = 1;
|
for (i = k = 0; i < 64; i++)
|
||||||
n = 0;
|
{
|
||||||
line[n++] = 'L';
|
n = 0;
|
||||||
n = addFormatedNumberDec4(k, n);
|
unused = 1;
|
||||||
line[n++] = ' ';
|
line[n++] = 'L';
|
||||||
for(j= 0; j < galinfo[gal].rows; j++, k++) {
|
n = addFormatedNumberDec4(k, n);
|
||||||
if (getFuseBit(k)) {
|
line[n++] = ' ';
|
||||||
unused = 0;
|
for (j = 0; j < 114; j++, k++)
|
||||||
line[n++] = '1';
|
{
|
||||||
} else {
|
if (getFuseBit(k)) {
|
||||||
line[n++] = '0';
|
unused = 0;
|
||||||
}
|
line[n++] = '1';
|
||||||
}
|
} else {
|
||||||
line[n++] = '*';
|
line[n++] = '0';
|
||||||
line[n++] = 0;
|
}
|
||||||
if (!unused) {
|
}
|
||||||
Serial.println(line);
|
line[n++] = '*';
|
||||||
}
|
line[n++] = 0;
|
||||||
|
if (!unused) {
|
||||||
|
Serial.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
|
{
|
||||||
|
unused = 1;
|
||||||
|
n = 0;
|
||||||
|
line[n++] = 'L';
|
||||||
|
n = addFormatedNumberDec4(k, n);
|
||||||
|
line[n++] = ' ';
|
||||||
|
for (j = 0; j < 78; j++, k++)
|
||||||
|
{
|
||||||
|
if (getFuseBit(k)) {
|
||||||
|
unused = 0;
|
||||||
|
line[n++] = '1';
|
||||||
|
} else {
|
||||||
|
line[n++] = '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line[n++] = '*';
|
||||||
|
line[n++] = 0;
|
||||||
|
if (!unused) {
|
||||||
|
Serial.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for( i = k = 0; i < galinfo[gal].bits; i++) {
|
||||||
|
unused = 1;
|
||||||
|
n = 0;
|
||||||
|
line[n++] = 'L';
|
||||||
|
n = addFormatedNumberDec4(k, n);
|
||||||
|
line[n++] = ' ';
|
||||||
|
for(j= 0; j < galinfo[gal].rows; j++, k++) {
|
||||||
|
if (getFuseBit(k)) {
|
||||||
|
unused = 0;
|
||||||
|
line[n++] = '1';
|
||||||
|
} else {
|
||||||
|
line[n++] = '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line[n++] = '*';
|
||||||
|
line[n++] = 0;
|
||||||
|
if (!unused) {
|
||||||
|
Serial.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( k < galinfo[gal].uesfuse) {
|
if( k < galinfo[gal].uesfuse) {
|
||||||
@ -2024,7 +2129,6 @@ static void printJedec()
|
|||||||
Serial.println(F("*"));
|
Serial.println(F("*"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// helper print function to save RAM space
|
// helper print function to save RAM space
|
||||||
static void printNoFusesError() {
|
static void printNoFusesError() {
|
||||||
Serial.println(F("ER fuse map not uploaded"));
|
Serial.println(F("ER fuse map not uploaded"));
|
||||||
|
Loading…
Reference in New Issue
Block a user