Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Hardware opstartkeuzeschakelaar met Pico

Kies vooraf het besturingssysteem om op te starten, zelfs voordat u de computer inschakelt door een schakelaar om te zetten. Nu hoef je niet te wachten om het besturingssysteem te selecteren.

Verhaal

Terwijl ik op Hackaday.io ronddwaalde voor projecten, kwam ik dit project (klik) van Stephen Holdaway tegen. In dit project loste hij een frustrerende taak op waarmee elke dual-boot-gebruiker wordt geconfronteerd, die zit en wacht om os (Windows) uit het GRUB-menu te kiezen wanneer we naar Windows willen overschakelen. Hij was in staat om een ​​hardwareschakelaar toe te voegen om te bepalen welk besturingssysteem moet worden opgestart telkens wanneer de computer wordt aangezet.

Hij bereikte dit door STM32 Microcontroller te configureren als een USB-apparaat voor massaopslag. Hij heeft zijn hele reis door het onderzoek en de implementatie van het project gedocumenteerd in hackaday post (klik). Ga door zijn post om een ​​beter begrip te krijgen van de implementaties.

In dit project zal ik laten zien hoe ik de wijzigingen naar Raspberry Pi Pico heb kunnen overbrengen. Je kunt mijn versie vinden in deze GitHub Repo (klik).

Concept

GNU GRUB is een programma dat wordt uitgevoerd voordat een besturingssysteem wordt geladen. Via dit menu kunnen we selecteren welk besturingssysteem we willen laden. GRUB biedt zeer beperkte modules om mee te werken. Dit betekent dat het geen gegevens kan lezen van een microcontroller die via USB is aangesloten. Maar het kan gegevens van opslagschijven lezen.

Dus we kunnen GRUB misleiden om gegevens van de microcontroller te lezen, door onze micro op te sommen als een apparaat voor massaopslag.

Daarom noemen we onze raspberry pi pico als een apparaat voor massaopslag, via de TinyUSB-bibliotheek, die een bestand switch.cfg zal hebben. bestand, waarnaar pico de schakelaarpositie schrijft, d.w.z. 1 voor AAN 0 voor UIT .

We moeten een script toevoegen in GRUB, dat zijn functies om het bestand switch.cfg te lezen en de standaard in te stellen naar 0(Ubuntu )/2(Windows).

GRUB voert tijdens het laden onze aangepaste scripts uit, die op hun beurt naar ons apparaat zoeken op basis van de UUID-ID's, en als het wordt afgesloten, lees dan het bestand switch.cfg. Nadat de schakelaarpositie is verkregen, wordt de standaard os-selectie respectievelijk ingesteld.

Samengevat,

  • pico zal zichzelf configureren als een apparaat voor massaopslag.
  • grub-menu roept ons script aan en vraagt ​​om het specifieke bestand.
  • Pico reageert op het leesverzoek door de schakelaarpositie toe te voegen aan het switch.cfg bestand.
  • het script in grub haalt de informatie uit het bestand en stelt de standaardoptie in op de uitgepakte gegevens.

Pico configureren als een apparaat voor massaopslag

Ik heb de cdc_msc . gebruikt voorbeeld door tinyUSB om dit te bereiken. In het voorbeeld wordt de pico geconfigureerd als een apparaat voor massaopslag en wordt een FAT12-bestandssysteem gemaakt en wordt een README.txt-bestand opgesomd.

Ik heb de README.txt gewijzigd in switch.cfg en de regel "set os_hw_switch=0\n" aan het bestand toegevoegd.

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

...
//----- -------- Blok3:Leesmij-inhoud -------------//
SWITCH_CFG_CONTENTS

Nu hebben we pico geconfigureerd als een apparaat voor massaopslag. Na het kopiëren van het uf2-bestand naar pico, wordt het opgesomd als een opslagapparaat. We hebben de UUID-ID van het apparaat nodig voor het GRUB-script, namelijk 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"

Circuit

Lezen van schakelaarpositie en schrijven naar bestand

Nu moeten we de positie van de schakelaar lezen en de inhoud van het bestand switch.cfg dienovereenkomstig wijzigen, d.w.z.

  • als de schakelaar AAN staat: set os_hw_switch=1\n
  • als de schakelaar UIT staat: stel os_hw_switch=0\n in

Ik heb GPIO_PIN 28 gebruikt als de schakelpin, die is ingesteld om naar beneden te trekken.

read_switch_value zet de schakelaar terug, d.w.z. '1' is aan (hoog getrokken) en '0' is uit (laag getrokken).

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

// lees schakelwaarde
uint8_t read_switch_value()
{
gpio_get(SWITCH_PIN) teruggeven? '1' :'0';
}

int main(void)
{
gpio_init(SWITCH_PIN);

// configureer pin als INPUT
gpio_set_dir(SWITCH_PIN, false);

//configureer pin als PULL_DOWN
gpio_set_pulls (SWITCH_PIN,false,true);

Om schakelaarpositie naar schakelaar.cfg te schrijven, heb ik readGRUBConfig() gebruikt die de read_switch_value . aanroept functie, en stel de uitgangsbuffer in met de schakelaarpositie.

Ik ontdekte dat bij het lezen van het derde blok3 lba is ingesteld op 3, waardoor de oproep wordt onderschept en readGrubConfig . wordt aangeroepen en het doorgeven van de buffer waar de inhoud van het bestand zal worden gekopieerd.

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

static char grubConfigStr[] ="set os_hw_switch=0\n";
static void readGrubConfig(uint8_t* output)
{
// Wijzig configuratietekenreeks met huidige schakelwaarde
grubConfigStr[sizeof(grubConfigStr)-3] =read_switch_value();
memcpy(output, &grubConfigStr, sizeof(grubConfigStr));
}

// Callback aangeroepen bij ontvangst READ10-opdracht.
// Kopieer schijfgegevens naar buffer (tot bufsize) en retourneer het aantal gekopieerde bytes.
int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
{
(void) lun;
// bij het lezen van het bestand
if(lba ==3){
readGrubConfig(buffer);
return bufsize;
}
...
...
}

Compileer de Pico-code

We moeten pico stdlib . toevoegen naar onze code om de gpio . te krijgen pintoegang.

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

Om het project te maken:

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

GRUB configureren om de bestandsinhoud te lezen

Ik heb deze wijzigingen toegevoegd aan mijn Ubuntu 20.10.

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

....
# Zoek naar hardware-switch-apparaat op hard-coded bestandssysteem-ID
zoeken --no-floppy --fs-uuid --set hdswitch 0000-1234

# Indien gevonden, lees het dynamische configuratiebestand en selecteer het juiste item voor elke positie
if [ "${hdswitch}" ]; then
source ($hdswitch)/switch.cfg

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

anders
set default="${GRUB_DEFAULT}"
fi

Eerst zoeken we naar ons bestandssysteem. GRUB heeft een subopdracht zoeken alleen hiervoor.

  • -geen-floppy optie voorkomt zoeken op diskettes
  • -fs–uuid  0000-1234 zoekt een bestandssysteem met UUID van 0000-1234.

Als er een apparaat wordt gevonden, wordt het eerst gevonden apparaat ingesteld als de waarde van de omgevingsvariabele.

–set hdswitch hdswitch is onze omgevingsvariabele en wordt ingesteld met schijfnaam indien gevonden.

Vervolgens sourcen we het bestand switch.cfg als de hdswitch variabele is ingesteld, waardoor een andere omgevingsvariabele wordt gemaakt os_hw_switch met de schakelaarpositie, d.w.z. 0/1.

We lezen de waarde van de os_hw_switch en stel de standaard in op respectievelijk 0 of 2. 0 omdat Ubuntu op de 0e positie staat en Windows op de 2e positie in het GRUB-menu.

Ten slotte, als hdswitch niet is ingesteld, hebben we de standaard ingesteld op GRUB_DEFAULT.

Nu moeten we onze grub updaten:

$ sudo update-grub

Bron: Hardware-opstartkeuzeschakelaar met Pico


Productieproces

  1. Epilatieapparaat
  2. C# switch-instructie
  3. C# met behulp van
  4. Raspberry Pi 2 weerstation
  5. Temperatuurgebaseerd apparaatbesturingssysteem met LM35
  6. Bewaking op afstand van het weer met Raspberry Pi
  7. SensorTag naar Blynk met Node-RED
  8. Bewegingssensor met Raspberry Pi
  9. Robot die Raspberry Pi &Bridge Shield gebruikt
  10. Wifi-gestuurde robot met Raspberry Pi
  11. Een inleiding tot het hacken van embedded hardware op IoT-apparaten