|
|
@@ -35,26 +35,27 @@ with "(spid)". |
|
|
|
|
|
|
|
Then, you initiate programming mode with "asp$", and then issue your commands. |
|
|
|
|
|
|
|
At this time, only fuse commands are implemented. You get/set they values with |
|
|
|
"aspfx@/aspfx!", x being one of "l" (low fuse), "h" (high fuse), "e" (extended |
|
|
|
fuse). |
|
|
|
|
|
|
|
Each command will verify that it's in sync, that is, that its 3rd exchange |
|
|
|
echoes the byte that was sent in the 2nd exchange. If it doesn't, the command |
|
|
|
aborts with "AVR err". |
|
|
|
|
|
|
|
At the time of this writing, it is recommended that you perform your commands in |
|
|
|
batch, that is, running your commands right after the "asp$" command, ending |
|
|
|
your batch with "(spid)" so that the next batch works. In my tests, interacting |
|
|
|
with the chip "live" in a single "asp$" session sometimes resulted in unreliable |
|
|
|
data that didn't properly detect sync errors. TODO: investigate further. |
|
|
|
# Access fuses |
|
|
|
|
|
|
|
You get/set they values with "aspfx@/aspfx!", x being one of "l" (low fuse), |
|
|
|
"h" (high fuse), "e" (extended fuse). |
|
|
|
|
|
|
|
# Writing data to Flash |
|
|
|
# Access flash |
|
|
|
|
|
|
|
Writing to AVR's flash is done in batch mode, page by page. To this end, the |
|
|
|
chip has a buffer which is writable byte-by-byte. To write to the flash, you |
|
|
|
begin by writing to that buffer using aspfb! and then write to a page using |
|
|
|
aspfp!. |
|
|
|
chip has a buffer which is writable byte-by-byte. |
|
|
|
|
|
|
|
Writing to the flash begins with a call to asperase, which erases the whole |
|
|
|
chip. It seems possible to erase flash page-by-page through parallel |
|
|
|
programming, but the SPI protocol doesn't expose it, we have to erase the whole |
|
|
|
chip. Then, you write to the buffer using aspfb! and then write to a page using |
|
|
|
aspfp!. Example to write 0x1234 to the first byte of the first page: |
|
|
|
|
|
|
|
asperase 0x1234 0 aspfb! 0 aspfp! |
|
|
|
|
|
|
|
Please note that aspfb! deals with *words*, not bytes. If, for example, you want |
|
|
|
to hook it to A!*, make sure you use AMOVEW instead of AMOVE. You will need to |
|
|
@@ -62,8 +63,3 @@ create a wrapper word around aspfb! that divides dst addr by 2 because AMOVEW |
|
|
|
use byte-based addresses but aspfb! uses word-based ones. You also have to make |
|
|
|
sure that A@* points to @ (or another word-based fetcher) instead of its default |
|
|
|
value of C@. |
|
|
|
|
|
|
|
Beware of bootloader sections! By default, AVR chips have a bootloader using the |
|
|
|
first few pages (by default, the ATMega328P uses 4 pages for its bootloader). |
|
|
|
Check (or modify) the BOOTSZ fuses to confirm where you whould start writing |
|
|
|
your program. |