IJFW - IchigoJamのBASICプログラムをメモリカード(MMCまたは互換カード)に保存したり読み出したりできるプログラム。メモリカードにファームウェアのファイルを置くだけで、電源ON時に自動的に書き換える機能も搭載(一応こちらがメイン)。LPC1114FN28専用。

Dependencies:   mbed

参考URL http://www.cyberchabudai.org/index.php/entry?tag=IJFW

Revision:
0:43cce7b453d0
Child:
1:11f73f269fdc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Apr 28 11:23:24 2016 +0000
@@ -0,0 +1,119 @@
+#include "mbed.h"
+#include "FatfsIJFW.h"
+#include "UartIsp.h"
+#include "I2CSlave2.h"
+#include "I2c2mem.h"
+
+// Pin definitions
+DigitalOut ledPow(dp13);                // Power indicator
+DigitalOut ledCard(dp14);               // Memory card access indicator
+
+DigitalOut resetIJ(dp25);               // IchigoJam Reset Pin
+DigitalOut ispIJ(dp26);                 // IchigoJam ISP Pin
+RawSerial serial(dp16, dp15);           // tx, rx
+I2CSlave2 i2cs(dp5, dp27);              // sda, scl
+
+SPI spi(dp2, dp1, dp6);                 // SPI for memory card access (mosi, miso, sck)
+DigitalOut cs(dp4);                     // Memory card cs pin
+FatfsIJFW fsij(&spi, &cs);              // Fatfs for Memory card
+
+
+// Firmware file name
+const char* BINFILE = "jam.bin";
+
+
+void error() {
+    while(1) {
+        ledCard = 1; ledPow = 1;
+        wait(0.25);
+        ledCard = 0; ledPow = 0;
+        wait(0.25);
+    }
+}
+
+
+int main() {
+    // LED
+    ledPow = 1; ledCard = 0;
+    
+    // Serial
+    serial.baud(115200);
+
+    // Firmware update if bin file is found
+    fsij.mount();
+    if (fsij.open(BINFILE, MODE_RO) == FR_OK) {
+        fsij.close();
+        ledCard = 1;
+
+        // Sequence of Entering UartISP mode
+        ispIJ = 0; resetIJ = 0;     // ISP=L, Reset=L
+        wait_ms(100);
+        ispIJ = 0; resetIJ = 1;     // ISP=L, Reset=H
+        wait_ms(100);
+        ispIJ = 1; resetIJ = 1;     // ISP=H, Reset=H
+        wait_ms(100);
+
+        UartIsp uartisp(&serial, &fsij);                            // UartISP
+        UartIsp::ISP_RESULT ret = uartisp.runUartIsp(BINFILE);      // Run UartISP process
+        if (ret != UartIsp::NOERROR) {
+            error();
+        }
+        ledCard = 0;
+    
+        // reset MCU
+        ispIJ = 1; resetIJ = 0;     // ISP=H, Reset=L
+        wait_ms(100);
+        ispIJ = 1; resetIJ = 1;     // ISP=H, Reset=H
+        wait_ms(100);
+
+        // reset IJFW
+        //NVIC_SystemReset();
+    }
+
+    // Data conversion I2C to/from memory card
+    //   address 0xA? -> EEPROM Emulation
+    //           0x22 -> Writing/Reading data of the specific file
+    //           0x24 -> Continuous writing mode 
+    I2c2mem i2c2m(&i2cs, &fsij, &ledCard);
+    i2cs.address(0xA0, 0x8E);       // Slave address, mask
+
+    while(1) {
+        int rcv = i2cs.receive();
+        int addr = i2cs.addressFromMaster();
+
+        switch (rcv) {
+            case I2CSlave2::WriteAddressed:
+                if (addr == 0xA0) {
+                    i2c2m.writeProgram(0);
+                } else if (addr == 0xA8) {
+                    i2c2m.writeProgram(1);
+                } else if (addr == 0x22) {  // I2C address #11 in IchigoJam
+                    i2c2m.writeData();
+                } else if (addr == 0x24) {  // I2C address #12 in IchigoJam
+                    i2c2m.writeDataContinuous();
+                } else {
+                    i2cs.stop();
+                }
+                break;
+            case I2CSlave2::ReadAddressed:
+                if (addr == 0xA1) {
+                    i2c2m.readProgram();
+                } else if (addr == 0xA9) {
+                    i2c2m.readProgram();
+                } else if (addr == 0x23) {  // I2C address #11 in IchigoJam
+                    i2c2m.readData();
+                } else if (addr == 0x25) {  // I2C address #12 in IchigoJam
+                    i2c2m.reset();
+                } else {
+                    i2cs.stop();
+                }
+                break;
+            case I2CSlave2::WriteGeneral:
+                i2cs.stop();
+                break;
+            default:
+                break;
+        }
+
+    }
+}