avrdudes / avrdude

AVRDUDE is a utility to program AVR microcontrollers
GNU General Public License v2.0
694 stars 134 forks source link

Implement Damerau Levenshtein distance checking for parts and memories #1701

Closed MCUdude closed 1 month ago

MCUdude commented 6 months ago

1593 related

Right before the v7.3 release, we added DL distance checking to programmers, so that Avrdude would suggest a programmer in case of a typo, rather than printing the entire list:

$ avrdude -cstk500_pp -patmega48
avrdude error: cannot find programmer id stk500_pp
similar programmer names:
  stk500pp = Atmel STK500 v2 in parallel programming mode
  stk600pp = Atmel STK600 in parallel programming mode
use -c? to see all possible programmers

Neat! Now this would be just as neat to have for memories and parts as well:

$ avrdude -cdryrun -patmega48 -Uflahs:r:-:i
avrdude error: unknown memory flahs

avrdude done.  Thank you.
$ avrdude -cdryrun -patmeag48

avrdude error: AVR part atmeag48 not found

Valid parts are:
  uc3a0512   = AT32UC3A0512
  89S51      = AT89S51
  89S52      = AT89S52
 [...]
  m644rfr2   = ATmega644RFR2
  m645       = ATmega645
  m6450      = ATmega6450
  m6450a     = ATmega6450A
  m6450p     = ATmega6450P
  m645a      = ATmega645A
  m645p      = ATmega645P
  [...]
  avr8ea28   = AVR8EA28
  avr8ea32   = AVR8EA32
  ucr2       = deprecated, use 'uc3a0512'
  lgt8f168p  = LGT8F168P
  lgt8f328p  = LGT8F328P
  lgt8f88p   = LGT8F88P

avrdude done.  Thank you.

One thing that's great about the DL implementation for the programmers is that it won't suggest a programmer that's not compatible with the part:

$ ./avrdude -cstk500hvs -patmega48 # stk500hvsp is the closest match, but not compatible
avrdude error: cannot find programmer id stk500hvs
similar programmer name:
  stk500v2 = Atmel STK500 version 2.x firmware
use -c? to see all possible programmers

But what should we print if:

stefanrueger commented 6 months ago

There are subtle but important differences between programmer, part and memory names:

I think it's OK to limit suggestions for a part if the programmer has unambiguously been specified and hence the supported programming interfaces are known.

MCUdude commented 6 months ago

Part names are the official ones; small changes, even a letter, can make a big difference for programming, eg, the fuse bitfields between the ATmega328P and ATmega328PB are different. It is unclear to me whether DL can help the user. They really have to get the right part that's in front of them

OK, this might be more difficult to solve than I first imagined. I'd think that we should only suggest the full name (atmega328p, not m328p), and ignore subtypes (ATmega328P-AU). So if the user uses -c m328L or ATmega328P-AY, suggest atmega328p as the most possible option, not m328p.

Memory names can be abbreviated as long as they are unique for the part: flash, flas, fla and fl will work

I think we should always suggest the full memory name to prevent confusion.

Memory names are matched case sensitive, but programmer and part names are treated case insensitive. DL will be implemented for case-insensitive matches (which is probably what you want)

I think case-insensitive matches for memories would be the best. A user may write -U EEPROM:w:data.hex:i, because EEPROM is usually written with capital letters. However, suggestions would always be that the actual memory name is in avrdude.conf is; eeprom in lover case.

Off topic: Avrdude supports m328p, t817 and x128a1u. Would it be possible to implement support for 128da32 as well?

stefanrueger commented 6 months ago

Avrdude supports m328p, t817 and x128a1u. Would it be possible to implement support for 128da32 as well?

As in PR #1703?

mcuee commented 6 months ago

Off topic: Avrdude supports m328p, t817 and x128a1u. Would it be possible to implement support for 128da32 as well?

Good idea.

mcuee commented 6 months ago

Avrdude supports m328p, t817 and x128a1u. Would it be possible to implement support for 128da32 as well?

As in PR #1703?

PR #1703 looks good.

stefanrueger commented 1 month ago

@MCUdude I won't be attempting to extend Damerau-Levenshtein to parts, mainly because I think that's waaay too complex a task with too little benefit. The asymmetry between parts and programmers as outlined above is just too big...