mirror of
https://github.com/tillitis/tillitis-key1.git
synced 2025-01-17 02:17:14 -05:00
Add bootloader command, SPI clock speed setting
This commit is contained in:
parent
d09919d354
commit
3fd4ec44b4
@ -46,7 +46,11 @@ class Nvcm():
|
|||||||
0x21: "ICE40UP3K",
|
0x21: "ICE40UP3K",
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, pins: dict, debug: bool = False) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
pins: dict,
|
||||||
|
spi_speed: int = 12,
|
||||||
|
debug: bool = False) -> None:
|
||||||
self.pins = pins
|
self.pins = pins
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
|
|
||||||
@ -68,7 +72,8 @@ class Nvcm():
|
|||||||
pins['sck'],
|
pins['sck'],
|
||||||
pins['ss'],
|
pins['ss'],
|
||||||
pins['mosi'],
|
pins['mosi'],
|
||||||
pins['miso']
|
pins['miso'],
|
||||||
|
spi_speed
|
||||||
)
|
)
|
||||||
|
|
||||||
def power_on(self) -> None:
|
def power_on(self) -> None:
|
||||||
@ -496,7 +501,8 @@ def sleep_flash(pins: dict) -> None:
|
|||||||
pins['sck'],
|
pins['sck'],
|
||||||
pins['ss'],
|
pins['ss'],
|
||||||
pins['miso'],
|
pins['miso'],
|
||||||
pins['mosi']
|
pins['mosi'],
|
||||||
|
12
|
||||||
)
|
)
|
||||||
|
|
||||||
flasher.spi_bitbang(bytes([0xAB]))
|
flasher.spi_bitbang(bytes([0xAB]))
|
||||||
|
@ -14,7 +14,7 @@ class ice40_flasher:
|
|||||||
FLASHER_REQUEST_SPI_BITBANG_NO_CS = 0x42
|
FLASHER_REQUEST_SPI_BITBANG_NO_CS = 0x42
|
||||||
FLASHER_REQUEST_SPI_PINS_SET = 0x43
|
FLASHER_REQUEST_SPI_PINS_SET = 0x43
|
||||||
FLASHER_REQUEST_ADC_READ = 0x50
|
FLASHER_REQUEST_ADC_READ = 0x50
|
||||||
FLASHER_REQUEST_BOOTLOADRE = 0xFF
|
FLASHER_REQUEST_BOOTLOADER = 0xFF
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
# See:
|
# See:
|
||||||
@ -117,7 +117,8 @@ class ice40_flasher:
|
|||||||
sck_pin: int,
|
sck_pin: int,
|
||||||
cs_pin: int,
|
cs_pin: int,
|
||||||
mosi_pin: int,
|
mosi_pin: int,
|
||||||
miso_pin: int) -> None:
|
miso_pin: int,
|
||||||
|
clock_speed: int) -> None:
|
||||||
"""Set the pins to use for SPI transfers
|
"""Set the pins to use for SPI transfers
|
||||||
|
|
||||||
Keyword arguments:
|
Keyword arguments:
|
||||||
@ -126,11 +127,12 @@ class ice40_flasher:
|
|||||||
mosi_pin -- GPIO pin number to use as the MOSI signal
|
mosi_pin -- GPIO pin number to use as the MOSI signal
|
||||||
miso_pin -- GPIO pin number to use as the MISO signal
|
miso_pin -- GPIO pin number to use as the MISO signal
|
||||||
"""
|
"""
|
||||||
header = struct.pack('>BBBB',
|
header = struct.pack('>BBBBB',
|
||||||
sck_pin,
|
sck_pin,
|
||||||
cs_pin,
|
cs_pin,
|
||||||
mosi_pin,
|
mosi_pin,
|
||||||
miso_pin)
|
miso_pin,
|
||||||
|
clock_speed)
|
||||||
msg = bytearray()
|
msg = bytearray()
|
||||||
msg.extend(header)
|
msg.extend(header)
|
||||||
|
|
||||||
@ -150,7 +152,7 @@ class ice40_flasher:
|
|||||||
|
|
||||||
ret = bytearray()
|
ret = bytearray()
|
||||||
|
|
||||||
max_chunk_size = (1024 - 8)
|
max_chunk_size = (2048 - 8)
|
||||||
for i in range(0, len(buf), max_chunk_size):
|
for i in range(0, len(buf), max_chunk_size):
|
||||||
chunk = buf[i:i + max_chunk_size]
|
chunk = buf[i:i + max_chunk_size]
|
||||||
ret.extend(
|
ret.extend(
|
||||||
@ -180,7 +182,7 @@ class ice40_flasher:
|
|||||||
|
|
||||||
byte_length = (bit_count + 7) // 8
|
byte_length = (bit_count + 7) // 8
|
||||||
|
|
||||||
if byte_length > (1024 - 8):
|
if byte_length > (2048 - 8):
|
||||||
print(
|
print(
|
||||||
'Message too large, bit_count:{:}'.format(bit_count))
|
'Message too large, bit_count:{:}'.format(bit_count))
|
||||||
exit(1)
|
exit(1)
|
||||||
@ -210,6 +212,11 @@ class ice40_flasher:
|
|||||||
|
|
||||||
return msg_in
|
return msg_in
|
||||||
|
|
||||||
|
def nvcm_command(self, cmd: bytes) -> None:
|
||||||
|
"""NVCM fast path: Run a command on the NVCM memory, then
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
def adc_read_all(self) -> tuple[float, float, float]:
|
def adc_read_all(self) -> tuple[float, float, float]:
|
||||||
"""Read the voltage values of ADC 0, 1, and 2
|
"""Read the voltage values of ADC 0, 1, and 2
|
||||||
|
|
||||||
@ -221,8 +228,21 @@ class ice40_flasher:
|
|||||||
|
|
||||||
return ch0 / 1000000, ch1 / 1000000, ch2 / 1000000
|
return ch0 / 1000000, ch1 / 1000000, ch2 / 1000000
|
||||||
|
|
||||||
|
def bootloader(self) -> None:
|
||||||
|
"""Reset the programmer to bootloader mode
|
||||||
|
|
||||||
|
After the device is reset, it can be programmed using
|
||||||
|
picotool, or by copying a file to the uf2 drive.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
self._write(self.FLASHER_REQUEST_BOOTLOADER, bytes())
|
||||||
|
except usb.core.USBError:
|
||||||
|
# We expect the device to disappear immediately, so mask
|
||||||
|
# the resulting error
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
flasher = ice40_flasher()
|
flasher = ice40_flasher()
|
||||||
print(flasher.gpio_get_all())
|
|
||||||
print(flasher.adc_read_all())
|
flasher.spi_pins_set(1, 2, 3, 4, 15)
|
||||||
|
Loading…
Reference in New Issue
Block a user