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

Switch Boot Berbasis Pico: Pilih OS Anda Sebelum Menyalakan

Pilih OS yang akan boot, bahkan sebelum menyalakan komputer dengan mengubah saklar. Sekarang Anda tidak perlu menunggu untuk memilih os.

Cerita

Melayani Hackaday.io untuk proyek, saya menemukan proyek ini(klik) oleh Stephen Holdaway. Dalam proyek ini, ia telah menyelesaikan tugas yang mengganggu dihadapi oleh setiap pengguna dual boot, yaitu duduk dan menunggu untuk memilih os (Windows) dari menu GRUB setiap kali kita ingin beralih ke windows. Ia berhasil menambahkan saklar hardware untuk menentukan OS yang akan boot setiap kali komputer dihidupkan.

Ia mencapai ini dengan mengonfigurasi Mikrokontroler STM32 sebagai perangkat mass-storage USB. Ia telah mendokumentasikan perjalanannya melalui penelitian dan implementasi proyek dalam posting hackaday(klik). Silakan melalui postingnya untuk mendapatkan pemahaman yang lebih baik tentang implementasi.

Dalam proyek ini, saya akan menunjukkan bagaimana saya berhasil mem-port perubahan ke Raspberry Pi Pico. Anda dapat menemukan versi saya di Repo GitHub ini (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 bekerja. Ini berarti ia tidak dapat membaca data dari mikrokontroler yang terhubung melalui USB. Tetapi ia dapat membaca data dari disk penyimpanan.

Jadi kita dapat menipu GRUB untuk membaca data dari mikrokontroler, dengan meng- enumerate mikrokontroler kami sebagai perangkat mass-storage.

Hence we enumerate our raspberry pi pico as a mass-storage device, via tinyUSB library, which will be having a file switch.cfg file, to which pico will write the switch position i.e 1 for ON 0 for OFF.

We have to add a script in GRUB, that’s functions to read switch.cfg file and set the default to 0(Ubuntu )/2(Windows).

GRUB when loads, runs our custom scripts, which in turn searches for our device by its UUID identifiers, and if exits read the switch.cfg file. After getting the switch position it sets the default os selection respectively.

In summary,

Mengonfigurasi Pico sebagai Perangkat Mass-storage

Saya telah menggunakan contoh cdc_msc oleh tinyUSB untuk mencapai ini. Contoh ini mengonfigurasi pico sebagai perangkat mass-storage dan membuat sistem berkas FAT12 serta meng-enumerate file README.txt.

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

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

...
//------------- Block3: Readme Content -------------//
SWITCH_CFG_CONTENTS

Sekarang kita telah mengonfigurasi pico sebagai perangkat mass-storage. Setelah menyalin file uf2 ke pico, ia di-enumerate sebagai perangkat penyimpanan. Kita akan membutuhkan UUID id perangkat untuk skrip GRUB, yang adalah 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"

Rangkaian

Membaca Posisi Saklar dan Menulis ke File

Sekarang kita perlu membaca posisi saklar dan mengubah isi file switch.cfg sesuai yaitu

Saya telah menggunakan GPIO_PIN 28 sebagai pin saklar, yang diatur ke pull down.

read_switch_value mengembalikan posisi saklar yaitu ‘1’ adalah on (ditarik tinggi) dan ‘0’ adalah off (ditarik rendah).

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

// read switch value
uint8_t read_switch_value()
{
return gpio_get(SWITCH_PIN) ? '1' : '0';
}

int main(void)
{
gpio_init(SWITCH_PIN);

//configure pin as INPUT
gpio_set_dir(SWITCH_PIN, false);

//configure pin as PULL_DOWN
gpio_set_pulls (SWITCH_PIN,false,true);

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

Saya menemukan saat membaca block3 lba diatur ke 3, sehingga menyadap panggilan dan memanggil readGrubConfig dan melewatkan buffer di mana isi file akan disalin.

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

static char grubConfigStr[] = "set os_hw_switch=0\n";
static void readGrubConfig(uint8_t* output)
{
// Modify config string with current switch value
grubConfigStr[sizeof(grubConfigStr)-3] = read_switch_value();
memcpy(output, &grubConfigStr, sizeof(grubConfigStr));
}

// Callback invoked when received READ10 command.
// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
{
(void) lun;
// when reading the file
if(lba == 3){
readGrubConfig(buffer);
return bufsize;
}
...
...
}

Kompilasi Kode Pico

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

//-------------------------main.c-----------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "bsp/board.h"
#include "tusb.h"
...
#include "pico/stdlib.h"

Untuk membuat proyek:

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

Mengonfigurasi GRUB untuk Membaca Isi File

Saya telah menambahkan perubahan ini di Ubuntu 20.10 saya.

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

....
# Look for hardware switch device by its hard-coded filesystem ID
search --no-floppy --fs-uuid --set hdswitch 0000-1234

# If found, read dynamic config file and select appropriate entry for each position
if [ "${hdswitch}" ] ; then
source ($hdswitch)/switch.cfg

if [ "${os_hw_switch}" == 0 ] ; then
# Boot Linux
set default="0"
elif [ "${os_hw_switch}" == 1 ] ; then
# Boot Windows
set default="2"
else
# Fallback to default
set default="${GRUB_DEFAULT}"
fi

else
set default="${GRUB_DEFAULT}"
fi

Pertama, kita mencari sistem berkas kami. GRUB memiliki subcommand search hanya untuk ini.

Jika perangkat apa pun ditemukan, perangkat pertama yang ditemukan ditetapkan sebagai nilai variabel lingkungan.

–set hdswitchhdswitch adalah variabel lingkungan kami dan ditetapkan dengan nama disk jika ditemukan.

Selanjutnya, kita sourcing file switch.cfg jika variabel hdswitch diatur, yang menciptakan variabel lingkungan lain os_hw_switch dengan posisi saklar yaitu 0/1.

Kita membaca nilai dari os_hw_switch dan menetapkan default ke 0 atau 2 masing-masing. 0 karena Ubuntu berada di posisi ke-0 dan windows di posisi ke-2 dalam menu GRUB.

Terakhir, jika hdswitch tidak diatur, kita menetapkan default ke GRUB_DEFAULT.

Sekarang kita perlu memperbarui grub kami:

$ sudo update-grub

Sumber: Hardware Boot Select Switch Using Pico


Proses manufaktur

  1. Menguasai Pernyataan Switch C#: Sintaks, Contoh, dan Praktik Terbaik
  2. Menguasai Pernyataan Using C#: Impor, Alias, dan Direktif Statis
  3. Membangun Stasiun Cuaca Luar Ruangan dengan Raspberry Pi 2 dan ADS-WS1
  4. Sistem Kontrol Suhu Berbasis LM35 dengan Mikrokontroler AT89S52
  5. Pemantauan Cuaca Jarak Jauh dengan Raspberry Pi 3 dan PubNub
  6. Integrasikan TI SensorTag dengan Blynk melalui Node-RED di Raspberry Pi Zero
  7. Mengontrol LED dengan Sensor Gerak PIR pada Raspberry Pi
  8. Membangun Robot Cerdas dengan Bridge Shield – Integrasi Raspberry Pi & Arduino
  9. Membangun Robot Raspberry Pi Dikontrol Wi‑Fi dengan Python – Panduan Langkah demi Langkah
  10. Hacking Hardware Terintegrasi untuk Perangkat IoT: Alat, Teknik, dan Implikasi Bisnis