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

Dependencies:   mbed

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

main.cpp

Committer:
oks486
Date:
2016-04-28
Revision:
0:43cce7b453d0
Child:
1:11f73f269fdc

File content as of revision 0:43cce7b453d0:

#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;
        }

    }
}