/*****************************************************************************//*! +FUNCTION---------------------------------------------------------------- * @function name: SPI0_Init * * @brief initialize SPI0 to master mode * * @param none * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ void SPI0_Init(void) { unsigned char temp[4] = { 0 }; volatile char dummy; CS_PIN_Init; // SPI0 initial //SYS_SOPT1_SPI0PS = 1; // SPI0 SPSCK0, MOSI0, MISO0, and SS0 are mapped on PTE0, PTE1, PTE2, and PTE3. SPI0_C1_MSTR = 1; // master SPI0_C1_CPOL = 0; SPI0_C1_CPHA = 0; SPI0_BR_SPR = 0b001; // device 2 SPI0_BR_SPPR = 0b000; // device 2 -> Baud = 20/4 =500khz dummy = SPI0_D; SPI0_C1_SPE = 1; // enabled flash_read_id(temp); }
int main(int argc, char **argv) { if (argc != 2 || (argv[1][0] == '-' && argv[1][1]) || !argv[1][0]) { printf("Usage: %s <binfile> ... program <binfile> to IceZero flash\n", argv[0]); printf(" %s - ... program stdin to IceZero flash\n", argv[0]); printf(" %s . ... erase first sector of IceZero flash\n", argv[0]); printf(" %s .. ... just restart the FPGA\n", argv[0]); return 1; } wiringPiSetup(); pinMode(CFG_SS, OUTPUT); pinMode(CFG_SCK, OUTPUT); pinMode(CFG_SI, INPUT); pinMode(CFG_SO, OUTPUT); pinMode(CFG_RST, OUTPUT); pinMode(CFG_DONE, INPUT); digitalWrite(CFG_SS, HIGH); digitalWrite(CFG_SCK, LOW); digitalWrite(CFG_SO, LOW); digitalWrite(CFG_RST, LOW); if (strcmp(argv[1], "..")) { flash_power_up(); flash_read_id(); } if (!strcmp(argv[1], ".")) { char buffer[1024]; int i; for (i = 0; i < (int)sizeof(buffer); i++) buffer[0] = 0xff; flash_wrsector(0, buffer, sizeof(buffer)); } else if (strcmp(argv[1], "..")) { int addr = 0, size = 0; char buffer[64*1024]; FILE *f = strcmp(argv[1], "-") ? fopen(argv[1], "rb") : stdin; if (f == NULL) { printf("Failed to open %s: %s\n", argv[1], strerror(errno)); return 1; } do { addr += size; size = 0; while (size < (int)sizeof(buffer)) { int rc = fread(buffer+size, 1, sizeof(buffer)-size, f); if (rc <= 0) break; size += rc; } if (size > 0) flash_wrsector(addr, buffer, size); } while (size == sizeof(buffer)); } digitalWrite(CFG_RST, LOW); usleep(2000); digitalWrite(CFG_RST, HIGH); usleep(500000); if (digitalRead(CFG_DONE) != HIGH) { printf("Warning: cdone is low\n"); return 1; } printf("DONE.\n"); return 0; }