QuickFeather 1.2

QuickFeather is a development board adopting QuickLogic's EOS S3 SOC.

1. Introduction

1.1 lsusb

1
2
3
......
Bus 011 Device 016: ID 1d50:6140 OpenMoko, Inc.
......

1.2 Openmoko

So cool. For Openmoko, please refer to:

1.3 Spec

  • All details can be found at QuickLogic's EOS S3 page.
  • In fact, the content on the QuickFeather crowdsupply website is also comprehensive and includes all necessary information.

1.4 Github Source Code

2. Flash the Firmware

2.1 Preparation

Please strictly follow: - the videos on QuickLogic's official website QuickFeather Development Kit - the installation steps on TinyFPGA-Programmer-Application

2.1.1 Highlight 1 - qfprog

In my .bashrc and .zshrc, the following line is added.

1
alias qfprog="python3 /opt/TinyFPGA-Programmer-Application/tinyfpga-programmer-gui.py"

2.1.2 Highlight 2 - tinyfpgaa and tinyfpgab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜  ~ pip show tinyfpgab
Name: tinyfpgab
Version: 1.1.0
Summary: Programmer for the TinyFPGA B2 boards (http://tinyfpga.com)
Home-page: https://github.com/tinyfpga/TinyFPGA-B-Series/tree/master/programmer
Author: Luke Valenty
Author-email: lvalenty@gmail.com
License:
Location: ~/.local/lib/python3.10/site-packages
Requires: pyserial
Required-by:
➜ ~ pip show tinyfpgaa
Name: tinyfpgaa
Version: 0.9.0
Summary: A small example package
Home-page: https://github.com/tinyfpga/TinyFPGA-A-Programmer
Author: William D. Jones
Author-email: thor0505@comcast.net
License:
Location: ~/.local/lib/python3.10/site-packages/tinyfpgaa-0.9.0-py3.10.egg
Requires:
Required-by:

2.2 Now Let's Flash

2.2.1 Flash Bootloader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
➜  qorc-sdk git:(master) ✗ qfprog --port=/dev/ttyACM0 --bl ./qf_apps/quickfeather-initial-binaries/qf_bootloader.bin
CLI mode
ports = ['/dev/ttyACM0 (QuickFeather)'] 1
Using port /dev/ttyACM0 (QuickFeather)
Programming bootloader with ./qf_apps/quickfeather-initial-binaries/qf_bootloader.bin
Erasing designated flash pages
Erase 32.0 KiB ( 0x52 ) at 0x0
Erase 4.0 KiB ( 0x20 ) at 0x8000
Erase 4.0 KiB ( 0x20 ) at 0x9000
Writing binary
Write 40340 bytes
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
Verifying binary
FastREAD 0x0B ( 40340 )
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
Success: read_back == data
Writing metadata
Erasing designated flash pages
Erase 4.0 KiB ( 0x20 ) at 0x1f000
Writing metadata
Write 8 bytes
[X] ]
Verifying metadata
FastREAD 0x0B ( 8 )
[X] ]
Success: read_back == data

2.2.2 Flash BootFPGA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
➜  qorc-sdk git:(master) ✗ qfprog --port=/dev/ttyACM0 --bootfpga ./qf_apps/quickfeather-initial-binaries/qf_bootfpga.bin
CLI mode
ports = ['/dev/ttyACM0 (QuickFeather)'] 1
Using port /dev/ttyACM0 (QuickFeather)
Programming FPGA image used during programming ./qf_apps/quickfeather-initial-binaries/qf_bootfpga.bin
Erasing designated flash pages
Erase 64.0 KiB ( 0xd8 ) at 0x20000
Erase 4.0 KiB ( 0x20 ) at 0x30000
Erase 4.0 KiB ( 0x20 ) at 0x31000
Erase 4.0 KiB ( 0x20 ) at 0x32000
Writing binary
Write 75960 bytes
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
Verifying binary
FastREAD 0x0B ( 75960 )
[XXXXXXXXXXXXXXXXXXXXXXXXXXXXTraceback (most recent call last):
File "/opt/TinyFPGA-Programmer-Application/tinyfpga-programmer-gui.py", line 206, in program
fpga.program_bitstream(addr, bitstream, "binary")
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 311, in program_bitstream
if self.program(addr, bitstream, what):
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 237, in program
read_back = self.read(addr, len(data))
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 72, in read
data += self.cmd(0x0b, addr, b'\x00', read_len=read_length)
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 45, in cmd
response = self.ser.read(read_len)
File "~/.local/lib/python3.10/site-packages/serial/serialposix.py", line 595, in read
raise SerialException(
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Writing metadata
Erasing designated flash pages
Traceback (most recent call last):
File "~/.local/lib/python3.10/site-packages/serial/serialposix.py", line 621, in write
n = os.write(self.fd, d)
OSError: [Errno 5] Input/output error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/opt/TinyFPGA-Programmer-Application/tinyfpga-programmer-gui.py", line 218, in program
fpga.program_bitstream(meta_addr, meta_bitstream, "metadata")
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 311, in program_bitstream
if self.program(addr, bitstream, what):
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 229, in program
self.quick_erase(addr, len(data))
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 179, in quick_erase
self._erase(start_addr, 0x1000)
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 108, in _erase
self.write_enable()
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 86, in write_enable
self.cmd(0x06)
File "/opt/TinyFPGA-Programmer-Application/q-series/python/tinyfpgaq.py", line 43, in cmd
self.ser.write(bytearray(cmd_write_string))
File "~/.local/lib/python3.10/site-packages/serial/serialposix.py", line 655, in write
raise SerialException('write failed: {}'.format(e))
serial.serialutil.SerialException: write failed: [Errno 5] Input/output error

2.2.3 Bricked

Unfortunately, my QuickFeather is bricked. Whenever reset or even entering user mode, the LED on QuickFeather turns to red in the end.