avr-chat
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Attempting to modify efuse with avrdude on Atmega32m1 seems to be unsupp


From: Hannes Wallnöfer
Subject: Attempting to modify efuse with avrdude on Atmega32m1 seems to be unsupported by standard means?
Date: Mon, 13 Apr 2020 15:28:31 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0

Hello

Appologies if this is the wrong mailing list, it seemed the right one to start with.

When trying to write to efuse on a Atmege32M1 (Marking on chip: MEGA32M1-AU). Avrdude seems to write and verify 0 bytes. No errors, efuse seems to remain unchanged:

>_________________________________________________________________________________________________________

# avrdude -c usbasp -p m32m1 -U efuse:w:0xfe:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e9584 (probably m32m1)
avrdude: reading input file "0xfe"
avrdude: writing efuse (0 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 0 bytes of efuse written
avrdude: verifying efuse memory against 0xfe:
avrdude: load data efuse data from input file 0xfe:
avrdude: input file 0xfe contains 0 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 0 bytes of efuse verified

avrdude: safemode: Fuses OK (E:FF, H:D9, L:FF)

avrdude done.  Thank you.

_________________________________________________________________________________________________________<

Writing to lfuse and hfuse is effective, as i am relying on switching the clock source to use an external Chrystal to get a 16MHz IO clock. Here is how writing to lfuse looks like:

>_________________________________________________________________________________________________________

# avrdude -c usbasp -p m32m1 -U lfuse:w:0xff:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e9584 (probably m32m1)
avrdude: reading input file "0xff"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xff:
avrdude: load data lfuse data from input file 0xff:
avrdude: input file 0xff contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK (E:FF, H:D9, L:FF)

avrdude done.  Thank you.

_________________________________________________________________________________________________________<

During research of the problem, found that avrdude offers a terminal mode. In oder to gain more of an understanding of the issue, i tried to dump the efuse memory location manually, which failed, followed by using the same command on lfuse and hfuse, which printed the expected fuse values:

>_________________________________________________________________________________________________________

# avrdude -c usbasp -p m32m1 -t

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e9584 (probably m32m1)
avrdude> dump efuse 0 1
>>> dump efuse 0 1
avrdude (dump): address 0x00000 is out of range for efuse memory
avrdude> dump lfuse 0 1
>>> dump lfuse 0 1
0000  ff |.               |

avrdude> dump hfuse 0 1
>>> dump hfuse 0 1
0000  d9 |.               |

avrdude>

_________________________________________________________________________________________________________<

My goal is to enable the 4.5V brown out functionality by writing 0xfe to efuse.

Learning about the send command form avrdudes man page, i found the send command, combining this with the information about programming of efuse in the Data sheet, i attempted to change efuse manually, first reading it, then writing the new value and finally reading it back and it seemed to work, but i got a warning when leaving the terminal mode and avrdudes safemode claimed the efuse was FF:

>_________________________________________________________________________________________________________

avrdude -c usbasp -p m32m1 -t

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e9584 (probably m32m1)
avrdude> send 0x50 0x08 0x00 0x00
>>> send 0x50 0x08 0x00 0x00
results: 00 50 08 ff

avrdude> send 0xAC 0xA4 0x00 0xFE
>>> send 0xAC 0xA4 0x00 0xFE
results: 00 ac a4 00

avrdude> send 0x50 0x08 0x00 0x00
>>> send 0x50 0x08 0x00 0x00
results: fe 50 08 fe

avrdude> quit
>>> quit

avrdude: safemode: efuse changed! Was ff, and is now fe
Would you like this fuse to be changed back? [y/n] n
avrdude: safemode: Fuses OK (E:FF, H:D9, L:FF)

_________________________________________________________________________________________________________<

Using the terminal mode again, running the send command for reading efuse revealed that it still was set to the desired vallue: fe. Exiting the terminal mode now for the second time did not bring up any warning and indicated that the desired value now is present in efuse: "avrdude: safemode: Fuses OK (E:FE, H:D9, L:FF)". Before sending the E-Mail, i have tried this method on only one chip and will see if this had side effects.

Then, as composing this E-mail, i found that this E-mail list may not be the right one (only non-technichal discussion) i did a bit of search and by randomly clicking i ran into this post: https://lists.gnu.org/archive/html/avrdude-dev/2020-04/msg00000.html

Checking my /etc/avrdude.conf, searching for "m32m1", i indeed found this section, missing a size parameter altogether (Line 8687):

>_________________________________________________________________________________________________________

#------------------------------------------------------------
# ATmega32m1
#------------------------------------------------------------

part parent "m328"
    id              = "m32m1";
    desc            = "ATmega32M1";
    # stk500_devcode    = 0x;
    # avr910_devcode    = 0x;
    signature       = 0x1e 0x95 0x84;
    bs2             = 0xe2;

    memory "efuse"
        read            = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
                          "x x x x x x x x o o o o o o o o";
        write           = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
                          "x x x x x x x x x x i i i i i i";
    ;
;

_________________________________________________________________________________________________________<

The parent Atmega328 does too have an efuse section with specifications for min and max write delay as well as a size declaration (size = 1). Maybe the lack of this information in the Atmega32m1 section is an issue?

The previous, direct attempts failed on 3 of my development boards, which otherwise work as expected (Firmware that runs CANbus communication and a small text based user interface via UART). I am using a "Fischl" original programmer and tried with both the slow and fast jumper setting. Before and after my attempts to write to efuse, i was successfully able to write around 16kB of firmware. I run arch linux with "avrdude: Version 6.3, compiled on May  8 2019 at 19:46:05".

Any direct help and thoughts or pointers to where i could go with this issue are appreciated.

--
Med venlig hilsen/Best regards
Hannes Wallnöfer




reply via email to

[Prev in Thread] Current Thread [Next in Thread]