電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
創(chuàng)作
電子發(fā)燒友網>電子資料下載>電子資料>使用Pico的硬件引導選擇開關

使用Pico的硬件引導選擇開關

2023-06-16 | zip | 0.00 MB | 次下載 | 免費

資料介紹

描述

在 Hackaday.io 上尋找項目時,我偶然發(fā)現(xiàn)了 Stephen Holdaway 的這個項目(點擊)。在這個項目中,他解決了每個雙啟動用戶面臨的一個令人沮喪的任務,即在我們想要切換到 Windows 的任何時候,等待從 GRUB 菜單中選擇 os (Windows)。他能夠添加一個硬件開關,以確定每次打開計算機時要啟動的操作系統(tǒng)

他通過將 STM32 微控制器配置為 USB 大容量存儲設備來實現(xiàn)這一點。他在hackaday 帖子(點擊)中記錄了他通過項目研究和實施的整個旅程。請閱讀他的帖子以更好地了解實現(xiàn)。

在這個項目中,我將展示如何將更改移植到 Raspberry Pi Pico。你可以在這個 GitHub Repo (點擊)中找到我的版本。

概念

GNU GRUB 是一個在加載任何操作系統(tǒng)之前運行的程序。通過這個菜單,我們可以選擇要加載的操作系統(tǒng)。GRUB 提供的模塊非常有限。這意味著它無法從通過 USB 連接的微控制器讀取數(shù)據(jù)。但它可以從存儲磁盤中讀取數(shù)據(jù)。

因此,我們可以通過將我們的微控制器枚舉為大容量存儲設備來欺騙 GRUB 從微控制器讀取數(shù)據(jù)。

因此,我們通過tinyUSB庫將我們的樹莓派 pico 枚舉為大容量存儲設備,該庫將具有文件switch.cfg文件,pico 將向其中寫入開關位置,即1 表示 ON 0 表示 OFF

我們必須在 GRUB 中添加一個腳本,它是讀取switch.cfg文件并將默認設置0(Ubuntu )/2(Windows) 的函數(shù)。

GRUB 在加載時運行我們的自定義腳本,然后通過其 UUID 標識符搜索我們的設備,如果退出則讀取switch.cfg文件。獲得開關位置后,它分別設置默認的操作系統(tǒng)選擇。

總之,

  • pico 會將自己配置為大容量存儲設備。
  • grub 菜單調用我們的腳本并詢問特定的文件。
  • Pico 通過在switch.cfg文件中添加開關位置來響應讀取請求。
  • grub 中的腳本從文件中提取信息并從提取的數(shù)據(jù)中設置默認選項。

將 Pico 配置為大容量存儲設備

我使用 tinyUSB 的cdc_msc示例來實現(xiàn)這一點。該示例將 pico 配置為大容量存儲設備,并創(chuàng)建 FAT12 文件系統(tǒng)并枚舉README.txt文件。

我將README.txt更改switch.cfg并將“set os_hw_switch=0\n”行添加到文件中。

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

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

現(xiàn)在我們已將 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"

電路

poYBAGOIKrqASFJGAAAVOmGHIzE439.png
開關連接
?

?

pYYBAGOIOlOAQ1ZHAAoU_Ub3zR4889.jpg
?

讀取開關位置并寫入文件

現(xiàn)在我們需要讀取開關位置并相應地更改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

// 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);

要將開關位置寫入switch.cfg ,我使用了調用read_switch_value函數(shù)的readGRUBConfig() ,并使用開關位置設置輸出緩沖區(qū)。

我發(fā)現(xiàn)在讀取第三個 block3 時lba設置為 3,因此攔截調用并調用readGrubConfig并傳遞將復制文件內容的緩沖區(qū)。

//-------------------------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;
    }
    ...
    ...
}

編譯 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

....
# 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

首先,我們搜索我們的文件系統(tǒng)。GRUB 有一個子命令search就是為了這個。

  • -no-floppy選項防止搜索軟盤設備
  • -fs--uuid 0000-1234搜索 UUID 為 0000-1234 的文件系統(tǒng)。

如果找到任何設備,則將找到的第一個設備設置為環(huán)境變量的值。

--set hdswitch hdswitch是我們的環(huán)境變量,如果找到,則使用磁盤名稱進行設置。

接下來,如果設置了hdswitch變量 ,我們將獲取 switch.cfg文件,這將創(chuàng)建另一個具有開關位置的環(huán)境變量,即 0/1。os_hw_switch

我們讀取 的值 os_hw_switch并將默認值分別設置為 0 或 2。0 因為 Ubuntu 在 GRUB 菜單中位于第 0 位,而 windows 位于第 2 位。

最后,如果 沒有設置hdswitch ,我們將默認設置為GRUB_DEFAULT。

現(xiàn)在我們需要更新我們的 grub:

$ sudo update-grub

我們完成了。

測試

poYBAGOIOnuAFjStAAoQsrAlGo8584.jpg
?

在連接設備的情況下重新啟動系統(tǒng)。

如果一切正常,打開按鈕將選擇 windows 或 ubuntu(如果關閉)。

pYYBAGOIOn2AZbgqAABpnnVPDEg185.jpg
當開關位置為 1 即 ON
?
pYYBAGOIOoCAGLslAABuKgmMA4w296.jpg
當開關位置為 0 即 OFF
?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費