Add fx-chip-test example
This commit is contained in:
parent
b9f9d6ebba
commit
8703aab7ca
|
@ -0,0 +1,124 @@
|
||||||
|
/* *****************************************************************************
|
||||||
|
* FX chip test example v1.0 by Mr.Blinky Sep 2023 licenced under CC0
|
||||||
|
* *****************************************************************************
|
||||||
|
*
|
||||||
|
* This test program can be used for testing and troubleshooting the external
|
||||||
|
* flash memory (FX) chip.
|
||||||
|
*
|
||||||
|
* It will show which chip select configuration is selected for compiling and
|
||||||
|
* it reads out the FX chips JEDEC ID and status register information. It also
|
||||||
|
* checks if the FX chip is loaded with a flash image file.
|
||||||
|
*
|
||||||
|
* Pressing the A-button will reset the status registers and disable any write
|
||||||
|
* protected areas of the FX chip (unless the status register itself is protected)
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include <Arduboy2.h> // required to build for Arduboy
|
||||||
|
#include <ArduboyFX.h> // required to access the FX external flash
|
||||||
|
|
||||||
|
Arduboy2 arduboy;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
arduboy.begin(); // normal initialisation with Arduboy startup logo
|
||||||
|
FX::begin(0); // initialise FX chip
|
||||||
|
}
|
||||||
|
|
||||||
|
JedecID jedecID;
|
||||||
|
|
||||||
|
void printHexByte(uint8_t b)
|
||||||
|
{
|
||||||
|
if (b <16) arduboy.print(0);
|
||||||
|
arduboy.print(b,HEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
void printStatusReg(uint8_t cmd)
|
||||||
|
|
||||||
|
{
|
||||||
|
FX::enable();
|
||||||
|
FX::writeByte(cmd);
|
||||||
|
printHexByte(FX::readByte());
|
||||||
|
FX::disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (!arduboy.nextFrame()) return; // Do nothing until it's time for the next frame
|
||||||
|
arduboy.pollButtons(); // required for arduboy.justPressed
|
||||||
|
|
||||||
|
// Show which chip select this sketch is compiled for.
|
||||||
|
#if defined(CART_CS_RX)
|
||||||
|
arduboy.setCursor(7,0);
|
||||||
|
arduboy.print(F("Chip select: PD2/RX"));
|
||||||
|
#elif defined(CART_CS_HWB)
|
||||||
|
arduboy.setCursor(4,0);
|
||||||
|
arduboy.print(F("Chip select: PE2/HWB"));
|
||||||
|
#else
|
||||||
|
arduboy.setCursor(4,0);
|
||||||
|
arduboy.print(F("Chip select: PD1/SDA"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Show JEDEC ID
|
||||||
|
FX::enable();
|
||||||
|
FX::writeByte(SFC_JEDEC_ID);
|
||||||
|
jedecID.manufacturer = FX::readByte();
|
||||||
|
jedecID.device = FX::readByte();
|
||||||
|
jedecID.size = FX::readByte();
|
||||||
|
FX::disable();
|
||||||
|
arduboy.setCursor(16,12);
|
||||||
|
arduboy.print(F("JEDEC ID: "));
|
||||||
|
printHexByte(jedecID.manufacturer);
|
||||||
|
printHexByte(jedecID.device );
|
||||||
|
printHexByte(jedecID.size);
|
||||||
|
|
||||||
|
// Show flash status register
|
||||||
|
arduboy.setCursor(22,24);
|
||||||
|
arduboy.print(F("Status: "));
|
||||||
|
if (jedecID.size == 0x18) printStatusReg(SFC_READSTATUS3);
|
||||||
|
printStatusReg(SFC_READSTATUS2);
|
||||||
|
printStatusReg(SFC_READSTATUS1);
|
||||||
|
|
||||||
|
// Show state of the the flash chips image
|
||||||
|
uint8_t cartSignature[7];
|
||||||
|
arduboy.setCursor(0,36);
|
||||||
|
arduboy.print(F("State: "));
|
||||||
|
FX::readDataBytes(0, cartSignature,sizeof(cartSignature));
|
||||||
|
if (strncmp(cartSignature,"ARDUBOY",sizeof(cartSignature)))
|
||||||
|
{
|
||||||
|
arduboy.print(F("No image loaded"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arduboy.print(F("Image loaded"));
|
||||||
|
}
|
||||||
|
|
||||||
|
arduboy.setCursor(13,48);
|
||||||
|
arduboy.print(F("Press A-button to"));
|
||||||
|
arduboy.setCursor(1,56);
|
||||||
|
arduboy.print(F("reset Status register"));
|
||||||
|
if (arduboy.justPressed(A_BUTTON))
|
||||||
|
{
|
||||||
|
FX::writeEnable();
|
||||||
|
FX::enable();
|
||||||
|
FX::writeByte(0x01);
|
||||||
|
FX::writeByte(0);
|
||||||
|
if (jedecID.size != 0x18) FX::writeByte(0);
|
||||||
|
FX::disable();
|
||||||
|
|
||||||
|
if (jedecID.size == 0x18)
|
||||||
|
{
|
||||||
|
FX::writeEnable();
|
||||||
|
FX::enable();
|
||||||
|
FX::writeByte(0x31);
|
||||||
|
FX::writeByte(0);
|
||||||
|
FX::disable();
|
||||||
|
|
||||||
|
FX::writeEnable();
|
||||||
|
FX::enable();
|
||||||
|
FX::writeByte(0x11);
|
||||||
|
FX::writeByte(0);
|
||||||
|
FX::disable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FX::display(CLEAR_BUFFER); // Using CLEAR_BUFFER will clear the display buffer after it is displayed
|
||||||
|
}
|
|
@ -991,9 +991,10 @@ void FX::drawBitmap(int16_t x, int16_t y, uint24_t address, uint8_t frame, uint8
|
||||||
pixels ^= display;
|
pixels ^= display;
|
||||||
Arduboy2Base::sBuffer[displayoffset + WIDTH] = pixels;
|
Arduboy2Base::sBuffer[displayoffset + WIDTH] = pixels;
|
||||||
}
|
}
|
||||||
displayoffset++;
|
(mode & (1 << dbfFlip)) ? displayoffset-- : displayoffset++;
|
||||||
}
|
}
|
||||||
displayoffset += WIDTH - renderwidth;
|
displayoffset += WIDTH;
|
||||||
|
(mode & (1 << dbfFlip)) ? displayoffset += renderwidth : displayoffset -= renderwidth;
|
||||||
displayrow ++;
|
displayrow ++;
|
||||||
renderheight -= 8;
|
renderheight -= 8;
|
||||||
readEnd();
|
readEnd();
|
||||||
|
|
Loading…
Reference in New Issue