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

Dependencies:   mbed

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

Committer:
oks486
Date:
Wed Aug 17 07:19:20 2016 +0000
Revision:
1:11f73f269fdc
Parent:
0:43cce7b453d0
Implementation of some configurable settings

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oks486 0:43cce7b453d0 1 #include "mbed.h"
oks486 1:11f73f269fdc 2 #include "FatfsIjfwConfigurable.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 1:11f73f269fdc 18 FatfsIjfwConfigurable fsij(&spi, &cs); // Fatfs for Memory card
oks486 0:43cce7b453d0 19
oks486 0:43cce7b453d0 20
oks486 1:11f73f269fdc 21 // file name
oks486 1:11f73f269fdc 22 const char* CONFIG_FILE = "_config.txt";
oks486 0:43cce7b453d0 23 const char* BINFILE = "jam.bin";
oks486 0:43cce7b453d0 24
oks486 0:43cce7b453d0 25
oks486 0:43cce7b453d0 26 void error() {
oks486 0:43cce7b453d0 27 while(1) {
oks486 0:43cce7b453d0 28 ledCard = 1; ledPow = 1;
oks486 0:43cce7b453d0 29 wait(0.25);
oks486 0:43cce7b453d0 30 ledCard = 0; ledPow = 0;
oks486 0:43cce7b453d0 31 wait(0.25);
oks486 0:43cce7b453d0 32 }
oks486 0:43cce7b453d0 33 }
oks486 0:43cce7b453d0 34
oks486 0:43cce7b453d0 35
oks486 0:43cce7b453d0 36 int main() {
oks486 0:43cce7b453d0 37 // LED
oks486 0:43cce7b453d0 38 ledPow = 1; ledCard = 0;
oks486 0:43cce7b453d0 39
oks486 0:43cce7b453d0 40 // Serial
oks486 0:43cce7b453d0 41 serial.baud(115200);
oks486 0:43cce7b453d0 42
oks486 1:11f73f269fdc 43 // Read Config File
oks486 1:11f73f269fdc 44 ledCard = 1;
oks486 1:11f73f269fdc 45 fsij.readConfigFile(CONFIG_FILE);
oks486 1:11f73f269fdc 46 ledCard = 0;
oks486 1:11f73f269fdc 47
oks486 0:43cce7b453d0 48 // Firmware update if bin file is found
oks486 1:11f73f269fdc 49 ledCard = 1;
oks486 1:11f73f269fdc 50 if (fsij.checkFirmFile(BINFILE)) {
oks486 0:43cce7b453d0 51 // Sequence of Entering UartISP mode
oks486 0:43cce7b453d0 52 ispIJ = 0; resetIJ = 0; // ISP=L, Reset=L
oks486 0:43cce7b453d0 53 wait_ms(100);
oks486 0:43cce7b453d0 54 ispIJ = 0; resetIJ = 1; // ISP=L, Reset=H
oks486 0:43cce7b453d0 55 wait_ms(100);
oks486 0:43cce7b453d0 56 ispIJ = 1; resetIJ = 1; // ISP=H, Reset=H
oks486 0:43cce7b453d0 57 wait_ms(100);
oks486 0:43cce7b453d0 58
oks486 0:43cce7b453d0 59 UartIsp uartisp(&serial, &fsij); // UartISP
oks486 0:43cce7b453d0 60 UartIsp::ISP_RESULT ret = uartisp.runUartIsp(BINFILE); // Run UartISP process
oks486 0:43cce7b453d0 61 if (ret != UartIsp::NOERROR) {
oks486 0:43cce7b453d0 62 error();
oks486 0:43cce7b453d0 63 }
oks486 0:43cce7b453d0 64
oks486 0:43cce7b453d0 65 // reset MCU
oks486 0:43cce7b453d0 66 ispIJ = 1; resetIJ = 0; // ISP=H, Reset=L
oks486 0:43cce7b453d0 67 wait_ms(100);
oks486 0:43cce7b453d0 68 ispIJ = 1; resetIJ = 1; // ISP=H, Reset=H
oks486 0:43cce7b453d0 69 wait_ms(100);
oks486 0:43cce7b453d0 70
oks486 0:43cce7b453d0 71 // reset IJFW
oks486 0:43cce7b453d0 72 //NVIC_SystemReset();
oks486 0:43cce7b453d0 73 }
oks486 1:11f73f269fdc 74 ledCard = 0;
oks486 0:43cce7b453d0 75
oks486 0:43cce7b453d0 76 // Data conversion I2C to/from memory card
oks486 0:43cce7b453d0 77 // address 0xA? -> EEPROM Emulation
oks486 0:43cce7b453d0 78 // 0x22 -> Writing/Reading data of the specific file
oks486 0:43cce7b453d0 79 // 0x24 -> Continuous writing mode
oks486 0:43cce7b453d0 80 I2c2mem i2c2m(&i2cs, &fsij, &ledCard);
oks486 0:43cce7b453d0 81 i2cs.address(0xA0, 0x8E); // Slave address, mask
oks486 0:43cce7b453d0 82
oks486 0:43cce7b453d0 83 while(1) {
oks486 0:43cce7b453d0 84 int rcv = i2cs.receive();
oks486 0:43cce7b453d0 85 int addr = i2cs.addressFromMaster();
oks486 0:43cce7b453d0 86
oks486 0:43cce7b453d0 87 switch (rcv) {
oks486 0:43cce7b453d0 88 case I2CSlave2::WriteAddressed:
oks486 0:43cce7b453d0 89 if (addr == 0xA0) {
oks486 0:43cce7b453d0 90 i2c2m.writeProgram(0);
oks486 0:43cce7b453d0 91 } else if (addr == 0xA8) {
oks486 0:43cce7b453d0 92 i2c2m.writeProgram(1);
oks486 0:43cce7b453d0 93 } else if (addr == 0x22) { // I2C address #11 in IchigoJam
oks486 0:43cce7b453d0 94 i2c2m.writeData();
oks486 0:43cce7b453d0 95 } else if (addr == 0x24) { // I2C address #12 in IchigoJam
oks486 0:43cce7b453d0 96 i2c2m.writeDataContinuous();
oks486 0:43cce7b453d0 97 } else {
oks486 0:43cce7b453d0 98 i2cs.stop();
oks486 0:43cce7b453d0 99 }
oks486 0:43cce7b453d0 100 break;
oks486 0:43cce7b453d0 101 case I2CSlave2::ReadAddressed:
oks486 0:43cce7b453d0 102 if (addr == 0xA1) {
oks486 0:43cce7b453d0 103 i2c2m.readProgram();
oks486 0:43cce7b453d0 104 } else if (addr == 0xA9) {
oks486 0:43cce7b453d0 105 i2c2m.readProgram();
oks486 0:43cce7b453d0 106 } else if (addr == 0x23) { // I2C address #11 in IchigoJam
oks486 0:43cce7b453d0 107 i2c2m.readData();
oks486 0:43cce7b453d0 108 } else if (addr == 0x25) { // I2C address #12 in IchigoJam
oks486 0:43cce7b453d0 109 i2c2m.reset();
oks486 0:43cce7b453d0 110 } else {
oks486 0:43cce7b453d0 111 i2cs.stop();
oks486 0:43cce7b453d0 112 }
oks486 0:43cce7b453d0 113 break;
oks486 0:43cce7b453d0 114 case I2CSlave2::WriteGeneral:
oks486 0:43cce7b453d0 115 i2cs.stop();
oks486 0:43cce7b453d0 116 break;
oks486 0:43cce7b453d0 117 default:
oks486 0:43cce7b453d0 118 break;
oks486 0:43cce7b453d0 119 }
oks486 0:43cce7b453d0 120
oks486 0:43cce7b453d0 121 }
oks486 0:43cce7b453d0 122 }