|  | # Copyright (c) 2022 Meta | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | description: Lattice iCE40 FPGA | 
|  |  | 
|  | compatible: "lattice,ice40-fpga" | 
|  |  | 
|  | include: spi-device.yaml | 
|  |  | 
|  | properties: | 
|  | load-mode: | 
|  | type: int | 
|  | required: true | 
|  | description: | | 
|  | Configure the method used to load the bitstream. | 
|  | The bitstream may be loaded via 2 separate methods: | 
|  | 0 := load the FPGA via SPI transfer | 
|  | 1 := load the FPGA via bit-banged GPIO | 
|  | Option 0 may be suitable for some high-end microcontrollers. | 
|  | Option 1 is suitable for low-end microcontrollers. This option | 
|  | requires clk-gpios, pico-gpios, gpios-set-reg, and gpios-clear-reg | 
|  | to be defined. | 
|  | Example usage: | 
|  | load-mode = <0>; | 
|  | cdone-gpios: | 
|  | type: phandle-array | 
|  | required: true | 
|  | description: | | 
|  | Configuration Done output from iCE40. | 
|  | Example usage: | 
|  | cdone-gpios = <&gpio0 0 0>; | 
|  | creset-gpios: | 
|  | type: phandle-array | 
|  | required: true | 
|  | description: | | 
|  | Configuration Reset input on iCE40. | 
|  | Example usage: | 
|  | creset-gpios = <&gpio0 1 GPIO_PUSH_PULL); | 
|  | clk-gpios: | 
|  | type: phandle-array | 
|  | description: | | 
|  | SPI Clock GPIO input on iCE40. | 
|  | Example usage: | 
|  | clk-gpios = <&gpio0 5 GPIO_PUSH_PULL>; | 
|  | pico-gpios: | 
|  | type: phandle-array | 
|  | description: | | 
|  | Peripheral-In Controller-Out GPIO input on iCE40. | 
|  | Example usage: | 
|  | pico-gpios = <&gpio0 7 GPIO_PUSH_PULL>; | 
|  | gpios-set-reg: | 
|  | type: int | 
|  | description: | | 
|  | Register address for setting a GPIO. | 
|  | Example usage: | 
|  | gpios-set-reg = <0x60004008>; | 
|  | gpios-clear-reg: | 
|  | type: int | 
|  | description: | | 
|  | Register address for clearing a GPIO. | 
|  | Example usage: | 
|  | gpios-clear-reg = <0x6000400c>; | 
|  | mhz-delay-count: | 
|  | type: int | 
|  | description: | | 
|  | in order to create a 1 MHz square wave in the following | 
|  | process. | 
|  | while(true) { | 
|  | *gpios_set_reg |= BIT(n); | 
|  | for(int i = mhz_delay_count; i > 0; --i); | 
|  | *gpios_clear_reg |= BIT(n); | 
|  | for(int i = mhz_delay_count; i > 0; --i); | 
|  | } | 
|  | Example usage / default: | 
|  | mhz-delay-count = <0>; | 
|  | creset-delay-us: | 
|  | type: int | 
|  | description: | | 
|  | Delay (in microseconds) between asserting CRESET_B and releasing CRESET_B. | 
|  | Example usage / default: | 
|  | creset-delay-us = <1>; | 
|  | config-delay-us: | 
|  | type: int | 
|  | description: | | 
|  | Delay (in microseconds) after releasing CRESET_B to clear internal configuration memory. | 
|  | Example usage / default: | 
|  | config-delay-us = <1200>; | 
|  | leading-clocks: | 
|  | type: int | 
|  | description: | | 
|  | Prior to sending the bitstream, issue this number of leading clocks with SPI_CS pulled high. | 
|  | Example usage / default: | 
|  | leading-clocks = <8>; | 
|  | trailing-clocks: | 
|  | type: int | 
|  | description: | | 
|  | After sending the bitstream, issue this number of trailing clocks with SPI_CS pulled high. | 
|  | Example usage / default: | 
|  | trailing-clocks = <49>; |