rearrange pin definitions
Signed-off-by: Your Name <you@example.com>
This commit is contained in:
parent
23616a1c4b
commit
c2f21f1df1
2
Makefile
2
Makefile
@ -51,7 +51,7 @@ $(OBJECTS): | $(OBJ_DIR)
|
|||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
$(TARGET): $(OBJECTS)
|
||||||
$(QUIET) echo " LD $@"
|
$(QUIET) echo " LD $@"
|
||||||
$(QUIET) $(CXX) $(OBJECTS) $(LFLAGS) -o $@
|
$(QUIET) $(CC) $(OBJECTS) $(LFLAGS) -o $@
|
||||||
|
|
||||||
$(DEBUG): CFLAGS += $(DBG_CFLAGS)
|
$(DEBUG): CFLAGS += $(DBG_CFLAGS)
|
||||||
$(DEBUG): LFLAGS += $(DBG_LFLAGS)
|
$(DEBUG): LFLAGS += $(DBG_LFLAGS)
|
||||||
|
177
bbflash.c
177
bbflash.c
@ -43,6 +43,19 @@ struct bb_spi {
|
|||||||
enum spi_state state;
|
enum spi_state state;
|
||||||
enum spi_type type;
|
enum spi_type type;
|
||||||
int qpi;
|
int qpi;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int clk;
|
||||||
|
int d0;
|
||||||
|
int d1;
|
||||||
|
int d2;
|
||||||
|
int d3;
|
||||||
|
int wp;
|
||||||
|
int hold;
|
||||||
|
int cs;
|
||||||
|
int miso;
|
||||||
|
int mosi;
|
||||||
|
} pins;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void spi_set_state(struct bb_spi *spi, enum spi_state state) {
|
static void spi_set_state(struct bb_spi *spi, enum spi_state state) {
|
||||||
@ -51,57 +64,57 @@ static void spi_set_state(struct bb_spi *spi, enum spi_state state) {
|
|||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case SS_SINGLE:
|
case SS_SINGLE:
|
||||||
gpioSetMode(S_CLK, PI_OUTPUT); // CLK
|
gpioSetMode(spi->pins.clk, PI_OUTPUT); // CLK
|
||||||
gpioSetMode(S_CE0, PI_OUTPUT); // CE0#
|
gpioSetMode(spi->pins.cs, PI_OUTPUT); // CE0#
|
||||||
gpioSetMode(S_MOSI, PI_OUTPUT); // MOSI
|
gpioSetMode(spi->pins.mosi, PI_OUTPUT); // MOSI
|
||||||
gpioSetMode(S_MISO, PI_INPUT); // MISO
|
gpioSetMode(spi->pins.miso, PI_INPUT); // MISO
|
||||||
gpioSetMode(S_HOLD, PI_OUTPUT);
|
gpioSetMode(spi->pins.hold, PI_OUTPUT);
|
||||||
gpioSetMode(S_WP, PI_OUTPUT);
|
gpioSetMode(spi->pins.wp, PI_OUTPUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SS_DUAL_RX:
|
case SS_DUAL_RX:
|
||||||
gpioSetMode(S_CLK, PI_OUTPUT); // CLK
|
gpioSetMode(spi->pins.clk, PI_OUTPUT); // CLK
|
||||||
gpioSetMode(S_CE0, PI_OUTPUT); // CE0#
|
gpioSetMode(spi->pins.cs, PI_OUTPUT); // CE0#
|
||||||
gpioSetMode(S_MOSI, PI_INPUT); // MOSI
|
gpioSetMode(spi->pins.mosi, PI_INPUT); // MOSI
|
||||||
gpioSetMode(S_MISO, PI_INPUT); // MISO
|
gpioSetMode(spi->pins.miso, PI_INPUT); // MISO
|
||||||
gpioSetMode(S_HOLD, PI_OUTPUT);
|
gpioSetMode(spi->pins.hold, PI_OUTPUT);
|
||||||
gpioSetMode(S_WP, PI_OUTPUT);
|
gpioSetMode(spi->pins.wp, PI_OUTPUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SS_DUAL_TX:
|
case SS_DUAL_TX:
|
||||||
gpioSetMode(S_CLK, PI_OUTPUT); // CLK
|
gpioSetMode(spi->pins.clk, PI_OUTPUT); // CLK
|
||||||
gpioSetMode(S_CE0, PI_OUTPUT); // CE0#
|
gpioSetMode(spi->pins.cs, PI_OUTPUT); // CE0#
|
||||||
gpioSetMode(S_MOSI, PI_OUTPUT); // MOSI
|
gpioSetMode(spi->pins.mosi, PI_OUTPUT); // MOSI
|
||||||
gpioSetMode(S_MISO, PI_OUTPUT); // MISO
|
gpioSetMode(spi->pins.miso, PI_OUTPUT); // MISO
|
||||||
gpioSetMode(S_HOLD, PI_OUTPUT);
|
gpioSetMode(spi->pins.hold, PI_OUTPUT);
|
||||||
gpioSetMode(S_WP, PI_OUTPUT);
|
gpioSetMode(spi->pins.wp, PI_OUTPUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SS_QUAD_RX:
|
case SS_QUAD_RX:
|
||||||
gpioSetMode(S_CLK, PI_OUTPUT); // CLK
|
gpioSetMode(spi->pins.clk, PI_OUTPUT); // CLK
|
||||||
gpioSetMode(S_CE0, PI_OUTPUT); // CE0#
|
gpioSetMode(spi->pins.cs, PI_OUTPUT); // CE0#
|
||||||
gpioSetMode(S_MOSI, PI_INPUT); // MOSI
|
gpioSetMode(spi->pins.mosi, PI_INPUT); // MOSI
|
||||||
gpioSetMode(S_MISO, PI_INPUT); // MISO
|
gpioSetMode(spi->pins.miso, PI_INPUT); // MISO
|
||||||
gpioSetMode(S_HOLD, PI_INPUT);
|
gpioSetMode(spi->pins.hold, PI_INPUT);
|
||||||
gpioSetMode(S_WP, PI_INPUT);
|
gpioSetMode(spi->pins.wp, PI_INPUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SS_QUAD_TX:
|
case SS_QUAD_TX:
|
||||||
gpioSetMode(S_CLK, PI_OUTPUT); // CLK
|
gpioSetMode(spi->pins.clk, PI_OUTPUT); // CLK
|
||||||
gpioSetMode(S_CE0, PI_OUTPUT); // CE0#
|
gpioSetMode(spi->pins.cs, PI_OUTPUT); // CE0#
|
||||||
gpioSetMode(S_MOSI, PI_OUTPUT); // MOSI
|
gpioSetMode(spi->pins.mosi, PI_OUTPUT); // MOSI
|
||||||
gpioSetMode(S_MISO, PI_OUTPUT); // MISO
|
gpioSetMode(spi->pins.miso, PI_OUTPUT); // MISO
|
||||||
gpioSetMode(S_HOLD, PI_OUTPUT);
|
gpioSetMode(spi->pins.hold, PI_OUTPUT);
|
||||||
gpioSetMode(S_WP, PI_OUTPUT);
|
gpioSetMode(spi->pins.wp, PI_OUTPUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SS_HARDWARE:
|
case SS_HARDWARE:
|
||||||
gpioSetMode(S_CLK, PI_ALT0); // CLK
|
gpioSetMode(spi->pins.clk, PI_ALT0); // CLK
|
||||||
gpioSetMode(S_CE0, PI_ALT0); // CE0#
|
gpioSetMode(spi->pins.cs, PI_ALT0); // CE0#
|
||||||
gpioSetMode(S_MOSI, PI_ALT0); // MOSI
|
gpioSetMode(spi->pins.mosi, PI_ALT0); // MOSI
|
||||||
gpioSetMode(S_MISO, PI_ALT0); // MISO
|
gpioSetMode(spi->pins.miso, PI_ALT0); // MISO
|
||||||
gpioSetMode(S_HOLD, PI_OUTPUT);
|
gpioSetMode(spi->pins.hold, PI_OUTPUT);
|
||||||
gpioSetMode(S_WP, PI_OUTPUT);
|
gpioSetMode(spi->pins.wp, PI_OUTPUT);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -119,12 +132,12 @@ static void spi_pause(void) {
|
|||||||
|
|
||||||
static void spiBegin(struct bb_spi *spi) {
|
static void spiBegin(struct bb_spi *spi) {
|
||||||
spi_set_state(spi, SS_SINGLE);
|
spi_set_state(spi, SS_SINGLE);
|
||||||
gpioWrite(S_CE0, 0);
|
gpioWrite(spi->pins.cs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiEnd(struct bb_spi *spi) {
|
static void spiEnd(struct bb_spi *spi) {
|
||||||
(void)spi;
|
(void)spi;
|
||||||
gpioWrite(S_CE0, 1);
|
gpioWrite(spi->pins.cs, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t spiXfer(struct bb_spi *spi, uint8_t out) {
|
static uint8_t spiXfer(struct bb_spi *spi, uint8_t out) {
|
||||||
@ -132,15 +145,15 @@ static uint8_t spiXfer(struct bb_spi *spi, uint8_t out) {
|
|||||||
uint8_t in = 0;
|
uint8_t in = 0;
|
||||||
for (bit = 7; bit >= 0; bit--) {
|
for (bit = 7; bit >= 0; bit--) {
|
||||||
if (out & (1 << bit)) {
|
if (out & (1 << bit)) {
|
||||||
gpioWrite(S_MOSI, 1);
|
gpioWrite(spi->pins.mosi, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_MOSI, 0);
|
gpioWrite(spi->pins.mosi, 0);
|
||||||
}
|
}
|
||||||
gpioWrite(S_CLK, 1);
|
gpioWrite(spi->pins.clk, 1);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
in |= ((!!gpioRead(S_MISO)) << bit);
|
in |= ((!!gpioRead(spi->pins.miso)) << bit);
|
||||||
gpioWrite(S_CLK, 0);
|
gpioWrite(spi->pins.clk, 0);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
}
|
}
|
||||||
return in;
|
return in;
|
||||||
@ -161,21 +174,21 @@ static void spiDualTx(struct bb_spi *spi, uint8_t out) {
|
|||||||
spi_set_state(spi, SS_DUAL_TX);
|
spi_set_state(spi, SS_DUAL_TX);
|
||||||
for (bit = 7; bit >= 0; bit -= 2) {
|
for (bit = 7; bit >= 0; bit -= 2) {
|
||||||
if (out & (1 << (bit - 1))) {
|
if (out & (1 << (bit - 1))) {
|
||||||
gpioWrite(S_D0, 1);
|
gpioWrite(spi->pins.d0, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_D0, 0);
|
gpioWrite(spi->pins.d0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out & (1 << (bit - 0))) {
|
if (out & (1 << (bit - 0))) {
|
||||||
gpioWrite(S_D1, 1);
|
gpioWrite(spi->pins.d1, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_D1, 0);
|
gpioWrite(spi->pins.d1, 0);
|
||||||
}
|
}
|
||||||
gpioWrite(S_CLK, 1);
|
gpioWrite(spi->pins.clk, 1);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
gpioWrite(S_CLK, 0);
|
gpioWrite(spi->pins.clk, 0);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,35 +198,35 @@ static void spiQuadTx(struct bb_spi *spi, uint8_t out) {
|
|||||||
spi_set_state(spi, SS_QUAD_TX);
|
spi_set_state(spi, SS_QUAD_TX);
|
||||||
for (bit = 7; bit >= 0; bit -= 4) {
|
for (bit = 7; bit >= 0; bit -= 4) {
|
||||||
if (out & (1 << (bit - 3))) {
|
if (out & (1 << (bit - 3))) {
|
||||||
gpioWrite(S_D0, 1);
|
gpioWrite(spi->pins.d0, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_D0, 0);
|
gpioWrite(spi->pins.d0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out & (1 << (bit - 2))) {
|
if (out & (1 << (bit - 2))) {
|
||||||
gpioWrite(S_D1, 1);
|
gpioWrite(spi->pins.d1, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_D1, 0);
|
gpioWrite(spi->pins.d1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out & (1 << (bit - 1))) {
|
if (out & (1 << (bit - 1))) {
|
||||||
gpioWrite(S_D2, 1);
|
gpioWrite(spi->pins.d2, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_D2, 0);
|
gpioWrite(spi->pins.d2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out & (1 << (bit - 0))) {
|
if (out & (1 << (bit - 0))) {
|
||||||
gpioWrite(S_D3, 1);
|
gpioWrite(spi->pins.d3, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gpioWrite(S_D3, 0);
|
gpioWrite(spi->pins.d3, 0);
|
||||||
}
|
}
|
||||||
gpioWrite(S_CLK, 1);
|
gpioWrite(spi->pins.clk, 1);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
gpioWrite(S_CLK, 0);
|
gpioWrite(spi->pins.clk, 0);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -231,11 +244,11 @@ static uint8_t spiDualRx(struct bb_spi *spi) {
|
|||||||
|
|
||||||
spi_set_state(spi, SS_QUAD_RX);
|
spi_set_state(spi, SS_QUAD_RX);
|
||||||
for (bit = 7; bit >= 0; bit -= 2) {
|
for (bit = 7; bit >= 0; bit -= 2) {
|
||||||
gpioWrite(S_CLK, 1);
|
gpioWrite(spi->pins.clk, 1);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
in |= ((!!gpioRead(S_D0)) << (bit - 1));
|
in |= ((!!gpioRead(spi->pins.d0)) << (bit - 1));
|
||||||
in |= ((!!gpioRead(S_D1)) << (bit - 0));
|
in |= ((!!gpioRead(spi->pins.d1)) << (bit - 0));
|
||||||
gpioWrite(S_CLK, 0);
|
gpioWrite(spi->pins.clk, 0);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
}
|
}
|
||||||
return in;
|
return in;
|
||||||
@ -247,13 +260,13 @@ static uint8_t spiQuadRx(struct bb_spi *spi) {
|
|||||||
|
|
||||||
spi_set_state(spi, SS_QUAD_RX);
|
spi_set_state(spi, SS_QUAD_RX);
|
||||||
for (bit = 7; bit >= 0; bit -= 4) {
|
for (bit = 7; bit >= 0; bit -= 4) {
|
||||||
gpioWrite(S_CLK, 1);
|
gpioWrite(spi->pins.clk, 1);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
in |= ((!!gpioRead(S_D0)) << (bit - 3));
|
in |= ((!!gpioRead(spi->pins.d0)) << (bit - 3));
|
||||||
in |= ((!!gpioRead(S_D1)) << (bit - 2));
|
in |= ((!!gpioRead(spi->pins.d1)) << (bit - 2));
|
||||||
in |= ((!!gpioRead(S_D2)) << (bit - 1));
|
in |= ((!!gpioRead(spi->pins.d2)) << (bit - 1));
|
||||||
in |= ((!!gpioRead(S_D3)) << (bit - 0));
|
in |= ((!!gpioRead(spi->pins.d3)) << (bit - 0));
|
||||||
gpioWrite(S_CLK, 0);
|
gpioWrite(spi->pins.clk, 0);
|
||||||
spi_pause();
|
spi_pause();
|
||||||
}
|
}
|
||||||
return in;
|
return in;
|
||||||
@ -550,13 +563,13 @@ uint8_t spiReset(struct bb_spi *spi) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fpgaSlaveMode(void) {
|
void fpgaSlaveMode(struct bb_spi *spi) {
|
||||||
|
|
||||||
// Set the CS pin to a GPIO, which will let us control it
|
// Set the CS pin to a GPIO, which will let us control it
|
||||||
gpioSetMode(S_CE0, PI_OUTPUT);
|
gpioSetMode(spi->pins.cs, PI_OUTPUT);
|
||||||
|
|
||||||
// Set CS to 0, which will put the FPGA into slave mode
|
// Set CS to 0, which will put the FPGA into slave mode
|
||||||
gpioWrite(S_CE0, 0);
|
gpioWrite(spi->pins.cs, 0);
|
||||||
|
|
||||||
usleep(10000); // XXX figure out correct sleep length here
|
usleep(10000); // XXX figure out correct sleep length here
|
||||||
|
|
||||||
@ -641,12 +654,22 @@ int main(int argc, char *argv[])
|
|||||||
* To program the FPGA
|
* To program the FPGA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
spi.pins.clk = S_CLK;
|
||||||
|
spi.pins.d0 = S_D0;
|
||||||
|
spi.pins.d1 = S_D1;
|
||||||
|
spi.pins.d2 = S_D2;
|
||||||
|
spi.pins.d3 = S_D3;
|
||||||
|
spi.pins.miso = S_MISO;
|
||||||
|
spi.pins.mosi = S_MOSI;
|
||||||
|
spi.pins.hold = S_HOLD;
|
||||||
|
spi.pins.wp = S_WP;
|
||||||
|
spi.pins.cs = S_CE0;
|
||||||
|
|
||||||
// Have the SPI flash pay attention to us
|
// Have the SPI flash pay attention to us
|
||||||
gpioWrite(S_HOLD, 1);
|
gpioWrite(spi.pins.hold, 1);
|
||||||
|
|
||||||
// Disable WP
|
// Disable WP
|
||||||
gpioWrite(S_WP, 1);
|
gpioWrite(spi.pins.wp, 1);
|
||||||
|
|
||||||
// Put the FPGA into reset
|
// Put the FPGA into reset
|
||||||
gpioSetMode(F_RESET, PI_OUTPUT);
|
gpioSetMode(F_RESET, PI_OUTPUT);
|
||||||
@ -702,7 +725,7 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
uint8_t check_data[sizeof(data)];
|
uint8_t check_data[sizeof(data)];
|
||||||
spiRead(&spi, 0, check_data, sizeof(check_data));
|
spiRead(&spi, 0, check_data, sizeof(check_data));
|
||||||
int j;
|
size_t j;
|
||||||
for (j=0; j<sizeof(check_data); j++) {
|
for (j=0; j<sizeof(check_data); j++) {
|
||||||
if (data[j] != check_data[j]) {
|
if (data[j] != check_data[j]) {
|
||||||
fprintf(stderr, "check data %d different: %02x vs %02x\n", j, check_data[j], data[j]);
|
fprintf(stderr, "check data %d different: %02x vs %02x\n", j, check_data[j], data[j]);
|
||||||
@ -714,10 +737,10 @@ int main(int argc, char *argv[])
|
|||||||
fprintf(stderr, "Programming result: %d\n", result);
|
fprintf(stderr, "Programming result: %d\n", result);
|
||||||
|
|
||||||
// Deassert CS
|
// Deassert CS
|
||||||
gpioWrite(S_CE0, 1);
|
gpioWrite(spi.pins.cs, 1);
|
||||||
|
|
||||||
// Deassert hold, if set
|
// Deassert hold, if set
|
||||||
gpioWrite(S_HOLD, 1);
|
gpioWrite(spi.pins.hold, 1);
|
||||||
|
|
||||||
// Return the SPI pins to SPI mode, so we can talk to
|
// Return the SPI pins to SPI mode, so we can talk to
|
||||||
// the FPGA normally
|
// the FPGA normally
|
||||||
|
Loading…
Reference in New Issue
Block a user