산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Pico를 사용한 하드웨어 부팅 선택 스위치

스위치를 토글하여 컴퓨터를 켜기 전에도 부팅할 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 선택을 각각 설정합니다.

요약하면,

<울>
  • pico는 스스로를 대용량 저장 장치로 구성합니다.
  • grub 메뉴는 스크립트를 호출하고 특정 파일을 요청합니다.
  • Pico는 switch.cfg 파일에 스위치 위치를 추가하여 읽기 요청에 응답합니다.
  • grub의 스크립트는 파일에서 정보를 추출하고 추출된 데이터에서 기본 옵션을 설정합니다.
  • Pico를 대용량 저장 장치로 구성

    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 파일의 콘텐츠를 변경해야 합니다. 즉,

    <울>
  • 스위치가 켜져 있는 경우:os_hw_switch=1로 설정\n
  • 스위치가 꺼져 있는 경우:os_hw_switch=0으로 설정\n
  • 풀다운으로 설정된 스위치 핀으로 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 코드 컴파일

    Pico stdlib를 추가해야 합니다. gpio를 얻으려면 핀 액세스.

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

    프로젝트를 만들려면:

    $ mkdir 빌드
    $ cd 빌드
    $ cmake ..
    $ make

    파일 내용을 읽도록 GRUB 구성

    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 하위 명령어가 있습니다. 단지 이것을 위해.

    <울>
  • -플로피 없음 플로피 장치 검색을 방지하는 옵션
  • -fs–uuid 0000-1234 UUID가 0000-1234인 파일 시스템을 검색합니다.
  • 장치가 발견되면 가장 먼저 발견된 장치가 환경 변수의 값으로 설정됩니다.

    – 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를 사용한 하드웨어 부팅 선택 스위치


    제조공정

    1. C# switch 문
    2. C# 사용
    3. Raspberry Pi 2 기상 관측소
    4. LM35를 사용한 온도 기반 장치 제어 시스템
    5. Raspberry Pi를 사용한 원격 날씨 모니터링
    6. Node-RED를 사용하여 Blynk하는 SensorTag
    7. Raspberry Pi를 사용한 모션 센서
    8. Raspberry Pi 및 Bridge Shield를 사용하는 로봇
    9. 라즈베리 파이를 사용하는 Wi-Fi 제어 로봇
    10. IoT 기기 임베디드 하드웨어 해킹 소개