Bagaimana Raspberry Pi meniru perangkat penyimpanan USB?

46

Perangkat penyimpanan USB, seperti USB stick dan harddrives, umum digunakan untuk memasang penyimpanan eksternal ke semua jenis komputer. Bagaimana Raspberry Pi meniru penyimpanan USB? Aplikasi termudah adalah secara langsung mengakses kartu SD melalui USB, tetapi orang juga bisa memberikan akses ke file melalui Ethernet. Saya memikirkan tata letak berikut untuk " USB cloud stick ":

Computer <---USB---> |Raspberry Pi| <---Ethernet---> Cloud, NAS etc.

Komputer seharusnya hanya melihat stik USB normal untuk membaca dan menulis file. Raspberry Pi akan bertindak sebagai jembatan yang dapat diprogram yang memetakan daftar direktori dan akses file untuk meminta penyimpanan cloud. Anda dapat mengakses host penyimpanan cloud dengan komputer apa pun (termasuk pemutar media kotak hitam) melalui USB tanpa harus menginstal perangkat lunak tambahan apa pun di komputer. Jembatan USB Raspberry Pi juga harus dapat mengenkripsi / mendekripsi file dengan cepat, sehingga orang dapat menyimpan file yang dienkripsi di cloud dan mengaksesnya di perangkat apa pun seperti drive USB normal.

Sunting: Produk yang ada dengan fungsi yang serupa tetapi terbatas termasuk Wireless Media Stick dan USB-over-Network . Akses ke file di cloud dapat dilakukan dengan memasang penyimpanan virtual dengan cloud drive atau perangkat lunak serupa dan enkripsi dengan TrueCrypt atau EncFS - kata sandi hanya akan disimpan pada kartu SD Raspberry Pi tetapi orang dapat mengakses penyimpanan dengan komputer apa pun tanpa harus ketik frasa sandi pada mesin yang tidak dipercaya.

Jakob
sumber
1
Saya pikir yang dia inginkan adalah memiliki partisi atau folder bersama pada Pi-nya yang dapat dipasang melalui USB di komputer lain. Gagasannya adalah Anda dapat mencolokkan raspi ke komputer mana pun dan folder / partisi tersebut berfungsi seperti flash drive dan dapat ditulis tanpa perangkat lunak tambahan.
wmarbut
3
Pi hanya boleh bertindak sebagai gerbang antara komputer mana pun , termasuk kotak hitam, dan misalnya cloud Amazon. Gateway juga dapat mengenkripsi file dengan cepat.
Jakob
1
Memotong itu - ini akan menjadi sempurna!
Alex Chamberlain
1
@AlexChamberlain - tidak, Anda tidak bisa. Perangkat Penyimpanan Massal USB memiliki protokol khusus yang didukung oleh sistem operasi host. Anda tentu saja dapat membuat driver untuk membuat sesuatu yang lain tampak seperti semacam perangkat penyimpanan ke sistem operasi tertentu, tetapi itu tidak akan menjadi perangkat "USB Mass Storage" melainkan "perangkat penyimpanan kustom yang terhubung melalui USB"
Chris Stratton
1
@ ppkinkin: Karena "pemetaan drive" atau "mencolokkan ke LAN" diperlukan untuk mengkonfigurasi PC (atau pemutar media). Hanya mencolokkan ke port USB tidak memerlukan administrasi dan seseorang tidak perlu memaparkan kata sandi apa pun ke PC. Perhatikan bahwa saya ingin berbagi penyimpanan dari drive cloud, yang selalu memerlukan kata sandi atau bahkan pemasangan perangkat lunak klien.
Jakob

Jawaban:

12

Masalahnya adalah bahwa koneksi USB Pi ke PC tidak memiliki pin data yang terhubung - hanya pin daya. Jadi Anda tidak dapat menggunakan ini untuk berbicara USB karena tidak terhubung.

Satu-satunya pilihan Anda dengan Pi adalah 'menggedor' USB menggunakan pin GPIO, tetapi ini sangat lambat dan berpotensi tidak dapat diandalkan. Saya menduga Anda hanya akan benar-benar dapat meniru keyboard atau mouse - bandwidth yang lebih tinggi mungkin akan terlalu banyak untuk CPU untuk mengatasinya, mengingat persyaratan waktu yang ketat untuk sedikit membenturkan sesuatu seperti USB.

Alternatif lain adalah menemukan perangkat yang memungkinkan Anda menghubungkan dua komputer bersama melalui USB, untuk membuat semacam jaringan. Tapi Anda juga bisa menggunakan koneksi Ethernet ...

Malvine
sumber
1
Saya sebelumnya pernah bermain dengan GP32 yang bisa berperilaku seperti tuan rumah bahkan ketika dicolokkan ke hub sebagai klien. Jika Raspberry dapat berperilaku seperti host pada USB-ports (bukan power satu) maka trik yang serupa juga mungkin terjadi di sana. Mungkin USB-to-go dapat melakukannya?
Thorbjørn Ravn Andersen
2
Hah? Anda salah dengan port micro usb yang digunakan untuk adaptor daya. Bagaimana dengan 2 port USB yang tepat? Dengan beberapa perangkat lunak emulasi akan mungkin untuk menyambungkan usb itu ke PC dan meniru Storage - misalnya - ponsel Android saat Anda mencolokkan usb. - Tapi tidak ada alasan untuk itu karena Anda mencolokkan Pi ke jaringan Anda, bagikan folder "cloud" Anda melalui samba atau apa pun (wifi atau lan) - dan juga pada saat yang sama melakukan sinkronisasi cloud apa pun yang ingin Anda lakukan . LAN dapat menangani banyak permintaan pada berbagai port
Piotr Kula
2
@ppumkin: Mengapa saya salah dengan port micro USB? Pin data tidak terhubung, jadi Anda tidak dapat mengirim data melewatinya. Port USB "tepat" hilir adalah port 'host', jadi tidak mungkin untuk menancapkannya ke PC tanpa semacam perangkat konverter di tengah. Emulasi perangkat lunak tidak cukup, karena cara kerja protokol USB. Anda mungkin berpikir Ethernet di mana Anda dapat menyambungkan dua perangkat bersama-sama, tetapi USB tidak berfungsi seperti ini. Jika Anda tidak percaya, baca spesifikasi USB, terutama bagian tentang host USB vs periferal.
Malvineous
1
Hanya ingin menambahkan bahwa "Bit-banging" USB bukan opsi. USB sangat panjang, jauh dari sesuatu seperti I2C yang bisa digedor. Mungkin pendekatan yang paling praktis adalah dengan menggunakan salah satu AVR micros yang memiliki port perangkat USB yang dibangun di dalamnya, dan kemudian berkomunikasi dengannya melalui port serial pada Pi. (mis. olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo
1
@ Malvine Pada 12 MHz atau hanya 1,5? Periode jam adalah [83,33 +/- 0,2 us] untuk 12 Mhz, dan [666,6 +/- 10 us] untuk 1,5 MHz. Ingatlah bahwa Anda perlu memulihkan jam pada saat menerima, yang mungkin berarti mengambil sampel setidaknya 5 - 10 kali laju jam. Apakah implementasi ini memungkinkan interupsi saat berbicara ke perangkat USB?
greggo
8

Berdasarkan pembahasan cepat lembar data BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) bab 15, sepertinya USB OTG didukung di HW, secara teoritis, mungkin hanya masalah SW untuk mendukung skema yang diusulkan. Saya bukan ahli protokol USB (atau bahkan pemula, sungguh), tetapi akan sangat keren untuk memiliki fungsi ini.

Melihat deskripsi BeagleBone (http://elinux.org/BeagleBone), tampaknya mendukung sesuatu yang serupa, meskipun ada penyebutan khusus konektor yang mendukung mode ini. Akan sangat disayangkan jika Raspberry Pi terbatas hanya karena pemilihan konektor.

Semoga ini bermanfaat.

Don Christensen
sumber
2
Bahkan jika SOC mendukungnya, perangkat hub LAN9512 pada model B mungkin menghalangi pengoperasian port USB "mundur" dalam mode perangkat. Pada model A (atau jika Anda menghapusnya dan menginstal R37 & R38) Anda bisa mendapatkan port USB SOCs ke jack eksternal - tetapi kemudian Anda tidak akan memiliki ethernet, dan hanya akan memiliki sdcard untuk penyimpanan potensial.
Chris Stratton
6

Ini sekarang tampaknya dimungkinkan menggunakan PiZero - lihat http://pi.gbaman.info/?p=699 untuk lebih lanjut.

David Walters
sumber
1
Selamat datang di Raspberry Pi! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Ghanima
4

Sayangnya meskipun ini tampak sederhana, sejauh yang saya tahu, itu belum dilakukan. Lihat utas ini dan jawaban yang sangat terperinci untuk perincian lebih lanjut

https://unix.stackexchange.com/questions/2683/serve-files-over-usb

Dan jawaban spesifik Pi di sini: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938

wmarbut
sumber
1
Terima kasih atas tautannya. Sepertinya perangkat ini dapat melakukan bagian dari apa yang saya inginkan, tetapi miliknya dan hanya berfungsi dalam satu arah (penyimpanan USB read-only virtual).
Jakob
3

Jika Anda tidak terlalu peduli dengan kinerja, Anda mungkin bisa mendapatkan mikrokontroler yang mampu menggunakan USB dengan kode penyimpanan massal USB (misalnya, Anda dapat memprogram ulang antarmuka debug STM32F103 pada modul eval discovery STM32F0 seharga $ 10), sambungkan dengan hati-hati ke port serial pi. sebagai ujung belakang, dan berlari beberapa ratus kilobaud.

Performa yang lebih baik kemungkinan akan dimiliki dengan menghubungkan ke PC klien melalui ethernet, tetapi itu akan memerlukan driver khusus atau presentasi berbeda ke sistem operasi host - yaitu, Anda akan menjadi perangkat penyimpanan yang terhubung jaringan atau server berbagi.

Dari kabel transfer file rak saya percaya sudah disebutkan, tapi itu akan memerlukan perangkat lunak yang sesuai untuk PC klien dan dukungan driver tingkat sumber linux untuk akhir pi.

Chris Stratton
sumber
3

Saya menemukan bahwa Arduino dapat meniru perangkat USB, bahkan Arduino Leonardo keluar dari kotak. The lufa USB stack dapat digunakan pada Arduino dan menerapkan perangkat USB mass storage driver (lihat tutorial ini ). Pengaturan ini dapat digunakan untuk memetakan USB ke perintah SCSI seperti dipahami oleh pembaca kartu SD. Saya tidak cukup tahu tentang SCSI tetapi sepertinya kartu SD pada Raspberry Pi dan USB-via-Arduino dapat digunakan bersama di bus yang sama. Tentu ide ini bukan solusi lengkap ...

Jakob
sumber
-1 Karena topiknya adalah tentang Raspberry Pi dan bukan Arduino.
1
Saya tahu, jawaban ini bukan solusi lengkap! Saya berharap bahwa pertanyaan tentang Raspberry Pi sebagai alat dan bukan tujuan itu sendiri adalah pada topik dan memperluas pandangan untuk membantu proyek terkait. Dalam hal ini saya menemukan tutorial ini cara menggunakan kartu SD sebagai perangkat penyimpanan massal USB. Mungkin orang bisa menggunakan Arduino atau ATMEGA32U4 lain untuk mendapatkan USB ke bus SIP yang juga tersedia di Raspberry Pi?
Jakob
2
Tidak, Anda tidak dapat benar-benar berbagi akses ke kartu sd, selain dengan beralih listrik. Hanya satu host yang dapat "me-mount" sistem file yang diberikan sekaligus (untuk jenis sistem file yang digunakan pada kartu - sistem file jaringan berbeda dalam hal ini).
Chris Stratton
1

Ini datang ke bagaimana USB bekerja, Anda melihat setiap kali dua hal terhubung dengan USB ada semua cara USB host dan perangkat USB dan tidak pernah keduanya mengubah tempat. Host USB melakukan segala macam hal yang sebagian besar tidak dapat dilakukan perangkat USB untuk menyinkronkan transfer data antara semua perangkat yang terhubung ke bus USB. Lihat halaman wikipedia USB untuk informasi lebih lanjut .

Apa yang Anda bicarakan lakukan adalah memaksa dua host USB (Raspberry Pi dan komputer) untuk berkomunikasi yang sayangnya tidak didukung oleh standar USB. Ada beberapa perangkat yang dapat memalsukan transfer data antara dua host USB, tetapi seperti yang disebutkan Malvineous, Anda sebaiknya menggunakan ethernet.

Pertanyaan Anda secara khusus menyebutkan menggunakan Raspberry Pi untuk meniru penyimpanan USB tetapi apakah Anda sudah mempertimbangkan untuk mengatur Raspberry Pi sebagai NAS? Menggunakan Raspberry Pi sebagai kotak NAS pada dasarnya melakukan persis seperti yang Anda minta, tetapi alih-alih menggunakan USB, ia akan menggunakan jaringan Anda. Berikut adalah petunjuk bagus tentang cara melakukan ini jika Anda tertarik.

Dan B
sumber
Terima kasih untuk petunjuknya. Jadi pertanyaan saya adalah tentang bagaimana mengimplementasikan perangkat USB menggunakan Raspberry Pi. Namun NAS bukan jawaban untuk pertanyaan ini.
Jakob
3
Jika Anda ingin Raspberry Pi memiliki kemampuan untuk menjadi perangkat USB, saya sarankan Anda menyelidiki produk di ftdichip.com lebih dari kemungkinan Anda akan dapat memasang papan yang menggunakan pin GPIO Pi untuk berinteraksi dengan chip FTDI. dan itu akan memberi Anda kemampuan perangkat USB. Anda mungkin juga perlu menulis driver untuk berkomunikasi dengan perangkat FTDI.
Dan B
Kecuali bahwa "the twain akan bertukar tempat" jika mereka adalah perangkat USB OTG ...
Chris Stratton
1

Saya dapat melakukannya dengan Ponsel Nokia N900 lama saya menggunakan driver gadget usb yang disertakan dengan stok Nokia kernel. Perangkat yang ditiru berperilaku persis seperti yang asli, Anda bahkan dapat mem-boot PC darinya.

Nyg
sumber
1
Bisakah Anda memberikan beberapa detail? Anda tidak hanya berbicara tentang menyediakan penyimpanan di ponsel Anda melalui USB seperti yang dilakukan kebanyakan smartphone lain, bukan? Sejauh yang saya mengerti, driver gadget USB hanya menyediakan pemetaan dari SCSI ke USB , jadi orang masih perlu memetakan SCSI ke beberapa API penyimpanan cloud.
Jakob
1

Pi Zero dan Pi Zero W sekarang tersedia dan mendukung antarmuka Gadget ( Kernal.org , linux-sunxi.org ) yang memungkinkan beberapa profil berbeda, termasuk USB Mass Storage dan jaringan virtual.

Solusi terdekat dengan permintaan OP adalah dengan menggunakan protokol jaringan antara Pi dan PC host, dan kemudian beberapa bentuk protokol jaringan lainnya dari Pi ke penyedia cloud / jaringan. Pi Zero W telah membangun Wi-Fi, jadi bahkan dapat terhubung langsung ke penyedia cloud / jaringan. Jaringan kedua tautan tersebut akan menjadi cara termudah untuk menyelesaikan pekerjaan. Ada banyak protokol jaringan dan penyedia cloud yang tersedia.

Mencoba menggunakan USB Mass Storage akan menjadi ide yang buruk; Anda harus menulis atau menulis ulang adaptasi tingkat driver antara USB Mass Storage dan Pi. Anda bisa mulai dengan MTP , atau berakhir dengan sesuatu yang serupa. MTP memiliki masalah kinerja yang parah ( Reddit , XDA , HowToGeek , Reddit ) jadi saya menyarankan pendekatan jaringan.

Seharusnya ada banyak program dan proyek ke arah itu. Dari sudut pandang Pi, itu hanya bertindak seperti server server berkas / sinkronisasi, jadi setiap tutorial serupa harus membantu Anda memulai. Melihat ke hal-hal seperti server Seafile berbasis Pi , Syncthing , SugarSync , dan OwnCloud akan membantu Anda memulai.

Beberapa panduan bermanfaat tentang Pi Zero sebagai Gadget USB:

NamunAnotherRandomUser
sumber
0

Standar USB berbasis host. Itu berarti bahwa satu perangkat harus mengendalikan semua komunikasi dengan perangkat yang terhubung. Klien dapat berupa perangkat atau hub sederhana. Hub adalah proxy host untuk klien yang terhubung ke hub, dan berkomunikasi dengan host (atau hub) yang terhubung dengannya.

Seperti desain asli USB yang terlihat, Anda tidak dapat menghubungkan dua host bersama (PC dan RPi).

Ada beberapa perluasan, USB On-The-Go , yang memungkinkan koneksi USB untuk melihat apakah terhubung ke host atau klien, dan menyesuaikan perannya tergantung pada itu. Agar ini berfungsi, Anda harus memiliki dukungan di perangkat keras. Saya tidak percaya RPi dirancang untuk melakukan itu.

Untuk informasi lebih lanjut, lihat di http://www.usb.org/home atau bahkan http://en.wikipedia.org/wiki/Universal_Serial_Bus

Singkatnya, saya tidak percaya itu bisa dilakukan.

Anders
sumber
Jawaban lain bertentangan dengan kurangnya komentar dukungan OTG Anda.
Alex Chamberlain
1
@Alex, lihat prangko tanggal. Anders memposting ini pada 2012, sebelum Pi Zero atau A + tersedia.
YetAnotherRandomUser
@YetAnotherRandomUser, lihat prangko tanggal. Saya memposting tanggapan saya sehari setelah Anders menulis komentarnya.
Alex Chamberlain
@AlexChamberlain dan pada tahun 2012, tidak ada dukungan untuk itu untuk Raspberry dan Rasbperian (atau perangkat lunak lain yang saya tahu). Jadi ya, dalam kerangka waktu ITU, saya benar. RPi Zero muncul bertahun-tahun kemudian ... Sekarang kami memiliki dukungan untuk RPi Zero, yang disebutkan di pos lain, seperti yang Anda tulis.
Anders