first commit
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 54 KiB |
@@ -0,0 +1,206 @@
|
||||
#!/usr/bin/env python2
|
||||
#
|
||||
# Intel HEX to ST microelectronics DfuSe file converter
|
||||
# Copyright (C)2015 Thomas Kindler <mail@t-kindler.de>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
import os
|
||||
import struct
|
||||
import argparse
|
||||
from zlib import crc32
|
||||
from intelhex import IntelHex
|
||||
|
||||
|
||||
def load_hex():
|
||||
"""
|
||||
Load hex or binary file.
|
||||
:return: intelhex object
|
||||
"""
|
||||
if args.verbose:
|
||||
print "Loading %s..." % args.source
|
||||
|
||||
try:
|
||||
ih = IntelHex()
|
||||
|
||||
if args.format == "hex":
|
||||
ih.loadhex(args.source)
|
||||
else:
|
||||
ih.loadbin(args.source, args.start_addr)
|
||||
|
||||
except Exception, e:
|
||||
print e
|
||||
exit(1)
|
||||
|
||||
if args.verbose:
|
||||
print " Start: 0x%08x" % ih.minaddr()
|
||||
print " End : 0x%08x" % ih.maxaddr()
|
||||
|
||||
return ih
|
||||
|
||||
|
||||
def save_dfu(ih):
|
||||
"""
|
||||
Save as STMicroelectronics DfuSe file.
|
||||
see UM0391 - DfuSe File Format Specification
|
||||
|
||||
:param ih: intelhex object
|
||||
"""
|
||||
if args.verbose:
|
||||
print "Saving %s..." % args.target
|
||||
print " Device ID: 0x%04x:0x%04x" % (args.vid, args.pid)
|
||||
print " Target name: %s" % args.target_name
|
||||
|
||||
# Image element
|
||||
#
|
||||
image_data = ih.tobinstr()
|
||||
|
||||
data = struct.pack(
|
||||
"<II",
|
||||
ih.minaddr(), # dwElementAddress
|
||||
len(image_data) # dwElementSize
|
||||
) + image_data # Data
|
||||
|
||||
# Target prefix
|
||||
#
|
||||
szTargetName = args.target_name.encode("ascii")
|
||||
|
||||
data = struct.pack(
|
||||
"<6sBI255sII",
|
||||
b"Target", # szSignature
|
||||
0, # bAlternateSetting
|
||||
1, # bTargetNamed
|
||||
szTargetName, # szTargetName
|
||||
len(data), # dwTargetSize
|
||||
1 # dwNbElements
|
||||
) + data
|
||||
|
||||
# Prefix
|
||||
#
|
||||
data = struct.pack(
|
||||
"<5sBIB",
|
||||
b"DfuSe", # szSignature
|
||||
0x01, # bVersion,
|
||||
len(data)+11, # DFUImageSize,
|
||||
1 # bTargets
|
||||
) + data
|
||||
|
||||
# Suffix
|
||||
#
|
||||
data += struct.pack(
|
||||
"<HHHH3sB",
|
||||
0xFFFF, # bcdDevice
|
||||
args.pid, # idProduct
|
||||
args.vid, # idVendor
|
||||
0x011a, # bdcDFU
|
||||
b"UFD", # ucDfuSignature
|
||||
16 # bLength
|
||||
)
|
||||
|
||||
dwCRC = ~crc32(data) & 0xFFFFFFFF
|
||||
|
||||
data += struct.pack(
|
||||
"<I",
|
||||
dwCRC # dwCRC
|
||||
)
|
||||
|
||||
try:
|
||||
open(args.target, "wb").write(data)
|
||||
|
||||
except Exception, e:
|
||||
print e
|
||||
exit(1)
|
||||
|
||||
|
||||
# Parse arguments
|
||||
#
|
||||
DEFAULT_DEVICE = "0x0483:0xdf11"
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Convert hex files to STMicroelectronics DfuSe format"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--version",
|
||||
action="version",
|
||||
version="%(prog)s 1.1.0"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-q", "--quiet", dest="verbose",
|
||||
default=True,
|
||||
action="store_false",
|
||||
help="do not print status messages"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"source", help="source file"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"target", nargs = "?",
|
||||
help="target file"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-f", "--format",
|
||||
default="hex", choices=["hex", "bin"],
|
||||
help="source file format (default: %(default)s)"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-s", "--start", dest="start_addr",
|
||||
help="set start address (for bin files)"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-d", "--device",
|
||||
default=DEFAULT_DEVICE,
|
||||
help="device VID:PID (default: %(default)s)"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-n", "--name", dest="target_name",
|
||||
default="application",
|
||||
help="target name (default: %(default)s)"
|
||||
)
|
||||
|
||||
args=parser.parse_args()
|
||||
|
||||
# Check arguments
|
||||
#
|
||||
if args.target == None:
|
||||
(root, ext) = os.path.splitext(args.source)
|
||||
args.target = root + ".dfu"
|
||||
|
||||
|
||||
if args.format == "bin":
|
||||
if args.start_addr == None:
|
||||
print "option --start required for binary files"
|
||||
exit(1)
|
||||
|
||||
args.start_addr = int(args.start_addr, 0)
|
||||
else:
|
||||
if args.start_addr != None:
|
||||
print "option --start not allowed for hex files"
|
||||
exit(1)
|
||||
|
||||
|
||||
args.vid = int(args.device.split(':', 1)[0], 0)
|
||||
args.pid = int(args.device.split(':', 1)[1], 0)
|
||||
|
||||
|
||||
# Convert file
|
||||
#
|
||||
save_dfu( load_hex() )
|
||||
@@ -0,0 +1,357 @@
|
||||
#!/usr/bin/python
|
||||
# (c) Alexander Belchenko, 2007, 2009
|
||||
|
||||
"""Benchmarking.
|
||||
|
||||
Run each test 3 times and get median value.
|
||||
Using 10K array as base test time.
|
||||
|
||||
Each other test compared with base with next formula::
|
||||
|
||||
Tc * Nb
|
||||
q = ---------
|
||||
Tb * Nc
|
||||
|
||||
Here:
|
||||
|
||||
* Tc - execution time of current test
|
||||
* Tb - execution time of base
|
||||
* Nb - array size of base (10K)
|
||||
* Nc - array size of current test
|
||||
|
||||
If resulting value is ``q <= 1.0`` it's the best possible result,
|
||||
i.e. time increase proportionally to array size.
|
||||
"""
|
||||
|
||||
from cStringIO import StringIO
|
||||
import gc
|
||||
import sys
|
||||
import time
|
||||
|
||||
import intelhex
|
||||
|
||||
|
||||
def median(values):
|
||||
"""Return median value for the list of values.
|
||||
@param values: list of values for processing.
|
||||
@return: median value.
|
||||
"""
|
||||
values.sort()
|
||||
n = int(len(values) / 2)
|
||||
return values[n]
|
||||
|
||||
def run_test(func, fobj):
|
||||
"""Run func with argument fobj and measure execution time.
|
||||
@param func: function for test
|
||||
@param fobj: data for test
|
||||
@return: execution time
|
||||
"""
|
||||
gc.disable()
|
||||
try:
|
||||
begin = time.time()
|
||||
func(fobj)
|
||||
end = time.time()
|
||||
finally:
|
||||
gc.enable()
|
||||
return end - begin
|
||||
|
||||
def run_readtest_N_times(func, hexstr, n):
|
||||
"""Run each test N times.
|
||||
@param func: function for test
|
||||
@param hexstr: string with content of hex file to read
|
||||
@param n: times to repeat.
|
||||
@return: (median time, times list)
|
||||
"""
|
||||
assert n > 0
|
||||
times = []
|
||||
for i in xrange(n):
|
||||
sio = StringIO(hexstr)
|
||||
times.append(run_test(func, sio))
|
||||
sio.close()
|
||||
t = median(times)
|
||||
return t, times
|
||||
|
||||
def run_writetest_N_times(func, n):
|
||||
"""Run each test N times.
|
||||
@param func: function for test
|
||||
@param n: times to repeat.
|
||||
@return: (median time, times list)
|
||||
"""
|
||||
assert n > 0
|
||||
times = []
|
||||
for i in xrange(n):
|
||||
sio = StringIO()
|
||||
times.append(run_test(func, sio))
|
||||
sio.close()
|
||||
t = median(times)
|
||||
return t, times
|
||||
|
||||
def time_coef(tc, nc, tb, nb):
|
||||
"""Return time coefficient relative to base numbers.
|
||||
@param tc: current test time
|
||||
@param nc: current test data size
|
||||
@param tb: base test time
|
||||
@param nb: base test data size
|
||||
@return: time coef.
|
||||
"""
|
||||
tc = float(tc)
|
||||
nc = float(nc)
|
||||
tb = float(tb)
|
||||
nb = float(nb)
|
||||
q = (tc * nb) / (tb * nc)
|
||||
return q
|
||||
|
||||
def get_test_data(n1, offset, n2):
|
||||
"""Create test data on given pattern.
|
||||
@param n1: size of first part of array at base address 0.
|
||||
@param offset: offset for second part of array.
|
||||
@param n2: size of second part of array at given offset.
|
||||
@return: (overall size, hex file, IntelHex object)
|
||||
"""
|
||||
# make IntelHex object
|
||||
ih = intelhex.IntelHex()
|
||||
addr = 0
|
||||
for i in xrange(n1):
|
||||
ih[addr] = addr % 256
|
||||
addr += 1
|
||||
addr += offset
|
||||
for i in xrange(n2):
|
||||
ih[addr] = addr % 256
|
||||
addr += 1
|
||||
# make hex file
|
||||
sio = StringIO()
|
||||
ih.write_hex_file(sio)
|
||||
hexstr = sio.getvalue()
|
||||
sio.close()
|
||||
#
|
||||
return n1+n2, hexstr, ih
|
||||
|
||||
def get_base_10K():
|
||||
"""Base 10K"""
|
||||
return get_test_data(10000, 0, 0)
|
||||
|
||||
def get_100K():
|
||||
return get_test_data(100000, 0, 0)
|
||||
|
||||
def get_100K_100K():
|
||||
return get_test_data(100000, 1000000, 100000)
|
||||
|
||||
def get_0_100K():
|
||||
return get_test_data(0, 1000000, 100000)
|
||||
|
||||
def get_1M():
|
||||
return get_test_data(1000000, 0, 0)
|
||||
|
||||
|
||||
class Measure(object):
|
||||
"""Measure execution time helper."""
|
||||
|
||||
data_set = [
|
||||
# (data name, getter)
|
||||
('base 10K', get_base_10K), # first should be base numbers
|
||||
('100K', get_100K),
|
||||
('1M', get_1M),
|
||||
('100K+100K', get_100K_100K),
|
||||
('0+100K', get_0_100K),
|
||||
]
|
||||
|
||||
def __init__(self, n=3, read=True, write=True):
|
||||
self.n = n
|
||||
self.read = read
|
||||
self.write = write
|
||||
self.results = []
|
||||
|
||||
def measure_one(self, data):
|
||||
"""Do measuring of read and write operations.
|
||||
@param data: 3-tuple from get_test_data
|
||||
@return: (time readhex, time writehex)
|
||||
"""
|
||||
_unused, hexstr, ih = data
|
||||
tread, twrite = 0.0, 0.0
|
||||
if self.read:
|
||||
tread = run_readtest_N_times(intelhex.IntelHex, hexstr, self.n)[0]
|
||||
if self.write:
|
||||
twrite = run_writetest_N_times(ih.write_hex_file, self.n)[0]
|
||||
return tread, twrite
|
||||
|
||||
def measure_all(self):
|
||||
for name, getter in self.data_set:
|
||||
data = getter()
|
||||
times = self.measure_one(data)
|
||||
self.results.append((name, times, data[0]))
|
||||
|
||||
def print_report(self, to_file=None):
|
||||
if to_file is None:
|
||||
to_file = sys.stdout
|
||||
|
||||
base_title, base_times, base_n = self.results[0]
|
||||
base_read, base_write = base_times
|
||||
read_report = ['%-10s\t%7.3f' % (base_title, base_read)]
|
||||
write_report = ['%-10s\t%7.3f' % (base_title, base_write)]
|
||||
|
||||
for item in self.results[1:]:
|
||||
cur_title, cur_times, cur_n = item
|
||||
cur_read, cur_write = cur_times
|
||||
if self.read:
|
||||
qread = time_coef(cur_read, cur_n,
|
||||
base_read, base_n)
|
||||
read_report.append('%-10s\t%7.3f\t%7.3f' % (cur_title,
|
||||
cur_read,
|
||||
qread))
|
||||
if self.write:
|
||||
qwrite = time_coef(cur_write, cur_n,
|
||||
base_write, base_n)
|
||||
write_report.append('%-10s\t%7.3f\t%7.3f' % (cur_title,
|
||||
cur_write,
|
||||
qwrite))
|
||||
if self.read:
|
||||
to_file.write('Read operation:\n')
|
||||
to_file.write('\n'.join(read_report))
|
||||
to_file.write('\n\n')
|
||||
if self.write:
|
||||
to_file.write('Write operation:\n')
|
||||
to_file.write('\n'.join(write_report))
|
||||
to_file.write('\n\n')
|
||||
|
||||
|
||||
HELP = """\
|
||||
Usage: python _bench.py [OPTIONS]
|
||||
|
||||
Options:
|
||||
-h this help
|
||||
-n N repeat tests N times
|
||||
-r run only tests for read operation
|
||||
-w run only tests for write operation
|
||||
|
||||
If option -r or -w is not specified then all tests will be run.
|
||||
"""
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
"""Main function to run benchmarks.
|
||||
@param argv: command-line arguments.
|
||||
@return: exit code (0 is OK).
|
||||
"""
|
||||
import getopt
|
||||
|
||||
# default values
|
||||
test_read = None
|
||||
test_write = None
|
||||
n = 3 # number of repeat
|
||||
|
||||
if argv is None:
|
||||
argv = sys.argv[1:]
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(argv, 'hn:rw', [])
|
||||
|
||||
for o,a in opts:
|
||||
if o == '-h':
|
||||
print(HELP)
|
||||
return 0
|
||||
elif o == '-n':
|
||||
n = int(a)
|
||||
elif o == '-r':
|
||||
test_read = True
|
||||
elif o == '-w':
|
||||
test_write = True
|
||||
|
||||
if args:
|
||||
raise getopt.GetoptError('Arguments are not used.')
|
||||
except getopt.GetoptError, msg:
|
||||
txt = str(msg)
|
||||
print(txt)
|
||||
return 1
|
||||
|
||||
if (test_read, test_write) == (None, None):
|
||||
test_read = test_write = True
|
||||
|
||||
m = Measure(n, test_read, test_write)
|
||||
m.measure_all()
|
||||
m.print_report()
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
|
||||
|
||||
"""
|
||||
|
||||
Some Results
|
||||
************
|
||||
|
||||
|
||||
21/04/2007 revno.40
|
||||
Python 2.5 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.031
|
||||
100K 0.360 1.161
|
||||
1M 3.500 1.129
|
||||
100K+100K 0.719 1.160
|
||||
0+100K 0.360 1.161
|
||||
|
||||
Write operation:
|
||||
base 10K 0.031
|
||||
100K 0.297 0.958
|
||||
1M 2.953 0.953
|
||||
100K+100K 1.328 2.142
|
||||
0+100K 0.312 1.006
|
||||
|
||||
|
||||
21/04/2007 revno.46
|
||||
Python 2.5 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.016
|
||||
100K 0.203 1.269
|
||||
1M 2.000 1.250
|
||||
100K+100K 0.422 1.319
|
||||
0+100K 0.203 1.269
|
||||
|
||||
Write operation:
|
||||
base 10K 0.031
|
||||
100K 0.297 0.958
|
||||
1M 2.969 0.958
|
||||
100K+100K 1.328 2.142
|
||||
0+100K 0.312 1.006
|
||||
|
||||
|
||||
22/04/2007 revno.48
|
||||
Python 2.5 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.016
|
||||
100K 0.187 1.169
|
||||
1M 1.891 1.182
|
||||
100K+100K 0.406 1.269
|
||||
0+100K 0.188 1.175
|
||||
|
||||
Write operation:
|
||||
base 10K 0.031
|
||||
100K 0.296 0.955
|
||||
1M 2.969 0.958
|
||||
100K+100K 1.328 2.142
|
||||
0+100K 0.312 1.006
|
||||
|
||||
|
||||
19/08/2008 revno.72
|
||||
Python 2.5.2 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.016
|
||||
100K 0.171 1.069
|
||||
1M 1.734 1.084
|
||||
100K+100K 0.375 1.172
|
||||
0+100K 0.172 1.075
|
||||
|
||||
Write operation:
|
||||
base 10K 0.016
|
||||
100K 0.156 0.975
|
||||
1M 1.532 0.957
|
||||
100K+100K 0.344 1.075
|
||||
0+100K 0.156 0.975
|
||||
|
||||
"""
|
||||
@@ -0,0 +1,57 @@
|
||||
# Copyright (c) 2011, Bernhard Leiner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms,
|
||||
# with or without modification, are permitted provided
|
||||
# that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain
|
||||
# the above copyright notice, this list of conditions
|
||||
# and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce
|
||||
# the above copyright notice, this list of conditions
|
||||
# and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author nor the names
|
||||
# of its contributors may be used to endorse
|
||||
# or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
'''Compatibility functions for python 2 and 3.
|
||||
|
||||
@author Bernhard Leiner (bleiner AT gmail com)
|
||||
@version 1.0
|
||||
'''
|
||||
|
||||
__docformat__ = "javadoc"
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
def asbytes(s):
|
||||
if isinstance(s, bytes):
|
||||
return s
|
||||
return s.encode('latin1')
|
||||
def asstr(s):
|
||||
if isinstance(s, str):
|
||||
return s
|
||||
return s.decode('latin1')
|
||||
else:
|
||||
asbytes = str
|
||||
asstr = str
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="RTC"/> <peripheral name="PWR"/> <peripheral name="RCC"/> <peripheral name="NVIC"/> <peripheral name="OTG_FS_DEVICE"/> <peripheral name="OTG_FS_GLOBAL"/> <peripheral name="GPIOB"/> <peripheral name="GPIOA"/> <peripheral name="GPIOD"/> <peripheral name="GPIOE"/> <peripheral name="GPIOC"/> <peripheral name="SPI2"/> </peripherals> "/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/MCHF.cfg"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugBootloaderMCHF/bl-mchf.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838.1988579444"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="134283264" label="0x8010000"/> <memoryBlockExpression address="134217728" label="0x8000000"/> <memoryBlockExpression address="134250496" label="0x8008000"/> </memoryBlockExpressionList> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x20000000000,0x20000,0x200000,0x20010000,0x20011000,0x20001000,0x20002000,0x2001A000,0x2001D000,0x2002D000,0x2003D000,0x20030000,0x80008000,0x8008000,0x800C000"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnuarmeclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="GPIOA"/> <peripheral name="OTG_FS_DEVICE"/> <peripheral name="OTG_FS_GLOBAL"/> </peripherals> "/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.enableSemihosting" value="true"/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/MCHF.cfg"/>
|
||||
<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU ARM OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugMCHF\fw-mchf.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x20000000000,0x20000,0x200000,0x20010000,0x20011000,0x20001000,0x20002000,0x2001A000,0x2001D000,0x2002D000,0x2003D000,0x20030000,0x80008000,0x8008000,0x800C000"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="GPIOA"/> <peripheral name="OTG_FS_DEVICE"/> <peripheral name="OTG_FS_GLOBAL"/> <peripheral name="DMA1"/> </peripherals> "/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbCLient" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="true"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/MCHF.cfg"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.svdPath" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugMCHF/fw-mchf.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="134283264" label="0x8010000"/> <memoryBlockExpression address="134217728" label="0x8000000"/> <memoryBlockExpression address="537001984" label="0x20020000"/> <memoryBlockExpression address="537001984" label="0x20020000"/> <memoryBlockExpression address="536870912" label="0x20000000"/> <memoryBlockExpression address="537001984" label="0x20020000"/> <memoryBlockExpression address="536973808" label="0x200191F0"/> <memoryBlockExpression address="536910408" label="0x20009a48"/> <memoryBlockExpression address="536892944" label="0x20005610"/> <memoryBlockExpression address="536893456" label="0x20005810"/> <memoryBlockExpression address="536893196" label="0x2000570C"/> </memoryBlockExpressionList> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x8008000,0x800C000,0x200089b8,0x200189b8,0x2001F000,0x200089ac,0x20017F3C <..,0x20017F3C <..,0x20017F3C,0x20000000,0x200000000,0x200017F3C,0x20020000,0x200089b0,0x20005610"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,15 @@
|
||||
# This is an MCHF board with a single STM32F407VGTx chip.
|
||||
# Generated by System Workbench for STM32
|
||||
|
||||
source [find interface/stlink-v2.cfg]
|
||||
#source [find interface/stlink-v2-1.cfg]
|
||||
|
||||
set WORKAREASIZE 0x20000
|
||||
transport select "hla_swd"
|
||||
|
||||
|
||||
source [find target/stm32f4x.cfg]
|
||||
#source [find target/stm32f7x.cfg]
|
||||
|
||||
# use hardware reset, connect under reset
|
||||
reset_config none
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="RTC"/> <peripheral name="GPIOC"/> <peripheral name="PWR"/> <peripheral name="RCC"/> <peripheral name="NVIC"/> <peripheral name="OTG_FS_DEVICE"/> <peripheral name="OTG_FS_GLOBAL"/> </peripherals> "/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/ovi40.cfg"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugBootloaderOVI40/bl-40sdr.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838.1988579444.812079502"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="134283264" label="0x8010000"/> <memoryBlockExpression address="134217728" label="0x8000000"/> <memoryBlockExpression address="134250496" label="0x8008000"/> <memoryBlockExpression address="1610629120" label="0x60004000"/> <memoryBlockExpression address="1610612736" label="0x60000000"/> <memoryBlockExpression address="1610620928" label="0x60002000"/> <memoryBlockExpression address="1610616832" label="0x60001000"/> <memoryBlockExpression address="1610625024" label="0x60003000"/> <memoryBlockExpression address="536836642" label="0x1FFF7A22"/> <memoryBlockExpression address="537378816" label="0x2007C000"/> <memoryBlockExpression address="3758157056" label="0xE000ED00"/> </memoryBlockExpressionList> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x20000000000,0x20000,0x200000,0x20010000,0x20011000,0x20001000,0x20002000,0x2001A000,0x2001D000,0x2002D000,0x2003D000,0x20030000,0x80008000,0x8008000,0x800C000"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals/> "/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/ovi40.cfg"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugOVI40/fw-40sdr.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838.1123244320"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="134283264" label="0x8010000"/> <memoryBlockExpression address="134217728" label="0x8000000"/> <memoryBlockExpression address="134250496" label="0x8008000"/> <memoryBlockExpression address="134266880" label="0x800C000"/> <memoryBlockExpression address="3758157056" label="0xE000ED00"/> </memoryBlockExpressionList> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x20000000000,0x20000,0x200000,0x20010000,0x20011000,0x20001000,0x20002000,0x2001A000,0x2001D000,0x2002D000,0x2003D000,0x20030000,0x80008000,0x8008000,0x800C000"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="RTC"/> <peripheral name="GPIOC"/> <peripheral name="PWR"/> <peripheral name="RCC"/> <peripheral name="NVIC"/> <peripheral name="OTG_FS_DEVICE"/> <peripheral name="OTG_FS_GLOBAL"/> </peripherals> "/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/ovi40h7.cfg"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugBootloaderOVI40H7/bl-ovi40.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838.1123244320.487780019.741727183"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="134283264" label="0x8010000"/> <memoryBlockExpression address="134217728" label="0x8000000"/> <memoryBlockExpression address="134250496" label="0x8008000"/> <memoryBlockExpression address="1610629120" label="0x60004000"/> <memoryBlockExpression address="1610612736" label="0x60000000"/> <memoryBlockExpression address="1610620928" label="0x60002000"/> <memoryBlockExpression address="1610616832" label="0x60001000"/> <memoryBlockExpression address="1610625024" label="0x60003000"/> <memoryBlockExpression address="536836642" label="0x1FFF7A22"/> <memoryBlockExpression address="537378816" label="0x2007C000"/> <memoryBlockExpression address="3758157056" label="0xE000ED00"/> <memoryBlockExpression address="134610944" label="0x8060000"/> </memoryBlockExpressionList> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x20000000000,0x20000,0x200000,0x20010000,0x20011000,0x20001000,0x20002000,0x2001A000,0x2001D000,0x2002D000,0x2003D000,0x20030000,0x80008000,0x8008000,0x800C000"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">
|
||||
<stringAttribute key="bad_container_name" value="\mchf-eclipse\supp"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.PERIPHERALS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <peripherals> <peripheral name="GPIOA"/> </peripherals> "/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbCLient" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>
|
||||
<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="-f support/ovi40h7.cfg"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666"/>
|
||||
<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>
|
||||
<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.svdPath" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value="8010000"/>
|
||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/>
|
||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="1"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="DebugOVI40H7/fw-ovi40.elf"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="mchf-eclipse"/>
|
||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838.1123244320.487780019"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/mchf-eclipse"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="134283264" label="0x8010000"/> <memoryBlockExpression address="134217728" label="0x8000000"/> <memoryBlockExpression address="134250496" label="0x8008000"/> <memoryBlockExpression address="134266880" label="0x800C000"/> <memoryBlockExpression address="3758157056" label="0xE000ED00"/> <memoryBlockExpression address="134610944" label="0x8060000"/> </memoryBlockExpressionList> "/>
|
||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||
<stringAttribute key="saved_expressions<seperator>Unknown" value="0x20000000000,0x20000,0x200000,0x20010000,0x20011000,0x20001000,0x20002000,0x2001A000,0x2001D000,0x2002D000,0x2003D000,0x20030000,0x80008000,0x8008000,0x800C000"/>
|
||||
</launchConfiguration>
|
||||
@@ -0,0 +1,12 @@
|
||||
Using the recent GNU ARM Eclipse v2.11
|
||||
(https://gnuarmeclipse.github.io/)
|
||||
and following the installation instructions to the letter
|
||||
including the Packs Download (takes a while).
|
||||
The eclipse-mars-gnuarm-mchf-preferences.epf contains the exported
|
||||
preferences from Eclipse Mars with a working debug configuration.
|
||||
If you already configured Eclipse, you may not want to use it, then
|
||||
follow the "images" in Eclipse-Debug-Settings to create a debug
|
||||
configuration by making the entries marked with red boxes in
|
||||
a new GDB OpenOCD Debug Configuration.
|
||||
You should be able to debug live with an ST-LINK V2 in
|
||||
no time at all.
|
||||
@@ -0,0 +1,222 @@
|
||||
Index: codec2-dev/src/fdmdv.c
|
||||
===================================================================
|
||||
--- codec2-dev/src/fdmdv.c (revision 2846)
|
||||
+++ codec2-dev/src/fdmdv.c (working copy)
|
||||
@@ -50,11 +50,21 @@
|
||||
#include "machdep.h"
|
||||
|
||||
static int sync_uw[] = {1,-1,1,-1,1,-1};
|
||||
-
|
||||
#ifdef __EMBEDDED__
|
||||
#define printf gdb_stdio_printf
|
||||
#endif
|
||||
|
||||
+#ifndef ARM_MATH_CM4
|
||||
+ #define SINF(a) sinf(a)
|
||||
+ #define COSF(a) cosf(a)
|
||||
+#else
|
||||
+ #define SINF(a) arm_sin_f32(a)
|
||||
+ #define COSF(a) arm_cos_f32(a)
|
||||
+#endif
|
||||
+
|
||||
+static const COMP pi_on_4 = { .70710678118654752439, .70710678118654752439 }; // COSF(PI/4) , SINF(PI/4)
|
||||
+
|
||||
+
|
||||
/*--------------------------------------------------------------------------* \
|
||||
|
||||
FUNCTION....: fdmdv_create
|
||||
@@ -110,8 +120,8 @@
|
||||
This helped PAPR for a few dB. We don't need to adjust rx
|
||||
phase as DQPSK takes care of that. */
|
||||
|
||||
- f->phase_tx[c].real = cosf(2.0*PI*c/(Nc+1));
|
||||
- f->phase_tx[c].imag = sinf(2.0*PI*c/(Nc+1));
|
||||
+ f->phase_tx[c].real = COSF(2.0*PI*c/(Nc+1));
|
||||
+ f->phase_tx[c].imag = SINF(2.0*PI*c/(Nc+1));
|
||||
|
||||
f->phase_rx[c].real = 1.0;
|
||||
f->phase_rx[c].imag = 0.0;
|
||||
@@ -124,12 +134,12 @@
|
||||
f->prev_tx_symbols[Nc].real = 2.0;
|
||||
|
||||
fdmdv_set_fsep(f, FSEP);
|
||||
- f->freq[Nc].real = cosf(2.0*PI*0.0/FS);
|
||||
- f->freq[Nc].imag = sinf(2.0*PI*0.0/FS);
|
||||
+ f->freq[Nc].real = COSF(2.0*PI*0.0/FS);
|
||||
+ f->freq[Nc].imag = SINF(2.0*PI*0.0/FS);
|
||||
f->freq_pol[Nc] = 2.0*PI*0.0/FS;
|
||||
|
||||
- f->fbb_rect.real = cosf(2.0*PI*FDMDV_FCENTRE/FS);
|
||||
- f->fbb_rect.imag = sinf(2.0*PI*FDMDV_FCENTRE/FS);
|
||||
+ f->fbb_rect.real = COSF(2.0*PI*FDMDV_FCENTRE/FS);
|
||||
+ f->fbb_rect.imag = SINF(2.0*PI*FDMDV_FCENTRE/FS);
|
||||
f->fbb_pol = 2.0*PI*FDMDV_FCENTRE/FS;
|
||||
f->fbb_phase_tx.real = 1.0;
|
||||
f->fbb_phase_tx.imag = 0.0;
|
||||
@@ -257,15 +267,15 @@
|
||||
|
||||
for(c=0; c<f->Nc/2; c++) {
|
||||
carrier_freq = (-f->Nc/2 + c)*f->fsep;
|
||||
- f->freq[c].real = cosf(2.0*PI*carrier_freq/FS);
|
||||
- f->freq[c].imag = sinf(2.0*PI*carrier_freq/FS);
|
||||
+ f->freq[c].real = COSF(2.0*PI*carrier_freq/FS);
|
||||
+ f->freq[c].imag = SINF(2.0*PI*carrier_freq/FS);
|
||||
f->freq_pol[c] = 2.0*PI*carrier_freq/FS;
|
||||
}
|
||||
|
||||
for(c=f->Nc/2; c<f->Nc; c++) {
|
||||
carrier_freq = (-f->Nc/2 + c + 1)*f->fsep;
|
||||
- f->freq[c].real = cosf(2.0*PI*carrier_freq/FS);
|
||||
- f->freq[c].imag = sinf(2.0*PI*carrier_freq/FS);
|
||||
+ f->freq[c].real = COSF(2.0*PI*carrier_freq/FS);
|
||||
+ f->freq[c].imag = SINF(2.0*PI*carrier_freq/FS);
|
||||
f->freq_pol[c] = 2.0*PI*carrier_freq/FS;
|
||||
}
|
||||
}
|
||||
@@ -676,6 +686,12 @@
|
||||
if (f >= 4)
|
||||
memcpy(&pilot_lut[M*(f-4)], pilot, M*sizeof(COMP));
|
||||
}
|
||||
+
|
||||
+ // create complex conjugate since we need this and only this later on
|
||||
+ for (f=0;f<4*M;f++)
|
||||
+ {
|
||||
+ pilot_lut[f] = cconj(pilot_lut[f]);
|
||||
+ }
|
||||
|
||||
}
|
||||
|
||||
@@ -806,10 +822,18 @@
|
||||
f->pilot_baseband2[i] = f->pilot_baseband2[i+nin];
|
||||
}
|
||||
|
||||
+#ifndef ARM_MATH_CM4
|
||||
for(i=0,j=NPILOTBASEBAND-nin; i<nin; i++,j++) {
|
||||
- f->pilot_baseband1[j] = cmult(rx_fdm[i], cconj(pilot[i]));
|
||||
- f->pilot_baseband2[j] = cmult(rx_fdm[i], cconj(prev_pilot[i]));
|
||||
+ f->pilot_baseband1[j] = cmult(rx_fdm[i], pilot[i]);
|
||||
+ f->pilot_baseband2[j] = cmult(rx_fdm[i], prev_pilot[i]);
|
||||
}
|
||||
+#else
|
||||
+ // TODO: Maybe a handwritten mult taking advantage of rx_fdm[0] being
|
||||
+ // used twice would be faster but this is for sure faster than
|
||||
+ // the implementation above in any case.
|
||||
+ arm_cmplx_mult_cmplx_f32(&rx_fdm[0].real,&pilot[0].real,&f->pilot_baseband1[NPILOTBASEBAND-nin].real,nin);
|
||||
+ arm_cmplx_mult_cmplx_f32(&rx_fdm[0].real,&prev_pilot[0].real,&f->pilot_baseband2[NPILOTBASEBAND-nin].real,nin);
|
||||
+#endif
|
||||
|
||||
lpf_peak_pick(&foff1, &max1, f->pilot_baseband1, f->pilot_lpf1, f->fft_pilot_cfg, f->S1, nin, do_fft);
|
||||
lpf_peak_pick(&foff2, &max2, f->pilot_baseband2, f->pilot_lpf2, f->fft_pilot_cfg, f->S2, nin, do_fft);
|
||||
@@ -840,8 +864,8 @@
|
||||
float mag;
|
||||
int i;
|
||||
|
||||
- foff_rect.real = cosf(2.0*PI*foff/FS);
|
||||
- foff_rect.imag = sinf(2.0*PI*foff/FS);
|
||||
+ foff_rect.real = COSF(2.0*PI*foff/FS);
|
||||
+ foff_rect.imag = SINF(2.0*PI*foff/FS);
|
||||
for(i=0; i<nin; i++) {
|
||||
*foff_phase_rect = cmult(*foff_phase_rect, foff_rect);
|
||||
rx_fdm_fcorr[i] = cmult(rx_fdm[i], *foff_phase_rect);
|
||||
@@ -992,7 +1016,41 @@
|
||||
return dec_rate*acc;
|
||||
}
|
||||
|
||||
+/*---------------------------------------------------------------------------*\
|
||||
|
||||
+ FUNCTION....: fir_filter2()
|
||||
+ AUTHOR......: David Rowe
|
||||
+ DATE CREATED: July 2014
|
||||
+
|
||||
+ Helper fir filter function which runs 2x same filter on two sets of data.
|
||||
+\*---------------------------------------------------------------------------*/
|
||||
+
|
||||
+static void fir_filter2(float acc[2], float mem[], float coeff[], const unsigned int dec_rate) {
|
||||
+ acc[0] = 0.0;
|
||||
+ acc[1] = 0.0;
|
||||
+
|
||||
+ float c,m1,m2,a1,a2;
|
||||
+ float* inpCmplx = &mem[0];
|
||||
+ float* coeffPtr = &coeff[0];
|
||||
+
|
||||
+ int m;
|
||||
+
|
||||
+ for(m=0; m<NFILTER; m+=dec_rate) {
|
||||
+ c = *coeffPtr;
|
||||
+ m1 = inpCmplx[0];
|
||||
+ m2 = inpCmplx[1];
|
||||
+ a1 = c * m1;
|
||||
+ a2 = c * m2;
|
||||
+ acc[0] += a1;
|
||||
+ inpCmplx+= dec_rate*2;
|
||||
+ acc[1] += a2;
|
||||
+ coeffPtr+= dec_rate;
|
||||
+ }
|
||||
+
|
||||
+ acc[0] *= dec_rate;
|
||||
+ acc[1] *= dec_rate;
|
||||
+}
|
||||
+
|
||||
/*---------------------------------------------------------------------------*\
|
||||
|
||||
FUNCTION....: down_convert_and_rx_filter()
|
||||
@@ -1049,8 +1107,8 @@
|
||||
|
||||
//PROFILE_SAMPLE(windback_start);
|
||||
windback_phase = -freq_pol[c]*NFILTER;
|
||||
- windback_phase_rect.real = cosf(windback_phase);
|
||||
- windback_phase_rect.imag = sinf(windback_phase);
|
||||
+ windback_phase_rect.real = COSF(windback_phase);
|
||||
+ windback_phase_rect.imag = SINF(windback_phase);
|
||||
phase_rx[c] = cmult(phase_rx[c],windback_phase_rect);
|
||||
//PROFILE_SAMPLE_AND_LOG(downconvert_start, windback_start, " windback");
|
||||
|
||||
@@ -1082,8 +1140,9 @@
|
||||
for(m=0; m<NFILTER; m++)
|
||||
rx_filt[c][k] = cadd(rx_filt[c][k], fcmult(gt_alpha5_root[m], rx_baseband[st+i+m]));
|
||||
#else
|
||||
- rx_filt[c][k].real = fir_filter(&rx_baseband[st+i].real, (float*)gt_alpha5_root, dec_rate);
|
||||
- rx_filt[c][k].imag = fir_filter(&rx_baseband[st+i].imag, (float*)gt_alpha5_root, dec_rate);
|
||||
+ // rx_filt[c][k].real = fir_filter(&rx_baseband[st+i].real, (float*)gt_alpha5_root, dec_rate);
|
||||
+ // rx_filt[c][k].imag = fir_filter(&rx_baseband[st+i].imag, (float*)gt_alpha5_root, dec_rate);
|
||||
+ fir_filter2(&rx_filt[c][k].real,&rx_baseband[st+i].real, (float*)gt_alpha5_root, dec_rate);
|
||||
#endif
|
||||
}
|
||||
//PROFILE_SAMPLE_AND_LOG2(filter_start, " filter");
|
||||
@@ -1155,8 +1214,8 @@
|
||||
out single DFT at frequency 2*pi/P */
|
||||
|
||||
x.real = 0.0; x.imag = 0.0;
|
||||
- freq.real = cosf(2*PI/P);
|
||||
- freq.imag = sinf(2*PI/P);
|
||||
+ freq.real = COSF(2*PI/P);
|
||||
+ freq.imag = SINF(2*PI/P);
|
||||
phase.real = 1.0;
|
||||
phase.imag = 0.0;
|
||||
|
||||
@@ -1213,13 +1272,10 @@
|
||||
COMP rx_symbols[], int old_qpsk_mapping)
|
||||
{
|
||||
int c;
|
||||
- COMP pi_on_4;
|
||||
COMP d;
|
||||
int msb=0, lsb=0;
|
||||
float ferr, norm;
|
||||
|
||||
- pi_on_4.real = cosf(PI/4.0);
|
||||
- pi_on_4.imag = sinf(PI/4.0);
|
||||
|
||||
/* Extra 45 degree clockwise lets us use real and imag axis as
|
||||
decision boundaries. "norm" makes sure the phase subtraction
|
||||
@@ -1296,11 +1352,8 @@
|
||||
float s[NC+1];
|
||||
COMP refl_symbols[NC+1];
|
||||
float n[NC+1];
|
||||
- COMP pi_on_4;
|
||||
int c;
|
||||
|
||||
- pi_on_4.real = cosf(PI/4.0);
|
||||
- pi_on_4.imag = sinf(PI/4.0);
|
||||
|
||||
/* mag of each symbol is distance from origin, this gives us a
|
||||
vector of mags, one for each carrier. */
|
||||
@@ -0,0 +1,14 @@
|
||||
cd ../drivers/freedv
|
||||
SRCFILES=`grep -L "/* THIS IS A G" *.c *.h`
|
||||
CODEC2_PATH=../../../../codec2-dev/src
|
||||
for i in $SRCFILES
|
||||
do
|
||||
XI="$CODEC2_PATH/$i"
|
||||
if [ -f "$XI" ]
|
||||
then
|
||||
cp $XI $i
|
||||
else
|
||||
echo $i not found
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
#Tue Feb 16 09:39:10 CET 2016
|
||||
@org.eclipse.debug.ui=3.11.100.v20150731-1137
|
||||
@org.eclipse.ui.ide=3.11.0.v20150825-2158
|
||||
/instance/org.eclipse.cdt.core/indexer/skipMacroReferences=false
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.server.doStart=true
|
||||
@org.eclipse.cdt.ui=5.11.0.201509131935
|
||||
/instance/org.eclipse.debug.core//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.remoteApplicationLaunchType=org.eclipse.rse.remotecdt.dsf.debug,debug,;
|
||||
/instance/org.eclipse.cdt.mylyn.ui/org.eclipse.mylyn.cdt.ui.run.count.3_3_0=1
|
||||
/instance/org.eclipse.cdt.core/indexer/skipTypeReferences=false
|
||||
/instance/org.eclipse.ui.ide/PROBLEMS_FILTERS_MIGRATE=true
|
||||
/instance/org.eclipse.ui.editors/overviewRuler_migration=migrated_3.1
|
||||
/instance/org.eclipse.core.resources/version=1
|
||||
/instance/org.eclipse.core.runtime/line.separator=\n
|
||||
@org.eclipse.core.resources=3.10.1.v20150725-1910
|
||||
/instance/org.eclipse.ui/showIntro=false
|
||||
/instance/org.eclipse.ui.workbench/UIActivities.org.eclipse.cdt.debug.dsfgdbActivity=true
|
||||
@org.eclipse.rse.ui=3.3.100.201503112018
|
||||
/instance/org.eclipse.rse.ui/org.eclipse.rse.preferences.order.connections=pcb.Local
|
||||
@ilg.gnuarmeclipse.debug.gdbjtag.openocd=3.2.1.201602101653
|
||||
@org.eclipse.debug.core=3.10.0.v20150303-1130
|
||||
/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true
|
||||
@org.eclipse.oomph.workingsets=1.2.0.v20150915-0926
|
||||
/configuration/org.eclipse.ui.ide/MAX_RECENT_WORKSPACES=5
|
||||
@org.eclipse.ui.workbench=3.107.0.v20150825-2206
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.client.commands=set mem inaccessible-by-default off
|
||||
file_export_version=3.0
|
||||
@org.eclipse.cdt.core=5.11.0.201509131935
|
||||
@org.eclipse.rse.core=3.3.100.201407181907
|
||||
/instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
|
||||
/instance/org.eclipse.team.ui/org.eclipse.team.ui.first_time=false
|
||||
/instance/org.eclipse.mylyn.tasks.ui/migrated.task.repositories.secure.store=true
|
||||
/instance/org.eclipse.debug.core//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.debug.gdbjtag.launchConfigurationType=org.eclipse.cdt.debug.gdbjtag.core.dsfLaunchDelegate,debug,;
|
||||
/instance/org.eclipse.cdt.core.prj-mchf-eclipse/indexer/preferenceScope=0
|
||||
/instance/org.eclipse.cdt.core/indexer/indexOnOpen=false
|
||||
/instance/org.eclipse.ui.ide/platformState=1455563484884
|
||||
/instance/org.eclipse.cdt.core/indexer/skipIncludedFilesLargerThanMB=16
|
||||
@org.eclipse.core.net=1.2.300.v20141118-1725
|
||||
/instance/org.eclipse.cdt.core/indexer/skipReferences=false
|
||||
/instance/org.eclipse.core.resources/encoding=UTF-8
|
||||
/instance/org.eclipse.cdt.managedbuilder.core/properties/mchf-eclipse.ilg.gnuarmeclipse.managedbuild.cross.target.elf.760754411/ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.563472857=ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.1357867660\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1668167853\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.833539941\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.printsize.1146300300\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.createflash.873251154\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.443738704\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1268992358\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.629732904\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.606680054\=rebuildState\\\=true\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.archiver.98451563\=rebuildState\\\=true\\r\\n\r\n
|
||||
/instance/org.eclipse.debug.core//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,;
|
||||
/instance/org.eclipse.mylyn.monitor.ui/org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true
|
||||
\!/=
|
||||
@org.eclipse.cdt.debug.core=7.7.0.201509131935
|
||||
@org.eclipse.mylyn.monitor.ui=3.17.0.v20150828-2041
|
||||
/instance/org.eclipse.core.resources/description.autobuilding=false
|
||||
@org.eclipse.cdt.dsf.ui=2.5.0.201509131935
|
||||
/instance/org.eclipse.cdt.core/indexer/useHeuristicIncludeResolution=true
|
||||
/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.MemoryView.RenderingViewPane.1=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<persistedMemoryRenderings>\r\n<memoryRendering memoryBlock\="1574521638" renderingId\="ilg.gnuarmeclipse.debug.gdbjtag.memoryRendering"/>\r\n</persistedMemoryRenderings>\r\n
|
||||
@org.eclipse.ui.editors=3.9.0.v20150213-1939
|
||||
@org.eclipse.core.variables=3.2.800.v20130819-1716
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.doDebugInRam=false
|
||||
/instance/org.eclipse.cdt.core/indexer/skipFilesLargerThanMB=8
|
||||
/instance/org.eclipse.cdt.ui/useQuickDiffPrefPage=true
|
||||
/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES=
|
||||
/instance/org.eclipse.debug.core//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,;
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.server.other=-f support/MCHF.cfg
|
||||
/instance/org.eclipse.ui.ide/quickStart=false
|
||||
/instance/org.eclipse.cdt.core/indexer/skipImplicitReferences=false
|
||||
/instance/org.eclipse.oomph.workingsets/working.set.group=<?xml version\="1.0" encoding\="UTF-8"?>\n<workingsets\:WorkingSetGroup xmi\:version\="2.0" xmlns\:xmi\="http\://www.omg.org/XMI" xmlns\:workingsets\="http\://www.eclipse.org/oomph/workingsets/1.0"/>\n
|
||||
/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<launchPerspectives/>\r\n
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.doPreRunReset=true
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.client.other=
|
||||
/instance/org.eclipse.mylyn.context.core/mylyn.attention.migrated=true
|
||||
@org.eclipse.mylyn.context.core=3.17.0.v20150625-2044
|
||||
/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.UseContextualLaunch=false
|
||||
/instance/org.eclipse.cdt.managedbuilder.core/properties/mchf-eclipse.ilg.gnuarmeclipse.managedbuild.cross.target.elf.760754411/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838=ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.1315515641\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.1301137147\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.createflash.1618780674\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.431714468\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.433341838\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1708414410\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.archiver.426523710\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.680557654\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.printsize.693017885\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.255939792\=rebuildState\\\=false\\r\\n\r\nilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.1298670015\=rebuildState\\\=false\\r\\n\r\n
|
||||
@org.eclipse.core.runtime=3.11.1.v20150903-1804
|
||||
@org.eclipse.cdt.mylyn.ui=3.17.0.v20150625-2044
|
||||
/instance/org.eclipse.debug.ui/preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane|
|
||||
/instance/org.eclipse.ui.ide/tipsAndTricks=true
|
||||
/instance/org.eclipse.cdt.core/indexer/indexerId=org.eclipse.cdt.core.fastIndexer
|
||||
/instance/org.eclipse.cdt.ui/spelling_locale_initialized=true
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.client.executable=${cross_prefix}gdb${cross_suffix}
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.enableSemihosting=false
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.preRunReset.type=halt
|
||||
/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.user_view_bindings=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<viewBindings>\r\n<view id\="org.eclipse.debug.ui.MemoryView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="org.eclipse.debug.ui.RegisterView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="org.eclipse.debug.ui.ModuleView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="ilg.gnuarmeclipse.debug.gdbjtag.ui.views.PeripheralsView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="org.eclipse.debug.ui.VariableView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="org.eclipse.debug.ui.DebugView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="org.eclipse.debug.ui.BreakpointView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n<view id\="org.eclipse.ui.console.ConsoleView">\r\n<perspective id\="org.eclipse.debug.ui.DebugPerspective" userAction\="closed"/>\r\n</view>\r\n</viewBindings>\r\n
|
||||
/instance/org.eclipse.cdt.ui/useAnnotationsPrefPage=true
|
||||
/instance/org.eclipse.cdt.core/indexer/indexAllFiles=true
|
||||
@org.eclipse.team.ui=3.7.200.v20150203-1452
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.doInitialReset=true
|
||||
/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.filters.nonmatching=true
|
||||
@org.eclipse.mylyn.tasks.ui=3.17.0.v20150909-1822
|
||||
@org.eclipse.egit.core=4.0.3.201509231615-r
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.server.executable=${openocd_path}/${openocd_executable}
|
||||
/instance/org.eclipse.debug.core//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug,;org.eclipse.cdt.cdi.launch.localCLaunch,run,;
|
||||
/instance/org.eclipse.ui.ide/SAVE_ALL_BEFORE_BUILD=true
|
||||
/instance/org.eclipse.core.variables/org.eclipse.core.variables.valueVariables=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<valueVariables>\r\n<valueVariable description\="Name of the QEMU executable" name\="qemu_executable" readOnly\="false" value\="qemu-system-gnuarmeclipse.exe"/>\r\n<valueVariable description\="Path to J-Link installation folder" name\="jlink_path" readOnly\="false" value\=""/>\r\n<valueVariable description\="Name of the OpenOCD executable" name\="openocd_executable" readOnly\="false" value\="openocd.exe"/>\r\n<valueVariable description\="Name of the J-Link executable" name\="jlink_gdbserver" readOnly\="false" value\="JLinkGDBServerCL.exe"/>\r\n<valueVariable description\="Path to the QEMU installation folder" name\="qemu_path" readOnly\="false" value\=""/>\r\n<valueVariable description\="Path to the OpenOCD installation folder" name\="openocd_path" readOnly\="false" value\="C\:/Program Files/GNU ARM Eclipse/OpenOCD/bin"/>\r\n</valueVariables>\r\n
|
||||
/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES_PROTOCOL=3
|
||||
/configuration/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
|
||||
/instance/org.eclipse.cdt.ui/content_assist_disabled_computers=org.eclipse.cdt.ui.parserProposalCategory\u0000org.eclipse.cdt.ui.textProposalCategory\u0000
|
||||
/instance/org.eclipse.cdt.core/indexer/indexUnusedHeadersWithDefaultLang=true
|
||||
/instance/org.eclipse.cdt.dsf.ui/useAnnotationsPrefPage=true
|
||||
/instance/org.eclipse.egit.core/GitRepositoriesView.GitDirectories=E\:\\Hacking\\ham\\MCHF\\my-sw\\mchf-github\\.git;
|
||||
/instance/org.eclipse.debug.ui/preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget|
|
||||
/instance/org.eclipse.ui.ide/EXIT_PROMPT_ON_CLOSE_LAST_WINDOW=false
|
||||
/instance/org.eclipse.cdt.core/indexer/updatePolicy=0
|
||||
/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.MemoryView.orientation=0
|
||||
/instance/org.eclipse.cdt.debug.core/org.eclipse.cdt.debug.core.cDebug.default_source_containers=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<sourceLookupDirector>\r\n<sourceContainers duplicates\="false">\r\n<container memento\="AbsolutePath" typeId\="org.eclipse.cdt.debug.core.containerType.absolutePath"/>\r\n<container memento\="programRelativePath" typeId\="org.eclipse.cdt.debug.core.containerType.programRelativePath"/>\r\n<container memento\="<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>&\#13;&\#10;<project referencedProjects\="true"/>&\#13;&\#10;" typeId\="org.eclipse.cdt.debug.core.containerType.project"/>\r\n</sourceContainers>\r\n</sourceLookupDirector>\r\n
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.preRun.other=
|
||||
/instance/org.eclipse.cdt.core/indexer/indexAllHeaderVersions=false
|
||||
@org.eclipse.ui=3.107.0.v20150507-1945
|
||||
/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<DebugViewMemento org.eclipse.debug.ui.BREADCRUMB_DROPDOWN_AUTO_EXPAND\="false"/>
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.initialReset.type=init
|
||||
@org.eclipse.cdt.managedbuilder.core=8.3.0.201509131935
|
||||
/instance/org.eclipse.ui.workbench//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false
|
||||
/instance/ilg.gnuarmeclipse.debug.gdbjtag.openocd/gdb.openocd.init.other=
|
||||
/instance/org.eclipse.debug.ui/pref_state_memento.ilg.gnuarmeclipse.debug.gdbjtag.ui.views.PeripheralsView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684">\r\n<PRESENTATION_CONTEXT_PROPERTIES IMemento.internal.id\="PeripheralsView">\r\n<BOOLEAN BOOLEAN\="true" IMemento.internal.id\="org.eclipse.debug.ui.check"/>\r\n</PRESENTATION_CONTEXT_PROPERTIES>\r\n</VariablesViewMemento>
|
||||
/instance/org.eclipse.cdt.core/indexer/indexAllVersionsSpecificHeaders=
|
||||
/configuration/org.eclipse.ui.ide/SHOW_WORKSPACE_SELECTION_DIALOG=false
|
||||
@@ -0,0 +1,184 @@
|
||||
import struct
|
||||
import sys
|
||||
|
||||
|
||||
class octaveRecord:
|
||||
def __init__(self):
|
||||
self.rname = ""
|
||||
self.rtype = ""
|
||||
self.rrows = 0
|
||||
self.rcols = 0
|
||||
self.record = []
|
||||
def dumpCell(self,cell,of):
|
||||
if (self.rtype == "complex"):
|
||||
of.write(" ({:f},{:f})".format(cell.real,cell.imag))
|
||||
elif (self.rtype == "float"):
|
||||
of.write(" {:f}".format(cell))
|
||||
elif (self.rtype == "int"):
|
||||
of.write(" {}".format(cell))
|
||||
elif (self.rtype == "matrix"):
|
||||
of.write(" {}".format(cell))
|
||||
|
||||
def dumpData(self,of):
|
||||
for row in self.record:
|
||||
for cell in row:
|
||||
self.dumpCell(cell,of)
|
||||
of.write("\n")
|
||||
|
||||
def dump(self,of):
|
||||
of.write("# name: " + self.rname+ "\n")
|
||||
of.write("# type: " + self.rtype+ "\n")
|
||||
of.write("# rows: " + str(self.rrows) + "\n")
|
||||
of.write("# columns: " + str(self.rcols)+ "\n")
|
||||
self.dumpData(of)
|
||||
of.write("\n")
|
||||
of.flush()
|
||||
|
||||
def get_dev(self,a,b):
|
||||
if (self.rtype == "complex"):
|
||||
iD = 10000.0
|
||||
rD = 10000.0
|
||||
if abs(a.real - b.real) > 0.000001:
|
||||
rD = abs(a.real / (a.real - b.real))
|
||||
if abs(a.imag - b.imag) > 0.0:
|
||||
iD = abs(a.imag / (a.imag - b.imag))
|
||||
return max(rD,iD)
|
||||
else:
|
||||
return abs(a / (a - b))
|
||||
|
||||
def compare(self,rec2,of):
|
||||
of.write(self.rname + ": ")
|
||||
if ( self.rrows == rec2.rrows):
|
||||
if (self.rcols == rec2.rcols):
|
||||
#iterate over both arrays and compare the values
|
||||
for rowA,rowB in zip(self.record,rec2.record):
|
||||
for cellA,cellB in zip(rowA,rowB):
|
||||
res = ''
|
||||
if (cellA == cellB):
|
||||
res = '' # 'o'
|
||||
elif self.get_dev(cellA,cellB) > 100.0:
|
||||
res = '' # '#'
|
||||
else:
|
||||
of.write(str(self.get_dev(cellA,cellB)) +":")
|
||||
self.dumpCell(cellA,of)
|
||||
of.write(" /")
|
||||
self.dumpCell(cellB,of)
|
||||
of.write(" ")
|
||||
|
||||
of.write(res)
|
||||
of.write("\n")
|
||||
else:
|
||||
of.write("col numbers differ\n")
|
||||
else:
|
||||
print of.write("row numbers differ")
|
||||
of.flush()
|
||||
|
||||
|
||||
def intStr2float(hexValStr):
|
||||
return struct.unpack('f',struct.pack('L',int(hexValStr,16)))
|
||||
|
||||
def get_complex(word,FloatAsHexString):
|
||||
real = 0.0
|
||||
imag = 0.0
|
||||
if FloatAsHexString:
|
||||
real = intStr2float(word.split(",")[0].split("(")[1])[0]
|
||||
imag = intStr2float(word.split(",")[1].split(")")[0])[0]
|
||||
else:
|
||||
real = float(word.split(",")[0].split("(")[1])
|
||||
imag = float(word.split(",")[1].split(")")[0])
|
||||
|
||||
return complex(real,imag)
|
||||
|
||||
def get_float(word,FloatAsHexString):
|
||||
if FloatAsHexString:
|
||||
return intStr2float(word)[0]
|
||||
else:
|
||||
return float(word)
|
||||
|
||||
def get_int(word):
|
||||
return int(word)
|
||||
|
||||
def readFromDump(fileName, FloatAsHexString = True):
|
||||
rname=""
|
||||
rhex=False
|
||||
rtype=""
|
||||
rvalues= {}
|
||||
rcols=0
|
||||
rrows=0
|
||||
rheaderWrite=True
|
||||
outOfSync = True
|
||||
|
||||
f = open(fileName, 'r')
|
||||
recArray = []
|
||||
|
||||
record = octaveRecord()
|
||||
|
||||
records = []
|
||||
|
||||
for line in f:
|
||||
if outOfSync == False:
|
||||
words = line.split()
|
||||
if words:
|
||||
if (words[0] == "#"):
|
||||
if (words[1] == "name:"):
|
||||
rname=words[2]
|
||||
elif (words[1] == "type:"):
|
||||
rtype=words[2]
|
||||
elif (words[1] == "rows:"):
|
||||
rrows=int(words[2])
|
||||
elif (words[1] == "columns:"):
|
||||
rcols=int(words[2])
|
||||
rheaderWrite = True
|
||||
elif (words[1] == "hex:"):
|
||||
rhex = words[2] == "true"
|
||||
|
||||
else:
|
||||
if (rheaderWrite):
|
||||
recArray = []
|
||||
rheaderWrite = False
|
||||
record.rname = rname
|
||||
record.rtype = rtype
|
||||
record.rrows = rrows
|
||||
record.rcols = rcols
|
||||
if (rtype == "complex"):
|
||||
compArray = []
|
||||
for word in words:
|
||||
compArray.append(get_complex(word,FloatAsHexString))
|
||||
recArray.append(compArray)
|
||||
elif (rtype == "float"):
|
||||
compArray = []
|
||||
for word in words:
|
||||
compArray.append(get_float(word,FloatAsHexString))
|
||||
recArray.append(compArray)
|
||||
elif (rtype == "int"):
|
||||
compArray = []
|
||||
for word in words:
|
||||
compArray.append(get_int(word))
|
||||
recArray.append(compArray)
|
||||
elif (rtype == "matrix"):
|
||||
compArray = []
|
||||
for word in words:
|
||||
compArray.append(get_float(word,rhex))
|
||||
recArray.append(compArray)
|
||||
|
||||
if (len(recArray) == rrows):
|
||||
record.record = recArray
|
||||
records.append(record)
|
||||
record = octaveRecord()
|
||||
rhex = False
|
||||
else:
|
||||
outOfSync = line.startswith("# Created by tfdmdv.c") == False
|
||||
f.close()
|
||||
return records
|
||||
|
||||
records = readFromDump('tfdmdv_out_reference.txt')
|
||||
records2 = readFromDump('tfdmdv_out.txt')
|
||||
|
||||
outputFile = open('log2.out', 'wt')
|
||||
for rA,rB in zip(records,records2):
|
||||
rA.compare(rB,outputFile)
|
||||
|
||||
#for record in records2:
|
||||
# record.dump(outputFile)
|
||||
outputFile.flush()
|
||||
outputFile.close()
|
||||
@@ -0,0 +1,210 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Intel HEX to ST microelectronics DfuSe file converter
|
||||
# Copyright (C)2015 Thomas Kindler <mail@t-kindler.de>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
import os
|
||||
import struct
|
||||
import argparse
|
||||
from zlib import crc32
|
||||
from intelhex import IntelHex
|
||||
|
||||
|
||||
def load_hex():
|
||||
"""
|
||||
Load hex or binary file.
|
||||
:return: intelhex object
|
||||
"""
|
||||
if args.verbose:
|
||||
print ("Loading %s..." % args.source)
|
||||
|
||||
try:
|
||||
ih = IntelHex()
|
||||
|
||||
if args.format == "hex":
|
||||
ih.loadhex(args.source)
|
||||
else:
|
||||
ih.loadbin(args.source, args.start_addr)
|
||||
|
||||
except Exception as e:
|
||||
print (e)
|
||||
exit(1)
|
||||
|
||||
if args.verbose:
|
||||
print (" Start: 0x%08x" % ih.minaddr())
|
||||
print (" End : 0x%08x" % ih.maxaddr())
|
||||
|
||||
return ih
|
||||
|
||||
|
||||
def save_dfu(ih):
|
||||
"""
|
||||
Save as STMicroelectronics DfuSe file.
|
||||
see UM0391 - DfuSe File Format Specification
|
||||
|
||||
:param ih: intelhex object
|
||||
"""
|
||||
if args.verbose:
|
||||
print ("Saving %s..." % args.target)
|
||||
print (" Device ID: 0x%04x:0x%04x" % (args.vid, args.pid))
|
||||
print (" Target name: %s" % args.target_name)
|
||||
|
||||
# Image element
|
||||
#
|
||||
image_data = ih.tobinarray()
|
||||
|
||||
if len(image_data) != len(bytes(image_data)):
|
||||
# catch and correct python2.7 issue using this hack
|
||||
image_data = ih.tobinstr()
|
||||
|
||||
data = struct.pack(
|
||||
"<II",
|
||||
ih.minaddr(), # dwElementAddress
|
||||
len(image_data) # dwElementSize
|
||||
) + bytes(image_data) # Data
|
||||
|
||||
# Target prefix
|
||||
#
|
||||
szTargetName = args.target_name.encode("ascii")
|
||||
|
||||
data = struct.pack(
|
||||
"<6sBI255sII",
|
||||
b"Target", # szSignature
|
||||
0, # bAlternateSetting
|
||||
1, # bTargetNamed
|
||||
szTargetName, # szTargetName
|
||||
len(data), # dwTargetSize
|
||||
1 # dwNbElements
|
||||
) + data
|
||||
|
||||
# Prefix
|
||||
#
|
||||
data = struct.pack(
|
||||
"<5sBIB",
|
||||
b"DfuSe", # szSignature
|
||||
0x01, # bVersion,
|
||||
len(data)+11, # DFUImageSize,
|
||||
1 # bTargets
|
||||
) + data
|
||||
|
||||
# Suffix
|
||||
#
|
||||
data += struct.pack(
|
||||
"<HHHH3sB",
|
||||
0xFFFF, # bcdDevice
|
||||
args.pid, # idProduct
|
||||
args.vid, # idVendor
|
||||
0x011a, # bdcDFU
|
||||
b"UFD", # ucDfuSignature
|
||||
16 # bLength
|
||||
)
|
||||
|
||||
dwCRC = ~crc32(data) & 0xFFFFFFFF
|
||||
|
||||
data += struct.pack(
|
||||
"<I",
|
||||
dwCRC # dwCRC
|
||||
)
|
||||
|
||||
try:
|
||||
open(args.target, "wb").write(data)
|
||||
|
||||
except Exception as e:
|
||||
print (e)
|
||||
exit(1)
|
||||
|
||||
|
||||
# Parse arguments
|
||||
#
|
||||
DEFAULT_DEVICE = "0x0483:0xdf11"
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Convert hex files to STMicroelectronics DfuSe format"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"--version",
|
||||
action="version",
|
||||
version="%(prog)s 1.1.0"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-q", "--quiet", dest="verbose",
|
||||
default=True,
|
||||
action="store_false",
|
||||
help="do not print status messages"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"source", help="source file"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"target", nargs = "?",
|
||||
help="target file"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-f", "--format",
|
||||
default="hex", choices=["hex", "bin"],
|
||||
help="source file format (default: %(default)s)"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-s", "--start", dest="start_addr",
|
||||
help="set start address (for bin files)"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-d", "--device",
|
||||
default=DEFAULT_DEVICE,
|
||||
help="device VID:PID (default: %(default)s)"
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"-n", "--name", dest="target_name",
|
||||
default="application",
|
||||
help="target name (default: %(default)s)"
|
||||
)
|
||||
|
||||
args=parser.parse_args()
|
||||
|
||||
# Check arguments
|
||||
#
|
||||
if args.target == None:
|
||||
(root, ext) = os.path.splitext(args.source)
|
||||
args.target = root + ".dfu"
|
||||
|
||||
|
||||
if args.format == "bin":
|
||||
if args.start_addr == None:
|
||||
print ("option --start required for binary files")
|
||||
exit(1)
|
||||
|
||||
args.start_addr = int(args.start_addr, 0)
|
||||
else:
|
||||
if args.start_addr != None:
|
||||
print ("option --start not allowed for hex files")
|
||||
exit(1)
|
||||
|
||||
|
||||
args.vid = int(args.device.split(':', 1)[0], 0)
|
||||
args.pid = int(args.device.split(':', 1)[1], 0)
|
||||
|
||||
|
||||
# Convert file
|
||||
#
|
||||
save_dfu( load_hex() )
|
||||
@@ -0,0 +1,357 @@
|
||||
#!/usr/bin/python
|
||||
# (c) Alexander Belchenko, 2007, 2009
|
||||
|
||||
"""Benchmarking.
|
||||
|
||||
Run each test 3 times and get median value.
|
||||
Using 10K array as base test time.
|
||||
|
||||
Each other test compared with base with next formula::
|
||||
|
||||
Tc * Nb
|
||||
q = ---------
|
||||
Tb * Nc
|
||||
|
||||
Here:
|
||||
|
||||
* Tc - execution time of current test
|
||||
* Tb - execution time of base
|
||||
* Nb - array size of base (10K)
|
||||
* Nc - array size of current test
|
||||
|
||||
If resulting value is ``q <= 1.0`` it's the best possible result,
|
||||
i.e. time increase proportionally to array size.
|
||||
"""
|
||||
|
||||
from cStringIO import StringIO
|
||||
import gc
|
||||
import sys
|
||||
import time
|
||||
|
||||
import intelhex
|
||||
|
||||
|
||||
def median(values):
|
||||
"""Return median value for the list of values.
|
||||
@param values: list of values for processing.
|
||||
@return: median value.
|
||||
"""
|
||||
values.sort()
|
||||
n = int(len(values) / 2)
|
||||
return values[n]
|
||||
|
||||
def run_test(func, fobj):
|
||||
"""Run func with argument fobj and measure execution time.
|
||||
@param func: function for test
|
||||
@param fobj: data for test
|
||||
@return: execution time
|
||||
"""
|
||||
gc.disable()
|
||||
try:
|
||||
begin = time.time()
|
||||
func(fobj)
|
||||
end = time.time()
|
||||
finally:
|
||||
gc.enable()
|
||||
return end - begin
|
||||
|
||||
def run_readtest_N_times(func, hexstr, n):
|
||||
"""Run each test N times.
|
||||
@param func: function for test
|
||||
@param hexstr: string with content of hex file to read
|
||||
@param n: times to repeat.
|
||||
@return: (median time, times list)
|
||||
"""
|
||||
assert n > 0
|
||||
times = []
|
||||
for i in range(n):
|
||||
sio = StringIO(hexstr)
|
||||
times.append(run_test(func, sio))
|
||||
sio.close()
|
||||
t = median(times)
|
||||
return t, times
|
||||
|
||||
def run_writetest_N_times(func, n):
|
||||
"""Run each test N times.
|
||||
@param func: function for test
|
||||
@param n: times to repeat.
|
||||
@return: (median time, times list)
|
||||
"""
|
||||
assert n > 0
|
||||
times = []
|
||||
for i in range(n):
|
||||
sio = StringIO()
|
||||
times.append(run_test(func, sio))
|
||||
sio.close()
|
||||
t = median(times)
|
||||
return t, times
|
||||
|
||||
def time_coef(tc, nc, tb, nb):
|
||||
"""Return time coefficient relative to base numbers.
|
||||
@param tc: current test time
|
||||
@param nc: current test data size
|
||||
@param tb: base test time
|
||||
@param nb: base test data size
|
||||
@return: time coef.
|
||||
"""
|
||||
tc = float(tc)
|
||||
nc = float(nc)
|
||||
tb = float(tb)
|
||||
nb = float(nb)
|
||||
q = (tc * nb) / (tb * nc)
|
||||
return q
|
||||
|
||||
def get_test_data(n1, offset, n2):
|
||||
"""Create test data on given pattern.
|
||||
@param n1: size of first part of array at base address 0.
|
||||
@param offset: offset for second part of array.
|
||||
@param n2: size of second part of array at given offset.
|
||||
@return: (overall size, hex file, IntelHex object)
|
||||
"""
|
||||
# make IntelHex object
|
||||
ih = intelhex.IntelHex()
|
||||
addr = 0
|
||||
for i in range(n1):
|
||||
ih[addr] = addr % 256
|
||||
addr += 1
|
||||
addr += offset
|
||||
for i in range(n2):
|
||||
ih[addr] = addr % 256
|
||||
addr += 1
|
||||
# make hex file
|
||||
sio = StringIO()
|
||||
ih.write_hex_file(sio)
|
||||
hexstr = sio.getvalue()
|
||||
sio.close()
|
||||
#
|
||||
return n1+n2, hexstr, ih
|
||||
|
||||
def get_base_10K():
|
||||
"""Base 10K"""
|
||||
return get_test_data(10000, 0, 0)
|
||||
|
||||
def get_100K():
|
||||
return get_test_data(100000, 0, 0)
|
||||
|
||||
def get_100K_100K():
|
||||
return get_test_data(100000, 1000000, 100000)
|
||||
|
||||
def get_0_100K():
|
||||
return get_test_data(0, 1000000, 100000)
|
||||
|
||||
def get_1M():
|
||||
return get_test_data(1000000, 0, 0)
|
||||
|
||||
|
||||
class Measure(object):
|
||||
"""Measure execution time helper."""
|
||||
|
||||
data_set = [
|
||||
# (data name, getter)
|
||||
('base 10K', get_base_10K), # first should be base numbers
|
||||
('100K', get_100K),
|
||||
('1M', get_1M),
|
||||
('100K+100K', get_100K_100K),
|
||||
('0+100K', get_0_100K),
|
||||
]
|
||||
|
||||
def __init__(self, n=3, read=True, write=True):
|
||||
self.n = n
|
||||
self.read = read
|
||||
self.write = write
|
||||
self.results = []
|
||||
|
||||
def measure_one(self, data):
|
||||
"""Do measuring of read and write operations.
|
||||
@param data: 3-tuple from get_test_data
|
||||
@return: (time readhex, time writehex)
|
||||
"""
|
||||
_unused, hexstr, ih = data
|
||||
tread, twrite = 0.0, 0.0
|
||||
if self.read:
|
||||
tread = run_readtest_N_times(intelhex.IntelHex, hexstr, self.n)[0]
|
||||
if self.write:
|
||||
twrite = run_writetest_N_times(ih.write_hex_file, self.n)[0]
|
||||
return tread, twrite
|
||||
|
||||
def measure_all(self):
|
||||
for name, getter in self.data_set:
|
||||
data = getter()
|
||||
times = self.measure_one(data)
|
||||
self.results.append((name, times, data[0]))
|
||||
|
||||
def print_report(self, to_file=None):
|
||||
if to_file is None:
|
||||
to_file = sys.stdout
|
||||
|
||||
base_title, base_times, base_n = self.results[0]
|
||||
base_read, base_write = base_times
|
||||
read_report = ['%-10s\t%7.3f' % (base_title, base_read)]
|
||||
write_report = ['%-10s\t%7.3f' % (base_title, base_write)]
|
||||
|
||||
for item in self.results[1:]:
|
||||
cur_title, cur_times, cur_n = item
|
||||
cur_read, cur_write = cur_times
|
||||
if self.read:
|
||||
qread = time_coef(cur_read, cur_n,
|
||||
base_read, base_n)
|
||||
read_report.append('%-10s\t%7.3f\t%7.3f' % (cur_title,
|
||||
cur_read,
|
||||
qread))
|
||||
if self.write:
|
||||
qwrite = time_coef(cur_write, cur_n,
|
||||
base_write, base_n)
|
||||
write_report.append('%-10s\t%7.3f\t%7.3f' % (cur_title,
|
||||
cur_write,
|
||||
qwrite))
|
||||
if self.read:
|
||||
to_file.write('Read operation:\n')
|
||||
to_file.write('\n'.join(read_report))
|
||||
to_file.write('\n\n')
|
||||
if self.write:
|
||||
to_file.write('Write operation:\n')
|
||||
to_file.write('\n'.join(write_report))
|
||||
to_file.write('\n\n')
|
||||
|
||||
|
||||
HELP = """\
|
||||
Usage: python _bench.py [OPTIONS]
|
||||
|
||||
Options:
|
||||
-h this help
|
||||
-n N repeat tests N times
|
||||
-r run only tests for read operation
|
||||
-w run only tests for write operation
|
||||
|
||||
If option -r or -w is not specified then all tests will be run.
|
||||
"""
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
"""Main function to run benchmarks.
|
||||
@param argv: command-line arguments.
|
||||
@return: exit code (0 is OK).
|
||||
"""
|
||||
import getopt
|
||||
|
||||
# default values
|
||||
test_read = None
|
||||
test_write = None
|
||||
n = 3 # number of repeat
|
||||
|
||||
if argv is None:
|
||||
argv = sys.argv[1:]
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(argv, 'hn:rw', [])
|
||||
|
||||
for o,a in opts:
|
||||
if o == '-h':
|
||||
print(HELP)
|
||||
return 0
|
||||
elif o == '-n':
|
||||
n = int(a)
|
||||
elif o == '-r':
|
||||
test_read = True
|
||||
elif o == '-w':
|
||||
test_write = True
|
||||
|
||||
if args:
|
||||
raise getopt.GetoptError('Arguments are not used.')
|
||||
except getopt.GetoptError, msg:
|
||||
txt = str(msg)
|
||||
print(txt)
|
||||
return 1
|
||||
|
||||
if (test_read, test_write) == (None, None):
|
||||
test_read = test_write = True
|
||||
|
||||
m = Measure(n, test_read, test_write)
|
||||
m.measure_all()
|
||||
m.print_report()
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
|
||||
|
||||
"""
|
||||
|
||||
Some Results
|
||||
************
|
||||
|
||||
|
||||
21/04/2007 revno.40
|
||||
Python 2.5 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.031
|
||||
100K 0.360 1.161
|
||||
1M 3.500 1.129
|
||||
100K+100K 0.719 1.160
|
||||
0+100K 0.360 1.161
|
||||
|
||||
Write operation:
|
||||
base 10K 0.031
|
||||
100K 0.297 0.958
|
||||
1M 2.953 0.953
|
||||
100K+100K 1.328 2.142
|
||||
0+100K 0.312 1.006
|
||||
|
||||
|
||||
21/04/2007 revno.46
|
||||
Python 2.5 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.016
|
||||
100K 0.203 1.269
|
||||
1M 2.000 1.250
|
||||
100K+100K 0.422 1.319
|
||||
0+100K 0.203 1.269
|
||||
|
||||
Write operation:
|
||||
base 10K 0.031
|
||||
100K 0.297 0.958
|
||||
1M 2.969 0.958
|
||||
100K+100K 1.328 2.142
|
||||
0+100K 0.312 1.006
|
||||
|
||||
|
||||
22/04/2007 revno.48
|
||||
Python 2.5 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.016
|
||||
100K 0.187 1.169
|
||||
1M 1.891 1.182
|
||||
100K+100K 0.406 1.269
|
||||
0+100K 0.188 1.175
|
||||
|
||||
Write operation:
|
||||
base 10K 0.031
|
||||
100K 0.296 0.955
|
||||
1M 2.969 0.958
|
||||
100K+100K 1.328 2.142
|
||||
0+100K 0.312 1.006
|
||||
|
||||
|
||||
19/08/2008 revno.72
|
||||
Python 2.5.2 @ Windows XP, Intel Celeron M CPU 430 @ 1.73GHz
|
||||
|
||||
Read operation:
|
||||
base 10K 0.016
|
||||
100K 0.171 1.069
|
||||
1M 1.734 1.084
|
||||
100K+100K 0.375 1.172
|
||||
0+100K 0.172 1.075
|
||||
|
||||
Write operation:
|
||||
base 10K 0.016
|
||||
100K 0.156 0.975
|
||||
1M 1.532 0.957
|
||||
100K+100K 0.344 1.075
|
||||
0+100K 0.156 0.975
|
||||
|
||||
"""
|
||||
@@ -0,0 +1,57 @@
|
||||
# Copyright (c) 2011, Bernhard Leiner
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms,
|
||||
# with or without modification, are permitted provided
|
||||
# that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain
|
||||
# the above copyright notice, this list of conditions
|
||||
# and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce
|
||||
# the above copyright notice, this list of conditions
|
||||
# and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of the author nor the names
|
||||
# of its contributors may be used to endorse
|
||||
# or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
||||
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
'''Compatibility functions for python 2 and 3.
|
||||
|
||||
@author Bernhard Leiner (bleiner AT gmail com)
|
||||
@version 1.0
|
||||
'''
|
||||
|
||||
__docformat__ = "javadoc"
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
def asbytes(s):
|
||||
if isinstance(s, bytes):
|
||||
return s
|
||||
return s.encode('latin1')
|
||||
def asstr(s):
|
||||
if isinstance(s, str):
|
||||
return s
|
||||
return s.decode('latin1')
|
||||
else:
|
||||
asbytes = str
|
||||
asstr = str
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
from setuptools import setup
|
||||
|
||||
def readme():
|
||||
with open('README.md') as f:
|
||||
return f.read()
|
||||
|
||||
setup(name='hex2dfu',
|
||||
version='0.1',
|
||||
packages=['hex2dfu'],
|
||||
description='hex file converter to dfu',
|
||||
url='https://github.com/pjsg/hex2dfu',
|
||||
author='Philip Gladstone',
|
||||
install_requires=[
|
||||
'intelhex>=2.2.1',
|
||||
'markdown',
|
||||
'docopt',
|
||||
],
|
||||
test_suite='nose.collector',
|
||||
tests_require=[
|
||||
'nose',
|
||||
],
|
||||
include_package_data=True,
|
||||
long_description=readme(),
|
||||
zip_safe=False,
|
||||
entry_points={
|
||||
'console_scripts': ['hex2dfu=hex2dfu:main'],
|
||||
})
|
||||
@@ -0,0 +1,23 @@
|
||||
# This is an MCHF board with a single STM32F407VGTx chip.
|
||||
# Generated by System Workbench for STM32
|
||||
|
||||
source [find interface/stlink-v2.cfg]
|
||||
#source [find interface/stlink-v2-1.cfg]
|
||||
|
||||
set WORKAREASIZE 0x20000
|
||||
transport select "hla_swd"
|
||||
|
||||
|
||||
#source [find target/stm32f4x.cfg]
|
||||
source [find target/stm32f7x.cfg]
|
||||
|
||||
# use hardware reset, connect under reset
|
||||
reset_config none
|
||||
|
||||
## code to unprotect a protected STM32F7
|
||||
## normally no required
|
||||
#init
|
||||
#reset halt
|
||||
#stm32f2x unlock 0
|
||||
#reset halt
|
||||
#exit
|
||||
@@ -0,0 +1,28 @@
|
||||
# This is an MCHF board with a single STM32F407VGTx chip.
|
||||
# Generated by System Workbench for STM32
|
||||
|
||||
source [find interface/stlink-v2.cfg]
|
||||
#source [find interface/stlink-v2-1.cfg]
|
||||
|
||||
set WORKAREASIZE 0x20000
|
||||
transport select "hla_swd"
|
||||
|
||||
set ENABLE_LOW_POWER 0
|
||||
set CONNECT_UNDER_RESET 1
|
||||
set STOP_WATCHDOG 1
|
||||
|
||||
debug_level 2
|
||||
|
||||
#source [find target/stm32f4x.cfg]
|
||||
source [find target/stm32h7x_dual_bank.cfg]
|
||||
|
||||
# use hardware reset, connect under reset
|
||||
reset_config none
|
||||
|
||||
## code to unprotect a protected STM32F7
|
||||
## normally no required
|
||||
#init
|
||||
#reset halt
|
||||
#stm32f2x unlock 0
|
||||
#reset halt
|
||||
#exit
|
||||
@@ -0,0 +1,225 @@
|
||||
"""
|
||||
This module contains experimental code for using the (extend) UHSDR API
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
Foundation, either version 3 of the License, or (at your option) any later
|
||||
version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
__author__ = "DB4PLE"
|
||||
__copyright__ = "Copyright 2018, UHSDR project"
|
||||
__credits__ = ["DB4PLE"]
|
||||
__license__ = "GPLv3"
|
||||
__status__ = "Prototype"
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
class CatCmdFt817:
|
||||
"""
|
||||
List of used/supported FT817 CAT command codes
|
||||
This list includes the officially known FT817 codes (including the "undocumented" ones)
|
||||
"""
|
||||
READ_EEPROM = 0xBB
|
||||
WRITE_EEPROM = 0xBC
|
||||
PTT_STATE = 0xF7
|
||||
|
||||
class CatCmd(CatCmdFt817):
|
||||
"""
|
||||
This list extends the FT817 by the special UHSDR codes implemented only in the UHSDR dialect
|
||||
of FT817 CAT (which must be different from the FT817 ones)
|
||||
"""
|
||||
|
||||
UHSDR_ID = 0x42
|
||||
"""
|
||||
this will return the bytes ['U', 'H' , 'S', 'D', 'R' ] and is used to identify an UHSDR with high enough firmware level
|
||||
"""
|
||||
|
||||
class UhsdrConfigIndex:
|
||||
"""
|
||||
this is a completely incomplete list of config value indicies as used in the UHSDR firmware
|
||||
we list only the absolutely necessary ids here for the moment (those must never change in different firmware versions, would break this code)
|
||||
"""
|
||||
VER_MAJOR = 176
|
||||
VER_MINOR = 310
|
||||
VER_BUILD = 171
|
||||
NUMBER_OF_ENTRIES = 407
|
||||
|
||||
def eprint(*args, **kwargs):
|
||||
"""
|
||||
a small function to print to stderr, used for error and logging messages
|
||||
"""
|
||||
print(*args, file=sys.stderr, **kwargs)
|
||||
|
||||
class catSerial:
|
||||
"""
|
||||
Low Level FT817 CAT protocol handling on a serial communication
|
||||
"""
|
||||
def __init__(self, comObj):
|
||||
self.comObj = comObj
|
||||
def sendCommand(self, command):
|
||||
bytesWritten = self.comObj.write(command)
|
||||
return bytesWritten == 5
|
||||
|
||||
def readResponse(self,count):
|
||||
response = self.comObj.read(count)
|
||||
return (len(response) == count,response)
|
||||
|
||||
|
||||
class catCommands:
|
||||
"""
|
||||
CAT API: Here we have direct access to CAT API ations, each logical API function has its direct counterpart in this
|
||||
class
|
||||
We do not implement any extra control logic in here, just the call of the API function and returning the response
|
||||
This may be enriched to have all availabl CAT API functions, right now it is just what we need now
|
||||
"""
|
||||
|
||||
def __init__(self, catObj):
|
||||
self.catObj = catObj
|
||||
|
||||
def execute(self, cmd, count):
|
||||
if self.catObj.sendCommand(cmd):
|
||||
ok,res = self.catObj.readResponse(count)
|
||||
return ok,bytearray(res)
|
||||
else:
|
||||
return (False,bytearray([]))
|
||||
|
||||
def readEEPROM(self, addr):
|
||||
cmd = bytearray([ (addr & 0xff00)>>8,addr & 0xff, 0x00, 0x00, CatCmd.READ_EEPROM])
|
||||
ok,res = self.execute(cmd,2)
|
||||
if ok:
|
||||
return res[1] * 256 + res[0]
|
||||
else:
|
||||
return ok
|
||||
|
||||
def readUHSDR(self):
|
||||
cmd = bytearray([ 0x00, 0x00 , 0x00, 0x00, CatCmd.UHSDR_ID])
|
||||
ok,res = self.execute(cmd,5)
|
||||
|
||||
return res == bytearray("UHSDR", 'utf-8')
|
||||
|
||||
def readPttState(self):
|
||||
cmd = bytearray([ 0x00, 0x00 , 0x00, 0x00, CatCmd.PTT_STATE])
|
||||
ok,res = self.execute(cmd,5)
|
||||
|
||||
return res
|
||||
|
||||
def writeEEPROM(self, addr, value16bit):
|
||||
cmd = bytearray([ (addr & 0xff00)>>8,addr & 0xff, (value16bit & 0xff) >> 0, (value16bit & 0xff00) >> 8, CatCmd.WRITE_EEPROM])
|
||||
ok,res = self.execute(cmd,1)
|
||||
return ok
|
||||
|
||||
def readUHSDRConfig(self, index):
|
||||
return self.readEEPROM(index + 0x8000);
|
||||
|
||||
def writeUHSDRConfig(self, index, value):
|
||||
return self.writeEEPROM(index + 0x8000, value);
|
||||
|
||||
|
||||
class UhsdrConfig():
|
||||
"""
|
||||
CONFIG MANAGEMENT: Handling of reading / writing TRX configurations, detection of TRX presence etc.
|
||||
This class represents high-level actions, should involve proper parameter checking etc.
|
||||
"""
|
||||
|
||||
def __init__(self, catObj):
|
||||
self.catObj = catObj
|
||||
|
||||
def getVersion(self):
|
||||
"""
|
||||
return firmware version as integer tuple (major,minor,build)
|
||||
or (False,False,False) if something goes wrong
|
||||
"""
|
||||
return (self.catObj.readUHSDRConfig(UhsdrConfigIndex.VER_MAJOR),
|
||||
self.catObj.readUHSDRConfig(UhsdrConfigIndex.VER_MINOR),
|
||||
self.catObj.readUHSDRConfig(UhsdrConfigIndex.VER_BUILD))
|
||||
|
||||
def isUhsdrConnected(self):
|
||||
"""
|
||||
we test if an UHSDR with extended API is connected by using an identification API call not present
|
||||
on a FT817 or older UHSDR / mcHF firmwares
|
||||
returns: True if a suitable TRX is connected, False otherwise
|
||||
"""
|
||||
return self.catObj.readUHSDR()
|
||||
|
||||
#
|
||||
def getConfigValueCount(self):
|
||||
return self.catObj.readUHSDRConfig(UhsdrConfigIndex.NUMBER_OF_ENTRIES)
|
||||
|
||||
def getValue(self, index):
|
||||
# TODO: do some range checking here
|
||||
return self.catObj.readUHSDRConfig(index)
|
||||
|
||||
def setValue(self, index, value):
|
||||
# TODO: do some range checking here
|
||||
retval = False
|
||||
if self.catObj.writeUHSDRConfig(index, value):
|
||||
retval = value == self.getValue(index)
|
||||
|
||||
return retval
|
||||
|
||||
|
||||
def configToJson(self):
|
||||
"""
|
||||
read the configuration from TRX into a data dictionary
|
||||
|
||||
returns tuple with boolean success state and read data
|
||||
|
||||
right now the returned JSON structure is quite simple
|
||||
we store the version number as list of 3 integers under the 'version' key
|
||||
we store the date and time of backup as UTC under the 'when' key
|
||||
we store each configuration value as addr/value pair under the 'eeprom' key
|
||||
"""
|
||||
from datetime import datetime
|
||||
|
||||
retval = False
|
||||
valList = []
|
||||
self.data = {}
|
||||
self.data['version'] = self.getVersion()
|
||||
self.data['when'] = str(datetime.utcnow())
|
||||
self.data['eeprom'] = []
|
||||
numberOfValues = self.getConfigValueCount()
|
||||
for index in range(numberOfValues):
|
||||
val = self.getValue(index)
|
||||
valList.append(val)
|
||||
self.data['eeprom'].append({ 'addr' : index , 'value' : val })
|
||||
|
||||
retval = all(val is not False for val in valList) or len(valList) != 0
|
||||
return retval,self.data
|
||||
|
||||
def jsonToConfig(self,data):
|
||||
"""
|
||||
write the configuration in passed data dictionary to TRX
|
||||
|
||||
returns tuple with boolean success state and human readable return msg
|
||||
|
||||
data dictionary must conform to format generated by configToJson()
|
||||
"""
|
||||
|
||||
retval = True
|
||||
retmsg = "OK"
|
||||
if data['when'] != None and len(data['version']) == 3 and len(data['eeprom']) == data['eeprom'][UhsdrConfigIndex.NUMBER_OF_ENTRIES]['value']:
|
||||
numberOfValues = data['eeprom'][UhsdrConfigIndex.NUMBER_OF_ENTRIES]['value']
|
||||
# we do not restore index 0 as it contains EEPROM type. This is never changed during configuration backup, too dangerous
|
||||
for index in range(numberOfValues):
|
||||
addr = data['eeprom'][index]['addr']
|
||||
value = data['eeprom'][index]['value']
|
||||
if addr != 0:
|
||||
if self.setValue(addr,value) == False:
|
||||
retmsg = "Restoring value {} at addr {} failed".format(value,addr)
|
||||
retval = False
|
||||
break
|
||||
else:
|
||||
retmsg = "Configuration data failed consistency check"
|
||||
retval = False
|
||||
return retval,retmsg
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
"""
|
||||
This module contains experimental code for using the (extend) UHSDR API
|
||||
and contains a small commandline client for backup and restore of
|
||||
the UHSDR configuration data from/to a TRX
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
Foundation, either version 3 of the License, or (at your option) any later
|
||||
version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
__author__ = "DB4PLE"
|
||||
__copyright__ = "Copyright 2018, UHSDR project"
|
||||
__credits__ = ["DB4PLE"]
|
||||
__license__ = "GPLv3"
|
||||
__status__ = "Prototype"
|
||||
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
import uhsdr
|
||||
|
||||
def listUHSDRSerial():
|
||||
"""
|
||||
list serial ports. For new pySerial version we return only the real UHSDR device, otherwise just a list of serial port objects
|
||||
|
||||
returns tupel (Boolean,List) True if UHSDR filter was active, False otherwise, second element is actual list of info for com ports.
|
||||
"""
|
||||
import serial
|
||||
import serial.tools.list_ports;
|
||||
from distutils.version import StrictVersion
|
||||
# UHSDR uses USB VID:PID=0483:5732
|
||||
retval = False,[]
|
||||
|
||||
if StrictVersion(serial.VERSION) >= StrictVersion("3.0"):
|
||||
retval = True,[ comport.device for comport in serial.tools.list_ports.comports() if comport.vid == 0x0483 and comport.pid == 0x5732 ]
|
||||
else:
|
||||
uhsdr.eprint("pySerial version ",serial.VERSION," is too old for detecting UHSDR device, using full serial port list")
|
||||
retval = False,[ vars(comport) for comport in serial.tools.list_ports.comports()]
|
||||
return retval
|
||||
|
||||
def backupRestoreApp():
|
||||
import serial
|
||||
"""
|
||||
Simple command line tool to backup/restore the configuration from/to TRX
|
||||
"""
|
||||
|
||||
if False and "idlelib" in sys.modules:
|
||||
uhsdr.eprint("Running in IDLE GUI, please set parameters directly in script, search for #change ")
|
||||
#change parameters here
|
||||
sys.argv = [sys.argv[0],'--port','15','-b']
|
||||
#no more changes below
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-b","--backup", help="backup the UHSDR TRX configuration to file", action="store_true")
|
||||
parser.add_argument("-r","--restore", help="restore the UHSDR TRX configuration from file", action="store_true")
|
||||
parser.add_argument("-p","--port", help="UHSDR serial port either by number (COM<num> in Windows, Linux /dev/ttyACM<num>) or full device name ( e.g. '/dev/cu.modemABCD', all operating systems )", type=str, default="undefined serial port name")
|
||||
parser.add_argument("-f","--file", help="filename to backup to/restore from, if not defined 'uhsdr_config.json' is used", type=str, default="uhsdr_config.json")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
print("This program backups and restores the configuration of UHSDR TRX via USB")
|
||||
|
||||
if args.port == -1:
|
||||
print("Use -h to get more information")
|
||||
print("")
|
||||
isFiltered, uhsdrDeviceList = listUHSDRSerial()
|
||||
if uhsdrDeviceList == []:
|
||||
uhsdr.eprint("No suitable serial port detected, make sure to connect UHSDR TRX")
|
||||
else:
|
||||
if isFiltered:
|
||||
uhsdr.eprint("List of detected UHSDR TRX")
|
||||
else:
|
||||
uhsdr.eprint("List of detected serial ports:")
|
||||
uhsdr.eprint(uhsdrDeviceList)
|
||||
uhsdr.eprint("Please specify valid UHSDR TRX serial port number(!) with -p / --port")
|
||||
else:
|
||||
|
||||
try:
|
||||
int(args.port);
|
||||
comPort= ("COM" if os.name == "nt" else "/dev/ttyACM") + str(args.port)
|
||||
except:
|
||||
comPort = args.port
|
||||
|
||||
uhsdr.eprint("Opening serial port ",comPort,":")
|
||||
try:
|
||||
mySer = serial.Serial(comPort, 38400, timeout=0.500, parity=serial.PARITY_NONE)
|
||||
except:
|
||||
uhsdr.eprint("... failed")
|
||||
raise
|
||||
uhsdr.eprint("... okay")
|
||||
myCom = uhsdr.catSerial(mySer)
|
||||
myCAT = uhsdr.catCommands(myCom)
|
||||
myUHSDR = uhsdr.UhsdrConfig(myCAT)
|
||||
|
||||
uhsdr.eprint("Detecting if UHSDR is connected: ")
|
||||
if myUHSDR.isUhsdrConnected():
|
||||
uhsdr.eprint("... yes")
|
||||
version = myUHSDR.getVersion()
|
||||
print("Detected UHSDR Firmware Version", version)
|
||||
if args.backup:
|
||||
uhsdr.eprint("Reading configuration from UHSDR TRX:")
|
||||
ok,data = myUHSDR.configToJson()
|
||||
if ok:
|
||||
uhsdr.eprint("... success. Now saving in file:")
|
||||
with open(args.file, 'w') as outfile:
|
||||
try:
|
||||
json.dump(data, outfile, indent=4)
|
||||
uhsdr.eprint("... saved to " + args.file + " file")
|
||||
except:
|
||||
uhsdr.eprint("... failed to save to " + args.file + " file")
|
||||
raise
|
||||
outfile.close()
|
||||
else:
|
||||
uhsdr.eprint("... could not read data sucessfully")
|
||||
elif args.restore:
|
||||
with open(args.file, 'r') as infile:
|
||||
data = json.load(infile)
|
||||
uhsdr.eprint("Sending configuration to UHSDR TRX:")
|
||||
ok,msg = myUHSDR.jsonToConfig(data)
|
||||
if ok:
|
||||
uhsdr.eprint("... restored all data from " + args.file + " file")
|
||||
print("ACTIVATING RESTORED CONFIGURATION: Switch off TRX WITHOUT saving configuration -> Press Band+ and Power buttons")
|
||||
print("")
|
||||
print("ATTENTION: In case of an accidential restore:")
|
||||
print("Press Power button to save running configuration, overwriting the restored values in configuration memory.")
|
||||
else:
|
||||
uhsdr.eprint("... problem occured: ",msg)
|
||||
|
||||
infile.close()
|
||||
else:
|
||||
uhsdr.eprint("... could not find a connected UHSDR with extended CAT commands (required)")
|
||||
|
||||
mySer.close()
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
backupRestoreApp()
|
||||
@@ -0,0 +1,152 @@
|
||||
# script for stm32h7x family
|
||||
|
||||
#
|
||||
# stm32h7 devices support both JTAG and SWD transports.
|
||||
#
|
||||
source [find target/swj-dp.tcl]
|
||||
source [find mem_helper.tcl]
|
||||
|
||||
if { [info exists CHIPNAME] } {
|
||||
set _CHIPNAME $CHIPNAME
|
||||
} else {
|
||||
set _CHIPNAME stm32h7x
|
||||
}
|
||||
|
||||
set _ENDIAN little
|
||||
|
||||
# Work-area is a space in RAM used for flash programming
|
||||
# By default use 64kB
|
||||
if { [info exists WORKAREASIZE] } {
|
||||
set _WORKAREASIZE $WORKAREASIZE
|
||||
} else {
|
||||
set _WORKAREASIZE 0x10000
|
||||
}
|
||||
|
||||
#jtag scan chain
|
||||
if { [info exists CPUTAPID] } {
|
||||
set _CPUTAPID $CPUTAPID
|
||||
} else {
|
||||
if { [using_jtag] } {
|
||||
set _CPUTAPID 0x6ba00477
|
||||
} {
|
||||
set _CPUTAPID 0x6ba02477
|
||||
}
|
||||
}
|
||||
|
||||
swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
|
||||
|
||||
if { [info exists BSTAPID] } {
|
||||
set _BSTAPID1 $BSTAPID
|
||||
} else {
|
||||
# See STM Document RM0399
|
||||
# Section 40.6.1
|
||||
# STM32H74xxI
|
||||
set _BSTAPID1 0x06450041
|
||||
}
|
||||
|
||||
if {[using_jtag]} {
|
||||
swj_newdap $_CHIPNAME bs -irlen 5 -expected-id $_BSTAPID1
|
||||
}
|
||||
|
||||
set _TARGETNAME $_CHIPNAME.cpu
|
||||
target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_TARGETNAME
|
||||
|
||||
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
|
||||
|
||||
set _FLASHNAME $_CHIPNAME.flash
|
||||
flash bank $_FLASHNAME stm32h7x 0x08000000 0 0 0 $_TARGETNAME
|
||||
|
||||
# check for second flash bank
|
||||
if { [regexp -nocase {stm32h74..i..|stm32h75..i..} $_CHIPNAME] } {
|
||||
# STM32H7xxxI 2Mo have a dual bank flash.
|
||||
# Add the second flash bank.
|
||||
set _FLASHNAME $_CHIPNAME.flash1
|
||||
flash bank $_FLASHNAME stm32h7x 0x08100000 0 0 0 $_TARGETNAME
|
||||
}
|
||||
|
||||
|
||||
# Clock after reset is HSI at 64 MHz, no need of PLL
|
||||
if { [info exists CLOCK_FREQ] } {
|
||||
set _CLOCK_FREQ $CLOCK_FREQ
|
||||
} else {
|
||||
set _CLOCK_FREQ 1800
|
||||
}
|
||||
adapter_khz 1800
|
||||
|
||||
|
||||
adapter_nsrst_delay 100
|
||||
if {[using_jtag]} {
|
||||
jtag_ntrst_delay 100
|
||||
}
|
||||
|
||||
if {![using_hla]} {
|
||||
# if srst is not fitted use SYSRESETREQ to
|
||||
# perform a soft reset
|
||||
cortex_m reset_config sysresetreq
|
||||
}
|
||||
|
||||
$_TARGETNAME configure -event trace-config {
|
||||
# Set TRACE_CLKEN; TRACE_MODE is set to async; when using sync
|
||||
# change this value accordingly to configure trace pins
|
||||
# assignment
|
||||
mmw 0x5C001004 0x00100000 0
|
||||
}
|
||||
|
||||
$_TARGETNAME configure -event reset-init {
|
||||
global ENABLE_LOW_POWER
|
||||
global STOP_WATCHDOG
|
||||
global _CLOCK_FREQ
|
||||
|
||||
# Not done in target examine-end because device can be under reset and we get comm errors
|
||||
|
||||
# Enable D3 and D1 DBG clocks
|
||||
# DBGMCU_CR |= DBG_CKEN_D3 | DBG_CKEN_D1
|
||||
mmw 0x5C001004 0x00600000 0
|
||||
|
||||
if { [expr ($ENABLE_LOW_POWER == 1)] } {
|
||||
# Enable debug during low power modes (uses more power)
|
||||
# DBGMCU_CR |= DBG_STANDBY | DBG_STOP | DBG_SLEEP in D3, D2 & D1 Domains
|
||||
mmw 0x5C001004 0x000001BF 0
|
||||
}
|
||||
if { [expr ($ENABLE_LOW_POWER == 0)] } {
|
||||
# Disable debug during low power modes
|
||||
# DBGMCU_CR |= ~(DBG_STANDBY | DBG_STOP | DBG_SLEEP)
|
||||
mmw 0x5C001004 0 0x000001BF
|
||||
}
|
||||
if { [expr ($STOP_WATCHDOG == 1)] } {
|
||||
# Stop watchdog counters during halt
|
||||
# DBGMCU_D1APB1_FZ |= DBG_WWDG1_STOP
|
||||
mmw 0x5C001034 0x00000040 0
|
||||
# DBGMCU_D2APB1_FZ |= DBG_WWDG2_STOP
|
||||
mmw 0x5C00103C 0x00000800 0
|
||||
# DBGMCU_D3APB1_FZ |= DBG_WDGLSD2_STOP | DBG_WDGLSD1_STOP
|
||||
mmw 0x5C001054 0x000C0000 0
|
||||
}
|
||||
if { [expr ($STOP_WATCHDOG == 0)] } {
|
||||
# Don't stop watchdog counters during halt
|
||||
# DBGMCU_D1APB1_FZ |= ~DBG_WWDG1_STOP
|
||||
mmw 0x5C001034 0 0x00000040
|
||||
# DBGMCU_D2APB1_FZ |= ~DBG_WWDG2_STOP
|
||||
mmw 0x5C00103C 0 0x00000800
|
||||
# DBGMCU_D3APB1_FZ |= ~(DBG_WDGLSD2_STOP | DBG_WDGLSD1_STOP)
|
||||
mmw 0x5C001054 0 0x000C0000
|
||||
}
|
||||
if { [expr ($ENABLE_LOW_POWER == 0)] && [expr ($STOP_WATCHDOG == 0)] } {
|
||||
# Disable D3 and D1 DBG clocks
|
||||
# DBGMCU_CR |= ~(DBG_CKEN_D3 | DBG_CKEN_D1)
|
||||
mmw 0x5C001004 0 0x00600000
|
||||
}
|
||||
|
||||
# Clock after reset is HSI at 64 MHz, no need of PLL
|
||||
adapter_khz $_CLOCK_FREQ
|
||||
}
|
||||
|
||||
$_TARGETNAME configure -event gdb-attach {
|
||||
global CONNECT_UNDER_RESET
|
||||
|
||||
# Needed to be able to use the connect_assert_srst in reset_config
|
||||
# otherwise, can't read device flash size register
|
||||
if { [expr ($CONNECT_UNDER_RESET == 1)] } {
|
||||
reset init
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
cd ../drivers/freedv
|
||||
SRCFILES=`grep -L "/* THIS IS A G" *.c *.h`
|
||||
CODEC2_PATH=../../../../codec2-dev/src
|
||||
for i in $SRCFILES
|
||||
do
|
||||
XI="$CODEC2_PATH/$i"
|
||||
if [ -f "$XI" ]
|
||||
then
|
||||
cp "$i" "$XI"
|
||||
else
|
||||
echo $i was not found at $XI
|
||||
fi
|
||||
done
|
||||
|
||||
|
After Width: | Height: | Size: 484 KiB |
@@ -0,0 +1 @@
|
||||
2019-07-15 15:42:15.426467743 +0200
|
||||
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# 2017-01-01 HB9ocq - removed WA (escape commas)
|
||||
|
||||
|
||||
# automated build only by DF8OE
|
||||
if [ "$1" == "auto" ] && [ ! -f ../DF8OE ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$1" == "test" ]; then
|
||||
mkdir ../handbook-test 2>/dev/null
|
||||
cp -v uhsdr-logo.png support/ui/menu > /dev/zero
|
||||
(cd support/ui/menu \
|
||||
&& python2 ./ui_menu_structure_c2py.py | python - \
|
||||
&& python2 ./ui_menu_structure_graph.py > ../../../../handbook-test/ui_menu_structure_graph.gv \
|
||||
&& dot -Tsvg -o../../../../handbook-test/ui_menu_structure_graph.svg ../../../../handbook-test/ui_menu_structure_graph.gv \
|
||||
&& dot -Tpng -o../../../../handbook-test/ui_menu_structure_graph.png ../../../../handbook-test/ui_menu_structure_graph.gv \
|
||||
)
|
||||
(cd support/ui/menu \
|
||||
&& python2 ./ui_menu_structure_mdtable.py > ../../../../handbook-test/ui_menu_structure_mdtable.md \
|
||||
)
|
||||
echo "menu-handbook-test build completed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$(cat support/ui/menu/menu-handbook-build.timestamp 2>/dev/null)" == "$(stat -c%y drivers/ui/menu/ui_menu_structure.c)" ]; then
|
||||
echo "menu-handbook already up2date"
|
||||
else
|
||||
# extract UI Menu Descriptor data from source code and generate graph + table for handbook
|
||||
echo "building menu-handbook..."
|
||||
cp -v uhsdr-logo.png support/ui/menu > /dev/zero
|
||||
(cd support/ui/menu \
|
||||
&& python2 ./ui_menu_structure_c2py.py | python - \
|
||||
&& python2 ./ui_menu_structure_graph.py > ui_menu_structure_graph.gv \
|
||||
&& dot -Tsvg -oui_menu_structure_graph.svg ui_menu_structure_graph.gv \
|
||||
&& dot -Tpng -oui_menu_structure_graph.png ui_menu_structure_graph.gv \
|
||||
)
|
||||
(cd support/ui/menu \
|
||||
&& python2 ./ui_menu_structure_mdtable.py > ui_menu_structure_mdtable.md \
|
||||
)
|
||||
(echo $(stat -c%y drivers/ui/menu/ui_menu_structure.c) > support/ui/menu/menu-handbook-build.timestamp)
|
||||
echo "menu-handbook build completed."
|
||||
fi
|
||||
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""
|
||||
|
||||
2016-12-30 HB9ocq - extract uhsdr LCD-menu definition data from C-cource
|
||||
and transform to Python, showing on stdout
|
||||
|
||||
WARNING: THIS BASES HEAVILY UPON (UN-)DISCIPLINE IN C SYNTAX ! ! !
|
||||
WARNING: ANY CHANGE OF DEFINITIONS AND DECLARATIONS IN $INPUT_C_SRC
|
||||
POTENTIALLY BREAKS THIS TRANSFORMATION ! ! !
|
||||
|
||||
LAST WARNING: YOU HAVE BEEN WARNED ! ! !
|
||||
|
||||
|
||||
2017-01-01 HB9ocq - replacement for prototype shell script (ui_menu_structure_c2py.sh)
|
||||
for improved parsing accuracy (avoids issues with commas and
|
||||
all uppercase text in UiMenuDesc(...))
|
||||
2017-01-06 HB9ocq - following change in definition of MenuDescriptor
|
||||
|
||||
AFTERLAST WARNING: BINDS EVEN TIGHTER TO WRITING DISCIPLINE IN C SYNTAX ! ! !
|
||||
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
|
||||
# this points from HERE to the 'mchf-eclipse' directory of our project
|
||||
MCHF_BASEDIR = r"../../../"
|
||||
MCHF_VERSIONFILE = MCHF_BASEDIR + r'src/uhsdr_version.h'
|
||||
|
||||
# the ONLY C-source we do read AND understand
|
||||
INPUT_C_SRC = MCHF_BASEDIR + r"drivers/ui/menu/ui_menu_structure.c"
|
||||
|
||||
# reading version from uhsdr_version.h
|
||||
MAJ = subprocess.check_output('cat ' + MCHF_VERSIONFILE + ' | cut -d " " -f 2 | grep "TRX4M" | egrep -e "^[^#]" | grep "MAJOR" | cut -d "\\"" -f 2 | tr -d $"\n"', shell = True)
|
||||
MIN = subprocess.check_output('cat ' + MCHF_VERSIONFILE + ' | cut -d " " -f 2 | grep "TRX4M" | egrep -e "^[^#]" | grep "MINOR" | cut -d "\\"" -f 2 | tr -d $"\n"', shell = True)
|
||||
REL = subprocess.check_output('cat ' + MCHF_VERSIONFILE + ' | cut -d " " -f 2 | grep "TRX4M" | egrep -e "^[^#]" | grep "RELEASE" | cut -d "\\"" -f 2 | tr -d $"\n"', shell = True)
|
||||
BUILD_ID = MAJ + "." + MIN + "." + REL
|
||||
|
||||
# reading version from mchf.bin
|
||||
#BUILD_ID = subprocess.check_output('grep -aPo "(?<=fwv-)[^fwt]+" ../../../mchf.bin | cut -d "" -f 1 | tr -d $"\n"', shell = True)
|
||||
|
||||
#print("##DBG## BUILD_ID = '{}'".format(BUILD_ID))
|
||||
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
TS_NOW = datetime.now().replace(microsecond=0).isoformat()
|
||||
|
||||
|
||||
#-----------------------------------------------------
|
||||
|
||||
# read in the whole C source
|
||||
menu_csrc = []
|
||||
with open(INPUT_C_SRC, 'r') as f:
|
||||
menu_csrc = f.readlines()
|
||||
|
||||
|
||||
MENU_DESCRIPTOR = []
|
||||
"""
|
||||
MENU_DESCRIPTOR is the datastructure we're gonna build
|
||||
|
||||
MENU_DESCRIPTOR is a list of dicts with entries "MENU_ID" "ME_KIND" "NR" "LABEL" "DESC"
|
||||
|
||||
e.g. [ ... { 'MENU_ID': "TOP",
|
||||
'ME_KIND': "GROUP",
|
||||
'NR': "MENU_BASE",
|
||||
'LABEL': "Standard Menu",
|
||||
'DESC': ":soon:" },
|
||||
...]
|
||||
"""
|
||||
|
||||
|
||||
import re
|
||||
|
||||
MENULN_REO = re.compile( # pattern for lines..
|
||||
r'^\s+{\s*' # ..starting with whitespace + a left brace
|
||||
+ r'(?P<MENU_ID>MENU_[\w]+)' # ..an identifier 'MENU_xxx', we call it MENU_ID
|
||||
+ r'[,\s]+'
|
||||
+ r'(?P<ME_KIND>MENU_[\w]+)' # ..a 2nd id 'MENU_xxx', we call it ME_KIND
|
||||
+ r'[,\s]+'
|
||||
+ r'(?P<NR>[\w]+)' # ..a 3rd rather long id 'yy...zz', we call it NR
|
||||
+ r'[,\s]+'
|
||||
+ r'.*[^,]' # ..show conditional entries, too
|
||||
# + r'NULL' # .. this would show only non-conditional entries
|
||||
+ r'[,\s]+'
|
||||
+ r'"(?P<LABEL>[^"]*)"' # ..n chars in quotes, we call this LABEL
|
||||
+ r'[,\s]+'
|
||||
+ r'UiMenuDesc\("(?P<DESC>[^"]*)"\s*\)' # ..a UiMenuDesc in quotes, we call it DESC
|
||||
+ r'.*}.*$' # ..unintresting rest, incl. right brace
|
||||
)
|
||||
|
||||
|
||||
# each line of the C source...
|
||||
for ln in menu_csrc:
|
||||
# ...gets RE-searched for the interesting data,
|
||||
m = MENULN_REO.search(ln)
|
||||
if m: # ...as things match: keep the ready-cooked dict
|
||||
MENU_DESCRIPTOR.append(m.groupdict())
|
||||
|
||||
if [] == MENU_DESCRIPTOR:
|
||||
print('ERROR: MENU_DESCRIPTOR is empty! (no lines defining UiMenu entries found in "{}".'.format(INPUT_C_SRC))
|
||||
exit(-1)
|
||||
|
||||
#-----------------------------------------------------
|
||||
|
||||
OUTPUT = """\
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# WARNING: generated data! DO NOT EDIT MANUALLY ! ! !
|
||||
#
|
||||
# generated at {TS_NOW} by "{__file__}"
|
||||
#
|
||||
# out of {INPUT_C_SRC} ({BUILD_ID})
|
||||
#
|
||||
|
||||
BUILD_ID = "{BUILD_ID}"
|
||||
|
||||
MENU_DESCRIPTOR = {}
|
||||
|
||||
#EOFILE
|
||||
"""
|
||||
|
||||
|
||||
from pprint import pformat
|
||||
|
||||
|
||||
# are we running as a program?
|
||||
if '__main__' == __name__:
|
||||
print(OUTPUT.format(pformat(MENU_DESCRIPTOR), **globals()))
|
||||
exit(0)
|
||||
|
||||
#EOFILE
|
||||
|
After Width: | Height: | Size: 3.4 MiB |
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/python
|
||||
"""
|
||||
2017-01-01 HB9ocq - support program to document the menu structure of uhsdr amateur radio firmware
|
||||
2017-01-06 HB9ocq - following change in definition of MenuDescriptor
|
||||
|
||||
relies upon module ui_menu_structure_c2py.py in the same directory
|
||||
|
||||
"""
|
||||
|
||||
|
||||
from ui_menu_structure_c2py import MENU_DESCRIPTOR, BUILD_ID
|
||||
# MENU_DESCRIPTOR is a list of dicts with entries "MENU_ID" "ME_KIND" "NR" "LABEL"
|
||||
# e.g. [ ... { 'MENU_ID': "TOP",
|
||||
# 'ME_KIND': "GROUP",
|
||||
# 'NR': "MENU_BASE",
|
||||
# 'LABEL': "Standard Menu",
|
||||
# 'DESC': ":soon:" },
|
||||
# ...]
|
||||
|
||||
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
TS_NOW = datetime.now().replace(microsecond=0).isoformat()
|
||||
|
||||
|
||||
#-----------------------------------------------------
|
||||
|
||||
GEN_SENTENCE = r'generated at {TS_NOW} by "{__file__}"'.format(**globals())
|
||||
|
||||
OUTPUT = ""
|
||||
|
||||
# preface/header
|
||||
OUTPUT += r"""
|
||||
#
|
||||
# WARNING: generated data! DO NOT EDIT MANUALLY ! ! !
|
||||
#
|
||||
# {GEN_SENTENCE}
|
||||
#
|
||||
# mcHF SDR TRX v{BUILD_ID} - Menu Structure Diagram in DOT-language
|
||||
#
|
||||
# (see <http://www.graphviz.org/content/dot-language> )
|
||||
#
|
||||
|
||||
digraph mcHF_menus {{
|
||||
|
||||
graph [ fontsize = 14,
|
||||
label = "\nmcHF v{BUILD_ID} - Menus Overview\n{GS2}",
|
||||
];
|
||||
|
||||
rankdir=LR
|
||||
nodesep=.05
|
||||
|
||||
# - - - -
|
||||
""".format(GS2=GEN_SENTENCE.replace('"', '\\"'), **globals())
|
||||
|
||||
# artificial node for MENU_TOP
|
||||
OUTPUT += """
|
||||
"MENU_TOP" [
|
||||
shape = none
|
||||
image = "uhsdr-logo.png"
|
||||
label = ""
|
||||
];
|
||||
|
||||
"""
|
||||
|
||||
# body - nodes
|
||||
|
||||
for md in MENU_DESCRIPTOR:
|
||||
if((0 != md['NR']) and ('MENU_STOP' != md['ME_KIND'])):
|
||||
# declare a node for id
|
||||
OUTPUT += """
|
||||
"{NR}" [
|
||||
label = "{NR} | {LABEL}"
|
||||
shape = record
|
||||
];
|
||||
""".format(**md).replace('<', '\<').replace('>', '\>')
|
||||
|
||||
|
||||
# body - edges
|
||||
|
||||
for mId in set([md['MENU_ID'] for md in MENU_DESCRIPTOR]):
|
||||
# start subgraph for every "parent"
|
||||
OUTPUT += """
|
||||
# - - - -
|
||||
|
||||
subgraph "{0}" {{
|
||||
label = "{0} beef.0f.dead.e5e1"
|
||||
|
||||
""".format(mId)
|
||||
|
||||
for md in MENU_DESCRIPTOR:
|
||||
if((0 != md['NR']) and ('MENU_STOP' != md['ME_KIND']) and (mId == md['MENU_ID'])):
|
||||
# ...add an edge
|
||||
OUTPUT += """
|
||||
{MENU_ID} -> {NR}
|
||||
""".format(**md)
|
||||
|
||||
OUTPUT += """
|
||||
}} ## END subgraph {MENU_ID}
|
||||
""".format(**md)
|
||||
|
||||
|
||||
# footer
|
||||
OUTPUT += """
|
||||
# - - - -
|
||||
}
|
||||
|
||||
#EOFILE
|
||||
"""
|
||||
|
||||
|
||||
# are we running as a program?
|
||||
if '__main__' == __name__:
|
||||
print(OUTPUT)
|
||||
exit(0)
|
||||
|
||||
#EOFILE
|
||||
|
After Width: | Height: | Size: 288 KiB |
@@ -0,0 +1,327 @@
|
||||
|
||||
[//]: # ( )
|
||||
[//]: # ( WARNING: generated data! DO NOT EDIT MANUALLY ! ! ! )
|
||||
[//]: # ( )
|
||||
[//]: # ( generated at 2019-07-15T15:44:19 by "./ui_menu_structure_mdtable.py" )
|
||||
[//]: # ( )
|
||||
[//]: # ( mcHF SDR TRX v.. - Menu Structure Diagram as MarkDown-Table )
|
||||
[//]: # ( )
|
||||
[//]: # ( see <https://help.github.com/categories/writing-on-github/> )
|
||||
[//]: # ( )
|
||||
|
||||
# uhsdr firmware v.. - UI Menu Overview
|
||||
|
||||
generated at 2019-07-15T15:44:19 by "./ui_menu_structure_mdtable.py"
|
||||
|
||||
|
||||
|
||||
## Standard Menu (`MENU_BASE`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **LSB/USB Auto Select** ( MENU_SSB_AUTO_MODE_SELECT) | If enabled, the appropriate sideband mode for SSB and FreeDV is chosen as default for each band by its frequency. |
|
||||
| **Digital Modes** ( MENU_DIGI_DISABLE) | Disable appearance of digital modes when pressing Mode button |
|
||||
| **CW Mode** ( MENU_CW_DISABLE) | Disable appearance of CW mode when pressing Mode button |
|
||||
| **AM Mode** ( MENU_AM_DISABLE) | Disable appearance of AM mode when pressing Mode button |
|
||||
| **SyncAM Mode** ( MENU_DEMOD_SAM) | Disable appearance of SyncAM modes when pressing Mode button |
|
||||
| **SAM PLL locking range** ( MENU_SAM_PLL_LOCKING_RANGE) | SAM PLL Locking Range in Hz: this determines how far up and down from the carrier frequency of an AM station we can offtune the receiver, so that the PLL will still lock to the carrier. |
|
||||
| **SAM PLL step response** ( MENU_SAM_PLL_STEP_RESPONSE) | Step response = Zeta = damping factor of the SAM PLL. Sets the stability and transient response of the PLL. Larger values give faster lock even if you are offtune, but PLL is also more sensitive. |
|
||||
| **SAM PLL bandwidth in Hz** ( MENU_SAM_PLL_BANDWIDTH) | Bandwidth of the PLL loop = OmegaN in Hz: smaller bandwidth = more stable lock. FAST LOCK SAM PLL - set Step response and PLL bandwidth to large values [eg. 80 / 350]; DX (SLOW & STABLE) SAM PLL - set Step response and PLL bandwidth to small values [eg. 30 / 100]. |
|
||||
| **SAM Fade Leveler** ( MENU_SAM_FADE_LEVELER) | Fade leveler (in AM/SAM mode) ON/OFF. Fade leveler is helpful in situations with very fast QSB of the carrier ´flutter´. It is designed to remove the rapidly changing carrier and replace it with a more stable carrier. If there is no QSB on the carrier, there is no change. |
|
||||
| **FM Mode** ( MENU_FM_MODE_ENABLE) | Disable appearance of FM mode when pressing Mode button |
|
||||
| **FM Sub Tone Gen** ( MENU_FM_GEN_SUBAUDIBLE_TONE) | Enable generation of CTCSS tones during FM transmissions. |
|
||||
| **FM Sub Tone Det** ( MENU_FM_DET_SUBAUDIBLE_TONE) | Enable detection of CTCSS tones during FM receive. RX is muted unless tone is detected. |
|
||||
| **FM Tone Burst** ( MENU_FM_TONE_BURST_MODE) | Enabled sending of short tone at beginning of each FM transmission. Used to open repeaters. Available frequencies are 1750 Hz and 2135 Hz. |
|
||||
| **FM Deviation** ( MENU_FM_DEV_MODE) | Select between normal and narrow deviation (5 and 2.5kHz) for FM RX/TX |
|
||||
| **AGC WDSP Mode** ( MENU_AGC_WDSP_MODE) | Choose a bundle of preset AGC parameters for the WDSP AGC: FAST / MED / SLOW / LONG / very LONG or switch OFF the AGC. |
|
||||
| **AGC WDSP Slope** ( MENU_AGC_WDSP_SLOPE) | Slope of the AGC is the difference between the loudest signal and the quietest signal after the AGC action has taken place. Given in dB. |
|
||||
| **AGC WDSP Decay** ( MENU_AGC_WDSP_TAU_DECAY) | Time constant for the AGC decay (speed of recovery of the AGC gain) in milliseconds. |
|
||||
| **AGC WDSP Threshold** ( MENU_AGC_WDSP_THRESH) | ´Threshold´ = ´Knee´ of the AGC: input signal level from which on the AGC action takes place. AGC threshold should be placed/adjusted just above the band noise for every particular RX situation to allow for optimal AGC action. The blue AGC box indicates when AGC action takes place and helps in adjusting this threshold. |
|
||||
| **AGC WDSP Hang enable** ( MENU_AGC_WDSP_HANG_ENABLE) | Enable/Disable Hang AGC function: If enabled: after the signal has decreased, the gain of the AGC is held constant for a certain time period (the hang time) in order to allow for speech pauses without disturbing noise because of fast acting AGC. |
|
||||
| **AGC WDSP Hang time** ( MENU_AGC_WDSP_HANG_TIME) | Hang AGC: hang time is the time period over which the AGC gain is held constant when in AGC Hang mode. After this period the gain is increased fast. |
|
||||
| **AGC WDSP Hang threshold** ( MENU_AGC_WDSP_HANG_THRESH) | ´Threshold´ for the Hang AGC: Hang AGC is useful for medium to strong signals. The Hang threshold determines the signal strength a signal has to exceed for Hang AGC to take place. |
|
||||
| **AGC WDSP Hang Decay** ( MENU_AGC_WDSP_TAU_HANG_DECAY) | Time constant for the Hang AGC decay (speed of recovery of the AGC gain after hang time has expired) in milliseconds. |
|
||||
| **RX Codec Gain** ( MENU_CODEC_GAIN_MODE) | Sets the Codec IQ signal gain. Higher values represent higher gain. If set to AUTO the mcHF controls the gain so that the best dynamic range is used. |
|
||||
| **RX/TX Freq Xlate** ( MENU_RX_FREQ_CONV) | Controls offset of the receiver IQ signal base frequency from the dial frequency. Use of +/-12Khz is recommended. Switching it to OFF is not recommended as it disables certain features. |
|
||||
| **Mic Input Gain** ( MENU_MIC_GAIN) | Microphone gain. Also changeable via Encoder 3 if Microphone is selected as Input |
|
||||
| **Line Input Gain** ( MENU_LINE_GAIN) | LineIn gain. Also changeable via Encoder 3 if LineIn Left (L>L) or LineIn Right (L>R) is selected as Input |
|
||||
| **TX Audio Compress** ( MENU_TX_COMPRESSION_LEVEL) | Control the TX audio compressor. Higher values give more compression. Set to CUSTOM for user defined compression parameters. See below. Also changeable via Encoder 1 (CMP). |
|
||||
| **TX ALC Release Time** ( MENU_ALC_RELEASE) | If Audio Compressor Config is set to CUSTOM, sets the value of the Audio Compressor Release time. Otherwise shows predefined value of selected compression level. |
|
||||
| **TX ALC Input Gain** ( MENU_ALC_POSTFILT_GAIN) | If Audio Compressor Config is set to CUSTOM, sets the value of the ALC Input Gain. Otherwise shows predefined value of selected compression level. |
|
||||
| **RX NB Setting** ( MENU_NOISE_BLANKER_SETTING) | Set the Noise Blanker strength. Higher values mean more agressive blanking. Also changeable using Encoder 2 if Noise Blanker is active. |
|
||||
| **DSP NR Strength** ( MENU_DSP_NR_STRENGTH) | Set the Noise Reduction Strength. Higher values mean more agressive noise reduction but also higher CPU load. Use with extreme care. Also changeable using Encoder 2 if DSP is active. |
|
||||
| **TCXO Off/On/Stop** ( MENU_TCXO_MODE) | The software TCXO can be turned ON (set frequency is adjusted so that generated frequency matches the wanted frequency); OFF (no correction or measurement done); or STOP (no correction but measurement). |
|
||||
| **TCXO Temp. (C/F)** ( MENU_TCXO_C_F) | Show the measure TCXO temperature in Celsius or Fahrenheit. |
|
||||
| **Backup Config** ( MENU_BACKUP_CONFIG) | Backup your I2C Configuration to flash. If you don't have suitable I2C EEPROM installed this function is not available. |
|
||||
| **Low Voltage Shutdown** ( MENU_LOW_POWER_SHUTDOWN) | Shutdown automatically when supply voltage is below threshold for 60 seconds (only in RX). |
|
||||
| **Restore Config** ( MENU_RESTORE_CONFIG) | Restore your I2C Configuration from flash. If you don't have suitable I2C EEPROM installed this function is not available. |
|
||||
|
||||
|
||||
## Configuration Menu (`MENU_CONF`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **Save Out-Of-Band Freq.** ( CONFIG_FREQ_MEM_LIMIT_RELAX) | Select ON to save and restore frequencies which do not fit into the band during configuration saving (Power-Off or long press on Menu button) |
|
||||
| **TX on Out-Of-Band Freq.** ( CONFIG_TX_OUT_ENABLE) | Permit low power transmission even if the frequency is out of the official ham bands. DO NOT USE WITH CONNECTED ANTENNA! Use a dummy load! |
|
||||
| **Transmit Disable** ( CONFIG_TX_DISABLE) | Disable all transmissions unconditionally. In CW you will be able to hear a sidetone but no transmission is made. |
|
||||
| **Menu SW on TX disable** ( CONFIG_AUDIO_MAIN_SCREEN_MENU_SWITCH) | Control if the screen automatically adapts Encoder value focus when switching between RX and TX. |
|
||||
| **TX Mute LineOut** ( CONFIG_MUTE_LINE_OUT_TX) | During transmission with frequency translation off, line out will carry one of the two signal channels. Good for CW but not very useful otherwise. You may switch this signal off here. |
|
||||
| **TX Initial Muting Time** ( CONFIG_TXRX_SWITCH_AUDIO_MUTE) | When switching from RX to TX the audio and HF output will be muted for roughly VALUE ms. There are now several minimum times for muting defined in the firmware:<br/><br/> Input from Mic: 40ms<br/> Input from Line In: 40ms<br/> Digital Inputs (CW, USB): less than 1ms.<br/><br/> If the user defined 'TX Initial Muting Time' is set to more than zero, the maximum of both fixed input time and user defined time is used. Your microphone PTT switch is a potential source of noise if Mic is input! You need to increase the delay or change switches! |
|
||||
| **Max Volume** ( CONFIG_MAX_VOLUME) | Set maximum speaker&headphone volume. |
|
||||
| **Lineout Gain** ( CONFIG_LINEOUT_GAIN) | Set the constant gain level for the analog lineout jack |
|
||||
| **Key Beep Frequency** ( CONFIG_BEEP_FREQ) | Set key beep frequency in Hz. |
|
||||
| **Key Beep Volume** ( CONFIG_BEEP_VOLUME) | Set key beep volume. |
|
||||
| **CAT Running In Sandbox** ( CONFIG_CAT_IN_SANDBOX) | If On, frequency Changes made via CAT will not automatically switch bands and affect the manually selected frequencies. |
|
||||
| **CAT-DIQ-FREQ-XLAT** ( CONFIG_CAT_XLAT) | Select which frequency is reported via CAT Interface to the connected PC in Digital IQ Mode. If ON, it reports the displayed frequency. If OFF, it reports the center frequency, which is more useful with SDR programs. |
|
||||
| **PTT via virtual RTS** ( CONFIG_CAT_PTT_RTS) | The virtual serial port signal RTS can be used to switch to TX. Use with care, many CAT-able programs also set RTS to aktiv and make the TRX go to TX mode. |
|
||||
| **XVTR Offs/Mult** ( CONFIG_XVTR_OFFSET_MULT) | When connecting to a transverter, set this to 1 and set the XVERTER Offset to the LO Frequency of it. The mcHF frequency is multiplied by this factor before the offset is added, so anything but 1 will result in each Hz in the mcHF being displayed as 2 to 10 Hz change on display. |
|
||||
| **XVTR Offset** ( CONFIG_XVTR_FREQUENCY_OFFSET) | When transverter mode is enabled, this value is added to the mcHF frequency after being multiplied with the XVTR Offs/Mult. Use Step+ to set a good step width, much less turns with the dial knob if it is set to 1Mhz |
|
||||
| **Step Button Swap** ( CONFIG_STEP_SIZE_BUTTON_SWAP) | If ON, Step- behaves like Step+ and vice versa. |
|
||||
| **Band+/- Button Swap** ( CONFIG_BAND_BUTTON_SWAP) | If ON, Band- behaves like Band+ and vice versa. |
|
||||
| **RTC Start** ( CONFIG_RTC_START) | Start using the RTC and use the modified button layout. Will reboot your mcHF. Please use only if you completed the RTC mod otherwise you will need to disconnect battery and power and reboot to get a working mcHF. This menu is only visible if Backup RAM (VBat) was detected. |
|
||||
| **RTC Hour** ( CONFIG_RTC_HOUR) | Sets the Real Time Clock Hour. Needs HW Modifications. |
|
||||
| **RTC Min** ( CONFIG_RTC_MIN) | Sets the Real Time Clock Minutes. Needs HW Modifications. |
|
||||
| **RTC Seconds** ( CONFIG_RTC_SEC) | Sets the Real Time Clock Seconds. Needs HW Modifications. |
|
||||
| **RTC Reset** ( CONFIG_RTC_RESET) | Full Reset of STM32 RTC. Can be used to simulate first start with RTC mod completed |
|
||||
| **RTC Calibration** ( CONFIG_RTC_CALIB) | Sets the Real Time Clock Frequency calibration value in ppm. 1s/day deviation equals 11.57 ppm deviation |
|
||||
| **Voltmeter Cal.** ( CONFIG_VOLTMETER_CALIBRATION) | Adjusts the displayed value of the voltmeter. |
|
||||
| **Low Voltage Threshold** ( CONFIG_LOW_POWER_THRESHOLD) | Voltage threshold for voltage warning colors and auto shutdown. |
|
||||
| **Freq. Calibrate** ( CONFIG_FREQUENCY_CALIBRATE) | Adjust the frequency correction of the local oscillator. Measure TX frequency and adjust until both match. Or use receive a know reference signal and zero-beat it and then adjust. More information in the Wiki. |
|
||||
| **Pwr. Display mW** ( CONFIG_FWD_REV_PWR_DISP) | Shows the forward and reverse power values in mW, can be used to calibrate the SWR meter. |
|
||||
| **Pwr. Det. Null** ( CONFIG_RF_FWD_PWR_NULL) | Set the forward and reverse power sensors ADC zero power offset. This setting is enabled ONLY when Disp. Pwr (mW), is enabled. Needs SWR meter hardware modification to work. See Wiki Adjustment and Calibration. |
|
||||
| **SWR/PWR Meter FWD/REV Swap** ( CONFIG_FWD_REV_SENSE_SWAP) | Exchange the assignment of the Power/SWR FWD and REV measurement ADC. Use if your power meter does not show anything during TX. |
|
||||
| **I2C1 Bus Speed** ( CONFIG_I2C1_SPEED) | Sets speed of the I2C1 bus (Si570 oscillator and MCP9801 temperature sensor). Higher speeds provide quicker RX/TX switching but may also cause tuning issues (red digits). Be careful with speeds above 200 kHz. |
|
||||
| **I2C2 Bus Speed** ( CONFIG_I2C2_SPEED) | Sets speed of the I2C2 bus (Audio Codec and I2C EEPROM). Higher speeds provide quicker RX/TX switching, configuration save and power off. Speeds above 200 kHz are not recommended for unmodified mcHF. Many modified mcHF seem to run with 300kHz without problems. |
|
||||
| **RX IQ Auto Correction** ( CONFIG_IQ_AUTO_CORRECTION) | Receive IQ phase and amplitude imbalance can be automatically adjusted by the mcHF. Switch ON/OFF here. If OFF, it takes the following menu values for compensating the imbalance. The automatic algorithm achieves up to 60dB mirror rejection. See Wiki Adjustments and Calibration. |
|
||||
| **RX IQ Balance (80m)** ( CONFIG_80M_RX_IQ_GAIN_BAL) | IQ Balance Adjust for all receive if frequency translation is NOT OFF. Requires USB/LSB/CW mode to be changeable.See Wiki Adjustments and Calibration. |
|
||||
| **RX IQ Phase (80m)** ( CONFIG_80M_RX_IQ_PHASE_BAL) | IQ Phase Adjust for all receive if frequency translation is NOT OFF. Requires USB/LSB/CW mode to be changeable.See Wiki Adjustments and Calibration. |
|
||||
| **RX IQ Balance (10m)** ( CONFIG_10M_RX_IQ_GAIN_BAL) | IQ Balance Adjust for all receive if frequency translation is NOT OFF. Requires USB/LSB/CW mode to be changeable.See Wiki Adjustments and Calibration. |
|
||||
| **RX IQ Phase (10m)** ( CONFIG_10M_RX_IQ_PHASE_BAL) | IQ Phase Adjust for all receive if frequency translation is NOT OFF. Requires USB/LSB/CW mode to be changeable. See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Balance (80m)** ( CONFIG_80M_TX_IQ_GAIN_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Requires USB or LSB mode to be changeable. See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Phase (80m)** ( CONFIG_80M_TX_IQ_PHASE_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Requires USB or LSB mode to be changeable. See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Balance (10m)** ( CONFIG_10M_TX_IQ_GAIN_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Requires USB or LSB mode to be changeable. See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Phase (10m)** ( CONFIG_10M_TX_IQ_PHASE_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Requires USB or LSB mode to be changeable. See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Balance (80m,CW)** ( CONFIG_80M_TX_IQ_GAIN_BAL_TRANS_OFF) | IQ Balance Adjust for CW transmissions (and all transmission if frequency translation is OFF). See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Phase (80m,CW)** ( CONFIG_80M_TX_IQ_PHASE_BAL_TRANS_OFF) | IQ Phase Adjust for CW transmissions (and all transmission if frequency translation is OFF).See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Balance (10m,CW)** ( CONFIG_10M_TX_IQ_GAIN_BAL_TRANS_OFF) | IQ Balance Adjust for CW transmissions (and all transmission if frequency translation is OFF).See Wiki Adjustments and Calibration. |
|
||||
| **TX IQ Phase (10m,CW)** ( CONFIG_10M_TX_IQ_PHASE_BAL_TRANS_OFF) | IQ Phase Adjust for CW transmissions (and all transmission if frequency translation is OFF).See Wiki Adjustments and Calibration. |
|
||||
| **DSP NR BufLen** ( CONFIG_DSP_NR_DECORRELATOR_BUFFER_LENGTH) | DSP LMS noise reduction: length of the audio buffer that is used for simulation of a reference for the LMS algorithm. The longer the buffer, the better the performance, but this buffer length must always be larger than the number of taps in the FIR filter used. Thus, a larger buffer (and larger FIR filter) uses more MCU resources. |
|
||||
| **DSP NR FIR NumTaps** ( CONFIG_DSP_NR_FFT_NUMTAPS) | DSP LMS noise reduction: Number of taps in the DSP noise reduction FIR filter. The larger the number of taps in the filter, the better the performance, but the slower the performance of the filter and the mcHF. |
|
||||
| **DSP NR Post-AGC** ( CONFIG_DSP_NR_POST_AGC_SELECT) | DSP LMS noise reduction: Perform the DSP LMS noise reduction BEFORE or AFTER the AGC. NO = before AGC, YES = after AGC. |
|
||||
| **DSP Notch ConvRate** ( CONFIG_DSP_NOTCH_CONVERGE_RATE) | DSP LMS automatic notch filter: |
|
||||
| **DSP Notch BufLen** (CONFIG_DSP_NOTCH_DECORRELATOR_BUFFER_LENGTH) | DSP LMS automatic notch filter: length of the audio buffer that is used for simulation of a reference for the LMS algorithm. The longer the buffer, the better -and the slower- the performance, but this buffer length must always be larger than the number of taps in the FIR filter used. Thus, a larger buffer (and larger FIR filter) uses more MCU resources. |
|
||||
| **DSP Notch FIRNumTap** ( CONFIG_DSP_NOTCH_FFT_NUMTAPS) | DSP LMS automatic notch filter: Number of taps in the DSP automatic notch FIR filter. The larger the number of taps in the filter, the better the performance, but the slower the performance of the filter and the mcHF. |
|
||||
| **DSP Notch ConvRate** ( CONFIG_DSP_NOTCH_CONVERGE_RATE) | DSP LMS automatic notch filter: |
|
||||
| **DSP Notch BufLen** (CONFIG_DSP_NOTCH_DECORRELATOR_BUFFER_LENGTH) | DSP LMS automatic notch filter: length of the audio buffer that is used for simulation of a reference for the LMS algorithm. The longer the buffer, the better -and the slower- the performance, but this buffer length must always be larger than the number of taps in the FIR filter used. Thus, a larger buffer (and larger FIR filter) uses more MCU resources. |
|
||||
| **DSP Notch FIRNumTap** ( CONFIG_DSP_NOTCH_FFT_NUMTAPS) | DSP LMS automatic notch filter: Number of taps in the DSP automatic notch FIR filter. The larger the number of taps in the filter, the better the performance, but the slower the performance of the filter and the mcHF. |
|
||||
| **Rst Conf EEPROM** ( CONFIG_RESET_SER_EEPROM) | Clear the EEPROM so that at next start all stored configuration data is reset to the values stored in Flash (see Backup/Restore). |
|
||||
|
||||
|
||||
## Display Menu (`MENU_DISPLAY`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **LCD Auto Blank** ( CONFIG_LCD_AUTO_OFF_MODE) | After x seconds LCD turns dark and LCD data sections stop. So power consumption is decreased and RX hum is decreased, too. LCD operation starts when using any button or the touchscreen. |
|
||||
| **Step Size Marker** ( CONFIG_FREQ_STEP_MARKER_LINE) | If enabled, you'll see a line under the digit which is currently representing the selected tuning step size |
|
||||
| **Filter BW Display** ( CONFIG_DISP_FILTER_BANDWIDTH) | Colour of the horizontal Filter Bandwidth indicator bar. |
|
||||
| **Spectrum Size** ( MENU_SPECTRUM_SIZE) | Change height of spectrum display |
|
||||
| **Spectrum Filter** ( MENU_SPECTRUM_FILTER_STRENGTH) | Lowpass filter for the spectrum FFT. Low values: fast and nervous spectrum; High values: slow and calm spectrum. |
|
||||
| **Spec FreqScale Colour** ( MENU_SPECTRUM_FREQSCALE_COLOUR) | Colour of the small frequency digits under the spectrum display. |
|
||||
| **TX Carrier Colour** ( MENU_SPECTRUM_CENTER_LINE_COLOUR) | Colour of the vertical line indicating the TX carrier frequency in the spectrum or waterdall display. |
|
||||
| **Scope Light** ( MENU_SCOPE_LIGHT_ENABLE) | The scope uses bars (NORMAL) or points (LIGHT) to represent data. LIGHT is a little less resource intensive. |
|
||||
| **Scope 1/Speed** ( MENU_SCOPE_SPEED) | Lower Values: Higher refresh rate. Set to 0 to disable scope. |
|
||||
| **Scope AGC Adj.** ( MENU_SCOPE_AGC_ADJUST) | Adjusting of scope / waterfall AGC for fitting graphs to screen |
|
||||
| **Scope Trace Colour** ( MENU_SCOPE_TRACE_COLOUR) | Set colour of scope |
|
||||
| **Scope BW Trace Colour** ( MENU_SCOPE_TRACE_HL_COLOUR) | Set colour of highlighted BW scope |
|
||||
| **Scope BW BCKgr Colour** ( MENU_SCOPE_BACKGROUND_HL_COLOUR) | Set colour of highlighted BW background |
|
||||
| **Scope Grid Colour** ( MENU_SCOPE_GRID_COLOUR) | Set colour of scope grid |
|
||||
| **Scope Div.** ( MENU_SCOPE_DB_DIVISION) | Set rf range for scope |
|
||||
| **Wfall 1/Speed** ( MENU_WFALL_SPEED) | Lower Values: Higher refresh rate. Set to 0 to disable waterfall. |
|
||||
| **Wfall Colours** ( MENU_WFALL_COLOR_SCHEME) | Select colour scheme for waterfall display. |
|
||||
| **Wfall Step Size** ( MENU_WFALL_STEP_SIZE) | How many lines are moved in a single screen update |
|
||||
| **Wfall Contrast** ( MENU_WFALL_CONTRAST) | Adjust to fit your personal input level range to displayable colour range for waterfall |
|
||||
| **Upper Meter Colour** ( MENU_METER_COLOUR_UP) | Set the colour of the scale of combined S/Power-Meter |
|
||||
| **Lower Meter Colour** ( MENU_METER_COLOUR_DOWN) | Set the colour of the scale of combined SWR/AUD/ALC-Meter |
|
||||
| **dBm display** ( MENU_DBM_DISPLAY) | RX signal power (measured within the filter bandwidth) can be displayed in dBm or normalized as dBm/Hz. This value is supposed to be quite accurate to +-3dB. Preferably use low spectrum display magnify settings. Accuracy is lower for very very weak and very very strong signals. |
|
||||
| **dBm calibrate** ( MENU_DBM_CALIBRATE) | dBm display calibration. Just an offset (in dB) that is added to the internally calculated dBm or dBm/Hz value. |
|
||||
| **S-Meter Attack** ( CONFIG_SMETER_ATTACK) | Attack controls how quickly the S-Meter reacts to rising signal levels, higher values represent quicker reaction |
|
||||
| **S-Meter Decay** ( CONFIG_SMETER_DECAY) | Decay controls how quickly the S-Meter reacts to falling signal levels, higher values represent quicker reaction |
|
||||
| **Freq display font** ( MENU_FREQ_FONT) | Font selection for frequency display. Allows selection of old/modern fonts |
|
||||
| **Menu Inverse Scrolling** ( MENU_UI_INVERSE_SCROLLING) | Inverts Enc2/Enc3 behavior in menu up/down and show/hide UI scrolling actions, used for side-mounted encoder dials. |
|
||||
|
||||
|
||||
## CW Mode Settings (`MENU_CW`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **CW Keyer Mode** ( MENU_KEYER_MODE) | Select how the mcHF interprets the connected keyer signals. Supported modes: Iambic A and B Keyer (IAM A/B), Straight Key (STR_K), and Ultimatic Keyer (ULTIM) |
|
||||
| **CW Keyer Speed** ( MENU_KEYER_SPEED) | Keyer Speed for the automatic keyer modes in WpM. Also changeable via Encoder 3 if in CW Mode. |
|
||||
| **CW Keyer Weight** ( MENU_KEYER_WEIGHT) | Keyer Dit/Pause ratio for the automatic keyer modes. Higher values increase length of dit, decreases length of pause so that the total time is still according to the set WpM value. |
|
||||
| **CW Sidetone Gain** ( MENU_SIDETONE_GAIN) | Audio volume for the monitor sidetone in CW TX. Also changeable via Encoder 1 if in CW Mode. |
|
||||
| **CW Side/Offset Freq** ( MENU_SIDETONE_FREQUENCY) | Sidetone Frequency (also Offset frequency, see CW Freq. Offset below) |
|
||||
| **CW Paddle Reverse** ( MENU_PADDLE_REVERSE) | Dit is Dah and Dah is Dit. Use if your keyer needs reverse meaning of the paddles. |
|
||||
| **CW TX->RX Delay** ( MENU_CW_TX_RX_DELAY) | How long to stay in CW TX mode after stop sending a signal. |
|
||||
| **CW Freq. Offset** ( MENU_CW_OFFSET_MODE) | TX: display is TX frequency if received frequency was zero-beated. DISP: display is RX frequency if received signal is matched to sidetone. SHIFT: LO shifts, display is RX frequency if signal is matched to sidetone. |
|
||||
| **CW LSB/USB Select** ( MENU_CW_AUTO_MODE_SELECT) | Set appropriate sideband mode for CW. If AUTO, sideband is chosen for bands by its frequency. A long press on Mode button gets the other sideband mode |
|
||||
| **CW decoder enable** ( MENU_CW_DECODER) | enable experimental CW decoding |
|
||||
| **Signal threshold** ( MENU_CW_DECODER_THRESH) | All signals above this threshold are intepreted as a dit or daah |
|
||||
| **Tune helper** ( MENU_CW_DECODER_SNAP_ENABLE) | graphical tune helper: adjust frequency until yellow vertical line is in centre of green box --> right on CW carrier frequency |
|
||||
| **Blocksize for Goertzel** ( MENU_CW_DECODER_BLOCKSIZE) | How many samples are taken for the signal detection with the Goertzel algorithm? |
|
||||
| **Noise cancel** ( MENU_CW_DECODER_NOISECANCEL) | Enable/disable noise canceler for CW decoder |
|
||||
| **Spike cancel** ( MENU_CW_DECODER_SPIKECANCEL) | Enable/disable spike canceler or short cancel for CW decoder |
|
||||
| **AGC for decoder** ( MENU_CW_DECODER_USE_3_GOERTZEL) | Enable/disable AGC for CW decoder |
|
||||
| **show CW LED** ( MENU_CW_DECODER_SHOW_CW_LED) | Enable/disable LED for CW decoder |
|
||||
|
||||
|
||||
## Filter Selection (`MENU_FILTER`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **SSB Filter 1** ( MENU_FP_SSB_01) | Filter bandwidth #1 when toggling with filter select button in LSB or USB. |
|
||||
| **SSB Filter 2** ( MENU_FP_SSB_02) | Filter bandwidth #2 when toggling with filter select button in LSB or USB. |
|
||||
| **SSB Filter 3** ( MENU_FP_SSB_03) | Filter bandwidth #3 when toggling with filter select button in LSB or USB. |
|
||||
| **SSB Filter 4** ( MENU_FP_SSB_04) | Filter bandwidth #4 when toggling with filter select button in LSB or USB. |
|
||||
| **CW Filter 1** ( MENU_FP_CW_01) | Filter bandwidth #1 when toggling with filter select button in CW. |
|
||||
| **CW Filter 2** ( MENU_FP_CW_02) | Filter bandwidth #2 when toggling with filter select button in CW. |
|
||||
| **CW Filter 3** ( MENU_FP_CW_03) | Filter bandwidth #3 when toggling with filter select button in CW. |
|
||||
| **CW Filter 4** ( MENU_FP_CW_04) | Filter bandwidth #4 when toggling with filter select button in CW. |
|
||||
| **AM/SAM Filter 1** ( MENU_FP_AM_01) | Filter bandwidth #1 when toggling with filter select button in AM & SAM. |
|
||||
| **AM/SAM Filter 2** ( MENU_FP_AM_02) | Filter bandwidth #2 when toggling with filter select button in AM & SAM. |
|
||||
| **AM/SAM Filter 3** ( MENU_FP_AM_03) | Filter bandwidth #3 when toggling with filter select button in AM & SAM. |
|
||||
| **AM/SAM Filter 4** ( MENU_FP_AM_04) | Filter bandwidth #4 when toggling with filter select button in AM & SAM. |
|
||||
| **AM TX Audio Filter** ( CONFIG_AM_TX_FILTER_DISABLE) | Select if AM-TX signal is filtered (strongly recommended to agree to regulations) |
|
||||
| **SSB TX Audio Filter2** ( CONFIG_SSB_TX_FILTER) | Select if SSB-TX signal is filtered (strongly recommended to agree to regulations) |
|
||||
|
||||
|
||||
## PA Configuration (`MENU_POW`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **Tune Power Level** ( CONFIG_TUNE_POWER_LEVEL) | Select the power level for TUNE operation. May be set using the selected power level or have a fixed power level. |
|
||||
| **Tune Tone (SSB)** ( CONFIG_TUNE_TONE_MODE) | Select if single tone or two tone is generated during TUNE operation. Not persistent. |
|
||||
| **CW PA Bias (If >0 )** ( CONFIG_CW_PA_BIAS) | If set to a value above 0, this BIAS is used during CW transmission; otherwise normal BIAS is used during CW |
|
||||
| **Reduce Power on Low Bands** ( CONFIG_REDUCE_POWER_ON_LOW_BANDS) | If set (recommended!) frequencies below 8Mhz (40m or lower) require higher power adjust values (four times). This permits better control of generated power on these frequencies. |
|
||||
| **Reduce Power on High Bands** ( CONFIG_REDUCE_POWER_ON_HIGH_BANDS) | If set frequencies above 8Mhz (30m or higher) require higher power adjust values (four times). This permits better control of generated power on these frequencies. |
|
||||
| **PA Bias** ( CONFIG_PA_BIAS) | Defines the BIAS value of the PA. See Adjustment and Calibration for more information. |
|
||||
| **2200m 5W PWR Adjust** ( CONFIG_2200M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **630m 5W PWR Adjust** ( CONFIG_630M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **160m 5W PWR Adjust** ( CONFIG_160M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **80m 5W PWR Adjust** ( CONFIG_80M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **60m 5W PWR Adjust** ( CONFIG_60M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **40m 5W PWR Adjust** ( CONFIG_40M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **30m 5W PWR Adjust** ( CONFIG_30M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **20m 5W PWR Adjust** ( CONFIG_20M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **17m 5W PWR Adjust** ( CONFIG_17M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **15m 5W PWR Adjust** ( CONFIG_15M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **12m 5W PWR Adjust** ( CONFIG_12M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **10m 5W PWR Adjust** ( CONFIG_10M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **6m 5W PWR Adjust** ( CONFIG_6M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **4m 5W PWR Adjust** ( CONFIG_4M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **2m 5W PWR Adjust** ( CONFIG_2M_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **70cm 5W PWR Adjust** ( CONFIG_70CM_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **23cm 5W PWR Adjust** ( CONFIG_23CM_5W_ADJUST) | Defines the internal power adjustment factor to achieve 5W power on this band. See Adjustment and Calibration for more information. |
|
||||
| **2200m Full PWR Adjust** ( CONFIG_2200M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **630m Full PWR Adjust** ( CONFIG_630M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **160m Full PWR Adjust** ( CONFIG_160M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **80m Full PWR Adjust** ( CONFIG_80M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **60m Full PWR Adjust** ( CONFIG_60M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **40m Full PWR Adjust** ( CONFIG_40M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **30m Full PWR Adjust** ( CONFIG_30M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **20m Full PWR Adjust** ( CONFIG_20M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **17m Full PWR Adjust** ( CONFIG_17M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **15m Full PWR Adjust** ( CONFIG_15M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **12m Full PWR Adjust** ( CONFIG_12M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **10m Full PWR Adjust** ( CONFIG_10M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **6m Full PWR Adjust** ( CONFIG_6M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **4m Full PWR Adjust** ( CONFIG_4M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **2m Full PWR Adjust** ( CONFIG_2M_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **70cm Full PWR Adjust** ( CONFIG_70CM_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **23cm Full PWR Adjust** ( CONFIG_23CM_FULL_POWER_ADJUST) | Defines the internal power adjustment factor to achieve full power on this band. Check the output signal when adjusting for full power! See Adjustment and Calibration for more information. |
|
||||
| **2200m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_2200M_ADJ) | Power Meter Adjustment factor for the 2200m band power values. See Wiki. |
|
||||
| **630m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_630M_ADJ) | Power Adjustment factor for the 630m band power values. See Wiki. |
|
||||
| **160m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_160M_ADJ) | Power Meter Adjustment factor for the 160m band power values. See Wiki. |
|
||||
| **80m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_80M_ADJ) | Power Meter Adjustment factor for the 80m band power values. See Wiki. |
|
||||
| **40m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_40M_ADJ) | Power Meter Adjustment factor for the 40m and 60m band power values. See Wiki. |
|
||||
| **20m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_20M_ADJ) | Power Meter Adjustment factor for the 20m and 30m band power values. See Wiki. |
|
||||
| **15m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_15M_ADJ) | Power Meter Adjustment factor for the 10m - 17m bands power values. See Wiki. |
|
||||
| **6m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_6M_ADJ) | Power Meter Adjustment factor for the 6m band power values. See Wiki. |
|
||||
| **2m Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_2M_ADJ) | Power Meter Adjustment factor for the 2m band power values. See Wiki. |
|
||||
| **70cm Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_70CM_ADJ) | Power Meter Adjustment factor for the 70cm band power values. See Wiki. |
|
||||
| **23cm Coupling Adj.** ( CONFIG_FWD_REV_COUPLING_23CM_ADJ) | Power Meter Adjustment factor for the 23cm band power values. See Wiki. |
|
||||
|
||||
|
||||
## System Info (`MENU_SYSINFO`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **Display** ( INFO_DISPLAY) | Displays working mode (SPI/parallel |
|
||||
| **Disp. Controller** ( INFO_DISPLAY_CTRL) | identified LCD controller chip |
|
||||
| **Oscillator** ( INFO_OSC_NAME) | Local oscillator type |
|
||||
| **SI570** ( INFO_SI570) | Startup frequency and I2C address of local oscillator Type SI570 |
|
||||
| **EEPROM** ( INFO_EEPROM) | type of serial EEPROM and its capacity |
|
||||
| **Touchscreen** ( INFO_TP) | touchscreen state |
|
||||
| **CPU** ( INFO_CPU) | identification of fitted MCU |
|
||||
| **Flash Size (kB)** ( INFO_FLASH) | flash size of MCU |
|
||||
| **RAM Size (kB)** ( INFO_RAM) | RAM size of MCU |
|
||||
| **Firmware** ( INFO_FW_VERSION) | firmware version |
|
||||
| **Build** ( INFO_BUILD) | firmware: timestamp of building |
|
||||
| **Bootloader** ( INFO_BL_VERSION) | bootloader version |
|
||||
| **RF Board** ( INFO_RFBOARD) | Displays the detected RF Board hardware identification. |
|
||||
| **Audio Codec Presence** ( INFO_CODEC) | Audio Codec I2C communication successfully tested? This is not a full test of the Audio Codec functionality, it only reports if I2C communication reported no problem talking to the codec. |
|
||||
| **Audio Codec Twinpeaks Corr.** ( INFO_CODEC_TWINPEAKS) | In some cases the audio codec needs to be restarted to produce correct IQ. The IQ auto correction detects this. If this fixes the problem, Done is displayed, Failed otherwise |
|
||||
| **Backup RAM Battery** ( INFO_VBAT) | Battery Support for Backup RAM present? |
|
||||
| **Real Time Clock** ( INFO_RTC) | Battery Supported Real Time Clock present? |
|
||||
| **FW license** ( INFO_LICENCE) | Display license of firmware |
|
||||
| **HW license** ( INFO_HWLICENCE) | Display license of hardware |
|
||||
|
||||
|
||||
## Debug/Exper. Settings (`MENU_DEBUG`)
|
||||
|
||||
| LABEL ( NR) | DESCRIPTION |
|
||||
| --------------------------------------------------------------------------- | ---------------------------------------------- |
|
||||
| **Enable Debug Info Display** ( MENU_DEBUG_ENABLE_INFO) | Enable debug outputs on LCD for testing purposes (touch screen coordinates, load) and audio interrupt duration indication via green led |
|
||||
| **CW Shift Keeps Signal** ( MENU_DEBUG_CW_OFFSET_SHIFT_KEEP_SIGNAL) | Enable automatic sidetone correction for CW OFFSET MODE = SHIFT. If you tuned in SSB to a CW signal around the sidetone frequency, you'll keep that signal when going to CW. Even if you switch from USB to CW-LSB etc. |
|
||||
| **TX Audio via USB** ( MENU_DEBUG_TX_AUDIO) | If enabled, send generated audio to PC during TX. |
|
||||
| **FT817 Clone Transmit** ( MENU_DEBUG_CLONEOUT) | Will in future send out memory data to an FT817 Clone Info (to be used with CHIRP). |
|
||||
| **FT817 Clone Receive** ( MENU_DEBUG_CLONEIN) | Will in future get memory data from an FT817 Clone Info (to be used with CHIRP). |
|
||||
| **Show gains** ( MENU_DEBUG_NR_GAIN_SHOW) | Debugging: show gains of spectral noise reduction |
|
||||
| **NR beta** ( MENU_DEBUG_NR_BETA) | time constant beta for spectral noise reduction, leave at 0.85 |
|
||||
| **NR asnr** ( MENU_DEBUG_NR_ASNR) | Devel 2 NR: asnr |
|
||||
| **NR smooth wd.** ( MENU_DEBUG_NR_GAIN_SMOOTH_WIDTH) | Devel 2 NR: width of gain smoothing window |
|
||||
| **NR smooth thr.** ( MENU_DEBUG_NR_GAIN_SMOOTH_THRESHOLD) | Devel 2 NR: threhold for gain smoothing |
|
||||
| **STEREO Enable** ( MENU_DEBUG_ENABLE_STEREO) | Enable stereo demodulation modes |
|
||||
| **leaky LMS** ( MENU_DEBUG_LEAKY_LMS) | Use leaky LMS noise reduction instead of built-in CMSIS LMS algorithm |
|
||||
| **NR no taps** ( MENU_DEBUG_ANR_TAPS) | Number of taps of leaky LMS noise reduction |
|
||||
| **NR delay** ( MENU_DEBUG_ANR_DELAY) | Delay length of leaky LMS noise reduction |
|
||||
| **NR gain** ( MENU_DEBUG_ANR_GAIN) | Gain of leaky LMS noise reduction |
|
||||
| **NR leak** ( MENU_DEBUG_ANR_LEAK) | Leak of leaky LMS noise reduction |
|
||||
| **Si5351a PLL Reset** ( MENU_DEBUG_OSC_SI5351_PLLRESET) | Debug Setting: Select when the Si5351a does a PLL RESET |
|
||||
| **HMC1023 Coarse** ( MENU_DEBUG_HMC1023_COARSE) | Debug Setting: Change LPF HMC1023LP5E coarse bandwidth |
|
||||
| **HMC1023 Fine** ( MENU_DEBUG_HMC1023_FINE) | Debug Setting: Change LPF HMC1023LP5E fine bandwidth |
|
||||
| **HMC1023 Gain 10db** ( MENU_DEBUG_HMC1023_GAIN) | Debug Setting: Switch LPF HMC1023LP5E +10db Amp on/off |
|
||||
| **HMC1023 Bypass** ( MENU_DEBUG_HMC1023_BYPASS) | Debug Setting: Set HMC1023 to bypass mode |
|
||||
| **HMC1023 Opamp Bias** ( MENU_DEBUG_HMC1023_OPAMP) | Debug Setting: Switch LPF HMC1023LP5E Opamp Bias |
|
||||
| **HMC1023 Driver Bias** ( MENU_DEBUG_HMC1023_DRVR) | Debug Setting: Set HMC1023 Driver Bias |
|
||||
| **Trigger Twinpeaks Corr.** ( MENU_DEBUG_TWINPEAKS_CORR_RUN) | Trigger Twinpeaks Correction Manually if IQ Auto Correction is enabled, otherwise you will see 'Not Possible' |
|
||||
| **TX IQ Balance (20m)** ( CONFIG_20M_TX_IQ_GAIN_BAL) | IQ Balance Adjust for all transmission if frequency translation is NOT OFF. Calibrate on 14.100 MHz. |
|
||||
| **TX IQ Phase (20m)** ( CONFIG_20M_TX_IQ_PHASE_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Calibrate on 14.100 MHz. |
|
||||
| **TX IQ Balance (15m)** ( CONFIG_15M_TX_IQ_GAIN_BAL) | IQ Balance Adjust for all transmission if frequency translation is NOT OFF. Calibrate on 21.100 MHz. |
|
||||
| **TX IQ Phase (15m)** ( CONFIG_15M_TX_IQ_PHASE_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Calibrate on 21.100 MHz. |
|
||||
| **TX IQ Balance (10mUp)** ( CONFIG_10M_UP_TX_IQ_GAIN_BAL) | IQ Balance Adjust for all transmission if frequency translation is NOT OFF. Calibrate on 29.650 MHz. |
|
||||
| **TX IQ Phase (10mUp)** ( CONFIG_10M_UP_TX_IQ_PHASE_BAL) | IQ Phase Adjust for all transmission if frequency translation is NOT OFF. Calibrate on 29.650 MHz. |
|
||||
| **TX IQ Balance (20m,CW)** ( CONFIG_20M_TX_IQ_GAIN_BAL_TRANS_OFF) | IQ Balance Adjust for all transmission if frequency translation is OFF. Calibrate on 14.100 MHz. |
|
||||
| **TX IQ Phase (20m,CW)** ( CONFIG_20M_TX_IQ_PHASE_BAL_TRANS_OFF) | IQ Phase Adjust for all transmission if frequency translation is OFF. Calibrate on 14.100 MHz. |
|
||||
| **TX IQ Balance (15m,CW)** ( CONFIG_15M_TX_IQ_GAIN_BAL_TRANS_OFF) | IQ Balance Adjust for all transmission if frequency translation is OFF. Calibrate on 21.100 MHz. |
|
||||
| **TX IQ Phase (15m,CW)** ( CONFIG_15M_TX_IQ_PHASE_BAL_TRANS_OFF) | IQ Phase Adjust for all transmission if frequency translation is OFF. Calibrate on 21.100 MHz. |
|
||||
| **TX IQ Balance (10mUp,CW)** ( CONFIG_10M_UP_TX_IQ_GAIN_BAL_TRANS_OFF) | IQ Balance Adjust for all transmission if frequency translation is OFF. Calibrate on 29.650 MHz. |
|
||||
| **TX IQ Phase (10mUp,CW)** ( CONFIG_10M_UP_TX_IQ_PHASE_BAL_TRANS_OFF) | IQ Phase Adjust for all transmission if frequency translation is OFF. Calibrate on 29.650 MHz. |
|
||||
| **VSWR Protect.threshold** ( MENU_DEBUG_VSWR_PROTECTION_THRESHOLD) | If not OFF, on TX/tune the bias of PA will be down to 0 etc when exceeding the specified value of VSWR |
|
||||
| **Rst Conf EEPROM** ( CONFIG_RESET_SER_EEPROM_SIGNATURE) | Clear the EEPROMi signature but keep all config values. This is mainly for debugging purposes). |
|
||||
| **FreeDV Mode** ( MENU_DEBUG_FREEDV_MODE) | Change active FreeDV mode. Please note, you have to reboot to activate new mode |
|
||||
| **FreeDV Squelch threshold** ( MENU_DEBUG_FREEDV_SQL_THRESHOLD) | If not OFF, FreeDV will squelch if detected SNR is below set value. |
|
||||
| **Smooth dynamic tune** ( MENU_DEBUG_SMOOTH_DYN_TUNE) | Activate smooth dynamic tune. |
|
||||
| **Band Definition** ( MENU_DEBUG_BANDEF_SELECT) | Select which band definition to use for ham bands (Original UHSDR or IARU Region 1 - 3 |
|
||||
|
||||
|
||||
[//]: # ( EOFILE )
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
#!/usr/bin/python
|
||||
"""
|
||||
2016-12-24 HB9ocq, DB4ple - support program to document the menu structure of uhsdr amateur radio firmware
|
||||
2017-01-01 HB9ocq - refinement
|
||||
2017-01-06 HB9ocq - following change in definition of MenuDescriptor
|
||||
|
||||
relies upon module ui_menu_structure_c2py.py in the same directory
|
||||
|
||||
"""
|
||||
|
||||
|
||||
from ui_menu_structure_c2py import MENU_DESCRIPTOR, BUILD_ID
|
||||
# MENU_DESCRIPTOR is a list of dicts with entries "MENU_ID" "ME_KIND" "NR" "LABEL" "DESC"
|
||||
# e.g. [ ... { 'MENU_ID': "TOP",
|
||||
# 'ME_KIND': "GROUP",
|
||||
# 'NR': "MENU_BASE",
|
||||
# 'LABEL': "Standard Menu",
|
||||
# 'DESC': ":soon:"},
|
||||
# ...]
|
||||
|
||||
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
TS_NOW = datetime.now().replace(microsecond=0).isoformat()
|
||||
|
||||
|
||||
# all unique MENU_IDs
|
||||
am = set([md['MENU_ID'] for md in MENU_DESCRIPTOR]) ## random order
|
||||
|
||||
# forced ORDER ## 2017-01-01 HB9ocq - arbitrary selection, feel free to rearrange
|
||||
am = ['MENU_TOP',
|
||||
'MENU_BASE',
|
||||
'MENU_CONF',
|
||||
'MENU_FILTER',
|
||||
'MENU_CW',
|
||||
'MENU_POW',
|
||||
'MENU_DISPLAY',
|
||||
'MENU_SYSINFO',
|
||||
'MENU_DEBUG',
|
||||
]
|
||||
|
||||
|
||||
#-----------------------------------------------------
|
||||
|
||||
GEN_SENTENCE = r'generated at {TS_NOW} by "{__file__}"'.format(**globals())
|
||||
|
||||
OUTPUT = ""
|
||||
|
||||
# preface/header
|
||||
OUTPUT += r"""
|
||||
[//]: # ( )
|
||||
[//]: # ( WARNING: generated data! DO NOT EDIT MANUALLY ! ! ! )
|
||||
[//]: # ( )
|
||||
[//]: # ( {GEN_SENTENCE} )
|
||||
[//]: # ( )
|
||||
[//]: # ( mcHF SDR TRX v{BUILD_ID} - Menu Structure Diagram as MarkDown-Table )
|
||||
[//]: # ( )
|
||||
[//]: # ( see <https://help.github.com/categories/writing-on-github/> )
|
||||
[//]: # ( )
|
||||
|
||||
# uhsdr firmware v{BUILD_ID} - UI Menu Overview
|
||||
|
||||
{GEN_SENTENCE}
|
||||
|
||||
|
||||
""".format(**globals())
|
||||
|
||||
# a paragraph for every group
|
||||
for gm in [md for md in MENU_DESCRIPTOR if (('MENU_GROUP' == md['ME_KIND']) and (md['NR'] in am))]:
|
||||
# header H2
|
||||
OUTPUT += r"""
|
||||
## {LABEL} (`{NR}`)
|
||||
""".format(**gm)
|
||||
|
||||
# table header
|
||||
OUTPUT += """
|
||||
| {:<25} ({:>43}) | {:<46} | """.format("LABEL", "NR", "DESCRIPTION")
|
||||
OUTPUT += """
|
||||
| {0:-<25}------{0:->43}- | {0:-<46} | """.format("-")
|
||||
# table rows
|
||||
for md in MENU_DESCRIPTOR:
|
||||
if((0 != md['NR']) and ('MENU_STOP' != md['ME_KIND']) and (gm['NR'] == md['MENU_ID'])):
|
||||
# for sensible entries only
|
||||
md['LABEL'] = "**{LABEL}**".format(**md)
|
||||
OUTPUT += """
|
||||
| {LABEL:<29} ({NR:>43}) | {DESC:<46} | """.format(**md)
|
||||
|
||||
OUTPUT += "\n\n"
|
||||
|
||||
# footer
|
||||
OUTPUT += r"""
|
||||
[//]: # ( EOFILE )
|
||||
"""
|
||||
|
||||
|
||||
# are we running as a program?
|
||||
if '__main__' == __name__:
|
||||
print(OUTPUT)
|
||||
exit(0)
|
||||
|
||||
#EOFILE
|
||||