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

Dependencies:   mbed

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

Committer:
oks486
Date:
Thu Apr 28 11:23:24 2016 +0000
Revision:
0:43cce7b453d0
Child:
1:11f73f269fdc
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oks486 0:43cce7b453d0 1 #include "mbed.h"
oks486 0:43cce7b453d0 2 #include "FatfsIJFW.h"
oks486 0:43cce7b453d0 3 #include "UartIsp.h"
oks486 0:43cce7b453d0 4 #include "I2CSlave2.h"
oks486 0:43cce7b453d0 5 #include "I2c2mem.h"
oks486 0:43cce7b453d0 6
oks486 0:43cce7b453d0 7 // Pin definitions
oks486 0:43cce7b453d0 8 DigitalOut ledPow(dp13); // Power indicator
oks486 0:43cce7b453d0 9 DigitalOut ledCard(dp14); // Memory card access indicator
oks486 0:43cce7b453d0 10
oks486 0:43cce7b453d0 11 DigitalOut resetIJ(dp25); // IchigoJam Reset Pin
oks486 0:43cce7b453d0 12 DigitalOut ispIJ(dp26); // IchigoJam ISP Pin
oks486 0:43cce7b453d0 13 RawSerial serial(dp16, dp15); // tx, rx
oks486 0:43cce7b453d0 14 I2CSlave2 i2cs(dp5, dp27); // sda, scl
oks486 0:43cce7b453d0 15
oks486 0:43cce7b453d0 16 SPI spi(dp2, dp1, dp6); // SPI for memory card access (mosi, miso, sck)
oks486 0:43cce7b453d0 17 DigitalOut cs(dp4); // Memory card cs pin
oks486 0:43cce7b453d0 18 FatfsIJFW fsij(&spi, &cs); // Fatfs for Memory card
oks486 0:43cce7b453d0 19
oks486 0:43cce7b453d0 20
oks486 0:43cce7b453d0 21 // Firmware file name
oks486 0:43cce7b453d0 22 const char* BINFILE = "jam.bin";
oks486 0:43cce7b453d0 23
oks486 0:43cce7b453d0 24
oks486 0:43cce7b453d0 25 void error() {
oks486 0:43cce7b453d0 26 while(1) {
oks486 0:43cce7b453d0 27 ledCard = 1; ledPow = 1;
oks486 0:43cce7b453d0 28 wait(0.25);
oks486 0:43cce7b453d0 29 ledCard = 0; ledPow = 0;
oks486 0:43cce7b453d0 30 wait(0.25);
oks486 0:43cce7b453d0 31 }
oks486 0:43cce7b453d0 32 }
oks486 0:43cce7b453d0 33
oks486 0:43cce7b453d0 34
oks486 0:43cce7b453d0 35 int main() {
oks486 0:43cce7b453d0 36 // LED
oks486 0:43cce7b453d0 37 ledPow = 1; ledCard = 0;
oks486 0:43cce7b453d0 38
oks486 0:43cce7b453d0 39 // Serial
oks486 0:43cce7b453d0 40 serial.baud(115200);
oks486 0:43cce7b453d0 41
oks486 0:43cce7b453d0 42 // Firmware update if bin file is found
oks486 0:43cce7b453d0 43 fsij.mount();
oks486 0:43cce7b453d0 44 if (fsij.open(BINFILE, MODE_RO) == FR_OK) {
oks486 0:43cce7b453d0 45 fsij.close();
oks486 0:43cce7b453d0 46 ledCard = 1;
oks486 0:43cce7b453d0 47
oks486 0:43cce7b453d0 48 // Sequence of Entering UartISP mode
oks486 0:43cce7b453d0 49 ispIJ = 0; resetIJ = 0; // ISP=L, Reset=L
oks486 0:43cce7b453d0 50 wait_ms(100);
oks486 0:43cce7b453d0 51 ispIJ = 0; resetIJ = 1; // ISP=L, Reset=H
oks486 0:43cce7b453d0 52 wait_ms(100);
oks486 0:43cce7b453d0 53 ispIJ = 1; resetIJ = 1; // ISP=H, Reset=H
oks486 0:43cce7b453d0 54 wait_ms(100);
oks486 0:43cce7b453d0 55
oks486 0:43cce7b453d0 56 UartIsp uartisp(&serial, &fsij); // UartISP
oks486 0:43cce7b453d0 57 UartIsp::ISP_RESULT ret = uartisp.runUartIsp(BINFILE); // Run UartISP process
oks486 0:43cce7b453d0 58 if (ret != UartIsp::NOERROR) {
oks486 0:43cce7b453d0 59 error();
oks486 0:43cce7b453d0 60 }
oks486 0:43cce7b453d0 61 ledCard = 0;
oks486 0:43cce7b453d0 62
oks486 0:43cce7b453d0 63 // reset MCU
oks486 0:43cce7b453d0 64 ispIJ = 1; resetIJ = 0; // ISP=H, Reset=L
oks486 0:43cce7b453d0 65 wait_ms(100);
oks486 0:43cce7b453d0 66 ispIJ = 1; resetIJ = 1; // ISP=H, Reset=H
oks486 0:43cce7b453d0 67 wait_ms(100);
oks486 0:43cce7b453d0 68
oks486 0:43cce7b453d0 69 // reset IJFW
oks486 0:43cce7b453d0 70 //NVIC_SystemReset();
oks486 0:43cce7b453d0 71 }
oks486 0:43cce7b453d0 72
oks486 0:43cce7b453d0 73 // Data conversion I2C to/from memory card
oks486 0:43cce7b453d0 74 // address 0xA? -> EEPROM Emulation
oks486 0:43cce7b453d0 75 // 0x22 -> Writing/Reading data of the specific file
oks486 0:43cce7b453d0 76 // 0x24 -> Continuous writing mode
oks486 0:43cce7b453d0 77 I2c2mem i2c2m(&i2cs, &fsij, &ledCard);
oks486 0:43cce7b453d0 78 i2cs.address(0xA0, 0x8E); // Slave address, mask
oks486 0:43cce7b453d0 79
oks486 0:43cce7b453d0 80 while(1) {
oks486 0:43cce7b453d0 81 int rcv = i2cs.receive();
oks486 0:43cce7b453d0 82 int addr = i2cs.addressFromMaster();
oks486 0:43cce7b453d0 83
oks486 0:43cce7b453d0 84 switch (rcv) {
oks486 0:43cce7b453d0 85 case I2CSlave2::WriteAddressed:
oks486 0:43cce7b453d0 86 if (addr == 0xA0) {
oks486 0:43cce7b453d0 87 i2c2m.writeProgram(0);
oks486 0:43cce7b453d0 88 } else if (addr == 0xA8) {
oks486 0:43cce7b453d0 89 i2c2m.writeProgram(1);
oks486 0:43cce7b453d0 90 } else if (addr == 0x22) { // I2C address #11 in IchigoJam
oks486 0:43cce7b453d0 91 i2c2m.writeData();
oks486 0:43cce7b453d0 92 } else if (addr == 0x24) { // I2C address #12 in IchigoJam
oks486 0:43cce7b453d0 93 i2c2m.writeDataContinuous();
oks486 0:43cce7b453d0 94 } else {
oks486 0:43cce7b453d0 95 i2cs.stop();
oks486 0:43cce7b453d0 96 }
oks486 0:43cce7b453d0 97 break;
oks486 0:43cce7b453d0 98 case I2CSlave2::ReadAddressed:
oks486 0:43cce7b453d0 99 if (addr == 0xA1) {
oks486 0:43cce7b453d0 100 i2c2m.readProgram();
oks486 0:43cce7b453d0 101 } else if (addr == 0xA9) {
oks486 0:43cce7b453d0 102 i2c2m.readProgram();
oks486 0:43cce7b453d0 103 } else if (addr == 0x23) { // I2C address #11 in IchigoJam
oks486 0:43cce7b453d0 104 i2c2m.readData();
oks486 0:43cce7b453d0 105 } else if (addr == 0x25) { // I2C address #12 in IchigoJam
oks486 0:43cce7b453d0 106 i2c2m.reset();
oks486 0:43cce7b453d0 107 } else {
oks486 0:43cce7b453d0 108 i2cs.stop();
oks486 0:43cce7b453d0 109 }
oks486 0:43cce7b453d0 110 break;
oks486 0:43cce7b453d0 111 case I2CSlave2::WriteGeneral:
oks486 0:43cce7b453d0 112 i2cs.stop();
oks486 0:43cce7b453d0 113 break;
oks486 0:43cce7b453d0 114 default:
oks486 0:43cce7b453d0 115 break;
oks486 0:43cce7b453d0 116 }
oks486 0:43cce7b453d0 117
oks486 0:43cce7b453d0 118 }
oks486 0:43cce7b453d0 119 }