Few bug fixes to wait for SD card to be finished
[SCSI2SD-V6.git] / src / firmware / fpga.c
1 //      Copyright (C) 2015 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17
18 #ifdef STM32F2xx
19 #include "stm32f2xx.h"
20 #endif
21
22 #ifdef STM32F4xx
23 #include "stm32f4xx.h"
24 #endif
25
26 #include "spi.h"
27
28 #include "fpga.h"
29 #include "led.h"
30 #include "time.h"
31
32 extern uint8_t _fpga_bitmap_start;
33 extern uint8_t _fpga_bitmap_end;
34 extern uint8_t _fpga_bitmap_size;
35
36 void s2s_fpgaInit()
37 {
38         // FPGA SPI Configuration
39         s2s_ledOn();
40         HAL_GPIO_WritePin(FPGA_RST_GPIO_Port, FPGA_RST_Pin, GPIO_PIN_SET);
41         HAL_GPIO_WritePin(nSPICFG_CS_GPIO_Port, nSPICFG_CS_Pin, GPIO_PIN_RESET);
42         HAL_GPIO_WritePin(
43                 nFGPA_CRESET_B_GPIO_Port, nFGPA_CRESET_B_Pin, GPIO_PIN_RESET);
44         s2s_delay_us(1); // TODO only need 200 ns
45
46         HAL_GPIO_WritePin(
47                 nFGPA_CRESET_B_GPIO_Port, nFGPA_CRESET_B_Pin, GPIO_PIN_SET);
48
49         // 800uS for iCE40HX1K. tCR_SCK parameter in datasheet.
50         s2s_delay_us(800);
51
52         uint8_t* fpgaData = &_fpga_bitmap_start;
53         uint32_t fpgaBytes = (uint32_t) &_fpga_bitmap_size;
54         HAL_SPI_Transmit(&hspi1, fpgaData, fpgaBytes, 0xFFFFFFFF);
55
56         // Wait 100 clocks
57         uint8_t dummy[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
58         HAL_SPI_Transmit(&hspi1, dummy, sizeof(dummy), 0xFFFFFFFF);
59
60         while (HAL_GPIO_ReadPin(nFGPA_CDONE_GPIO_Port, nFGPA_CDONE_Pin) ==
61                 GPIO_PIN_RESET)
62         {
63                 s2s_ledOn();
64                 s2s_delay_ms(25);
65                 s2s_ledOff();
66                 s2s_delay_ms(25);
67
68         }
69         s2s_ledOff();
70
71         // We're Done!! Release rst and allow processing to commence.
72         s2s_delay_us(1);
73         HAL_GPIO_WritePin(FPGA_RST_GPIO_Port, FPGA_RST_Pin, GPIO_PIN_RESET);
74 }
75
76 void s2s_fpgaReset()
77 {
78         HAL_GPIO_WritePin(FPGA_RST_GPIO_Port, FPGA_RST_Pin, GPIO_PIN_SET);
79         s2s_delay_clocks(12);
80         HAL_GPIO_WritePin(FPGA_RST_GPIO_Port, FPGA_RST_Pin, GPIO_PIN_RESET);
81 }
82