From db508b7ff5d1ca011d487b88591ee4725692272f Mon Sep 17 00:00:00 2001 From: Seth Kerr <thesethkerr@gmail.com> Date: Sun, 23 Jun 2024 15:29:36 -0600 Subject: [PATCH 1/3] Add IcyBlue Feather --- .../boards/ODT_IcyBlue_Feather/info.json | 3 ++ .../boards/ODT_IcyBlue_Feather/pinout.json | 31 ++++++++++++ .../boards/ODT_IcyBlue_Feather/pinout.pcf | 49 +++++++++++++++++++ app/resources/boards/menu.json | 2 +- app/views/menu.html | 4 ++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 app/resources/boards/ODT_IcyBlue_Feather/info.json create mode 100644 app/resources/boards/ODT_IcyBlue_Feather/pinout.json create mode 100644 app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf diff --git a/app/resources/boards/ODT_IcyBlue_Feather/info.json b/app/resources/boards/ODT_IcyBlue_Feather/info.json new file mode 100644 index 000000000..3bf08b480 --- /dev/null +++ b/app/resources/boards/ODT_IcyBlue_Feather/info.json @@ -0,0 +1,3 @@ +{"label":"icyBlue","datasheet":"https://github.com/Oak-Development-Technologies/IcyBlue/blob/main/Documentation/IcyBlue%20Feather%20V2%20Datasheet%20rev1a.docx", + "interface":"FTDI","FPGAResources": {"ffs":3520,"luts":3520, + "pios":27,"plbs":440,"brams":20}} \ No newline at end of file diff --git a/app/resources/boards/ODT_IcyBlue_Feather/pinout.json b/app/resources/boards/ODT_IcyBlue_Feather/pinout.json new file mode 100644 index 000000000..35a14d852 --- /dev/null +++ b/app/resources/boards/ODT_IcyBlue_Feather/pinout.json @@ -0,0 +1,31 @@ +[{"type": "output", "name": "LED2", "value": "2"}, + {"type": "output", "name": "LED3", "value": "3"}, + {"type": "inout", "name": "P9", "value": "9"}, + {"type": "inout", "name": "P6", "value": "6"}, + {"type": "inout", "name": "P47", "value": "47"}, + {"type": "inout", "name": "P46", "value": "46"}, + {"type": "inout", "name": "P45", "value": "45"}, + {"type": "inout", "name": "P44", "value": "44"}, + {"type": "inout", "name": "P43", "value": "43"}, + {"type": "inout", "name": "P42", "value": "42"}, + {"type": "inout", "name": "P4", "value": "4"}, + {"type": "inout", "name": "P38", "value": "38"}, + {"type": "inout", "name": "P37", "value": "37"}, + {"type": "inout", "name": "P25", "value": "25"}, + {"type": "inout", "name": "P23", "value": "23"}, + {"type": "inout", "name": "P21", "value": "21"}, + {"type": "inout", "name": "P20", "value": "20"}, + {"type": "inout", "name": "P19", "value": "19"}, + {"type": "inout", "name": "P18", "value": "18"}, + {"type": "inout", "name": "P13", "value": "13"}, + {"type": "inout", "name": "P12", "value": "12"}, + {"type": "inout", "name": "P11", "value": "11"}, + {"type": "inout", "name": "P10", "value": "10"}, + {"type": "output", "name": "LED_R", "value": "41"}, + {"type": "output", "name": "LED_G", "value": "40"}, + {"type": "output", "name": "LED_B", "value": "39"}, + {"type": "inout", "name": "F_SSB", "value": "16"}, + {"type": "inout", "name": "F_SCK", "value": "15"}, + {"type": "inout", "name": "F_IO1", "value": "17"}, + {"type": "inout", "name": "F_IO0", "value": "14"}, + {"type": "inout", "name": "P48", "value": "P48"}] \ No newline at end of file diff --git a/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf b/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf new file mode 100644 index 000000000..48d101e88 --- /dev/null +++ b/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf @@ -0,0 +1,49 @@ +# ----------------------------------------------------------------------------- + #- IcyBlue Feather constraint file (.pcf) + #- By Seth Kerr + #- August - 2022 + #- GPL license + # ----------------------------------------------------------------------------- + + # ------------ RGB LED Driver ------------------------------------------------- + set_io --warn-no-port LED_B 39 # output + set_io --warn-no-port LED_G 40 # output + set_io --warn-no-port LED_R 41 # output + + + # ------------ User LEDS ------------------------------------------------------ + set_io --warn-no-port LED2 2 # output + set_io --warn-no-port LED3 3 # output + + # ------------ SPI Flash ------------------------------------------------------ + set_io --warn-no-port F_SCK 15 + set_io --warn-no-port F_SSB 16 + set_io --warn-no-port F_IO0 14 + set_io --warn-no-port F_IO1 17 + + + # ------------ GPIO ----------------------------------------------------------- + set_io --warn-no-port P4 4 + set_io --warn-no-port P6 6 + set_io --warn-no-port P9 9 + set_io --warn-no-port P10 10 + set_io --warn-no-port P11 11 + set_io --warn-no-port P12 12 + set_io --warn-no-port P13 13 + + set_io --warn-no-port P18 18 + set_io --warn-no-port P19 19 + set_io --warn-no-port P20 20 + set_io --warn-no-port P21 21 + set_io --warn-no-port P23 23 + set_io --warn-no-port P25 25 + + set_io --warn-no-port P37 37 + set_io --warn-no-port P38 38 + set_io --warn-no-port P42 42 + set_io --warn-no-port P43 43 + set_io --warn-no-port P44 44 + set_io --warn-no-port P45 45 + set_io --warn-no-port P46 46 + set_io --warn-no-port P47 47 + set_io --warn-no-port P48 48 \ No newline at end of file diff --git a/app/resources/boards/menu.json b/app/resources/boards/menu.json index 13bfb1017..a42ffafc4 100644 --- a/app/resources/boards/menu.json +++ b/app/resources/boards/menu.json @@ -1 +1 @@ -[{"type":"HX1K","boards":["icezum","go-board","icestick"]},{"type":"HX8K","boards":["Alchitry-Cu","alhambra-ii","blackice","blackice-ii","blackice-mx","edu-ciaa-fpga","icoboard","kefir","iCE40-HX8K","icefun","iceWerx","ThetaMachines-ETH4K"]},{"type":"LP8K","boards":["TinyFPGA-B2","TinyFPGA-BX"]},{"type":"LP1K","boards":["iCESugar-nano"]},{"type":"UP5K","boards":["MCH2022_badge","iCEBreaker","iCEBreaker-bitsy0","iCEBreaker-bitsy1","upduino","upduino2","upduino21","upduino3","upduino31","fpga101","iCE40-UP5K","fomu","iCESugar_1_5","OK-iCE40Pro","pico-ice"]},{"type":"ECP5","boards":["ulx3s-12f","ulx3s-25f","ulx3s-45f","ulx3s-85f","Butterstick-r10-2g-85k","Butterstick-r10-2g-85k_(FT2232H)","Butterstick-r10-2g-85k_(FT232H)","orangecrab-r02-25f","orangecrab-r02-85f","ColorLight-5A-75B-V61","ColorLight-5A-75B-V7","ColorLight-5A-75B-V8","ColorLight-5A-75E-V6","ColorLight-5A-75E-V71_(FT2232H)","ColorLight-5A-75E-V71_(FT232H)","ColorLight-5A-75E-V71_(USB-Blaster)","ColorLight-i5-v7.0_(FT2232H)","ColorLight-i5-v7.0_(FT232H)","ColorLight-i5-v7.0_(USB-Blaster)","iCESugar-Pro_(FT2232H)","iCESugar-Pro_(FT232H)","iCESugar-Pro_(USB-Blaster)","FleaFPGA-Ohm_(FT2232H)","FleaFPGA-Ohm_(FT232H)","FleaFPGA-Ohm_(USB-Blaster)","ECP5-Evaluation-Board","ECP5-Mini-12_(FT2232H)","ECP5-Mini-25_(FT2232H)","ColorLight-i9-v7.2_(FT2232H)","ColorLight-i9-v7.2_(FT232H)","ColorLight-i9-v7.2_(USB-Blaster)"]}] \ No newline at end of file +[{"type":"HX1K","boards":["icezum","go-board","icestick"]},{"type":"HX8K","boards":["Alchitry-Cu","alhambra-ii","blackice","blackice-ii","blackice-mx","edu-ciaa-fpga","icoboard","kefir","iCE40-HX8K","icefun","iceWerx","ThetaMachines-ETH4K"]},{"type":"LP8K","boards":["TinyFPGA-B2","TinyFPGA-BX"]},{"type":"LP1K","boards":["iCESugar-nano"]},{"type":"U4K","boards":["ODT_IcyBlue_Feather"]},{"type":"UP5K","boards":["MCH2022_badge","iCEBreaker","iCEBreaker-bitsy0","iCEBreaker-bitsy1","upduino","upduino2","upduino21","upduino3","upduino31","fpga101","iCE40-UP5K","fomu","iCESugar_1_5","OK-iCE40Pro","pico-ice"]},{"type":"ECP5","boards":["ulx3s-12f","ulx3s-25f","ulx3s-45f","ulx3s-85f","Butterstick-r10-2g-85k","Butterstick-r10-2g-85k_(FT2232H)","Butterstick-r10-2g-85k_(FT232H)","orangecrab-r02-25f","orangecrab-r02-85f","ColorLight-5A-75B-V61","ColorLight-5A-75B-V7","ColorLight-5A-75B-V8","ColorLight-5A-75E-V6","ColorLight-5A-75E-V71_(FT2232H)","ColorLight-5A-75E-V71_(FT232H)","ColorLight-5A-75E-V71_(USB-Blaster)","ColorLight-i5-v7.0_(FT2232H)","ColorLight-i5-v7.0_(FT232H)","ColorLight-i5-v7.0_(USB-Blaster)","iCESugar-Pro_(FT2232H)","iCESugar-Pro_(FT232H)","iCESugar-Pro_(USB-Blaster)","FleaFPGA-Ohm_(FT2232H)","FleaFPGA-Ohm_(FT232H)","FleaFPGA-Ohm_(USB-Blaster)","ECP5-Evaluation-Board","ECP5-Mini-12_(FT2232H)","ECP5-Mini-25_(FT2232H)","ColorLight-i9-v7.2_(FT2232H)","ColorLight-i9-v7.2_(FT232H)","ColorLight-i9-v7.2_(USB-Blaster)"]}] \ No newline at end of file diff --git a/app/views/menu.html b/app/views/menu.html index f088dfa90..5fdca563c 100644 --- a/app/views/menu.html +++ b/app/views/menu.html @@ -524,6 +524,10 @@ <li ng-repeat="board in common.boards"> <menuboard type="'LP8K'" board="board"></menuboard> </li> + <li><a><b>U4K</b></a></li> + <li ng-repeat="board in common.boards"> + <menuboard type="'U4K'" board="board"></menuboard> + </li> <li><a><b>UP5K</b></a></li> <li ng-repeat="board in common.boards"> <menuboard type="'UP5K'" board="board"></menuboard> From 4275028ecbe3b5b110f6ca85cba50c85e77389dd Mon Sep 17 00:00:00 2001 From: Seth Kerr <thesethkerr@gmail.com> Date: Sun, 23 Jun 2024 15:41:14 -0600 Subject: [PATCH 2/3] Add RPGA Feather --- .../boards/ODT_IcyBlue_Feather/pinout.json | 2 +- .../boards/ODT_IcyBlue_Feather/pinout.pcf | 2 +- .../boards/ODT_RPGA_Feather/info.json | 3 ++ .../boards/ODT_RPGA_Feather/pinout.json | 17 +++++++++ .../boards/ODT_RPGA_Feather/pinout.pcf | 36 +++++++++++++++++++ app/resources/boards/menu.json | 2 +- 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 app/resources/boards/ODT_RPGA_Feather/info.json create mode 100644 app/resources/boards/ODT_RPGA_Feather/pinout.json create mode 100644 app/resources/boards/ODT_RPGA_Feather/pinout.pcf diff --git a/app/resources/boards/ODT_IcyBlue_Feather/pinout.json b/app/resources/boards/ODT_IcyBlue_Feather/pinout.json index 35a14d852..732378d58 100644 --- a/app/resources/boards/ODT_IcyBlue_Feather/pinout.json +++ b/app/resources/boards/ODT_IcyBlue_Feather/pinout.json @@ -28,4 +28,4 @@ {"type": "inout", "name": "F_SCK", "value": "15"}, {"type": "inout", "name": "F_IO1", "value": "17"}, {"type": "inout", "name": "F_IO0", "value": "14"}, - {"type": "inout", "name": "P48", "value": "P48"}] \ No newline at end of file + {"type": "inout", "name": "P48", "value": "48"}] \ No newline at end of file diff --git a/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf b/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf index 48d101e88..5590965bf 100644 --- a/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf +++ b/app/resources/boards/ODT_IcyBlue_Feather/pinout.pcf @@ -1,7 +1,7 @@ # ----------------------------------------------------------------------------- #- IcyBlue Feather constraint file (.pcf) #- By Seth Kerr - #- August - 2022 + #- June - 2024 #- GPL license # ----------------------------------------------------------------------------- diff --git a/app/resources/boards/ODT_RPGA_Feather/info.json b/app/resources/boards/ODT_RPGA_Feather/info.json new file mode 100644 index 000000000..b42112be4 --- /dev/null +++ b/app/resources/boards/ODT_RPGA_Feather/info.json @@ -0,0 +1,3 @@ +{"label":"RPGA Feather","datasheet":"https://github.com/Oak-Development-Technologies/RPGA%20Feather/", + "interface":"MCU","FPGAResources": {"ffs":3520,"luts":3520, + "pios":27,"plbs":440,"brams":20}} \ No newline at end of file diff --git a/app/resources/boards/ODT_RPGA_Feather/pinout.json b/app/resources/boards/ODT_RPGA_Feather/pinout.json new file mode 100644 index 000000000..6d4641357 --- /dev/null +++ b/app/resources/boards/ODT_RPGA_Feather/pinout.json @@ -0,0 +1,17 @@ +[{"type": "inout", "name": "pico16", "value": "2"}, + {"type": "inout", "name": "pico17", "value": "3"}, + {"type": "inout", "name": "pico19", "value": "6"}, + {"type": "inout", "name": "pico20", "value": "48"} + {"type": "inout", "name": "pico6", "value": "47"}, + {"type": "inout", "name": "pico11", "value": "46"}, + {"type": "inout", "name": "pico10", "value": "45"}, + {"type": "inout", "name": "pico18", "value": "4"}, + {"type": "output", "name": "LED_R", "value": "41"}, + {"type": "output", "name": "LED_G", "value": "40"}, + {"type": "output", "name": "LED_B", "value": "39"}, + {"type": "inout", "name": "F_SSB", "value": "16"}, + {"type": "inout", "name": "F_SCK", "value": "15"}, + {"type": "inout", "name": "F_IO1", "value": "17"}, + {"type": "inout", "name": "F_IO0", "value": "14"}, + {"type": "inout", "name": "edge[0]", "value": "20"}, + {"type": "inout", "name": "edge[1]", "value": "13"}] \ No newline at end of file diff --git a/app/resources/boards/ODT_RPGA_Feather/pinout.pcf b/app/resources/boards/ODT_RPGA_Feather/pinout.pcf new file mode 100644 index 000000000..4ef54e6a1 --- /dev/null +++ b/app/resources/boards/ODT_RPGA_Feather/pinout.pcf @@ -0,0 +1,36 @@ +# ----------------------------------------------------------------------------- + #- RPGA Feather constraint file (.pcf) + #- By Seth Kerr + #- June - 2024 + #- GPL license + # ----------------------------------------------------------------------------- + + # ------------ RGB LED Driver ------------------------------------------------- + set_io --warn-no-port LED_B 39 # output + set_io --warn-no-port LED_G 40 # output + set_io --warn-no-port LED_R 41 # output + + set_io RGB[2] 41 + set_io RGB[1] 40 + set_io RGB[0] 39 + + # ------------ SPI Flash ------------------------------------------------------ + set_io --warn-no-port F_SCK 15 + set_io --warn-no-port F_SSB 16 + set_io --warn-no-port F_IO0 14 + set_io --warn-no-port F_IO1 17 + + # ------------ GPIO ----------------------------------------------------------- + set_io --warn-no-port clk 2 + set_io --warn-no-port pico16 2 + set_io --warn-no-port pico17 3 + set_io --warn-no-port pico18 4 + set_io --warn-no-port pico19 6 + + set_io --warn-no-port pico20 48 + set_io --warn-no-port pico6 47 + set_io --warn-no-port pico11 46 + set_io --warn-no-port pico10 45 + + set_io edge[1] 13 + set_io edge[0] 20 \ No newline at end of file diff --git a/app/resources/boards/menu.json b/app/resources/boards/menu.json index a42ffafc4..e6a97f56d 100644 --- a/app/resources/boards/menu.json +++ b/app/resources/boards/menu.json @@ -1 +1 @@ -[{"type":"HX1K","boards":["icezum","go-board","icestick"]},{"type":"HX8K","boards":["Alchitry-Cu","alhambra-ii","blackice","blackice-ii","blackice-mx","edu-ciaa-fpga","icoboard","kefir","iCE40-HX8K","icefun","iceWerx","ThetaMachines-ETH4K"]},{"type":"LP8K","boards":["TinyFPGA-B2","TinyFPGA-BX"]},{"type":"LP1K","boards":["iCESugar-nano"]},{"type":"U4K","boards":["ODT_IcyBlue_Feather"]},{"type":"UP5K","boards":["MCH2022_badge","iCEBreaker","iCEBreaker-bitsy0","iCEBreaker-bitsy1","upduino","upduino2","upduino21","upduino3","upduino31","fpga101","iCE40-UP5K","fomu","iCESugar_1_5","OK-iCE40Pro","pico-ice"]},{"type":"ECP5","boards":["ulx3s-12f","ulx3s-25f","ulx3s-45f","ulx3s-85f","Butterstick-r10-2g-85k","Butterstick-r10-2g-85k_(FT2232H)","Butterstick-r10-2g-85k_(FT232H)","orangecrab-r02-25f","orangecrab-r02-85f","ColorLight-5A-75B-V61","ColorLight-5A-75B-V7","ColorLight-5A-75B-V8","ColorLight-5A-75E-V6","ColorLight-5A-75E-V71_(FT2232H)","ColorLight-5A-75E-V71_(FT232H)","ColorLight-5A-75E-V71_(USB-Blaster)","ColorLight-i5-v7.0_(FT2232H)","ColorLight-i5-v7.0_(FT232H)","ColorLight-i5-v7.0_(USB-Blaster)","iCESugar-Pro_(FT2232H)","iCESugar-Pro_(FT232H)","iCESugar-Pro_(USB-Blaster)","FleaFPGA-Ohm_(FT2232H)","FleaFPGA-Ohm_(FT232H)","FleaFPGA-Ohm_(USB-Blaster)","ECP5-Evaluation-Board","ECP5-Mini-12_(FT2232H)","ECP5-Mini-25_(FT2232H)","ColorLight-i9-v7.2_(FT2232H)","ColorLight-i9-v7.2_(FT232H)","ColorLight-i9-v7.2_(USB-Blaster)"]}] \ No newline at end of file +[{"type":"HX1K","boards":["icezum","go-board","icestick"]},{"type":"HX8K","boards":["Alchitry-Cu","alhambra-ii","blackice","blackice-ii","blackice-mx","edu-ciaa-fpga","icoboard","kefir","iCE40-HX8K","icefun","iceWerx","ThetaMachines-ETH4K"]},{"type":"LP8K","boards":["TinyFPGA-B2","TinyFPGA-BX"]},{"type":"LP1K","boards":["iCESugar-nano"]},{"type":"U4K","boards":["ODT_IcyBlue_Feather", "ODT_RPGA_Feather"]},{"type":"UP5K","boards":["MCH2022_badge","iCEBreaker","iCEBreaker-bitsy0","iCEBreaker-bitsy1","upduino","upduino2","upduino21","upduino3","upduino31","fpga101","iCE40-UP5K","fomu","iCESugar_1_5","OK-iCE40Pro","pico-ice"]},{"type":"ECP5","boards":["ulx3s-12f","ulx3s-25f","ulx3s-45f","ulx3s-85f","Butterstick-r10-2g-85k","Butterstick-r10-2g-85k_(FT2232H)","Butterstick-r10-2g-85k_(FT232H)","orangecrab-r02-25f","orangecrab-r02-85f","ColorLight-5A-75B-V61","ColorLight-5A-75B-V7","ColorLight-5A-75B-V8","ColorLight-5A-75E-V6","ColorLight-5A-75E-V71_(FT2232H)","ColorLight-5A-75E-V71_(FT232H)","ColorLight-5A-75E-V71_(USB-Blaster)","ColorLight-i5-v7.0_(FT2232H)","ColorLight-i5-v7.0_(FT232H)","ColorLight-i5-v7.0_(USB-Blaster)","iCESugar-Pro_(FT2232H)","iCESugar-Pro_(FT232H)","iCESugar-Pro_(USB-Blaster)","FleaFPGA-Ohm_(FT2232H)","FleaFPGA-Ohm_(FT232H)","FleaFPGA-Ohm_(USB-Blaster)","ECP5-Evaluation-Board","ECP5-Mini-12_(FT2232H)","ECP5-Mini-25_(FT2232H)","ColorLight-i9-v7.2_(FT2232H)","ColorLight-i9-v7.2_(FT232H)","ColorLight-i9-v7.2_(USB-Blaster)"]}] \ No newline at end of file From 47e2ab464ef2fbf9ccb23481023fbeb81a1fca4b Mon Sep 17 00:00:00 2001 From: Seth Kerr <thesethkerr@gmail.com> Date: Sun, 23 Jun 2024 15:51:35 -0600 Subject: [PATCH 3/3] fix info.json for both boards --- .../boards/ODT_IcyBlue_Feather/info.json | 16 +++++++++++++--- app/resources/boards/ODT_RPGA_Feather/info.json | 15 ++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/resources/boards/ODT_IcyBlue_Feather/info.json b/app/resources/boards/ODT_IcyBlue_Feather/info.json index 3bf08b480..b7aeb59f1 100644 --- a/app/resources/boards/ODT_IcyBlue_Feather/info.json +++ b/app/resources/boards/ODT_IcyBlue_Feather/info.json @@ -1,3 +1,13 @@ -{"label":"icyBlue","datasheet":"https://github.com/Oak-Development-Technologies/IcyBlue/blob/main/Documentation/IcyBlue%20Feather%20V2%20Datasheet%20rev1a.docx", - "interface":"FTDI","FPGAResources": {"ffs":3520,"luts":3520, - "pios":27,"plbs":440,"brams":20}} \ No newline at end of file +{"label":"icyBlue", + "device":"U4K", + "datasheet":"https://github.com/Oak-Development-Technologies/IcyBlue/blob/main/Documentation/IcyBlue%20Feather%20V2%20Datasheet%20rev1a.docx", + "interface":"FTDI", + "FPGAResources": + { + "ffs":3520, + "luts":3520, + "pios":27, + "plbs":440, + "brams":20 + } +} \ No newline at end of file diff --git a/app/resources/boards/ODT_RPGA_Feather/info.json b/app/resources/boards/ODT_RPGA_Feather/info.json index b42112be4..1c86470ab 100644 --- a/app/resources/boards/ODT_RPGA_Feather/info.json +++ b/app/resources/boards/ODT_RPGA_Feather/info.json @@ -1,3 +1,12 @@ -{"label":"RPGA Feather","datasheet":"https://github.com/Oak-Development-Technologies/RPGA%20Feather/", - "interface":"MCU","FPGAResources": {"ffs":3520,"luts":3520, - "pios":27,"plbs":440,"brams":20}} \ No newline at end of file +{"label":"RPGA Feather", + "device":"U4K", + "datasheet":"https://github.com/Oak-Development-Technologies/RPGA%20Feather/", + "interface":"MCU", + "FPGAResources": { + "ffs":3520, + "luts":3520, + "pios":12, + "plbs":440, + "brams":20 + } +} \ No newline at end of file