Pemrograman mikrokontroler: JTAG, SPI, USB oh my !?


52

Saya perhatikan, berkaitan dengan mikrokontroler, ada beberapa cara untuk memprogram mereka. Saya agak terbiasa dengan USB karena Arduino saya dapat diprogram melalui USB.

Apa itu antarmuka JTAG atau SPI?

Pada akhirnya saya tahu bahwa antarmuka ini menyediakan sarana untuk mem-flash chip dengan instruksi baru tetapi bagaimana bedanya? Apakah ada kelebihan satu sama lain?

Jawaban:


39

Mikrokontroler ATMEGA seperti yang ada di Arduino yang datang langsung dari pabrik hanya dapat diprogram menggunakan antarmuka SPI atau JTAG.

SPI singkatan dari Serial Peripheral Interface dan merupakan cara bagi mikrokontroler untuk berkomunikasi satu sama lain atau dengan dunia luar. Ini juga disebut 3-kawat kadang-kadang karena menggunakan tiga kabel untuk berkomunikasi. Untuk memprogram sebuah chip, Anda membutuhkan pemrogram khusus yang membaca perintah dari USB untuk menggerakkan jalur SPI untuk memprogram chip tersebut. Yang populer tampaknya adalah USBTinyISP dari Adafruit . Pengantar yang sangat bagus tentang pemrograman SPI ada di SparkFun. Aplikasi yang paling populer untuk pemrograman chip Atmel AVR adalah avrdude (cmd line), ponyprog (tidak bekerja dengan programmer yang lebih baru) dan dalam beberapa kasus AVR Studio (jika programmer Anda mendukungnya). Keuntungan pemrograman SPI adalah Anda dapat memprogram chip Atmel apa pun langsung dari pabrik sehingga Anda tidak akan selalu membutuhkan Arduino dalam proyek Anda.

Di mana SPI adalah "hanya satu" protokol serial, JTAG adalah protokol yang dirancang khusus untuk memprogram dan men-debug mikrokontroler. Tidak semua Atmel micro mendukung JTAG tetapi yang digunakan di Arduino lakukan. Protokol JTAG dapat digunakan untuk hal-hal keren seperti "dalam persaingan emulasi" dan debugging yang artinya memungkinkan Anda untuk melihat status program di mikrokontroler Anda saat sedang berjalan. Untuk melakukan ini, Anda memerlukan programmer khusus. Lihat jawaban saya untuk pertanyaan lain .

Untuk memprogram chip menggunakan USB, Anda harus memprogramnya terlebih dahulu dengan "bootloader" menggunakan SPI atau JTAG. Setelah dimuat dengan bootloader, sistem akan dapat diprogram dari PC manapun menggunakan konverter USB-Serial. Kelemahannya adalah bahwa bootloader membutuhkan ruang memori dan metode ini tidak memungkinkan Anda untuk melihat keadaan chip saat sedang berjalan.


10
Meskipun akurat dalam gagasan bahwa bootloader serial tidak tersedia pada ATMEGA baru (meskipun pada banyak mikrokontroler lainnya), klaim bahwa SPI atau JTAG harus digunakan salah. ATMEGA juga mendukung mode pemrograman paralel tegangan tinggi, yang memiliki kemampuan untuk menunggangi beberapa pengaturan sekering yang akan membuat metode pemrograman dalam sirkuit yang lebih populer menjadi tidak bisa dijalankan. JTAG tidak dirancang untuk pemrograman micros tetapi untuk pengujian papan PC dengan mencatat nilai masuk dan keluar dari register pin IO. Memperluasnya untuk pemrograman atau men-debug fungsi-fungsi inti adalah hack yang kemudian.
Chris Stratton

SPI dan In System Programming / Serial programming berbeda. Saya juga terbiasa dengan fakta bahwa banyak Atmega MCU yang lebih kecil memiliki pin pemrograman serial pada antarmuka SPI, tetapi saya digigit oleh fakta, bahwa pada beberapa Atmega MCU yang lebih besar, pin pemrograman serial tidak pada antarmuka SPI.
fest

30

Sementara saya ingin terjun ke berbagai metode pemrograman yang tersedia, orang lain sudah memilikinya. Berikut ini adalah tutorial Dean Camera tentang AVRFreaks, Metode Pemrograman AVR :

Ada banyak cara untuk memprogram mikrokontroler AVR. Karena banyak orang bertanya tentang yang berbeda pada satu waktu atau yang lain, saya pikir saya akan menguraikannya di sini sehingga pertanyaan mereka dapat dijawab dengan cepat dan efisien. Maafkan saya jika saya melewatkan metode atau membuat kesalahan.

METODE 1: Pemrograman Sistem (ISP)

Didukung oleh: Sebagian besar AVR (lihat posting di bawah)
Programmer yang didukung: AVRISP MKI / II, JTAG MKII, STK500, STK600, Naga, klon AVRISP, Programmer AVR910, AVRONE

Dalam Pemrograman Sistem mungkin metode yang paling umum dari pemrograman lampu kilat, EEPROM, sekering dan kunci bit dari seluruh garis AVR. ISP dapat memprogram AVR dengan kecepatan clock yang sangat tinggi (dengan asumsi target AVR berjalan pada frekuensi tinggi dan programmer mendukungnya) dan merupakan metode pilihan untuk hampir semua penggemar hobi AVR. Ada banyak, banyak klon AVRISP dan programmer AVR910 di pasaran selain dongle do-it-yourself yang sederhana yang terhubung ke port paralel komputer Anda.

Desain dongle baru terbaru mungkin menggunakan port serial komputer, namun bukti anekdotal mengatakan bahwa metode ini sangat lambat karena keterbatasan teknis.

ISP mengharuskan target AVR berjalan pada laju jam setidaknya empat kali lipat dari jam ISP. Ini adalah perangkap umum dan sumber kebingungan bagi banyak orang yang baru mengenal AVR.

METODE 2: JTAG

Didukung Oleh: Lihat bantuan Alat AVRStudio untuk dukungan perangkat MKI dan MKII
Programmer yang Didukung: JTAG-ICE, JTAG-ICE MKII, Dragon, klon JTAG-ICE, AVRONE, STK600 (hanya pemrograman)

Secara teknis JTAG adalah sistem debugging, bukan metode pemrograman. Namun, antarmuka JTAG memungkinkan pemrograman AVR yang mendukungnya.

JTAG adalah alat debugging dalam sistem yang memungkinkan Anda untuk memanipulasi dan memeriksa status AVR yang didukung saat sedang berjalan dalam suatu rangkaian. JTAG memungkinkan pengguna untuk menghentikan eksekusi kapan saja, memanipulasi register internal AVR dan banyak lagi.

Unit JTAG-ICE resmi dari ATMEL telah digantikan oleh JTAG-ICE MKII, yang mendukung protokol debugging DebugWire jangkauan AVR yang lebih baru dan lebih luas serta pemrograman melalui metode ISP (lihat di atas).

Klon JTAG-ICE tersedia dengan harga murah, namun kompatibilitasnya terbatas dengan hanya sedikit AVR yang membatasi kegunaannya. Apapun itu, jika AVR Anda mendukung antarmuka JTAG, JTAG-ICE tetap menjadi metode dan program debugging yang sangat bagus dan efektif.

METODE 3: DebugWire

Didukung Oleh: Banyak
Pemrogram yang Didukung AVR yang lebih kecil : JTAG-ICE MKII, Dragon, AVRONE

Lagi-lagi DebugWire adalah debugging daripada antarmuka pemrograman, tetapi dapat digunakan untuk memuat dalam program ke dalam AVR yang didukung. Antarmuka dW menggunakan pin AVR tunggal (garis / RESET) untuk semua komunikasi, menjadikannya ideal untuk perangkat AVR dengan jumlah pin rendah.

METODE 4: Bootloader

Didukung oleh:
Pemrogram yang Didukung AVR yang paling baru : Tidak Ada

Sekali lagi secara teknis bukan metode pemrograman. Bootloader adalah program AVR kecil yang berada di bagian yang disediakan pengguna pada flash biasa. Bootloader menggunakan fitur modifikasi diri flash yang tersedia di AVR yang lebih baru untuk memungkinkan AVR memprogram dirinya sendiri melalui data program yang diambil dari sumber eksternal. Bootloader dapat mengambil data mereka dari lokasi mana pun (mis. Dataflash eksternal atau kartu SD) namun sejauh ini tipe Bootloader yang paling umum berkomunikasi dengan PC melalui port RS-232 (serial) AVR.

Bootloader terbatas karena mereka mengkonsumsi ruang flash (membatasi ukuran flash yang tersedia untuk aplikasi AVR) dan mereka tidak dapat mengubah fusebits AVR.

Bootloader tersedia secara luas di internet untuk diunduh, tetapi mereka mengalami masalah "ayam dan telur"; Anda memerlukan jenis programmer lain yang terdaftar di sini untuk memprogram bootloader. Ini biasanya diselesaikan dengan membangun dongle port paralel sederhana (Lihat bagian ISP) atau dengan pembelian AVR yang sudah dimuat sebelumnya dengan bootloader (mis. Papan AVRButterfly).

METODE 5: Pemrograman Paralel Tegangan Tinggi (HVPP)

Didukung oleh: Kebanyakan AVR non-TINY (dengan pengecualian)
Programmer yang Didukung: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

Pemrograman Paralel Tegangan Tinggi adalah metode pemrograman yang jarang digunakan, karena kerumitan yang diperlukan untuk mengatur. Meskipun demikian, pemrograman HVPP umumnya digunakan untuk "menghidupkan kembali" AVR yang fusebitnya salah dikonfigurasi melalui metode pemrograman lain.

STK500 dan Naga mendukung HVPP. Selama HVPP, pin target / RESET dinaikkan ke nilai 12V yang luar biasa tinggi yang melibatkan sirkuit pemrograman paralel internal. Pin / RESET adalah satu-satunya pin AVR (pada AVR yang didukung HVPP) yang dapat dengan aman dinaikkan ke level ini.

Anda dapat membuat dongle HVPP Anda sendiri menggunakan paket online seperti ini.

METODE 6: Pemrograman Serial Tegangan Tinggi (HVSP)

Didukung oleh: Banyak TINY AVR (dengan pengecualian)
Programmer yang Didukung: STK500, STK600, Dragon, Homebrew Dongles, AVRONE

HVSP mirip dengan HVPP, kecuali transfer data dilakukan secara seri daripada secara paralel. Ini adalah metode pemrograman alternatif yang digunakan pada banyak seri TINY AVR yang tidak memiliki cukup pin untuk HVPP.

METODE 7: PDI

Didukung oleh: XMEGA AVR
Programmer yang Didukung: STK600, AVRONE, JTAG MKII, Dragon, AVRISP MKII

PDI adalah antarmuka pemrograman baru berdasarkan protokol debugWire, untuk lini XMEGA dari AVR. Saat ini tidak digunakan pada mikrokontroler AVR 8-bit lainnya.

METODE 8: TPI

Didukung oleh: 6-Pin TINY AVR (ATTINY10, dll.)
Programmer yang Didukung: STK600, Dragon, AVRISP MKII

TPI adalah antarmuka pemrograman yang sangat kecil untuk jajaran AVR TINY yang lebih baru dengan pin terbatas, seperti ATTINY10 6 pin. Seperti dW, TPI menggunakan garis perangkat / RESET sebagai bagian dari antarmuka komunikasi, tetapi di sana kesamaannya berakhir. Karena AVR TINY berukuran pint tidak memiliki sirkuit debugging chip, protokol TPI menggunakan antarmuka pemrograman baru dari tiga pin, dalam protokol setengah dupleks. Karena garis / RESET perlu dinaikkan ke + 12V untuk pemrograman ketika pin RSTDSB perangkat diatur, saat ini hanya didukung oleh papan pemrograman STK600 yang lebih baru.

Bagian FAQ Bonus!

  1. Metode mana yang terbaik?
    Tidak ada metode universal "terbaik". Pemrograman ISP sederhana dan sangat populer, namun semua metode di atas akan berfungsi. Dua mode pemrograman tegangan tinggi (mana saja yang berlaku untuk perangkat Anda) adalah yang paling kaya fitur, karena memungkinkan untuk perbaikan AVR yang memiliki kesalahan konfigurasi. Namun, metode-metode tersebut sulit diatur, karenanya alasan sebagian besar pengguna menggunakan ISP.

  2. Saya sudah membuat dongle port paralel. Bisakah saya menggunakannya dengan AVRStudio?
    Aku takut tidak. AVRStudio tidak dapat berinteraksi dengan dongle "bodoh" - ini membutuhkan perangkat pemrograman pintar - yang berisi mikrokontroler itu sendiri - untuk menguraikan protokol komunikasi yang dikirimkannya. Dongle sederhana tanpa mikrokontroler harus "digedor-bit" (mis. Sinyal yang sesuai disimulasikan melalui dongle melalui komputer) itu sendiri.

  3. Jadi dongle saya tidak berguna?
    Tidak. Anda masih dapat memprogram melalui dongle buatan sendiri dengan alat perangkat lunak pemrograman pihak ketiga. AVRDude adalah utilitas baris perintah gratis yang bagus, dikenal, dan disertakan dengan paket WinAVR.

  4. Apa pilihan saya jika saya ingin programmer saya bekerja dengan AVRStudio?
    Pilih seorang programmer yang menggunakan protokol yang didukung AVRStudio. Ini bisa berupa protokol "AVR910" sederhana (usang) atau implementasi kustom protokol yang digunakan oleh STK500 / AVRISP. Perhatikan bahwa pemrogram ini membutuhkan pengontrol mikro di dalamnya, yang mengarah ke situasi tangkapan-22. Ini dapat diselesaikan dengan AVR programmer yang diprogram pada saat pembelian dengan firmware yang sesuai, atau dengan AVR yang diprogram dengan bootloader.

  5. Oke, saya ingin menggunakan bootloader. Bagaimana saya mendapatkannya di sana?
    Untuk menggunakan bootloader dalam AVR, pertama-tama Anda harus memiliki bootloader yang diprogram. Jika Anda tidak memiliki programmer yang ada (bahkan dongle bodoh sederhana akan cukup untuk pemrograman awal), Anda dapat membeli AVR yang diprogram sebelumnya dengan bootloader dari beberapa pemasok.
    Atmel juga memproduksi papan demo Butterfly, yang MEGA169 AVR-nya hadir dengan bootloader yang kompatibel dengan AVR-Studio.

  6. Tolong! Saya telah mengacaukan sekering dan mengetuk AVR saya saat menggunakan ISP! Kesalahan yang paling umum adalah mengubah sekering pemilihan jam ke pengaturan yang tidak valid. Coba letakkan jam eksternal pada pin XTAL1 AVR dan lihat apakah itu membantu.
    Gagal itu, jika mungkin gunakan salah satu metode tegangan tinggi. Ini akan memperbaiki kesalahan konfigurasi, termasuk yang melibatkan sumber clock karena metode tegangan tinggi menyediakan clock sendiri ke AVR untuk pemrograman.

  7. Bagaimana cara saya berinteraksi dengan programmer saya?
    Perangkat lunak mana yang Anda gunakan untuk berinteraksi dengan programmer Anda tergantung pada jenis programmer yang Anda gunakan.
    Dongle "bodoh" yang sederhana membutuhkan perangkat lunak pihak ketiga, seperti PonyProg atau AVRDude. Ini mungkin baris perintah atau alat GUI - lihat di web dan Anda akan memilih yang sesuai dengan kebutuhan Anda.
    Programmer dan bootloader berdasarkan protokol AVR910 dapat digunakan dalam AVRStudio. Dari menu Alat, pilih opsi "AVRProg" untuk membuka layar GUI untuk berinteraksi dengan programmer Anda. Sebagai alternatif, alat pihak ketiga seperti AVRDude juga kompatibel dengan AVR910.
    Alat resmi terintegrasi erat ke dalam AVRStudio, terutama dalam hal varian debugging (JTAG / Dragon / dll). Dari menu AVRStudio Tools, pilih submenu "Program AVR ..." dan klik item "Connect". Dari jendela baru, pilih alat Anda dan antarmuka koneksinya dan klik ok.
    Seperti halnya dongle bisu dan programmer AVR910, alat resmi juga dapat digunakan dengan perangkat lunak pemrograman pihak ketiga.

(C) Dean Camera, 2009. Hak cipta dilindungi undang-undang. Tidak untuk reproduksi di situs web apa pun selain AVRFreaks.net tanpa izin eksplisit sebelumnya.

Diproduksi ulang dengan izin eksplisit sebelumnya, tentu saja!


5

Saya ingin menambahkan satu hal lagi ke dalam diskusi.

SPI adalah antarmuka yang sangat umum untuk chip. Alusi ke 3-kawat adalah mode SPI di mana Anda tidak menggunakan pin pilih chip.

I2C adalah kontes utama untuk antarmuka karena hanya menggunakan 2-kabel tidak peduli jumlah chip, sementara SPI membutuhkan kawat lain per antarmuka, tetapi lebih lambat.

Saat mengajar saya menganggap mengajar tentang antarmuka salah satu tugas paling penting.

Wiki komunitas tersedia untuk mereka yang ingin memperluas informasi saya.


2
Saya belum pernah mendengar I2C digunakan sebagai antarmuka pemrograman flash asli pada mikrokontroler, meskipun tidak ada alasan itu tidak bisa menjadi titik masuk ke bootloader kurasa ...
vicatcu

@vicatcu, saya baru saja menambahkannya sebagai antarmuka yang sangat umum.
Kortuk

3

Dari sudut pandang keseluruhan, antarmuka ini hanya berbeda di mana programmer dan mikro-controller mana yang mendukungnya. Selama Anda memiliki kecocokan antara programmer dan micro-controller saya tidak akan khawatir.

Ketika Anda masuk ke dalamnya lebih banyak Anda akan menemukan bahwa itu adalah pin antarmuka menggunakan pada pengontrol mikro yang lebih penting - jika Anda menggunakan pin ini untuk sensor maka sinyal dapat mengganggu ketika Anda memprogram perangkat. Solusi paling sederhana jika ini menjadi masalah adalah melepaskan sensor selama pemrograman.

Beberapa antarmuka (termasuk JTAG) memungkinkan untuk debugging perangkat - tetapi kemudian Anda memerlukan seorang programmer (dan perangkat lunak untuk mengendarainya) yang juga mendukung ini. Dalam pertanyaan sebelumnya saya diarahkan pada Dragon untuk debugging perangkat AVR - Saya bermaksud untuk mendapatkannya dan bermain ketika putaran proyek saya saat ini hampir selesai.


2

Seperti yang Anda sebutkan serial, spi (2 wire, 3 wire?), Usb, jtag, swd, dll semuanya digunakan.

Ya ada pro dan kontra. Jtag misalnya adalah untuk semua kasus yang saya ketahui tentang bawaan perangkat keras, awalnya dan terutama digunakan untuk sesuatu selain dari proses debugging prosesor, tetapi mereka kebetulan menggunakannya untuk itu juga. jika jtag tersedia itu umumnya antarmuka terbaik untuk alasan itu, tetapi ada pengecualian. Sebagai contoh jika pin tidak didedikasikan untuk jtag, Anda bisa memiliki bug dalam kode dan / atau sengaja menggunakan salah satu pin untuk sesuatu yang lain sehingga tidak mungkin untuk mengakses chip menggunakan jtag (jika itu mem-boot perangkat lunak dalam flash yang repurposes pin tersebut). Pengecualian lain adalah jika inti prosesor dapat digantung oleh bug pada perangkat lunak dalam flash dan inti yang digantung tidak dapat di-debuggable melalui jtag. Saya menyebutnya bug dalam desain perangkat keras, tetapi baru-baru ini menangani masalah ini pada bagian komersial.

Pada AVR misalnya PDI, yang saya pikir orang mungkin memanggil spi di sini, mungkin tidak. tampaknya setidaknya pada xmega bahwa pdi dan jtag eksternal masuk ke antarmuka pdi umum secara internal. Jadi pin pdi memberi Anda akses langsung ke ini, bukan jtag overhead. selama antarmuka ini bekerja ketika perangkat lunak dalam flash telah menggantung intinya, maka ini akan menjadi antarmuka yang ideal untuk keluarga ini. Protokol diterbitkan dan relatif sederhana, dan dibangun ke dalam perangkat keras. itu memang memiliki kelemahan dari bus data dua arah, seperti i2c.

Arm memiliki jtag dengan lebih sedikit kabel yang disebut swd yang mereka tidak ingin dipublikasikan secara terbuka. alat open source mengimplementasikannya. ini dalam teori jtag serial, sinyal jtag yang berbeda dikirim secara berurutan pada satu kawat entah bagaimana bukannya paralel pada banyak kabel. di dalam bagian saya menganggap itu akan diparalelkan lagi dan memberi makan logika jtag normal. Ini memiliki kelemahan dari ARM yang ingin merahasiakannya, dan ARM tidak menganggapnya sebagai masalah kerajaan untuk digunakan. Jadi ini banyak pekerjaan. Jika / ketika openocd membuatnya berfungsi maka itu mungkin cerita yang berbeda. Anda juga harus tetap khawatir tentang pin yang digunakan ulang dan apa yang terjadi dengan core yang digantung.

Sejumlah vendor menggunakan solusi di mana mereka memiliki satu atau lebih area flash boot, tergantung pada cara pin atau dua atau tiga ditarik tergantung pada flash mana Anda boot. Jadi Anda dapat boot dari flash pengguna, atau Anda dapat boot dari flash yang setidaknya dari pabrik memiliki bootloader berbasis port serial, atau yang memiliki bootloader berbasis usb. Untuk setiap vendor, solusi perangkat lunak ini dapat dan memang bervariasi, protokol serial berubah dalam cara yang halus atau lebih halus, solusi usb dapat sedikit berubah. Yang baik dan buruk adalah bahwa beberapa dari flash ini dapat Anda dapatkan, jadi Anda dapat memilih untuk mengubah bootloader serial, ini baik dan buruk, baik karena Anda dapat memilih untuk menyesuaikannya dengan produk Anda, buruk bahwa itu mungkin untuk menghapusnya secara tidak sengaja dan menutup bagian tersebut, setidaknya menghapusnya untuk antarmuka tersebut.

Alat Jtag digunakan untuk biaya ribuan dolar, sekarang mereka tidak, untuk sekitar $ 15 Anda bisa mendapatkan papan breakdown ftdi dan menggunakan kembali dengan openocd. Untuk $ 50 plus atau minus beberapa Anda bisa mendapatkan solusi usb berbasis ftdi yang bekerja di luar kotak dengan openocd. Anda bisa mendapatkan j-link non-komersial seperti $ 75- $ 80. Dan kemudian ada yang multi-ribu dolar yang cepat, pasti tetapi tidak sepadan dengan uang pada umumnya. Anda membeli itu ketika Anda adalah perusahaan besar dengan banyak uang untuk dihancurkan dan ingin membayar dukungan. Ketika Anda membayar harga itu, Anda mendapatkan produk yang Anda inginkan dan Anda segera mendapatkan jawaban untuk pertanyaan dukungan teknis. Seperti linux vs windows gratis atau RHEL misalnya, dukungan linux gratis tetapi Anda mendapatkan apa yang Anda dapatkan. Bagaimanapun ini membuat jtag jauh lebih menarik,

Anda harus memiliki alat debugging dan pengembangan jtag arsenal Anda kapan dan di mana terjangkau. sparkfun memiliki ftdi berbasis usb ke papan serial dan bagian ftdi dapat diubah menjadi big bangers, Anda dapat menggunakan ini untuk spi atau i2c atau pdi atau jtag atau antarmuka lainnya. Idealnya mendapatkan papan yang dibuat untuk bus / bagian yang Anda minati dan menggunakan perangkat lunak sumber bebas / terbuka yang menyertainya. Juga menggunakan papan serial ini, idealnya memiliki persediaan 3,3V dan 5V (masing-masing sekitar $ 15 yang Anda gunakan untuk lillypads dan arduino mini, dll) untuk menghubungkan ke port serial untuk berbagai mikros yang memiliki semacam protokol serial. Saya merasa lebih mudah untuk menulis loader saya sendiri berdasarkan protokol-protokol itu, terutama seperti orang-orang arduino / avr di mana sumber bootloader diterbitkan dan merupakan subset yang cukup dari standar yang seharusnya mereka dukung. YMMV.

Singkatnya, tidak ada satu solusi yang baik, mereka semua memiliki pro dan kontra. Bersiaplah untuk mendukung setidaknya dua dari mereka. usb dan serial atau usb dan jtag atau jtag dan serial, dll. Cukup letakkan bantalan atau pin lubang di papan tulis dan belum tentu terisi. Untuk pengembangan pribadi atau laboratorium Anda, miliki seperangkat alat lengkap dan bersiaplah untuk beralih dari satu ke yang lain saat Anda membuat chip dan harus memulihkan papan atau saat Anda mengembangkan bootloader Anda sendiri, firmware usb, dll.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.