資料介紹
描述
在 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"
電路
?
讀取開關位置并寫入文件
現(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
我們完成了。
測試
在連接設備的情況下重新啟動系統(tǒng)。
如果一切正常,打開按鈕將選擇 windows 或 ubuntu(如果關閉)。
?
- NIDEC(尼得科)旋轉選擇開關S-2150數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關S-2151數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關S-2051數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關S-2050數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-22YTB數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-22YB數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-22YA數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-14NA數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-14NB數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-13NB數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-13NA數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-12XB數(shù)據(jù)手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-12XA數(shù)據(jù)手冊
- 單芯片CMOS 8路可選擇開關MS714規(guī)格書 5次下載
- CAT6500雙電源自動選擇開關應用 0次下載
- 使用PICO示波器配合PICO軟件的邏輯觸發(fā)功能 285次閱讀
- 開關電源輸出整流二極管的選擇方法 1288次閱讀
- 在主開關上避免使用漏電保護器的原因 496次閱讀
- Pico W的無線功能 883次閱讀
- 怎么使用uboot引導應用程序? 1360次閱讀
- 選擇開關電源要考慮哪些因素? 6667次閱讀
- 如何選擇開關電源的型號 9264次閱讀
- 如何選擇空氣開關的C型與D型 7108次閱讀
- 5款追求極簡設計的ESP32-PICO-D4開發(fā)板 2.8w次閱讀
- 如何正確選擇開關電源頻率? 7.1w次閱讀
- 萬用表測試二極管好壞方法和電壓電流的測量 2.1w次閱讀
- 74hc4052中文資料匯總(74hc4052引腳圖及功能_工作原理及應用電路) 15.3w次閱讀
- 光電開關型號含義及選擇說明 5.5w次閱讀
- 引導濾波的軟硬件協(xié)同加速器設計與實現(xiàn) 1425次閱讀
- 基于NFC技術的智能引導系統(tǒng)設計 793次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多