mirror of
https://github.com/Architeuthis-Flux/Jumperless.git
synced 2025-02-21 04:47:29 +01:00
259 lines
4.8 KiB
C++
259 lines
4.8 KiB
C++
|
|
#include "CH446Q.h"
|
|
#include "MatrixStateRP2040.h"
|
|
#include "NetsToChipConnections.h"
|
|
#include "LEDs.h"
|
|
#include "Peripherals.h"
|
|
#include "JumperlessDefinesRP2040.h"
|
|
|
|
#include "hardware/pio.h"
|
|
|
|
#include "spi.pio.h"
|
|
#include "pio_spi.h"
|
|
|
|
#define MYNAMEISERIC 0 //on the board I sent to eric, the data and clock lines are bodged to GPIO 18 and 19. To allow for using hardware SPI
|
|
|
|
|
|
|
|
int chipToPinArray[12] = {CS_A, CS_B, CS_C, CS_D, CS_E, CS_F, CS_G, CS_H, CS_I, CS_J, CS_K, CS_L};
|
|
PIO pio = pio0;
|
|
|
|
uint sm = pio_claim_unused_sm(pio, true);
|
|
|
|
volatile int chipSelect = 0;
|
|
volatile uint32_t irq_flags = 0;
|
|
|
|
void isrFromPio(void)
|
|
{
|
|
switch (chipSelect)
|
|
{
|
|
case CHIP_A:
|
|
{
|
|
digitalWriteFast(CS_A, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_B:
|
|
{
|
|
digitalWriteFast(CS_B, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_C:
|
|
{
|
|
digitalWriteFast(CS_C, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_D:
|
|
{
|
|
digitalWriteFast(CS_D, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_E:
|
|
{
|
|
digitalWriteFast(CS_E, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_F:
|
|
{
|
|
digitalWriteFast(CS_F, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_G:
|
|
{
|
|
digitalWriteFast(CS_G, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_H:
|
|
{
|
|
digitalWriteFast(CS_H, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_I:
|
|
{
|
|
digitalWriteFast(CS_I, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_J:
|
|
{
|
|
digitalWriteFast(CS_J, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_K:
|
|
{
|
|
digitalWriteFast(CS_K, HIGH);
|
|
break;
|
|
}
|
|
case CHIP_L:
|
|
{
|
|
digitalWriteFast(CS_L, HIGH);
|
|
break;
|
|
}
|
|
}
|
|
|
|
delayMicroseconds(2);
|
|
digitalWriteFast(CS_A, LOW);
|
|
digitalWriteFast(CS_B, LOW);
|
|
digitalWriteFast(CS_C, LOW);
|
|
digitalWriteFast(CS_D, LOW);
|
|
digitalWriteFast(CS_E, LOW);
|
|
digitalWriteFast(CS_F, LOW);
|
|
digitalWriteFast(CS_G, LOW);
|
|
|
|
digitalWriteFast(CS_H, LOW);
|
|
digitalWriteFast(CS_I, LOW);
|
|
digitalWriteFast(CS_J, LOW);
|
|
digitalWriteFast(CS_K, LOW);
|
|
digitalWriteFast(CS_L, LOW);
|
|
delayMicroseconds(2);
|
|
irq_flags = pio0_hw->irq;
|
|
pio_interrupt_clear(pio, PIO0_IRQ_0);
|
|
hw_clear_bits(&pio0_hw->irq, irq_flags);
|
|
|
|
}
|
|
|
|
void initCH446Q(void)
|
|
{
|
|
|
|
uint dat = 14;
|
|
uint clk = 15;
|
|
|
|
|
|
if (MYNAMEISERIC)
|
|
{
|
|
dat = 18;
|
|
clk = 19;
|
|
|
|
|
|
}
|
|
|
|
uint cs = 7;
|
|
|
|
irq_add_shared_handler(PIO0_IRQ_0, isrFromPio, PICO_SHARED_IRQ_HANDLER_DEFAULT_ORDER_PRIORITY);
|
|
irq_set_enabled(PIO0_IRQ_0, true);
|
|
|
|
uint offset = pio_add_program(pio, &spi_ch446_multi_cs_program);
|
|
// uint offsetCS = pio_add_program(pio, &spi_ch446_cs_handler_program);
|
|
|
|
Serial.print("offset: ");
|
|
Serial.println(offset);
|
|
|
|
pio_spi_ch446_multi_cs_init(pio, sm, offset, 8, 16, 0, 1, clk, dat);
|
|
// pio_spi_ch446_cs_handler_init(pio, smCS, offsetCS, 256, 1, 8, 20, 6);
|
|
// pinMode(CS_A, OUTPUT);
|
|
// digitalWrite(CS_A, HIGH);
|
|
|
|
pinMode(CS_A, OUTPUT);
|
|
pinMode(CS_B, OUTPUT);
|
|
pinMode(CS_C, OUTPUT);
|
|
pinMode(CS_D, OUTPUT);
|
|
pinMode(CS_E, OUTPUT);
|
|
pinMode(CS_F, OUTPUT);
|
|
pinMode(CS_G, OUTPUT);
|
|
pinMode(CS_H, OUTPUT);
|
|
pinMode(CS_I, OUTPUT);
|
|
pinMode(CS_J, OUTPUT);
|
|
pinMode(CS_K, OUTPUT);
|
|
pinMode(CS_L, OUTPUT);
|
|
|
|
digitalWrite(CS_A, LOW);
|
|
digitalWrite(CS_B, LOW);
|
|
digitalWrite(CS_C, LOW);
|
|
digitalWrite(CS_D, LOW);
|
|
digitalWrite(CS_E, LOW);
|
|
digitalWrite(CS_F, LOW);
|
|
digitalWrite(CS_G, LOW);
|
|
digitalWrite(CS_H, LOW);
|
|
digitalWrite(CS_I, LOW);
|
|
digitalWrite(CS_J, LOW);
|
|
digitalWrite(CS_K, LOW);
|
|
digitalWrite(CS_L, LOW);
|
|
|
|
pinMode(RESETPIN, OUTPUT);
|
|
|
|
digitalWrite(RESETPIN, HIGH);
|
|
delay(10);
|
|
digitalWrite(RESETPIN, LOW);
|
|
}
|
|
|
|
|
|
|
|
void resetArduino (void)
|
|
{
|
|
int lastPath = MAX_BRIDGES - 1;
|
|
path[lastPath].chip[0] = CHIP_I;
|
|
path[lastPath].chip[1] = CHIP_I;
|
|
path[lastPath].x[0] = 11;
|
|
path[lastPath].y[0] = 0;
|
|
path[lastPath].x[1] = 15;
|
|
path[lastPath].y[1] = 0;
|
|
|
|
sendPath(lastPath, 1);
|
|
delay(100);
|
|
sendPath(lastPath, 0);
|
|
|
|
|
|
}
|
|
void sendAllPaths(void) // should we sort them by chip? for now, no
|
|
{
|
|
|
|
for (int i = 0; i < numberOfPaths; i++)
|
|
{
|
|
sendPath(i, 1);
|
|
}
|
|
|
|
}
|
|
|
|
void sendPath(int i, int setOrClear)
|
|
{
|
|
|
|
uint32_t chAddress = 0;
|
|
|
|
int chipToConnect = 0;
|
|
int chYdata = 0;
|
|
int chXdata = 0;
|
|
|
|
for (int chip = 0; chip < 4; chip++)
|
|
{
|
|
if (path[i].chip[chip] != -1)
|
|
{
|
|
chipSelect = path[i].chip[chip];
|
|
|
|
chipToConnect = path[i].chip[chip];
|
|
|
|
if (path[i].y[chip] == -1 || path[i].x[chip] == -1)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
chYdata = path[i].y[chip];
|
|
chXdata = path[i].x[chip];
|
|
|
|
chYdata = chYdata << 5;
|
|
chYdata = chYdata & 0b11100000;
|
|
|
|
chXdata = chXdata << 1;
|
|
chXdata = chXdata & 0b00011110;
|
|
|
|
chAddress = chYdata | chXdata;
|
|
|
|
if (setOrClear == 1)
|
|
{
|
|
chAddress = chAddress | 0b00000001; // this last bit determines whether we set or unset the path
|
|
}
|
|
|
|
chAddress = chAddress << 24;
|
|
|
|
// delayMicroseconds(50);
|
|
|
|
delayMicroseconds(30);
|
|
|
|
pio_sm_put(pio, sm, chAddress);
|
|
|
|
delayMicroseconds(60);
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
|
|
void createXYarray(void)
|
|
{
|
|
} |