# Pastebin ZYzyEDqe #include #include #include #define ROKU_RESET_PIN 113 #define RYBY_PIN 114 #define RE_PIN 109 #define CE_PIN 110 #define CLE_PIN 112 #define ALE_PIN 108 #define WE_PIN 111 #define WP_PIN 115 #define D0_PIN 100 #define D1_PIN 101 #define D2_PIN 102 #define D3_PIN 103 #define D4_PIN 104 #define D5_PIN 105 #define D6_PIN 106 #define D7_PIN 107 unsigned char buff[2112]; void setDataDir(int dir) { pinMode(D0_PIN, dir); pinMode(D1_PIN, dir); pinMode(D2_PIN, dir); pinMode(D3_PIN, dir); pinMode(D4_PIN, dir); pinMode(D5_PIN, dir); pinMode(D6_PIN, dir); pinMode(D7_PIN, dir); } void setDataVal(unsigned char val) { digitalWrite(D0_PIN, val & 0x01); digitalWrite(D1_PIN, (val >> 1) & 0x01); digitalWrite(D2_PIN, (val >> 2) & 0x01); digitalWrite(D3_PIN, (val >> 3) & 0x01); digitalWrite(D4_PIN, (val >> 4) & 0x01); digitalWrite(D5_PIN, (val >> 5) & 0x01); digitalWrite(D6_PIN, (val >> 6) & 0x01); digitalWrite(D7_PIN, (val >> 7) & 0x01); } unsigned char getDATAval() { unsigned char val = 0; val |= digitalRead(D0_PIN); val |= digitalRead(D1_PIN) << 1; val |= digitalRead(D2_PIN) << 2; val |= digitalRead(D3_PIN) << 3; val |= digitalRead(D4_PIN) << 4; val |= digitalRead(D5_PIN) << 5; val |= digitalRead(D6_PIN) << 6; val |= digitalRead(D7_PIN) << 7; return val; } void writeCOM(unsigned char val) { digitalWrite(ALE_PIN, LOW); //Disable Address Latch digitalWrite(CLE_PIN, HIGH); //Enable Command Latch //Set Command setDataDir(OUTPUT); setDataVal(val); //Toggle WE aka latch digitalWrite(WE_PIN, LOW); digitalWrite(WE_PIN, HIGH); setDataDir(INPUT); digitalWrite(CLE_PIN, LOW); //Disable Command Latch } void writeAddr(unsigned char val) { digitalWrite(CLE_PIN, LOW); //Disable Command Latch digitalWrite(ALE_PIN, HIGH); //ENABLE Address Latch //Set Command setDataDir(OUTPUT); setDataVal(val); //Toggle WE aka latch digitalWrite(WE_PIN, LOW); digitalWrite(WE_PIN, HIGH); setDataDir(INPUT); digitalWrite(ALE_PIN, LOW); //Disable Address Latch } void writeData(unsigned char val) { //Set Command setDataDir(OUTPUT); setDataVal(val); //Toggle WE aka latch digitalWrite(WE_PIN, LOW); digitalWrite(WE_PIN, HIGH); setDataDir(INPUT); } unsigned char readData() { unsigned char val; setDataDir(INPUT); //Toggle RE digitalWrite(RE_PIN, LOW); val = getDATAval(); digitalWrite(RE_PIN, HIGH); return val; } void waitRYBY() { while(digitalRead(RYBY_PIN) == LOW) continue; } unsigned char readStaus() { writeCOM(0x70); return readData(); } unsigned char eraseBlock(unsigned int block) { writeCOM(0x60); writeAddr(block & 0xff); writeAddr((block >> 8) & 0xff); writeAddr((block >> 16) & 0x01); writeCOM(0xD0); waitRYBY(); //Bit 0: 0 = successful erase // 1 = error in erase return readStaus(); } unsigned char programPage(unsigned int page) { writeCOM(0x80); writeAddr(0x00); writeAddr(0x00); writeAddr(page & 0xff); writeAddr((page >> 8) & 0xff); writeAddr((page >> 16) & 0x01); for(unsigned int i = 0; i < 2112; i++) { writeData(buff[i]); } writeCOM(0x10); waitRYBY(); //Bit 0: 0 = successful // 1 = error return readStaus(); } void readPage(unsigned int page) { writeCOM(0x00); writeAddr(0x00); writeAddr(0x00); writeAddr(page & 0xff); writeAddr((page >> 8) & 0xff); writeAddr((page >> 16) & 0x01); writeCOM(0x30); waitRYBY(); for(unsigned int i = 0; i < 2112; i++) { buff[i] = readData(); } //Serial.write(buff, 2112); } void readID() { writeCOM(0x90); writeAddr(0x00); printf("data %08x \n", readData()); printf("data %08x \n", readData()); printf("data %08x \n", readData()); printf("data %08x \n", readData()); printf("data %08x \n", readData()); // Serial.write(readData()); // Serial.write(readData()); // Serial.write(readData()); // Serial.write(readData()); // Serial.write(readData()); } void reset() { writeCOM(0xFF); waitRYBY(); } void releaseIO() { pinMode(RYBY_PIN,INPUT); pinMode(WP_PIN,INPUT); pinMode(CE_PIN,INPUT); pinMode(RE_PIN,INPUT); pinMode(CLE_PIN,INPUT); pinMode(ALE_PIN,INPUT); pinMode(WE_PIN,INPUT); setDataDir(INPUT); } void initIO() { //rpi fix // pinMode(RYBY_PIN,INPUT_PULLUP); pinMode(RYBY_PIN,PUD_UP); pinMode(WP_PIN,OUTPUT); pinMode(CE_PIN,OUTPUT); pinMode(RE_PIN,OUTPUT); pinMode(CLE_PIN,OUTPUT); pinMode(ALE_PIN,OUTPUT); pinMode(WE_PIN,OUTPUT); digitalWrite(WP_PIN, HIGH); //Write protect LOW = Enable digitalWrite(CE_PIN, LOW); //Chip Enable LOW = EN digitalWrite(RE_PIN, HIGH); digitalWrite(CLE_PIN, LOW); digitalWrite(ALE_PIN, LOW); digitalWrite(WE_PIN, HIGH); setDataDir(INPUT); } int main() { mcp23017Setup(100, 0x20); releaseIO(); delay(1000); readID(); } #define CMD_PING1 'a' #define CMD_PING2 'b' #define CMD_NAND_ID 'c' #define CMD_NAND_READPAGE 'd' #define CMD_NAND_WRITEPAGE 'e' #define CMD_NAND_ERASEBLOCK 'f' #define CMD_INITIO 'g' #define CMD_RELEASEIO 'h' #define CMD_ROKU_RESET 'i' char command = -1; unsigned int tempVal = 0; /* unsigned int getValSerial() { char bufferbytes[4]; Serial.readBytes(bufferbytes, 4); return bufferbytes[0] | (bufferbytes[1] << 8) | (bufferbytes[2] << 16)| (bufferbytes[3] << 24); } void loop() { char b; while(true) { command = Serial.read(); if (command == -1) continue; switch (command) { case CMD_PING1: Serial.write(69); break; case CMD_PING2: Serial.write(96); break; case CMD_NAND_ID: readID(); break; case CMD_INITIO: initIO(); break; case CMD_RELEASEIO: releaseIO(); break; case CMD_ROKU_RESET: pinMode(ROKU_RESET_PIN, OUTPUT); digitalWrite(ROKU_RESET_PIN, LOW); delay(10); digitalWrite(ROKU_RESET_PIN, HIGH); pinMode(ROKU_RESET_PIN, INPUT); break; case CMD_NAND_READPAGE: tempVal = getValSerial(); readPage(tempVal); break; case CMD_NAND_WRITEPAGE: tempVal = getValSerial(); Serial.readBytes((char *)buff, 2112); b = programPage(tempVal); Serial.write(b); break; case CMD_NAND_ERASEBLOCK: tempVal = getValSerial(); b = eraseBlock(tempVal); Serial.write(b); break; default: break; } } }*/