IJFW - IchigoJamのBASICプログラムをメモリカード(MMCまたは互換カード)に保存したり読み出したりできるプログラム。メモリカードにファームウェアのファイルを置くだけで、電源ON時に自動的に書き換える機能も搭載(一応こちらがメイン)。LPC1114FN28専用。
参考URL http://www.cyberchabudai.org/index.php/entry?tag=IJFW
Diff: main.cpp
- 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; + } + + } +}