文石系統由於有自己的 Launcher ,其 App 清單中並無設置,故無法叫出內建的設置頁面。
網路上說可以透過 adb 解決,我雖然沒用過,但原理應該是透過 adb 來啟動設置 App。
我覺得對一般使用者來說,應該有更簡單的方式,那就是安裝任一 Launcher App,比如說 Nova Launcher,便可以在它的 App 清單中找到設置 App,如果沒有想取代原本 Launcher,記得詢問時選僅此一次即可。
pretty code
2019年6月16日 星期日
2019年6月13日 星期四
UEFI Application - Get Boot Variables
在搞懂了相關結構後,剩下的就是 coding 了,在 UDK Base 翻找後,便寫出了下面的程式,可以讀取所有的 Boot Variables,Just for fun。
#include <stdio.h>
#include <Library/UefiLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/PrintLib.h>
#include <Library/BaseLib.h>
#include <Library/DevicePathLib.h>
// The caller is responsible for freeing this buffer with FreePool().
VOID* mGetVariable(CHAR16 *name, EFI_GUID *guid, UINTN *size)
{
EFI_STATUS status;
UINTN realSize;
VOID *value;
// Try to get the variable size.
value = NULL;
realSize = 0;
status = gRT->GetVariable(name, guid, NULL, &realSize, value);
if (status != EFI_BUFFER_TOO_SMALL) {
return NULL;
}
// Allocate buffer to get the variable.
value = AllocatePool(realSize);
if (value == NULL) {
return NULL;
}
// Get the variable data.
status = gRT->GetVariable(name, guid, NULL, &realSize, value);
if (EFI_ERROR(status)) {
FreePool(value);
return NULL;
}
*size = realSize;
return value;
}
int main(void)
{
VOID *value;
UINTN size;
UINTN varCount;
UINTN i;
UINT16 bootString[10];
UINT16 *desc;
UINT16 filePathLen;
EFI_DEVICE_PATH_PROTOCOL *protocol;
char *ptr;
value = mGetVariable(L"BootOrder", &gEfiGlobalVariableGuid, &size);
if (value == NULL) {
printf("Can't get BootOrder Variable \n");
return -1;
}
FreePool(value);
varCount = size / 2;
for (i = 0; i < varCount; i++) {
UnicodeSPrint(bootString, sizeof(bootString), L"Boot%04x", i);
value = mGetVariable(bootString, &gEfiGlobalVariableGuid, &size);
if (value == NULL) {
printf("Can't get Boot%04X Variable \n", i);
return -1;
}
ptr = (char*)value;
desc = (UINT16*)(ptr + 6);
Print(L"Boot%04X : %s \n", i, desc);
filePathLen = *((UINT16*)(ptr + 4));
protocol = (EFI_DEVICE_PATH_PROTOCOL*)(ptr + 6 + 2*(StrLen(desc)+1));
Print(L"FilePath Length %02X \n", filePathLen);
Print(L"FilePath.Type %02X \n", protocol->Type);
Print(L"FilePath.SubType %02X \n", protocol->SubType);
Print(L"%s \n", ConvertDevicePathToText(protocol, TRUE, TRUE));
Print(L"\n");
FreePool(value);
}
return 0;
}
Boot0000 : USB: ADATA USB Flash Drive
FilePath Length 27
FilePath.Type 05
FilePath.SubType 01
BBS(HD,USB: ADATA USB Flash Drive)
Boot0001 : UEFI USB: ADATA USB Flash Drive
FilePath Length 1C
FilePath.Type 02
FilePath.SubType 01
PciRoot(0x0)/Pci(0x10,0x7)/USB(0x3,0x0)
Boot0002 : Internal EDK Shell
FilePath Length 2C
FilePath.Type 04
FilePath.SubType 07
Fv(92E111AA-5F63-49D5-96C7-947422BDD1AA)/FvFile(C57AD6B7-0515-40A8-9D21-551652854E37)
電子書閱讀器手感
我開始相信重量真的不是絕對了!
一直都覺得 Note Lite 拿起來比 Nova Pro 舒服,但其實還多了 85 克,大概等於一個瑜伽磚的感覺,我想也許是因為 Note Lite 較薄的關係或是 Nova Pro 重量分佈的問題,總之,開始有點想把 Nova Pro 賣掉了!
也不是說 Nova Pro 不好,但凡事在使用比較後就會見真章,坦白說,當初拿到 Nova Pro 驚為天人的感覺已經所剩無幾!也許,對我來說,Nova Pro 只剩攜帶方便這個優點,畢竟我並沒有把御三家的書全部轉進 Kindle Paperwhite 3。
看著自己的暗黑心法原始碼,只能感嘆為什麼 Kindle 不支援 EPUB 格式就好,這樣我就少掉每次轉檔時還要花時間 debug kindlegen 所吐出來的錯誤訊息了。
一直都覺得 Note Lite 拿起來比 Nova Pro 舒服,但其實還多了 85 克,大概等於一個瑜伽磚的感覺,我想也許是因為 Note Lite 較薄的關係或是 Nova Pro 重量分佈的問題,總之,開始有點想把 Nova Pro 賣掉了!
也不是說 Nova Pro 不好,但凡事在使用比較後就會見真章,坦白說,當初拿到 Nova Pro 驚為天人的感覺已經所剩無幾!也許,對我來說,Nova Pro 只剩攜帶方便這個優點,畢竟我並沒有把御三家的書全部轉進 Kindle Paperwhite 3。
看著自己的暗黑心法原始碼,只能感嘆為什麼 Kindle 不支援 EPUB 格式就好,這樣我就少掉每次轉檔時還要花時間 debug kindlegen 所吐出來的錯誤訊息了。
2019年6月12日 星期三
Rust 探索之旅 - Can't work on Windows 7
執行 cargo -V or rustc -V 時,程式就沒反應,不論是用工作管理員或是 taskkill 指令都無法停止相關程式,目前只知網路上的看法是跟防毒軟體有關。
遇到這種問題時,連關機都無法正常,只能強制斷電,已經斷電了 3 次。
我個人認為是跟 wrapper 的檔案有關﹝user/.cargo/bin﹞,而不是真實的執行檔有問題﹝user/.rustup/toolchains/stable-x86_64-pc-windows-msvc/bin﹞,也許可以把真實的執行檔加入到 PATH,而不要使用 wrapper 的位置?
https://github.com/rust-lang/rustup.rs/issues/1075
https://github.com/rust-lang/cargo/issues/3673
2019/06/18 更新
砍掉 "user/.cargo" 裡的 cargo.exe and rustc.exe,直接使用 "user/.rustup" 的執行檔就正常了,記得把這個路徑加入到 PATH。
遇到這種問題時,連關機都無法正常,只能強制斷電,已經斷電了 3 次。
我個人認為是跟 wrapper 的檔案有關﹝user/.cargo/bin﹞,而不是真實的執行檔有問題﹝user/.rustup/toolchains/stable-x86_64-pc-windows-msvc/bin﹞,也許可以把真實的執行檔加入到 PATH,而不要使用 wrapper 的位置?
https://github.com/rust-lang/rustup.rs/issues/1075
https://github.com/rust-lang/cargo/issues/3673
2019/06/18 更新
砍掉 "user/.cargo" 裡的 cargo.exe and rustc.exe,直接使用 "user/.rustup" 的執行檔就正常了,記得把這個路徑加入到 PATH。
Rust 探索之旅 - Hello World
早上坐公車時無聊,看了一下 Rust 教學文件,開始我的 Rust 探索之旅。
Rust 和 C 一樣,都是編譯型語言,透過編譯會得到一個單一執行檔,可以方便的發佈給其他人。不像 script language,對方要執行時,需要有相關的安裝環境﹝理論上的,因為有些語言有第三方工具可以 build executable binary ﹞。
Rust 目前已知特點
01. cargo new "helloworld",可以自動建立一個 "helloworld" 的專案,"helloworld" 資料夾裡面會有 git 結構、Cargo.toml 的專案描述檔以及一個建立好的 "src\main.rs" 程式碼檔案,副檔名 "rs" 表示這是一個 Rust 的原始碼檔案。
02. 同 Go 一樣,cargo run 可以直接執行,cargo build 則是編譯 binary。
03. Rust 使用 let 宣告變數,變數預設是 immutable,加上 mut﹝mutable﹞表示變數可以被改值。
04. Rust 使用 use 宣告來存取內建函數。
05. "println!" 是一個 macro 而不是函數。
06. String 是 UTF-8 的編碼。
07. & 表示傳進函數的是一個參考﹝reference﹞,也可以加上 mut 關鍵字。
08. 在 println 中,"{}" 表示一個佔位符,有幾個後面就要有幾個對應的變數。
09. read_line 會包含換行字元,因為我們是 String,可以用 num.trim( ) 來去除。
10. Rust 變數命名慣例是小寫駝峰式,例如:s_len。
Rust 和 C 一樣,都是編譯型語言,透過編譯會得到一個單一執行檔,可以方便的發佈給其他人。不像 script language,對方要執行時,需要有相關的安裝環境﹝理論上的,因為有些語言有第三方工具可以 build executable binary ﹞。
Rust 目前已知特點
01. cargo new "helloworld",可以自動建立一個 "helloworld" 的專案,"helloworld" 資料夾裡面會有 git 結構、Cargo.toml 的專案描述檔以及一個建立好的 "src\main.rs" 程式碼檔案,副檔名 "rs" 表示這是一個 Rust 的原始碼檔案。
02. 同 Go 一樣,cargo run 可以直接執行,cargo build 則是編譯 binary。
03. Rust 使用 let 宣告變數,變數預設是 immutable,加上 mut﹝mutable﹞表示變數可以被改值。
04. Rust 使用 use 宣告來存取內建函數。
05. "println!" 是一個 macro 而不是函數。
06. String 是 UTF-8 的編碼。
07. & 表示傳進函數的是一個參考﹝reference﹞,也可以加上 mut 關鍵字。
08. 在 println 中,"{}" 表示一個佔位符,有幾個後面就要有幾個對應的變數。
09. read_line 會包含換行字元,因為我們是 String,可以用 num.trim( ) 來去除。
10. Rust 變數命名慣例是小寫駝峰式,例如:s_len。
use std::io;
fn main() {
println!("Guess the number");
println!("Please input your guess");
let mut num = String::new();
io::stdin().read_line(&mut num)
.expect("Failed to read line");
println!("Your guess: {}", num);
let s_len = num.len();
let bytes = num.into_bytes();
println!("lenth = {}, bytes = {:?}", s_len, bytes);
}
C:\helloworld>cargo run
Guess the number
Please input your guess:
123
Your guess: 123
lenth = 5, bytes = [49, 50, 51, 13, 10]
C:\helloworld>
2019年6月11日 星期二
2019年6月10日 星期一
UEFI Application - 找出 UEFI 相關函數實作
寫 UEFI Application 時,如果是跟 UEFI 有關的東西,常常需要去 UDKBase 裡翻找,我一般都是使用 "FileSeek v3.3" 這個工具,可以幫助我很快的找到關鍵字。可惜的是,即使發現在某支 .c 檔,如果想要在該檔案中查找相關函數,我目前用的 UltraEdit 並沒有辦法在函式清單中列出來所有函數,這個是跟 UEFI 慣用的函式實作寫法有關,目前至少發現有 2 種寫法,故我後來都是使用 grep 來找出函式名稱。
Rgex 下法
1. "^\w+\s*\("
兩者的差別在函數名稱後面到左括弧間有無空格,之後如果有新發現再來補充。
Rgex 下法
1. "^\w+\s*\("
兩者的差別在函數名稱後面到左括弧間有無空格,之後如果有新發現再來補充。
訂閱:
文章 (Atom)

