From 6f62f647d6f09b3914d51a85d2e58e91164ad887 Mon Sep 17 00:00:00 2001 From: Oleg Date: Thu, 9 Feb 2017 21:49:42 +0400 Subject: [PATCH 1/3] added 'Autodetect' button to automatically detect microcontroller --- AVRFuses.xcodeproj/project.pbxproj | 4 + AVRFusesController.h | 2 + AVRFusesController.m | 104 ++++++++++++++++ English.lproj/MainMenu.nib/designable.nib | 66 ++++++----- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 48745 -> 49991 bytes PartDefinition.h | 13 ++ PartDefinition.m | 27 +++++ Signatures.lst | 124 ++++++++++++++++++++ 8 files changed, 308 insertions(+), 32 deletions(-) create mode 100644 Signatures.lst diff --git a/AVRFuses.xcodeproj/project.pbxproj b/AVRFuses.xcodeproj/project.pbxproj index cc438e6..29cde09 100644 --- a/AVRFuses.xcodeproj/project.pbxproj +++ b/AVRFuses.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 8C0903A51E4A606100DDE453 /* Signatures.lst in Resources */ = {isa = PBXBuildFile; fileRef = 8C0903A41E4A606100DDE453 /* Signatures.lst */; }; 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; @@ -46,6 +47,7 @@ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* AVRFuses_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVRFuses_Prefix.pch; sourceTree = ""; }; + 8C0903A41E4A606100DDE453 /* Signatures.lst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Signatures.lst; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* AVRFuses.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AVRFuses.app; sourceTree = BUILT_PRODUCTS_DIR; }; 960D606D0B6FE9700018E006 /* AVRFusesWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AVRFusesWindowController.h; sourceTree = ""; }; @@ -141,6 +143,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 8C0903A41E4A606100DDE453 /* Signatures.lst */, 96EE8B940FA02F320024B974 /* dsa_pub.pem */, 9661E70B0D18340400DFABE4 /* appcast.xml */, 962D354B0CFD5922003A6C5A /* AVRFuses2.icns */, @@ -218,6 +221,7 @@ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 96D8D30A0CEEE5D600C7FDC6 /* AVRFuses.parts in Resources */, 96A329570CFBF63900500BA9 /* Credits.rtf in Resources */, + 8C0903A51E4A606100DDE453 /* Signatures.lst in Resources */, 962D354C0CFD5922003A6C5A /* AVRFuses2.icns in Resources */, 9661E70C0D18340400DFABE4 /* appcast.xml in Resources */, 96EE8B950FA02F320024B974 /* dsa_pub.pem in Resources */, diff --git a/AVRFusesController.h b/AVRFusesController.h index e2a0d95..f00abe6 100644 --- a/AVRFusesController.h +++ b/AVRFusesController.h @@ -12,11 +12,13 @@ NSMutableArray *fuseSettings; NSMutableArray *lockbitSettings; NSString *avrdudeVersion; + NSMutableDictionary *signatures; } - (void)awakeFromNib; - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *) theApplication; - (void)loadPartDefinitions; +- (void)loadSignaturesDefinitions; - (void)loadAvrdudeConfigs; - (BOOL) avrdudeAvailable; diff --git a/AVRFusesController.m b/AVRFusesController.m index 335a3ed..188dbb4 100644 --- a/AVRFusesController.m +++ b/AVRFusesController.m @@ -30,6 +30,7 @@ @implementation AVRFusesController - (void)awakeFromNib { parts = [[NSMutableDictionary alloc] init]; + signatures = [[NSMutableDictionary alloc] init]; selectedPart = nil; fuses = [[NSMutableDictionary alloc] init]; fuseSettings = [[NSMutableArray alloc] init]; @@ -39,6 +40,7 @@ - (void)awakeFromNib [lockbitsTableView setDoubleAction: @selector(tableViewDoubleClick:)]; [self loadPartDefinitions]; + [self loadSignaturesDefinitions]; NSArray *sortedPartNames = [[parts allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; for (int i = 0; i < [sortedPartNames count]; i++) { @@ -166,6 +168,44 @@ - (void)loadPartDefinitions fclose(file); } +- (void)loadSignaturesDefinitions +{ + NSBundle *thisBundle = [NSBundle mainBundle]; + char buffer[1000]; + FILE *file = fopen([[thisBundle pathForResource: @"Signatures" ofType: @"lst"] UTF8String], "r"); + while(fgets(buffer, 1000, file) != NULL) { + NSString *line = [[NSString alloc] initWithCString: buffer encoding:NSUTF8StringEncoding]; + [line autorelease]; + NSScanner *scanner = [NSScanner scannerWithString: line]; + + NSString *name = nil; + unsigned int signature1 = 0; + unsigned int signature2 = 0; + unsigned int signature3 = 0; + + [scanner scanUpToString: @"," intoString: &name]; + [scanner setScanLocation:[scanner scanLocation] + 1]; + [scanner scanHexInt: &signature1]; + [scanner setScanLocation:[scanner scanLocation] + 1]; + [scanner scanHexInt: &signature2]; + [scanner setScanLocation:[scanner scanLocation] + 1]; + [scanner scanHexInt: &signature3]; + + // TODO see if this makes sense since we're adding to arrays and such + [name retain]; + + Signature *signature = nil; + signature = [[Signature alloc] init]; + [signature autorelease]; + signature->s1 = signature1; + signature->s2 = signature2; + signature->s3 = signature3; + + [signatures setObject: name forKey: signature]; + } + fclose(file); +} + - (IBAction)deviceChanged:(id)sender { @@ -1010,6 +1050,70 @@ - (IBAction)eraseDevice:(id)sender [self logStatus:[task terminationStatus] == 0]; } +- (IBAction)autodetectDevice:(id)sender +{ + NSString *avrdudePath = [[NSUserDefaults standardUserDefaults] stringForKey: @"avrdudePath"]; + NSMutableArray *avrdudeArguments = [self defaultAvrdudeArguments]; + + [avrdudeArguments addObject: @"-F"]; + [avrdudeArguments addObject: @"-U"]; + [avrdudeArguments addObject: @"signature:r:/tmp/SIGNATURE.tmp:h"]; + + [self log: @"Reading signature..."]; + + NSTask *task = [[NSTask alloc] init]; + [task autorelease]; + [task setLaunchPath: avrdudePath]; + [task setArguments: avrdudeArguments]; + NSPipe *pipe = [NSPipe pipe]; + [task setStandardError: pipe]; + NSFileHandle *file = [pipe fileHandleForReading]; + [self logCommandLine:task]; + [task launch]; + [task waitUntilExit]; + + NSData *data = [file readDataToEndOfFile]; + NSString *stdErr = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; + [stdErr autorelease]; + NSArray *stdErrLines = [stdErr componentsSeparatedByString: @"\n"]; + for (int i = 0; i < [stdErrLines count]; i++) { + NSString *line = [stdErrLines objectAtIndex: i]; + if ([line length] > 0) { + [self log: line]; + } + } + + [self logStatus:[task terminationStatus] == 0]; + + if ([task terminationStatus] == 0) { + char buffer[1000]; + FILE *file = fopen("/tmp/SIGNATURE.tmp", "r"); + fgets(buffer, 1000, file); + NSString *line = [[NSString alloc] initWithCString: buffer encoding:NSUTF8StringEncoding]; + [line autorelease]; + NSScanner *scanner = [NSScanner scannerWithString: line]; + NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@","]; + unsigned int signByte1, signByte2, signByte3; + [scanner setCharactersToBeSkipped:separatorSet]; + [scanner scanHexInt: &signByte1]; + [scanner scanHexInt: &signByte2]; + [scanner scanHexInt: &signByte3]; + fclose(file); + + Signature *signature = [[Signature alloc] init]; + signature->s1 = signByte1; + signature->s2 = signByte2; + signature->s3 = signByte3; + + + NSString *name = [signatures objectForKey:signature]; + [name autorelease]; + [self log: name]; + [devicePopUpButton selectItemWithTitle: name]; + [self deviceChanged: nil]; + } +} + - (void)tableViewDoubleClick: (NSTableView *) tableView { if (![self avrdudeAvailable]) { diff --git a/English.lproj/MainMenu.nib/designable.nib b/English.lproj/MainMenu.nib/designable.nib index b1f1aae..0419c95 100644 --- a/English.lproj/MainMenu.nib/designable.nib +++ b/English.lproj/MainMenu.nib/designable.nib @@ -1,8 +1,10 @@ - - + + - + + + @@ -39,7 +41,7 @@ - + @@ -132,13 +134,11 @@ - - - + @@ -233,18 +233,16 @@ - - - + - - + + @@ -254,7 +252,7 @@ - + + - - @@ -288,13 +297,13 @@ - + - + - + @@ -337,7 +346,6 @@ - @@ -841,10 +847,10 @@ - + - + @@ -990,13 +996,11 @@ - - - + - + @@ -1037,8 +1041,6 @@ - - diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 4ba7f0c45cc80f3b69876f3d6053cb52d6e9fe12..dc9c2c152f80b40819e3228e531583044dc503e4 100644 GIT binary patch literal 49991 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

x0 zXbgG>eT2S1-=Tl4@dic2)=LEUSyv-HNoLtv*()6=x+_gRG&}aBHMB#u{%; zu+pr_R)&>jWm~hXxz-|Uv9;7%W39E;TRW@@>s;$1>uT#!>!or3eI`u!-_tqZf6xDa HTd({N)~Z@nvyjgj1iA(7D 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 diff --git a/PartDefinition.h b/PartDefinition.h index 9f33a8f..a2fdcad 100755 --- a/PartDefinition.h +++ b/PartDefinition.h @@ -38,3 +38,16 @@ NSString *text; } @end + +@interface Signature : NSObject +{ + @public + unsigned int s1; + unsigned int s2; + unsigned int s3; +} +- (NSString*)description; +- (BOOL)isEqual: (id)other; +- (NSUInteger)hash; +-(id)copyWithZone:(NSZone*)zone; +@end diff --git a/PartDefinition.m b/PartDefinition.m index 1ed7292..e6ddf6f 100755 --- a/PartDefinition.m +++ b/PartDefinition.m @@ -29,3 +29,30 @@ -(id)init; @implementation FuseSetting @end + +@implementation Signature +- (NSString*)description +{ + return [NSString stringWithFormat:@"%.2x %.2x %.2x", self->s1, self->s2, self->s3]; +} + +- (BOOL)isEqual: (id)other +{ + return [self hash] == [other hash]; +} + +- (NSUInteger)hash +{ + return (self->s1 << 16) + (self->s2 << 8) + self->s3; +} + + +-(id)copyWithZone:(NSZone*)zone +{ + Signature *newSignature = [[[self class] allocWithZone:zone] init]; + newSignature->s1 = self->s1; + newSignature->s2 = self->s2; + newSignature->s3 = self->s3; + return newSignature; +} +@end diff --git a/Signatures.lst b/Signatures.lst new file mode 100644 index 0000000..699396a --- /dev/null +++ b/Signatures.lst @@ -0,0 +1,124 @@ +AT90CAN128,0x1e,0x97,0x81 +AT90CAN32,0x1e,0x95,0x81 +AT90CAN64,0x1e,0x96,0x81 +AT90PWM1,0x1e,0x93,0x83 +AT90PWM161,0x1e,0x94,0x8B +AT90PWM216,0x1e,0x94,0x83 +AT90PWM2B,0x1e,0x93,0x83 +AT90PWM316,0x1e,0x94,0x83 +AT90PWM3B,0x1e,0x93,0x83 +AT90PWM81,0x1e,0x93,0x88 +AT90USB1286,0x1e,0x97,0x82 +AT90USB1287,0x1e,0x97,0x82 +AT90USB162,0x1e,0x94,0x82 +AT90USB646,0x1e,0x96,0x82 +AT90USB647,0x1e,0x96,0x82 +AT90USB82,0x1e,0x93,0x82 +ATmega128,0x1e,0x97,0x02 +ATmega1280,0x1e,0x97,0x03 +ATmega1281,0x1e,0x97,0x04 +ATmega1284,0x1e,0x97,0x06 +ATmega1284P,0x1e,0x97,0x05 +ATmega1284RFR2,0x1e,0xa7,0x03 +ATmega128A,0x1e,0x97,0x02 +ATmega128RFA1,0x1e,0xa7,0x01 +ATmega128RFR2,0x1e,0xa7,0x02 +ATmega16,0x1e,0x94,0x03 +ATmega162,0x1e,0x94,0x04 +ATmega164A,0x1e,0x94,0x0f +ATmega164P,0x1e,0x94,0x0a +ATmega164PA,0x1e,0x94,0x0a +ATmega165A,0x1e,0x94,0x10 +ATmega165P,0x1e,0x94,0x07 +ATmega165PA,0x1e,0x94,0x07 +ATmega168,0x1e,0x94,0x06 +ATmega168A,0x1e,0x94,0x06 +ATmega168P,0x1e,0x94,0x0b +ATmega168PA,0x1e,0x94,0x0b +ATmega168PB,0x1e,0x94,0x15 +ATmega169A,0x1e,0x94,0x11 +ATmega169P,0x1e,0x94,0x05 +ATmega169PA,0x1e,0x94,0x05 +ATmega16A,0x1e,0x94,0x03 +ATmega16HVA,0x1e,0x94,0x0c +ATmega16HVB,0x1e,0x94,0x0d +ATmega16HVBrevB,0x1e,0x94,0x0d +ATmega16M1,0x1e,0x94,0x84 +ATmega16U2,0x1e,0x94,0x89 +ATmega16U4,0x1e,0x94,0x88 +ATmega2560,0x1e,0x98,0x01 +ATmega2561,0x1e,0x98,0x02 +ATmega2564RFR2,0x1e,0xa8,0x03 +ATmega256RFR2,0x1e,0xa8,0x02 +ATmega32,0x1e,0x95,0x02 +ATmega324A,0x1e,0x95,0x15 +ATmega324P,0x1e,0x95,0x08 +ATmega324PA,0x1e,0x95,0x11 +ATmega324PB,0x1e,0x95,0x17 +ATmega325,0x1e,0x95,0x05 +ATmega3250,0x1e,0x95,0x06 +ATmega3250A,0x1e,0x95,0x06 +ATmega3250P,0x1e,0x95,0x0e +ATmega3250PA,0x1e,0x95,0x0e +ATmega325A,0x1e,0x95,0x05 +ATmega325P,0x1e,0x95,0x0d +ATmega325PA,0x1e,0x95,0x0d +ATmega328,0x1e,0x95,0x14 +ATmega328P,0x1e,0x95,0x0f +ATmega328PB,0x1e,0x95,0x16 +ATmega329,0x1e,0x95,0x03 +ATmega3290,0x1e,0x95,0x04 +ATmega3290A,0x1e,0x95,0x04 +ATmega3290P,0x1e,0x95,0x0c +ATmega3290PA,0x1e,0x95,0x0c +ATmega329A,0x1e,0x95,0x03 +ATmega329P,0x1e,0x95,0x0b +ATmega329PA,0x1e,0x95,0x0b +ATmega32A,0x1e,0x95,0x02 +ATmega32C1,0x1e,0x95,0x86 +ATmega32HVB,0x1e,0x95,0x10 +ATmega32HVBrevB,0x1e,0x95,0x10 +ATmega32M1,0x1e,0x95,0x84 +ATmega32U2,0x1e,0x95,0x8a +ATmega32U4,0x1e,0x95,0x87 +ATmega406,0x1e,0x95,0x07 +ATmega48,0x1e,0x92,0x05 +ATmega48A,0x1e,0x92,0x05 +ATmega48P,0x1e,0x92,0x0a +ATmega48PA,0x1e,0x92,0x0a +ATmega48PB,0x1e,0x92,0x10 +ATmega64,0x1e,0x96,0x02 +ATmega640,0x1e,0x96,0x08 +ATmega644,0x1e,0x96,0x09 +ATmega644A,0x1e,0x96,0x09 +ATmega644P,0x1e,0x96,0x0a +ATmega644PA,0x1e,0x96,0x0a +ATmega644RFR2,0x1e,0xa6,0x03 +ATmega645,0x1e,0x96,0x05 +ATmega6450,0x1e,0x96,0x06 +ATmega6450A,0x1e,0x96,0x06 +ATmega6450P,0x1e,0x96,0x0e +ATmega645A,0x1e,0x96,0x05 +ATmega645P,0x1e,0x96,0x0D +ATmega649,0x1e,0x96,0x03 +ATmega6490,0x1e,0x96,0x04 +ATmega6490A,0x1e,0x96,0x04 +ATmega6490P,0x1e,0x96,0x0C +ATmega649A,0x1e,0x96,0x03 +ATmega649P,0x1e,0x96,0x0b +ATmega64A,0x1e,0x96,0x02 +ATmega64C1,0x1e,0x96,0x86 +ATmega64HVE2,0x1e,0x96,0x10 +ATmega64M1,0x1e,0x96,0x84 +ATmega64RFR2,0x1e,0xa6,0x02 +ATmega8,0x1e,0x93,0x07 +ATmega8515,0x1e,0x93,0x06 +ATmega8535,0x1e,0x93,0x08 +ATmega88,0x1e,0x93,0x0a +ATmega88A,0x1e,0x93,0x0a +ATmega88P,0x1e,0x93,0x0f +ATmega88PA,0x1e,0x93,0x0f +ATmega88PB,0x1e,0x93,0x16 +ATmega8A,0x1e,0x93,0x07 +ATmega8HVA,0x1e,0x93,0x10 +ATmega8U2,0x1e,0x93,0x89 From 711736989d1c629e455264b501ca687cc0bcad07 Mon Sep 17 00:00:00 2001 From: Oleg Date: Sat, 11 Feb 2017 10:21:20 +0400 Subject: [PATCH 2/3] added script to build signatures file --- BuildCache/build_signatures.py | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 BuildCache/build_signatures.py diff --git a/BuildCache/build_signatures.py b/BuildCache/build_signatures.py new file mode 100755 index 0000000..e1195f0 --- /dev/null +++ b/BuildCache/build_signatures.py @@ -0,0 +1,46 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +import os + +import sys + + +if len(sys.argv) != 2: + print 'Usage: build_signatures.py ' + sys.exit(1) + +atmel_location = sys.argv[1] + +sys.stdout = open('Signatures.lst', 'w') + + +def process_atdf(path): + with open(path) as f: + lines = f.readlines() + name = None + s1 = None + s2 = None + s3 = None + l = len('= 0: + name = s[pn+len(' Date: Sat, 11 Feb 2017 23:07:33 +0400 Subject: [PATCH 3/3] fixed layout issue and fixed crash --- AVRFusesController.m | 1 - English.lproj/MainMenu.nib/designable.nib | 2 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 49991 -> 49991 bytes 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/AVRFusesController.m b/AVRFusesController.m index 188dbb4..f471440 100644 --- a/AVRFusesController.m +++ b/AVRFusesController.m @@ -1107,7 +1107,6 @@ - (IBAction)autodetectDevice:(id)sender NSString *name = [signatures objectForKey:signature]; - [name autorelease]; [self log: name]; [devicePopUpButton selectItemWithTitle: name]; [self deviceChanged: nil]; diff --git a/English.lproj/MainMenu.nib/designable.nib b/English.lproj/MainMenu.nib/designable.nib index 0419c95..1224498 100644 --- a/English.lproj/MainMenu.nib/designable.nib +++ b/English.lproj/MainMenu.nib/designable.nib @@ -269,7 +269,7 @@