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