Leonardo (32u4): cara untuk merusaknya secara terprogram

8

Ketika Leonardo diperkenalkan, saya pikir, saya telah membaca beberapa artikel tentang berhati-hati untuk melakukan beberapa hal, yang dapat menyebabkannya tidak memuat sketsa baru lagi, jadi kita harus menulis ulang bootloader. Karena saya berencana untuk menggunakan opsi hemat daya, misalnya untuk menonaktifkan komponen perangkat keras yang tidak digunakan seperti port USB, saya takut melakukan sesuatu yang salah.

Satu kelezatan Leonardo yang saya temukan sejauh ini:

  • jika interupsi dinonaktifkan, mengunggah sketsa baru gagal kecuali satu menekan tombol Reset segera setelah Arduino IDE menampilkan "Mengunggah ..."

Hal-hal apa (kecuali yang terkait dengan perangkat keras yang biasa seperti menghubungkan pin yang dikonfigurasi keluaran ke potensi tetap) yang dapat merusak controller atau mengharuskan untuk merefleksikan Leonardo dengan bootloader baru?

Thomas S.
sumber
Secara umum, Arduino tidak mungkin dirusak melalui perangkat lunak kecuali mengacaukan sekering pada chip (atau merancang robot untuk menghancurkan papan: D).
Penguin Anonim
1
Bootloader selalu dijalankan sebelum program Anda sendiri. Jadi ketika Anda menekan tombol atur ulang bootloader akan mulai dan Anda dapat mengunggah program baru Anda, bahkan jika program lama Anda rusak. Menonaktifkan komponen-komponen tertentu hanya sementara, dan komponen-komponen itu akan pulih ketika perangkat diatur ulang. Dengan mengubah sekering, Anda dapat membuat opsi tertentu permanen, jadi cobalah untuk tidak harus mengubahnya.
Gerben
2
Gerben, bisakah Anda menambahkan komentar Anda sebagai jawaban?
Thomas S.

Jawaban:

1

Jika Anda mengunggah program yang mengubah kecepatan inti USB, program itu akan hampir mati. Apa yang akan terjadi adalah ini:

  1. Power on, boot loader dimulai, perangkat USB disebutkan pada PC.
  2. Beberapa detik kemudian program mulai, kecepatan inti USB berubah, perangkat USB menghilang dari PC

Masalahnya di sini adalah Anda tidak hanya harus menekan reset ke program, setelah reset Anda harus dengan cepat memilih port com yang tepat dan kemudian mengunggah sebelum program dimulai.

Redbearlab Blend Micro membutuhkan kecepatan inti USB yang akan ditetapkan dalam program pengguna. Dalam instruksi pengaturannya ada langkah untuk mengedit main.cpp Arduino dan menambahkan bagian untuk melakukannya. Jika langkah ini terlewatkan, masalah di atas terjadi.

geometrikal
sumber
1

Saya berhasil brickwall sebuah ATMega128RFA1. Bootloader, dan perangkat lunak yang saya unggah di dalamnya, berfungsi dengan baik. Tetapi tidak mungkin untuk menghapus / menulis ROM.

Setelah memeriksa apa yang terjadi, saya menemukan dalam lembar data bahwa beberapa sekering pada inti AVR dimaksudkan untuk melindungi penulisan yang tidak disengaja pada ROM. Semacam sekering keamanan.

Saya tidak pernah menemukan bug yang ditulis dalam byte ini (karena itu adalah program yang sangat besar dan kami adalah 3 orang yang terlibat dalam pengkodean) tapi ya, kami hanya meniup sekering dan kehilangan MCU karena bug.

Adapun leonardo, beberapa hal bisa terjadi, tetapi tidak ada yang bisa menutupi papan Anda kecuali Anda meledakkan salah satu dari sekering perlindungan ini.

CopperMaze
sumber
1

Dimungkinkan, dengan beberapa kode yang sangat pintar , untuk mengeksploitasi bootloader untuk menimpa dirinya sendiri.

Kutipan:

Solusinya sebenarnya secara konsep cukup sederhana. Bootloader, pada dasarnya dirancang untuk mengunduh firmware baru ke perangkat. Karena itu akan mengandung setidaknya satu instruksi spm. Karena register konfigurasi SPM harus ditulis tidak lebih dari 4 siklus sebelum instruksi SPM itu berarti ada sangat sedikit urutan yang secara praktis terjadi: hanya sts, SPM atau keluar, SPM urutan. Jadi, yang Anda butuhkan adalah menemukan urutan di bagian bootloader; mengatur register yang tepat dan menyebutnya.

Namun, ternyata ada masalah besar dengan itu juga. Instruksi spm bootloader self-programming V-USB bukanlah rutinitas yang rapi, tetapi dimasukkan ke dalam kode utama; jadi memanggilnya hanya akan menyebabkan AVR crash saat mencoba mengeksekusi sisa bootloader V-USB.

Jahat, tapi sekali lagi ada solusinya. Dengan menggunakan penghitung waktu yang clock pada frekuensi CPU (yang mudah pada AVR), Anda dapat membuat assembler rutin yang mengatur register untuk Bootloader keluar, urutan spm; menyebutnya dan tepat pada saat dijalankan siklus pertama SPM itu sendiri, interupsi timer mati dan AVR harus melompat ke rutinitas interupsi Anda (dalam ruang Aplikasi). Rutin interupsi muncul alamat bootloader dan kemudian kembali ke kode sebelumnya - yang merupakan rutin yang mengatur urutan spm keluar. Ini seharusnya bekerja, karena ketika Anda menerapkan instruksi spm ke bagian bootloader, CPU dihentikan hingga selesai.

Jadi pada dasarnya, Anda dapat melakukan beberapa pemrograman mewah, dan membuat bootloader untuk menyemprot sendiri, menjadikan MCU tidak berguna tanpa programmer yang berdedikasi.

Connor Wolf
sumber
0

Yang saya tahu adalah membuat Leonard bertindak seperti mouse USB yang mengepak di mana-mana dan mengetik tombol acak sehingga Anda tidak dapat memprogram ulang tanpa melakukan semacam trik untuk menyiasatinya. Tetapi mereka menyebutkan ini di api docs.

EternityForest
sumber