Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Переключатель выбора аппаратной загрузки с использованием Pico

Предварительно выберите ОС для загрузки, даже до включения компьютера переключением переключателя. Теперь вам не нужно ждать, чтобы выбрать ОС.

История

Блуждая по Hackaday.io по проектам, я наткнулся на этот проект (щелчок) Стивена Холдэуэя. В этом проекте он решил неприятную задачу, с которой сталкивается каждый пользователь двойной загрузки, который сидит и ждет, чтобы выбрать ОС (Windows) из меню GRUB в любое время, когда мы захотим переключиться на окна. Он смог добавить аппаратный переключатель, чтобы определять загрузку ОС при каждом включении компьютера.

Он достиг этого, настроив микроконтроллер STM32 как запоминающее устройство USB. Он задокументировал все свое путешествие по исследованию и реализации проекта в hackaday post (нажмите). Просмотрите его сообщение, чтобы лучше понять реализации.

В этом проекте я покажу, как мне удалось перенести изменения на Raspberry Pi Pico. Вы можете найти мою версию в этом репозитории GitHub (нажмите).

Концепция

GNU GRUB - это программа, которая запускается до загрузки любой операционной системы. Через это меню мы можем выбрать, какую ОС загружать. GRUB предлагает очень ограниченное количество модулей для работы. Это означает, что он не может считывать данные с микроконтроллера, подключенного через USB. Но он может читать данные с дисков хранения.

Таким образом, мы можем обмануть GRUB для чтения данных с микроконтроллера, указав наш микроконтроллер как запоминающее устройство.

Следовательно, мы перечисляем наш raspberry pi pico как запоминающее устройство через библиотеку tinyUSB, в которой будет файл switch.cfg файл, в который pico запишет положение переключателя, например 1 для ВКЛ 0 для ВЫКЛ .

Мы должны добавить скрипт в GRUB, который будет читать файл switch.cfg и установить значение по умолчанию на 0 (Ubuntu) / 2 (Windows).

GRUB при загрузке запускает наши пользовательские скрипты, которые, в свою очередь, ищут наше устройство по его идентификаторам UUID, и при выходе читает файл switch.cfg. После получения положения переключателя он соответственно устанавливает выбор ОС по умолчанию.

Таким образом,

Настройка Pico как запоминающего устройства

Я использовал cdc_msc пример от tinyUSB для достижения этой цели. Пример настраивает pico как запоминающее устройство, создает файловую систему FAT12 и перечисляет файл README.txt.

Я изменил README.txt на switch.cfg и добавил в файл строку «set os_hw_switch =0 \ n».

 # определить SWITCH_CFG_CONTENTS \ 
"set os_hw_switch =0 \ n"

...
// ----- -------- Блок 3:Содержимое Readme ------------- //
SWITCH_CFG_CONTENTS

Теперь мы настроили pico как запоминающее устройство. После копирования файла uf2 в pico он регистрируется как запоминающее устройство. Нам понадобится идентификатор UUID устройства для сценария GRUB, который равен 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"

Схема

Чтение положения переключателя и запись в файл

Теперь нам нужно прочитать положение переключателя и соответственно изменить содержимое файла switch.cfg, т.е.

Я использовал GPIO_PIN 28 в качестве контакта переключателя, который настроен на опускание.

read_switch_value верните переключатель в положение, т. е. «1» включен (высокий уровень), а «0» выключен (низкий уровень).

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

// чтение значения переключателя
uint8_t read_switch_value ()
{
вернуть gpio_get (SWITCH_PIN)? '1':'0';
}

int main (void)
{
gpio_init (SWITCH_PIN);

// настроить вывод как INPUT
gpio_set_dir (SWITCH_PIN, false);

// настраиваем вывод как PULL_DOWN
gpio_set_pulls (SWITCH_PIN, false, true);

Чтобы записать положение переключателя в switch.cfg, я использовал readGRUBConfig () который вызывает read_switch_value функцию и установите выходной буфер в положение переключателя.

Я обнаружил, что при чтении третьего блока3 lba установлено значение 3, следовательно, вызов перехватывается и вызывается readGrubConfig и передать буфер, в который будет скопировано содержимое файла.

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

static char grubConfigStr [] ="set os_hw_switch =0 \ n";
static void readGrubConfig (uint8_t * output)
{
// Изменить строку конфигурации текущим значением переключателя
grubConfigStr [sizeof (grubConfigStr) -3] =read_switch_value ();
memcpy (output, &grubConfigStr, sizeof (grubConfigStr));
}

// Обратный вызов вызывается при получении команды READ10.
// Копируем данные с диска в буфер (до bufsize) и возвращаем количество скопированных байтов.
int32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void * buffer, uint32_t bufsize)
{
(void) lun;
// при чтении файла
if (lba ==3) {
readGrubConfig (buffer);
return bufsize;
}
...
...
}

Скомпилируйте код Pico

Нам нужно добавить pico stdlib в наш код, чтобы получить gpio контактный доступ.

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

Чтобы сделать проект:

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

Настройка GRUB для чтения содержимого файла

Я добавил эти изменения в свой Ubuntu 20.10.

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

....
# Ищите устройство переключения оборудования по его жестко запрограммированному идентификатор файловой системы
search --no-floppy --fs-uuid --set hdswitch 0000-1234

# Если найден, прочтите файл динамической конфигурации и выберите соответствующую запись для каждой позиции
если ["$ {hdswitch}"]; затем
source ($ hdswitch) /switch.cfg

if ["$ {os_hw_switch}" ==0]; затем
# Загрузите Linux
установите default ="0"
elif ["$ {os_hw_switch}" ==1]; then
# Загрузка Windows
set default ="2"
else
# Откат к умолчанию
set default ="$ {GRUB_DEFAULT}"
fi

else
установить default ="$ {GRUB_DEFAULT}"
fi

Сначала мы ищем нашу файловую систему. В GRUB есть подкоманда search только для этого.

Если какое-либо устройство обнаружено, первое найденное устройство устанавливается как значение переменной среды.

–установить hdswitch hdswitch - это наша переменная среды, и если она найдена, ей присваивается имя диска.

Затем мы получаем файл switch.cfg, если hdswitch установлена ​​переменная, которая создает другую переменную среды os_hw_switch с положением переключателя, то есть 0/1.

Читаем значение os_hw_switch и установите значение по умолчанию на 0 или 2 соответственно. 0, потому что Ubuntu находится на 0-й позиции, а окна - на 2-й позиции в меню GRUB.

Наконец, если hdswitch не было установлено, мы установили значение по умолчанию на GRUB_DEFAULT.

Теперь нам нужно обновить наш grub:

 $ sudo update-grub 

Источник: Аппаратный переключатель выбора загрузки с использованием Pico


Производственный процесс

  1. Оператор переключения C#
  2. С# с использованием
  3. Метеостанция Raspberry Pi 2
  4. Система управления устройством на основе температуры с использованием LM35
  5. Удаленный мониторинг погоды с помощью Raspberry Pi
  6. SensorTag для Blynk с использованием Node-RED
  7. Датчик движения с использованием Raspberry Pi
  8. Робот, использующий Raspberry Pi и Bridge Shield
  9. Робот, управляемый Wi-Fi и использующий Raspberry Pi
  10. Введение во взлом встроенного оборудования устройств Интернета вещей