Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Beralih Pilih Boot Perangkat Keras Menggunakan Pico

Pra-pilih OS untuk boot, bahkan sebelum menyalakan komputer dengan mengaktifkan sakelar. Sekarang Anda tidak perlu menunggu untuk memilih os.

Cerita

Mengembara Hackaday.io untuk proyek, saya menemukan proyek ini (klik) oleh Stephen Holdaway. Dalam proyek ini, ia memecahkan tugas frustasi yang dihadapi oleh setiap pengguna dual boot, yang duduk dan menunggu untuk memilih os (Windows) dari menu GRUB kapan saja ketika kita ingin beralih ke windows. Dia dapat menambahkan sakelar perangkat keras untuk menentukan OS yang akan di-boot setiap kali komputer dihidupkan.

Dia mencapai ini dengan mengkonfigurasi Mikrokontroler STM32 sebagai perangkat penyimpanan massal USB. Dia telah mendokumentasikan seluruh perjalanannya melalui penelitian dan implementasi proyek di hackaday post(klik). Silakan baca postingannya untuk mendapatkan pemahaman yang lebih baik tentang implementasinya.

Dalam proyek ini, saya akan menunjukkan bagaimana saya berhasil mem-port perubahan ke Raspberry Pi Pico. Anda dapat menemukan versi saya di GitHub Repo (Klik).

Konsep

GNU GRUB adalah program yang berjalan sebelum Sistem Operasi apa pun dimuat. Melalui menu ini, kita dapat memilih OS mana yang akan dimuat. GRUB menawarkan modul yang sangat terbatas untuk digunakan. Ini berarti tidak dapat membaca data dari mikrokontroler yang terhubung melalui USB. Tapi itu bisa membaca data dari disk penyimpanan.

Jadi kami dapat mengelabui GRUB untuk membaca data dari mikrokontroler, dengan menghitung mikro kami sebagai perangkat penyimpanan massal.

Oleh karena itu kami menghitung raspberry pi pico kami sebagai perangkat penyimpanan massal, melalui perpustakaan tinyUSB, yang akan memiliki file switch.cfg file, ke mana pico akan menulis posisi sakelar yaitu 1 untuk ON 0 untuk OFF .

Kita harus menambahkan script di GRUB, yang berfungsi untuk membaca file switch.cfg dan mengatur default ke 0(Ubuntu )/2(Windows).

GRUB saat memuat, menjalankan skrip khusus kami, yang pada gilirannya mencari perangkat kami dengan pengenal UUID-nya, dan jika keluar, baca file switch.cfg . Setelah mendapatkan posisi sakelar, ia menetapkan pilihan os default masing-masing.

Singkatnya,

Mengonfigurasi Pico sebagai perangkat Mass-storage

Saya telah menggunakan cdc_msc contoh oleh tinyUSB untuk mencapai ini. Contoh tersebut mengonfigurasi pico sebagai perangkat penyimpanan massal dan membuat sistem file FAT12 dan menghitung file README.txt.

Saya mengubah README.txt menjadi switch.cfg dan menambahkan baris “set os_hw_switch=0\n” ke file.

#define SWITCH_CFG_CONTENTS \
"set os_hw_switch=0\n"

...
//----- -------- Blok3:Konten Readme -------------//
SWITCH_CFG_CONTENTS

Sekarang kami telah mengonfigurasi pico sebagai perangkat penyimpanan massal. Setelah menyalin file uf2 ke pico, itu disebutkan sebagai perangkat penyimpanan. Kami akan membutuhkan id UUID perangkat untuk skrip GRUB, yaitu UUID=”0000-1234″.

$ sudo blkid
...
/dev/sda:SEC_TYPE="msdos" LABEL_FATBOOT="TinyUSB MSC" LABEL="TinyUSB MSC" UUID="0000-1234" BLOCK_SIZE="512" TYPE="vfat"

Sirkuit

Membaca posisi sakelar dan menulis ke file

Sekarang kita perlu membaca posisi sakelar dan mengubah konten file switch.cfg yang sesuai yaitu

Saya telah menggunakan GPIO_PIN 28 sebagai pin sakelar, yang diatur untuk ditarik ke bawah.

baca_switch_value mengembalikan posisi sakelar yaitu '1' aktif (ditarik tinggi) dan '0' mati (ditarik rendah).

//-------------------------main.c-------- -------------
#define SWITCH_PIN 28

// baca nilai sakelar
uint8_t read_switch_value()
{
kembalikan gpio_get(SWITCH_PIN) ? '1' :'0';
}

int main(void)
{
gpio_init(SWITCH_PIN);

// konfigurasikan pin sebagai INPUT
gpio_set_dir(SWITCH_PIN, false);

//konfigurasi pin sebagai PULL_DOWN
gpio_set_pulls (SWITCH_PIN,false,true);

Untuk menulis posisi sakelar ke switch.cfg, saya telah menggunakan readGRUBConfig() yang memanggil read_switch_value fungsi, dan atur buffer output dengan posisi sakelar.

Saya menemukan itu saat membaca blok ketiga lba disetel ke 3, sehingga mencegat panggilan dan memanggil readGrubConfig dan melewati buffer tempat konten file akan disalin.

//-------------------------msc_disk.c-------- -------------

static char grubConfigStr[] ="set os_hw_switch=0\n";
static void readGrubConfig(uint8_t* output)
{
// Ubah string konfigurasi dengan nilai sakelar saat ini
grubConfigStr[sizeof(grubConfigStr)-3] =read_switch_value();
memcpy(output, &grubConfigStr, sizeof(grubConfigStr));
}

// Panggilan balik dipanggil saat menerima perintah READ10.
// Salin data disk ke buffer (hingga bufsize) dan kembalikan jumlah byte yang disalin.
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
{
(void) lun;
// saat membaca file
if(lba ==3){
readGrubConfig(buffer);
return bufsize;
}
...
...
}

Mengkompilasi kode Pico

Kita perlu menambahkan pico stdlib ke kode kami untuk mendapatkan gpio akses pin.

//-------------------------main.c-------- ---------------------------
#include
#include
#include
#include "bsp/board.h"
#include "tusb.h"
...
#include "pico/ stdlib.h"

Untuk membuat proyek:

$ mkdir build
$ cd build
$ cmake ..
$ make

Mengonfigurasi GRUB untuk membaca konten file

Saya telah menambahkan perubahan ini di Ubuntu 20.10 saya.

$ sudo vim /etc/grub.d/40_custom

....
# Cari perangkat sakelar perangkat keras dengan kode kerasnya ID sistem file
cari --no-floppy --fs-uuid --set hdswitch 0000-1234

# Jika ditemukan, baca file konfigurasi dinamis dan pilih entri yang sesuai untuk setiap posisi
jika [ "${hdswitch}" ]; lalu
source ($hdswitch)/switch.cfg

if [ "${os_hw_switch}" ==0 ]; lalu
# Boot Linux
set default="0"
elif [ "${os_hw_switch}" ==1 ]; lalu
# Boot Windows
set default="2"
else
# Kembali ke default
set default="${GRUB_DEFAULT}"
fi

else
set default="${GRUB_DEFAULT}"
fi

Pertama, kami mencari sistem file kami. GRUB memiliki subperintah penelusuran hanya untuk ini.

Jika ada perangkat yang ditemukan, perangkat pertama yang ditemukan akan ditetapkan sebagai nilai variabel lingkungan.

–setel hdswitch switch hd adalah variabel lingkungan kita dan disetel dengan nama disk jika ditemukan.

Selanjutnya, kami mengambil file switch.cfg jika hdswitch variabel disetel, yang membuat variabel lingkungan lain os_hw_switch dengan posisi sakelar yaitu 0/1.

Kami membaca nilai os_hw_switch dan atur default masing-masing ke 0 atau 2. 0 karena Ubuntu ada di posisi 0 dan windows di posisi 2 di menu GRUB.

Terakhir, jika hdswitch tidak disetel, kami menyetel default ke GRUB_DEFAULT.

Sekarang kita perlu memperbarui grub kita:

$ sudo update-grub

Sumber: Sakelar Pemilihan Boot Perangkat Keras Menggunakan Pico


Proses manufaktur

  1. Pernyataan sakelar C#
  2. C# menggunakan
  3. Stasiun Cuaca Raspberry Pi 2
  4. Perangkat berbasis suhu Sistem kontrol menggunakan LM35
  5. Pemantauan Cuaca Jarak Jauh Menggunakan Raspberry Pi
  6. SensorTag ke Blynk Menggunakan Node-RED
  7. Sensor Gerak menggunakan Raspberry Pi
  8. Robot Menggunakan Raspberry Pi &Bridge Shield
  9. Robot Terkendali Wifi Menggunakan Raspberry Pi
  10. Pengantar peretasan perangkat keras tertanam perangkat IoT