제조공정
스위치를 토글하여 컴퓨터를 켜기 전에도 부팅할 OS를 미리 선택하십시오. 이제 OS를 선택하기 위해 기다릴 필요가 없습니다.
그림>프로젝트를 위해 Hackaday.io를 방황하다가 Stephen Holdaway의 이 프로젝트(클릭)를 우연히 발견했습니다. 이 프로젝트에서 그는 창으로 전환하고 싶을 때 GRUB 메뉴에서 os(Windows)를 선택하기 위해 앉아서 기다리는 모든 이중 부팅 사용자가 직면하는 답답한 작업을 해결했습니다. 그는 컴퓨터를 켤 때마다 부팅할 OS를 결정하기 위해 하드웨어 스위치를 추가할 수 있었습니다.
그는 STM32 마이크로컨트롤러를 USB 대용량 저장 장치로 구성하여 이를 달성했습니다. 그는 hackaday 게시물(클릭)에서 프로젝트의 연구 및 구현을 통한 전체 여정을 문서화했습니다. 구현을 더 잘 이해하려면 그의 게시물을 살펴보십시오.
이 프로젝트에서는 변경 사항을 Raspberry Pi Pico로 이식하는 방법을 보여 드리겠습니다. 이 GitHub Repo (클릭)에서 내 버전을 찾을 수 있습니다.
GNU GRUB은 운영 체제가 로드되기 전에 실행되는 프로그램입니다. 이 메뉴를 통해 로드할 OS를 선택할 수 있습니다. GRUB은 작업할 수 있는 매우 제한된 모듈을 제공합니다. 즉, USB를 통해 연결된 마이크로컨트롤러에서 데이터를 읽을 수 없습니다. 하지만 저장 디스크에서 데이터를 읽을 수 있습니다.
따라서 마이크로를 대용량 저장 장치로 열거하여 GRUB이 마이크로 컨트롤러에서 데이터를 읽도록 속일 수 있습니다.
따라서 우리는 switch.cfg 파일이 있는 작은 USB 라이브러리를 통해 raspberry pico를 대용량 저장 장치로 열거합니다. Pico가 스위치 위치를 기록할 파일(예:ON의 경우 1 0 OFF의 경우) .
switch.cfg 파일을 읽고 기본값을 설정하는 기능인 스크립트를 GRUB에 추가해야 합니다. 0(Ubuntu )/2(Windows)으로
GRUB가 로드되면 사용자 지정 스크립트를 실행하여 UUID 식별자로 기기를 검색하고 종료하면 switch.cfg 파일을 읽습니다. 스위치 위치를 얻은 후 기본 OS 선택을 각각 설정합니다.
요약하면,
<울>cdc_msc를 사용했습니다. 이를 달성하기 위해 tinyUSB의 예입니다. 이 예에서는 Pico를 대용량 저장 장치로 구성하고 FAT12 파일 시스템을 만들고 README.txt 파일을 열거합니다.
README.txt를 switch.cfg로 변경하고 파일에 'set os_hw_switch=0\n' 줄을 추가했습니다.
#define SWITCH_CFG_CONTENTS \
"set os_hw_switch=0\n"
...
//----- -------- Block3:읽어보기 콘텐츠 -------------//
SWITCH_CFG_CONTENTS
이제 Pico를 대용량 저장 장치로 구성했습니다. uf2 파일을 pico에 복사한 후 저장 장치로 열거합니다. GRUB 스크립트에 대한 기기의 UUID ID가 필요하며, 이는 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-------- -------------
정적 char grubConfigStr[] ="set os_hw_switch=0\n";
정적 무효 readGrubConfig(uint8_t* 출력)
{
// 현재 스위치 값으로 구성 문자열 수정
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* 버퍼, uint32_t bufsize)
{
(void) lun;
// 파일을 읽을 때
if(lba ==3){
readGrubConfig(버퍼);
버퍼 크기 반환;
}
...
...
}
Pico stdlib를 추가해야 합니다. gpio를 얻으려면 핀 액세스.
//-------------------------main.c-------- ---------------------------
#include
#include
#include
#include "bsp/board.h"
#include "tusb.h"
...
#include "pico/ stdlib.h"
프로젝트를 만들려면:
$ mkdir 빌드
$ cd 빌드
$ cmake ..
$ make
Ubuntu 20.10에 이러한 변경 사항을 추가했습니다.
$ sudo vim /etc/grub.d/40_custom
....
# 하드 코딩된 하드웨어 스위치 장치를 찾습니다. 파일 시스템 ID
search --no-floppy --fs-uuid --set hdswitch 0000-1234
# 찾은 경우 동적 구성 파일을 읽고 각 위치에 적절한 항목을 선택합니다.
if [ "${hdswitch}" ]; then
소스($hdswitch)/switch.cfg
if [ "${os_hw_switch}" ==0 ]; then
# 리눅스 부팅
set default="0"
elif [ "${os_hw_switch}" ==1 ]; then
# Windows 부팅
set default="2"
else
# 기본값으로 폴백
set default="${GRUB_DEFAULT}"
fi
else
set default="${GRUB_DEFAULT}"
fi
먼저 파일 시스템을 검색합니다. GRUB에는 search 하위 명령어가 있습니다. 단지 이것을 위해.
<울>장치가 발견되면 가장 먼저 발견된 장치가 환경 변수의 값으로 설정됩니다.
– hdswitch 설정 HD스위치 우리의 환경 변수이며 발견되면 디스크 이름으로 설정됩니다.
다음으로, hdswitch 변수가 설정되어 다른 환경 변수 os_hw_switch가 생성됩니다. 코드> 스위치 위치, 즉 0/1.
os_hw_switch 값을 읽습니다. 코드> 기본값을 각각 0 또는 2로 설정합니다. 0은 Ubuntu가 GRUB 메뉴에서 0번째 위치에 있고 windows가 2번째 위치에 있기 때문입니다.
마지막으로 hdswitch 설정되지 않았으므로 기본값을 GRUB_DEFAULT로 설정했습니다.
이제 grub을 업데이트해야 합니다.
$ sudo 업데이트-grub
출처: Pico를 사용한 하드웨어 부팅 선택 스위치
제조공정
프로그래밍 가능하고 흥미로운 전자 프로젝트를 구축하는 방법에는 여러 가지가 있습니다. 하나는 더 인기 있는 Arduino 또는 Raspberry Pi 보드를 사용할 수 있습니다. 하지만 Xilinx 플랫폼으로 가는 더 쉬운 방법을 찾고 있다면 PYNQ 보드가 필요합니다. 사실, PYNQ 보드는 전자 프로젝트를 구축하면서 프로그래밍을 위한 다양한 가능성을 열어줄 수 있습니다. 보드는 어떻게 작동합니까? 이 기사에서는 PYNQ 보드가 무엇인지, 어떻게 사용하는지, 무엇을 할 수 있는지 등을 보여줍니다. 시작하겠습니다! PYNQ
이 작은 데모 프로젝트는 REST API 및 Modbus TCP를 통해 오픈 소스 홈 자동화 소프트웨어 Home Assistant에서 PLCnext 컨트롤러를 스마트 홈 장치로 쉽게 사용하는 방법을 보여줍니다. PLCnext 컨트롤러를 사용하면 자동화에서 Axioline 구성 요소를 사용하여 Raspberry Pi의 GPIO 핀, Pt100과 같은 온도 센서 및 DALI와 같은 버스 시스템보다 더 강력한 출력을 쉽게 추가할 수 있습니다. 작동하는 홈 어시스턴트 설치와 작지만 실행 가능한 PLCnext 프로젝트가 포함된 PLCnext