diff --git a/keyboards/anne_pro/README.md b/keyboards/anne_pro/README.md new file mode 100644 index 0000000000..daa36be6c5 --- /dev/null +++ b/keyboards/anne_pro/README.md @@ -0,0 +1,34 @@ +# Anne Pro +QMK firmware port for the Obins Anne Pro 60% keyboard. + +__This firmware is not created or supported by the creator of this keyboard!__ + +## Building the firmware +To build the firmware a few things have to be done. +First ChibiOS has to be patched, to do this use the provided script in the keyboard folder. +``` +$ ./apply_patch.sh +``` +After this build the Anne Pro firmware from the main folder. +``` +$ make anne_pro +``` +This produces a file `anne_pro_default.bin` in the main folder. To covert this to a DFU file use the script provided. +``` +./dfu-convert.py -b 0x08004000:anne_pro_default.bin anne_pro_default.dfu +``` + +## Flashing the firmware +First find the correct device to flash. +``` +$ dfu-util -l +... +Found DFU: [0483:df11] ver=0200, devnum=30, cfg=1, intf=0, path="20-1.1", alt=2, name="@BluetoothFlash /0x1c000000/14*256 a,192*256 g", serial="017D37663036" +Found DFU: [0483:df11] ver=0200, devnum=30, cfg=1, intf=0, path="20-1.1", alt=1, name="@Internal Flash /0x0c000000/64*256 a,192*256 g", serial="017D37663036" +Found DFU: [0483:df11] ver=0200, devnum=30, cfg=1, intf=0, path="20-1.1", alt=0, name="@Internal Flash /0x08000000/64*256 a,192*256 g", serial="017D37663036" +... +``` +Then flash the firmware. +``` +$ dfu-util --alt 0 --intf 0 --download anne_pro_default.dfu +``` diff --git a/util/dfu-convert.py b/util/dfu-convert.py new file mode 100755 index 0000000000..2022e41793 --- /dev/null +++ b/util/dfu-convert.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python2 + +# Written by Antonio Galea - 2010/11/18 +# Distributed under Gnu LGPL 3.0 +# see http://www.gnu.org/licenses/lgpl-3.0.txt +# +# Removed ihex functionality and dependency, Bitcraze - 2014-12-11 + +import sys,struct,zlib,os +from optparse import OptionParser + +DEFAULT_DEVICE="0x0483:0xdf11" + +def named(tuple,names): + return dict(zip(names.split(),tuple)) +def consume(fmt,data,names): + n = struct.calcsize(fmt) + return named(struct.unpack(fmt,data[:n]),names),data[n:] +def cstring(string): + return string.split('\0',1)[0] +def compute_crc(data): + return 0xFFFFFFFF & -zlib.crc32(data) -1 + +def parse(file,dump_images=False): + print 'File: "%s"' % file + data = open(file,'rb').read() + crc = compute_crc(data[:-4]) + prefix, data = consume('<5sBIB',data,'signature version size targets') + print '%(signature)s v%(version)d, image size: %(size)d, targets: %(targets)d' % prefix + for t in range(prefix['targets']): + tprefix, data = consume('<6sBI255s2I',data,'signature altsetting named name size elements') + tprefix['num'] = t + if tprefix['named']: + tprefix['name'] = cstring(tprefix['name']) + else: + tprefix['name'] = '' + print '%(signature)s %(num)d, alt setting: %(altsetting)s, name: "%(name)s", size: %(size)d, elements: %(elements)d' % tprefix + tsize = tprefix['size'] + target, data = data[:tsize], data[tsize:] + for e in range(tprefix['elements']): + eprefix, target = consume('<2I',target,'address size') + eprefix['num'] = e + print ' %(num)d, address: 0x%(address)08x, size: %(size)d' % eprefix + esize = eprefix['size'] + image, target = target[:esize], target[esize:] + if dump_images: + out = '%s.target%d.image%d.bin' % (file,t,e) + open(out,'wb').write(image) + print ' DUMPED IMAGE TO "%s"' % out + if len(target): + print "target %d: PARSE ERROR" % t + suffix = named(struct.unpack('<4H3sBI',data[:16]),'device product vendor dfu ufd len crc') + print 'usb: %(vendor)04x:%(product)04x, device: 0x%(device)04x, dfu: 0x%(dfu)04x, %(ufd)s, %(len)d, 0x%(crc)08x' % suffix + if crc != suffix['crc']: + print "CRC ERROR: computed crc32 is 0x%08x" % crc + data = data[16:] + if data: + print "PARSE ERROR" + +def build(file,targets,device=DEFAULT_DEVICE): + data = '' + for t,target in enumerate(targets): + tdata = '' + for image in target: + tdata += struct.pack('<2I',image['address'],len(image['data']))+image['data'] + tdata = struct.pack('<6sBI255s2I','Target',0,1,'ST...',len(tdata),len(target)) + tdata + data += tdata + data = struct.pack('<5sBIB','DfuSe',1,len(data)+11,len(targets)) + data + v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1)) + data += struct.pack('<4H3sB',0,d,v,0x011a,'UFD',16) + crc = compute_crc(data) + data += struct.pack('