Created
December 21, 2015 16:45
-
-
Save Ced2911/d6d9c2ccfc9eca726201 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define N_ADDR_PIN 20 | |
#define N_DATA_PIN 16 | |
typedef unsigned long uint32_t; | |
typedef unsigned long addr_t; | |
typedef unsigned short data_t; | |
typedef struct { | |
byte addr_pin[N_ADDR_PIN]; | |
byte data_pin[N_DATA_PIN]; | |
byte ce_pin; | |
byte vcc; | |
byte bp; | |
byte oe; | |
byte gnd[2]; | |
} ccprom_t; | |
ccprom_t ccprom; | |
void __init() { | |
int i = 0; | |
for(i = 0; i < N_ADDR_PIN; i++) { | |
ccprom.addr_pin[i] = 0; | |
} | |
for(i = 0; i < N_DATA_PIN; i++) { | |
ccprom.data_pin[i] = 0; | |
} | |
ccprom.ce_pin = 0; | |
ccprom.vcc = 0; | |
ccprom.bp = 0; | |
ccprom.oe = 0; | |
ccprom.gnd[0] = 0; | |
ccprom.gnd[1] = 0; | |
} | |
void setup() { | |
// put your setup code here, to run once: | |
__init(); | |
ccprom.addr_pin[18] = 21; | |
ccprom.addr_pin[17] = 22; | |
ccprom.addr_pin[7] = 24; | |
ccprom.addr_pin[6] = 26; | |
ccprom.addr_pin[5] = 28; | |
ccprom.addr_pin[4] = 30; | |
ccprom.addr_pin[3] = 32; | |
ccprom.addr_pin[2] = 34; | |
ccprom.addr_pin[1] = 36; | |
ccprom.addr_pin[0] = 38; | |
ccprom.ce_pin = 40; | |
ccprom.gnd[0] = 42; | |
ccprom.oe = 44; | |
ccprom.data_pin[0] = 46; | |
ccprom.data_pin[8] = 48; | |
ccprom.data_pin[1] = 50; | |
ccprom.data_pin[9] = 52; | |
ccprom.data_pin[2] = 17; | |
ccprom.data_pin[10] = 16; | |
ccprom.data_pin[3] = 15; | |
ccprom.data_pin[11] = 14; | |
/****************************************/ | |
ccprom.addr_pin[19] = 7; | |
ccprom.addr_pin[8] = 23; | |
ccprom.addr_pin[9] = 25; | |
ccprom.addr_pin[10] = 27; | |
ccprom.addr_pin[11] = 29; | |
ccprom.addr_pin[12] = 31; | |
ccprom.addr_pin[13] = 33; | |
ccprom.addr_pin[14] = 35; | |
ccprom.addr_pin[15] = 37; | |
ccprom.addr_pin[16] = 39; | |
ccprom.bp = 41; | |
ccprom.gnd[1] = 43; | |
ccprom.data_pin[15] = 45; | |
ccprom.data_pin[7] = 47; | |
ccprom.data_pin[14] = 49; | |
ccprom.data_pin[6] = 51; | |
ccprom.data_pin[13] = 53; | |
ccprom.data_pin[5] = 20; | |
ccprom.data_pin[12] = 19; | |
ccprom.data_pin[4] = 18; | |
/****************************************/ | |
for(int i=0;i<N_ADDR_PIN;i++){ | |
pinMode(ccprom.addr_pin[i],OUTPUT); | |
digitalWrite(ccprom.addr_pin[i], 0); | |
} | |
for(int i=0;i<N_DATA_PIN;i++){ | |
pinMode(ccprom.data_pin[i],INPUT); | |
} | |
digitalWrite(ccprom.addr_pin[17], HIGH); | |
//digitalWrite(ccprom.addr_pin[16], HIGH); | |
//digitalWrite(ccprom.addr_pin[0], LOW); | |
pinMode(ccprom.ce_pin,OUTPUT); | |
pinMode(ccprom.oe,OUTPUT); | |
pinMode(ccprom.bp,OUTPUT); | |
pinMode(ccprom.gnd[0],OUTPUT); | |
pinMode(ccprom.gnd[1],OUTPUT); | |
digitalWrite(ccprom.ce_pin,HIGH); | |
digitalWrite(ccprom.oe,HIGH); | |
digitalWrite(ccprom.bp,HIGH); | |
// tmp | |
pinMode(7,OUTPUT); | |
digitalWrite(7,LOW); | |
digitalWrite(ccprom.gnd[0],LOW); | |
digitalWrite(ccprom.gnd[1],LOW); | |
pinMode(13, OUTPUT); | |
digitalWrite(13, LOW); | |
Serial.begin(115200); | |
while (!Serial) { | |
; // wait for serial port to connect. Needed for ATmega32u4-based boards and Arduino 101 | |
} | |
delay(1000); | |
} | |
#include <stdarg.h> | |
void p(char *fmt, ... ){ | |
char buf[128]; // resulting string limited to 128 chars | |
va_list args; | |
va_start (args, fmt ); | |
vsnprintf(buf, 128, fmt, args); | |
va_end (args); | |
Serial.print(buf); | |
} | |
void dumpAddr(addr_t addr) { | |
addr_t a = addr; | |
addr_t r = 0; | |
byte b = 0; | |
unsigned long t = 0; | |
delayMicroseconds(10); | |
Serial.println("dumpAddr"); | |
// 8 bit cpu !! | |
for(int i=0;i<8;i++){ | |
b=digitalRead(ccprom.addr_pin[i]); | |
p("i: %02d pin: %02d n: %d r: %d\r\n",i, ccprom.addr_pin[i], addr&(1<<i)?1:0, b); | |
r|=b<<i; | |
} | |
addr=addr>>8; | |
for(int i=0;i<8;i++){ | |
b=digitalRead(ccprom.addr_pin[i+8]); | |
p("i: %02d pin: %02d n: %d r: %d\r\n",i+8, ccprom.addr_pin[i+8], addr&(1<<i)?1:0, b); | |
r|=b<<(i+8); | |
} | |
addr=addr>>8; | |
for(int i=0;i<4;i++){ | |
b=digitalRead(ccprom.addr_pin[i+16]); | |
p("i: %02d pin: %02d n: %d r: %d\r\n",i+16, ccprom.addr_pin[i+16], addr&(1<<i)?1:0, b); | |
r|=b<<(i+16); | |
} | |
p("%08lx == %08lx\r\n", a, r); | |
} | |
void setAddr(addr_t addr) { | |
addr_t a = addr; | |
// addr = 0; | |
digitalWrite(ccprom.ce_pin,HIGH); | |
digitalWrite(ccprom.oe,HIGH); | |
// 8bit cpu :s | |
for(int i=0;i<8;i++){ | |
digitalWrite(ccprom.addr_pin[i], addr&(1<<i)); | |
} | |
addr=addr>>8; | |
for(int i=0;i<8;i++){ | |
digitalWrite(ccprom.addr_pin[i+8], addr&(1<<i)); | |
} | |
addr=addr>>8; | |
for(int i=0;i<4;i++){ | |
digitalWrite(ccprom.addr_pin[i+16], addr&(1<<i)); | |
} | |
for(int i=0;i<16;i++){ | |
//digitalWrite(ccprom.addr_pin[i], addr&(1<<i)); | |
} | |
//dumpAddr(a); | |
} | |
data_t readWord(addr_t addr) { | |
data_t data = 0; | |
setAddr(addr); | |
delayMicroseconds(100); | |
digitalWrite(ccprom.ce_pin, LOW); | |
digitalWrite(ccprom.oe, LOW); | |
delayMicroseconds(10); | |
for(int i=0;i<8;i++){ | |
data|=digitalRead(ccprom.data_pin[i])<<i; | |
} | |
data = data << 8; | |
for(int i=0;i<8;i++){ | |
data|=digitalRead(ccprom.data_pin[i + 8])<<i; | |
} | |
return data; | |
} | |
#define DUMP_BUF_SIZE 0x20 | |
byte dump_buf[DUMP_BUF_SIZE]; | |
void output_dump(byte len) { | |
Serial.write(dump_buf, len); | |
} | |
void dump(addr_t addr, addr_t addr_end) { | |
byte rpos = 0; | |
digitalWrite(13, HIGH); | |
unsigned short data = 0; | |
for(int i=addr; i< addr_end; i++){ | |
data = readWord(i); | |
dump_buf[rpos++] = (data >> 8) & 0xFF; | |
dump_buf[rpos++] = data & 0xFF; | |
if (rpos >= DUMP_BUF_SIZE) { | |
output_dump(DUMP_BUF_SIZE); | |
rpos = 0; | |
} | |
} | |
if (rpos>0) { | |
output_dump(rpos); | |
} | |
Serial.write(0); | |
Serial.write(0); | |
Serial.write(0); | |
Serial.write(0); | |
digitalWrite(13, LOW); | |
delay(5); | |
} | |
void loop(){ | |
Serial.flush(); | |
if (1 && Serial.available()) { | |
while (Serial.available()) {Serial.read();}; | |
Serial.flush(); | |
//delay(1); | |
dump(0x0, 0x100000); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment