2012-05-09

Atmel: AVR Basics: Reading (and writing) flash contents

Atmel: AVR Basics: Reading (and writing) flash contents - Atmel: AVR Khái niệm cơ bảnđọc (và viết) flash nội dung

Programming on a target board
From one forum comes this interesting question:

   "Is it possible to download the contents of an ATmega168/328, essentially backing it up so that it can somehow be restored later?
   For example: Let's say I have lost the source code to a very useful program currently residing on a 328, but I need to flash it with a different sketch temporarily, then restore that original sketch. This would be useful in the case that the chip was soldered directly onto a board - a big mess to try to replace.
   Is this possible in some way, perhaps by altering an ISP programmer?"

The answer is that yes indeed, it is possible - with a couple of exceptions that are worth mentioning. And on occasion, it's even very useful.

Reading out the flash memory is straightforward with an AVR ISP programmer, such as the USBtinyISP, using avrdude from the command line.

You'll need to have a copy of the AVR toolchain - or at least avrdude - installed on your computer. There are easy installers available for Mac (Crosspack) and Windows (MHV AVR Tools) that include this software, along with the other open source tools for AVR development. Linux packages for AVR development are also available.

Reading the flash
To read out the contents of the flash memory of your AVR, you just need to hook up your ISP programmer to the target board, and run an appropriate avrdude command to read out the flash. For "dumping" out the contents of an ATmega328P, for example, you might use the command:
   avrdude -p m328p -P usb -c usbtiny -U flash:r:flash.bin:r
Where, "atmega328p" is the name of the chip, written exactly as found in the avrdude documentation, "-P usb" means that we're using a usb-connected programmer, and "usbtiny" is the programmer type (again, taken from the list in the documentation).

The real heart of the command is the last part, -U flash:r:"flash.bin":r. This tells avrdude to read the contents of the flash ("flash:r"), save it to a file named "flash.bin," and specifies the format (":r"), in this case raw binary.

Writing the flash
To write the contents of that file, "flash.bin," we use a similar command, only now telling it to write the contents "flash:w...":
   avrdude -p m328p -P usb -c usbtiny -U flash:w:flash.bin
Again, the exact command line needs to be tailored to your particular chip, programmer, and file name.

Applications
So, when would this kind of method be useful? Yes, it's possible that you've lost the source code to a piece of software-- but perhaps that's an esoteric case. We have actually found this method to be very helpful in daily use as a sort of "disk image" file.

You can, for example, read and write the full flash contents of an Arduino device that has both the Arduino bootloader and a program on top of that. Then, deploying an additional copy of that program becomes as simple as executing a single command to write the flash file. For "production programming" - that is, making many clones of an AVR program - it has the added benefits of being fast and reliably consistent, as compared with individually compiling and installing firmware for each device.

Caveats
As we mentioned earlier, there are a couple of exceptions that are worth mentioning:
   1.) It is possible to intentionally lock the contents of the flash memory, such that the contents cannot be read out*. You can do this by setting the lock bits of the AVR according to the values listed in the datasheet, and the lock bits cannot be reset except by erasing the whole device.

*There are known ways of getting around this, so please don't consider lock bits sufficient defense if you are worried about someone stealing your code as a means of industrial espionage.

  2.) These commands, as written, only back up the contents of the flash (program) memory. Reading out the EEPROM or fuse byte values can be done in similar ways. You can read more about the avrdude command line options in the avrdude documentation, or in the tutorial at Adafruit.

For production programming, the single avrdude statement can set the fuse bytes and also write the flash, or a makefile can be written to give multiple avrdude statements, for sequencing the order of writing flash and fuse and/or lock bits.

Other comments

AVR Basics: Reading (and writing) flash contents
if you've got the arduino software, you've got avrdude already. it'll be at arduino-00xx/hardware/tools/avrdude, if you happen to be running arduino version xx. so, if you can figure out where your arduino software is installed, you can run it from there.

AVR Basics: Reading (and writing) flash contents
You might want to add that while the lock bits prevent reading the actual flash memory contents, you won't get an error message. The binary file will be created just as it would without the lock bits set, but it contains nonsense (or, more precisely, the lower 8 bits of word address of the memory location). So you will have to open the binary file with a hex editor (I recommend frhed for windows and dhex for linux/console, if you're using KDE then khexedit might be a good choice). If it contains a pattern like
00 00 01 01 02 02 03 03 04 04
and so on, the AVR is most probably locked.


AVR Basics: Reading (and writing) flash contents
How do you get around the lock bits? HV Programing?

AVR Basics: Reading (and writing) flash contents
If there was a way to "get around" the lock bits, that would sorta defeat the purpose of the lock bits, no?

You can re-program the chip and disable the lock bits, but it'll wipe out whatever's on there in the process. If you're trying to get code from a locked chip, ask the programmer if they're willing to share the code.



Atmel: AVR Khái niệm cơ bảnđọc (và viết) flash nội dung

Từ một diễn đàn đến câu hỏi thú vị này:


   "Có thể tải về các nội dung của một ATmega168/328, về cơ bản sao lưu nó lên để nó bằng cách nào đó có thể được phục hồi sau này?

   Ví dụ: Hãy nói rằng tôi đã bị mất mã nguồn một chương trình rất hữu ích, hiện đang cư trú trên 1 328, nhưng tôi cần phải flash nó với một bản phác thảo khác nhau tạm thời, sau đó khôi phục lại rằng bản phác thảo ban đầu. Điều này sẽ hữu ích trong trường hợp chip được hàn trực tiếp vào hội đồng quản trị - một mớ hỗn độn lớn để cố gắng thay thế.

   Đây có thể một cách nào đó, có lẽ bằng cách thay đổi một lập trình ISP? "


   Ví dụ: Hãy nói rằng tôi đã bị mất mã nguồn một chương trình rất hữu ích, hiện đang cư trú trên 1 328, nhưng tôi cần phải flash nó với một bản phác thảo khác nhau tạm thời, sau đó khôi phục lại rằng bản phác thảo ban đầu. Điều này sẽ hữu ích trong trường hợp chip được hàn trực tiếp vào hội đồng quản trị - một mớ hỗn độn lớn để cố gắng thay thế.

   Đây có thể một cách nào đó, có lẽ bằng cách thay đổi một lập trình ISP? "
Câu trả lời là rằng  thực sự,  có thể - với một vài trường hợp ngoại lệ  đáng nhắc đến.  nhân dịp, thậm chí nó còn rất hữu ích.

Đọc bộ nhớ flash đơn giản với một ISP AVR lập trình, chẳng hạn nhưUSBtinyISP, sử dụng avrdude từ dòng lệnh.

Bạn sẽ cần phải có một bản sao của toolchain AVR hoặc avrdude ít nhất là cài đặt trên máy tính của bạn.  trình cài đặt dễ dàng  sẵncho Mac (Crosspack)  Windows (MHV AVR Công cụ) bao gồm phần mềm này, cùng với các công cụ mã nguồn mở khác cho AVR phát triển.Gói Linux phát triển cho AVR cũng có sẵn.


Bạn sẽ cần phải có một bản sao của toolchain AVR hoặc avrdude ít nhất là cài đặt trên máy tính của bạn.  trình cài đặt dễ dàng  sẵncho Mac (Crosspack)  Windows (MHV AVR Công cụ) bao gồm phần mềm này, cùng với các công cụ mã nguồn mở khác cho AVR phát triển.Gói Linux phát triển cho AVR cũng có sẵn.

Đọc bộ nhớ flash đơn giản với một ISP AVR lập trình, chẳng hạn nhưUSBtinyISP, sử dụng avrdude từ dòng lệnh.

Bạn sẽ cần phải có một bản sao của toolchain AVR hoặc avrdude ít nhất là cài đặt trên máy tính của bạn.  trình cài đặt dễ dàng  sẵncho Mac (Crosspack)  Windows (MHV AVR Công cụ) bao gồm phần mềm này, cùng với các công cụ mã nguồn mở khác cho AVR phát triển.Gói Linux phát triển cho AVR cũng có sẵn.



Đọc bộ nhớ flash đơn giản với một ISP AVR lập trình, chẳng hạn nhưUSBtinyISP, sử dụng avrdude từ dòng lệnh.

Bạn sẽ cần phải có một bản sao của toolchain AVR hoặc avrdude ít nhất là cài đặt trên máy tính của bạn.  trình cài đặt dễ dàng  sẵncho Mac (Crosspack)  Windows (MHV AVR Công cụ) bao gồm phần mềm này, cùng với các công cụ mã nguồn mở khác cho AVR phát triển.Gói Linux phát triển cho AVR cũng có sẵn.



Bạn sẽ cần phải có một bản sao của toolchain AVR hoặc avrdude ít nhất là cài đặt trên máy tính của bạn.  trình cài đặt dễ dàng  sẵncho Mac (Crosspack)  Windows (MHV AVR Công cụ) bao gồm phần mềm này, cùng với các công cụ mã nguồn mở khác cho AVR phát triển.Gói Linux phát triển cho AVR cũng có sẵn.


Câu trả lời là rằng  thực sự,  có thể - với một vài trường hợp ngoại lệ  đáng nhắc đến.  nhân dịp, thậm chí nó còn rất hữu ích.



Đọc flash
Để đọc nội dung của bộ nhớ flash AVR của bạn, bạn chỉ cần để treo lên ISP của bạn lập trình viên hội đồng quản trị mục tiêu, và chạy một lệnh avrdude thích hợp để đọc flash. Đối với "phá giá" các nội dung của ATmega328P, ví dụ, bạn có thể sử dụng lệnh:

   avrdude -p m328p -P usb -c usbtiny -U flash:r:flash.bin:r

Ở đâu, "atmega328p" là tên của chip, được viết chính xác như được tìm thấy trong tài liệu avrdude-P usb "có nghĩa là chúng ta đang sử dụng một lập trình kết nối usb, và" usbtiny "là kiểu lập trình (một lần nữa, thực hiện từ danh sách trong tài liệu hướng dẫn).


Trái tim thực sự của lệnh là phần cuối cùng, U đèn flash: r: "flash.bin": r. Điều này cho avrdude để đọc các nội dung của bộ nhớ flash (Flash: r "), lưu nó vào một tập tin tên là" flash.bin, "và xác định các định dạng (": r "), trong trường hợp này liệu nhị phân.




Viết flash
Để ghi các nội dung của tập tin đó ", flash.bin", chúng tôi sử dụng một lệnh tương tự, chỉ bây giờ nói cho nó để ghi các nội dung "flash: w ...":


   avrdude -p m328p -P usb -c usbtiny -U flash:w:flash.bin


Một lần nữa, các dòng lệnh chính xác cần phải được thay đổi để tênchip, lập trình, và tập tin cụ thể của bạn.

ứng dụng
Vì vậy, khi loại phương pháp này sẽ hữu ích? Vâng, rất có thể là bạn đã bị mất  nguồn một phần của phần mềm - nhưng có lẽ đó là mộttrường hợp bí truyền. Chúng tôi đã thực sự tìm thấy phương pháp này rất hữu ích trong việc sử dụng hàng ngày như là một loại của tập tinảnh đĩa ".

Bạn có thể, ví dụ, đọc và viết nội dung flash đầy đủ của một thiết bịArduino  cả hai bộ nạp khởi động Arduino và một chương trình trên đó. Sau đó, triển khai thêm một bản sao của chương trình đó trở nênđơn giản như thực hiện một lệnh duy nhất để viết các tập tin flash. Đốivới sản xuất "lập trình" - đó là, làm cho nhiều dòng vô tính của một chương trình AVR -   những lợi ích gia tăng nhanh chóng  đáng tin cậy phù hợp, so với cá nhân biên dịch  cài đặt phần mềm cho từng thiết bị.



Hãy cẩn thận
Như chúng tôi đã đề cập trước đó, có một vài trường hợp ngoại lệ đáng nhắc đến:



1)  có thể cố ý khóa các nội dung của bộ nhớ flash, chẳng hạn các nội dung có thể được đọc *. Bạn có thể làm điều này bằng cách thiết lậpcác bit khóa của AVR theo các giá trị được liệt  trong bảng dữ liệu, các bit khóa không thể được thiết lập lại ngoại trừ bằng cách xóa toàn bộ thiết bị.

* Có nhiều cách nổi tiếng nhận được khoảng này,  vậy xin vui lòngkhông xem xét các bit khóa bảo vệ đầy đủ nếu bạn đang lo lắng về một ai đó ăn cắp mã của bạn như là một phương tiện gián điệp công nghiệp.

  2) Những lệnh này, như bằng văn bản, chỉ sao lưu các nội dung của bộ nhớ Flash (chương trình). Đọc ra các giá trị byte EEPROM hoặc cầu chì  thể được thực hiện theo cách tương tự. Bạn có thể đọc thêm vềcác tùy chọn dòng lệnh avrdude trong tài liệu avrdude, hoặc tronghướng dẫn tại Adafruit.



Đối với chương trình sản xuất, báo cáo avrdude duy nhất có thể thiết lập các byte cầu chì  viết flash, hoặc makefile có thể được viết chonhiều báo cáo avrdude, để sắp xếp thứ tự của văn bản đèn flash và cáccầu chì  / hoặc khóa bit.


Các ý kiến ​​khác


AVR Khái niệm cơ bản: đọc (và viết) flash nội dung
nếu bạn đã có phần mềm Arduino, bạn đã có avrdude đã. nó sẽ được tạiarduino-00xx/hardware/tools/avrdude, nếu bạn xảy ra để được chạyArduino phiên bản xx. vì vậy, nếu bạn có thể tìm ra nơi Arduino phần mềm của bạn được cài đặt, bạn có thể chạy nó từ đó.



AVR Khái niệm cơ bảnđọc (và viết) flash nội dung
Bạn có thể muốn thêm rằng trong khi các bit khóa ngăn chặn đọc nộidung bộ nhớ flash thực tếbạn sẽ không nhận được một thông báo lỗi.Các tập tin nhị phân sẽ được tạo ra chỉ vì nó sẽ không  các bit khóa,nhưng nó chứa đựng vô nghĩa (hay chính xác hơn, thấp hơn 8 bit địa chỉtừ vị trí bộ nhớ).  vậybạn sẽ phải mở các tập tin nhị phân với một trình soạn thảo hex (Tôi khuyên bạn nên frhed cho các cửa sổ  dhex cholinux / giao diện điều khiểnnếu bạn đang sử dụng KDE sau đó khexedit có thể là một lựa chọn tốt). Nếu nó có chứa một mô hình như


00 00 01 01 02 02 03 03 04 04
và như vậy, AVR có thể bị khóa.


AVR Khái niệm cơ bảnđọc (và viết) flash nội dung
Làm thế nào để bạn có được xung quanh các bit khóa? HV Lập trình?



AVR Khái niệm cơ bảnđọc (và viết) flash nội dung
Nếu có một cách để "có đượccác bit khóasorta sẽ đánh bại mục đíchcủa các bit khóa, không có?

Bạn có thể tái lập trình các chip   hiệu hóa các bit khóanhưng nó sẽ quét sạch bất cứ điều gì trên đó trong quá trình nàyNếu bạn đang cố gắng để có được  từ một con chip đã bị khóayêu cầu các lập trình viên nếu họ sẵn sàng chia sẻ mã.



Thể hiện trước đó trong E V I L

No comments:

Post a Comment