資料介紹
描述
在 Hackaday.io 上尋找項目時,我偶然發現了 Stephen Holdaway 的這個項目(點擊)。在這個項目中,他解決了每個雙啟動用戶面臨的一個令人沮喪的任務,即在我們想要切換到 Windows 的任何時候,等待從 GRUB 菜單中選擇 os (Windows)。他能夠添加一個硬件開關,以確定每次打開計算機時要啟動的操作系統。
他通過將 STM32 微控制器配置為 USB 大容量存儲設備來實現這一點。他在hackaday 帖子(點擊)中記錄了他通過項目研究和實施的整個旅程。請閱讀他的帖子以更好地了解實現。
在這個項目中,我將展示如何將更改移植到 Raspberry Pi Pico。你可以在這個 GitHub Repo (點擊)中找到我的版本。
概念
GNU GRUB 是一個在加載任何操作系統之前運行的程序。通過這個菜單,我們可以選擇要加載的操作系統。GRUB 提供的模塊非常有限。這意味著它無法從通過 USB 連接的微控制器讀取數據。但它可以從存儲磁盤中讀取數據。
因此,我們可以通過將我們的微控制器枚舉為大容量存儲設備來欺騙 GRUB 從微控制器讀取數據。
因此,我們通過tinyUSB庫將我們的樹莓派 pico 枚舉為大容量存儲設備,該庫將具有文件switch.cfg文件,pico 將向其中寫入開關位置,即1 表示 ON 0 表示 OFF 。
我們必須在 GRUB 中添加一個腳本,它是讀取switch.cfg文件并將默認設置為0(Ubuntu )/2(Windows) 的函數。
GRUB 在加載時運行我們的自定義腳本,然后通過其 UUID 標識符搜索我們的設備,如果退出則讀取switch.cfg文件。獲得開關位置后,它分別設置默認的操作系統選擇。
總之,
- pico 會將自己配置為大容量存儲設備。
- grub 菜單調用我們的腳本并詢問特定的文件。
- Pico 通過在switch.cfg文件中添加開關位置來響應讀取請求。
- grub 中的腳本從文件中提取信息并從提取的數據中設置默認選項。
將 Pico 配置為大容量存儲設備
我使用 tinyUSB 的cdc_msc示例來實現這一點。該示例將 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: Readme Content -------------//
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
// 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函數的readGRUBConfig() ,并使用開關位置設置輸出緩沖區。
我發現在讀取第三個 block3 時lba設置為 3,因此攔截調用并調用readGrubConfig并傳遞將復制文件內容的緩沖區。
//-------------------------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
首先,我們搜索我們的文件系統。GRUB 有一個子命令search就是為了這個。
- -no-floppy選項防止搜索軟盤設備
- -fs--uuid 0000-1234搜索 UUID 為 0000-1234 的文件系統。
如果找到任何設備,則將找到的第一個設備設置為環境變量的值。
--set hdswitch hdswitch是我們的環境變量,如果找到,則使用磁盤名稱進行設置。
接下來,如果設置了hdswitch變量 ,我們將獲取 switch.cfg文件,這將創建另一個具有開關位置的環境變量,即 0/1。os_hw_switch
我們讀取 的值 os_hw_switch
并將默認值分別設置為 0 或 2。0 因為 Ubuntu 在 GRUB 菜單中位于第 0 位,而 windows 位于第 2 位。
最后,如果 沒有設置hdswitch ,我們將默認設置為GRUB_DEFAULT。
現在我們需要更新我們的 grub:
$ sudo update-grub
我們完成了。
測試
在連接設備的情況下重新啟動系統。
如果一切正常,打開按鈕將選擇 windows 或 ubuntu(如果關閉)。
?
- NIDEC(尼得科)旋轉選擇開關S-2150數據手冊
- NIDEC(尼得科)旋轉選擇開關S-2151數據手冊
- NIDEC(尼得科)旋轉選擇開關S-2051數據手冊
- NIDEC(尼得科)旋轉選擇開關S-2050數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-22YTB數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-22YB數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-22YA數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-14NA數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-14NB數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-13NB數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-13NA數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-12XB數據手冊
- NIDEC(尼得科)旋轉選擇開關CS-4-12XA數據手冊
- 單芯片CMOS 8路可選擇開關MS714規格書 5次下載
- CAT6500雙電源自動選擇開關應用 0次下載
- 使用PICO示波器配合PICO軟件的邏輯觸發功能 285次閱讀
- 開關電源輸出整流二極管的選擇方法 1288次閱讀
- 在主開關上避免使用漏電保護器的原因 496次閱讀
- Pico W的無線功能 883次閱讀
- 怎么使用uboot引導應用程序? 1360次閱讀
- 選擇開關電源要考慮哪些因素? 6667次閱讀
- 如何選擇開關電源的型號 9264次閱讀
- 如何選擇空氣開關的C型與D型 7108次閱讀
- 5款追求極簡設計的ESP32-PICO-D4開發板 2.8w次閱讀
- 如何正確選擇開關電源頻率? 7.1w次閱讀
- 萬用表測試二極管好壞方法和電壓電流的測量 2.1w次閱讀
- 74hc4052中文資料匯總(74hc4052引腳圖及功能_工作原理及應用電路) 15.3w次閱讀
- 光電開關型號含義及選擇說明 5.5w次閱讀
- 引導濾波的軟硬件協同加速器設計與實現 1425次閱讀
- 基于NFC技術的智能引導系統設計 793次閱讀
下載排行
本周
- 1美的電磁爐維修手冊大全
- 1.56 MB | 5次下載 | 5 積分
- 2SMD LED選型手冊 貼片燈珠
- 5.47 MB | 3次下載 | 免費
- 3基于PLC的拉絲機張力控制系統研究
- 0.14 MB | 2次下載 | 5 積分
- 4LZC3106G高性能諧振控制器中文手冊
- 1.29 MB | 1次下載 | 1 積分
- 5JL2233B集成電平轉換功能的LDO中文手冊
- 0.50 MB | 1次下載 | 免費
- 6加密芯片的一種破解方法和對應加密方案改進設計
- 0.29 MB | 1次下載 | 免費
- 7萬用表UT58A原理圖
- 0.09 MB | 1次下載 | 5 積分
- 8BOSCH-REXROTH300擰緊系統常見故障及處理方法
- 0.06 MB | 次下載 | 5 積分
本月
- 1使用單片機實現七人表決器的程序和仿真資料免費下載
- 2.96 MB | 44次下載 | 免費
- 2UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 19次下載 | 免費
- 3華瑞昇CR216芯片數字萬用表規格書附原理圖及校正流程方法
- 0.74 MB | 14次下載 | 3 積分
- 4DMT0660數字萬用表產品說明書
- 0.70 MB | 13次下載 | 免費
- 53314A函數發生器維修手冊
- 16.30 MB | 13次下載 | 免費
- 6TPS54202H降壓轉換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費
- 7STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 8感應筆電路圖
- 0.06 MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多