電子發(fā)燒友App

硬聲App

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

使用Pico的硬件引導(dǎo)選擇開關(guān)

2023-06-16 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

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

他通過(guò)將 STM32 微控制器配置為 USB 大容量存儲(chǔ)設(shè)備來(lái)實(shí)現(xiàn)這一點(diǎn)。他在hackaday 帖子(點(diǎn)擊)中記錄了他通過(guò)項(xiàng)目研究和實(shí)施的整個(gè)旅程。請(qǐng)閱讀他的帖子以更好地了解實(shí)現(xiàn)。

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

概念

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

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

因此,我們通過(guò)tinyUSB庫(kù)將我們的樹莓派 pico 枚舉為大容量存儲(chǔ)設(shè)備,該庫(kù)將具有文件switch.cfg文件,pico 將向其中寫入開關(guān)位置,即1 表示 ON 0 表示 OFF 。

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

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

總之,

  • pico 會(huì)將自己配置為大容量存儲(chǔ)設(shè)備。
  • grub 菜單調(diào)用我們的腳本并詢問(wèn)特定的文件。
  • Pico 通過(guò)在switch.cfg文件中添加開關(guān)位置來(lái)響應(yīng)讀取請(qǐng)求。
  • grub 中的腳本從文件中提取信息并從提取的數(shù)據(jù)中設(shè)置默認(rèn)選項(xiàng)。

將 Pico 配置為大容量存儲(chǔ)設(shè)備

我使用 tinyUSB 的cdc_msc示例來(lái)實(shí)現(xiàn)這一點(diǎn)。該示例將 pico 配置為大容量存儲(chǔ)設(shè)備,并創(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 配置為大容量存儲(chǔ)設(shè)備。將uf2文件復(fù)制到pico后,枚舉為存儲(chǔ)設(shè)備。我們將需要 GRUB 腳本的設(shè)備 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
開關(guān)連接
?

?

pYYBAGOIOlOAQ1ZHAAoU_Ub3zR4889.jpg
?

讀取開關(guān)位置并寫入文件

現(xiàn)在我們需要讀取開關(guān)位置并相應(yīng)地更改switch.cfg文件的內(nèi)容,

  • 如果開關(guān)打開:設(shè)置 os_hw_switch=1\n
  • 如果開關(guān)關(guān)閉:設(shè)置 os_hw_switch=0\n

我使用 GPIO_PIN 28 作為開關(guān)引腳,設(shè)置為下拉。

read_switch_value返回開關(guān)位置,即“1”打開(拉高),“0”關(guān)閉(拉低)。

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

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

我發(fā)現(xiàn)在讀取第三個(gè) block3 時(shí)lba設(shè)置為 3,因此攔截調(diào)用并調(diào)用readGrubConfig并傳遞將復(fù)制文件內(nèi)容的緩沖區(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引腳訪問(wèn)權(quán)限。

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

制作項(xiàng)目:

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

配置 GRUB 以讀取文件內(nèi)容

我在我的 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 有一個(gè)子命令search就是為了這個(gè)。

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

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

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

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

我們讀取 的值 os_hw_switch并將默認(rèn)值分別設(shè)置為 0 或 2。0 因?yàn)?Ubuntu 在 GRUB 菜單中位于第 0 位,而 windows 位于第 2 位。

最后,如果 沒有設(shè)置hdswitch ,我們將默認(rèn)設(shè)置為GRUB_DEFAULT。

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

$ sudo update-grub

我們完成了。

測(cè)試

poYBAGOIOnuAFjStAAoQsrAlGo8584.jpg
?

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

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

pYYBAGOIOn2AZbgqAABpnnVPDEg185.jpg
當(dāng)開關(guān)位置為 1 即 ON
?
pYYBAGOIOoCAGLslAABuKgmMA4w296.jpg
當(dāng)開關(guān)位置為 0 即 OFF
?

?


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

評(píng)論

查看更多

下載排行

本周

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

本月

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

總榜

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