小華的部落格

搜尋此網誌

星期一, 2月 05, 2018

UEFI Shell Utility - pwrtest.efi

The pwrtest.efi is an UEFI Shell tool that help developer to confirm RTC wake function from a system(Support on both Intel and AMD platform).

最近在幫忙ODM看一個RTC Wake 問題,所以就順便寫了一個TOOL來驗證一些東西。原本遇到的問題也解決了,所以就順便把這個小TOOL分享一下給有需要的人使用。

Usage:
    pwrtest -s3 -t 10 -w 60  ; 系統會在10 sec delay 後進入S3,然後在60 sec 後喚醒(Wake up) 
    pwrtest [-h|-s3|-s4|-s5|-s|-ss|-sx|-cb|-r]
                  -h help
                  -s3|-s4|-s5        ;選擇系統的Sx State (Intel platform)
                  -cb                   ;做coldboot ,我是透過 gRT->ResetSystem()  方式去做的
                  -ss                   ; 做Shutdown,我是透過 gRT->ResetSystem()  方式去做的
                  -sx value         ; 支援AMD platform去做Sx State,因為填的SLP_TYP值不同.
                                            value = 3/4/5 for AMD platform(S3/S4/S5)
                                            value = 5/6/7 for Intel Platform (S3/S4/S5)
e.g,
    pwrtest -sx 4 -t 5 -w 30 ; For AMD Platform,  Put system to S4 after 5 sec, then wake after 30 sec.
    pwrtest -sx 6 -t 5 -w 30 ; For INTEL Platform,  Put system to S4 after 5 sec, then wake after 30 sec.
    pwrtest -s3 -t 5 -w 30    ; For INTEL Platform,  Put system to S3 after 5 sec, then wake after 30 sec.
    pwrtest -r                       ; Warm boot
    pwrtest -cb                    ; Cold boot

[註]
    - S3 功能只能喚醒系統,喚醒後會當機,因為我沒有支援Reset Vector(Not support)
    - 有些系統S4/S5 並不支援RTC wake up,所以請跟你們的BIOS/EC確認,因為這個工具只是去填RTC Enable bit & RTC Alarm interrupt而已。


Download (Password: harrison):
https://1drv.ms/u/s!Aj82TWjmhiTKgxRsoYQMjf4lCo0p


星期一, 1月 15, 2018

紀錄一下WinDbg裡面比較常用到的指令集

AMLI裡面比較常用到的指令集

AMLI(? for help)-> ?
?

Help                     - ? [<Cmd>]
Clear Breakpoints        - bc <bp list> | *
Disable Breakpoints      - bd <bp list> | *
Enable Breakpoints       - be <bp list> | *
List Breakpoints         - bl
Set Breakpoints          - bp <MethodName> | <CodeAddr> ...
Clear Event Log          - cl
Dump Event Log           - dl
Dump Object Count Table  - dc
Dump Heap                - dh [<Addr>]
Dump Stack               - ds [/v] [<Addr>]
Dump Name Space Object   - dns [[/s] [<NameStr> | <Addr>]]
Dump Data Object         - do <Addr>
Find NameSpace Object    - find <NameSeg>
Continue Execution       - g
Read Byte from Port      - i <Port>
Read Word from Port      - iw <Port>
Read DWord from Port     - id <Port>
List All Contexts        - lc
Display Nearest Method   - ln [<MethodName> | <CodeAddr>]
Notify NameSpace Object  - notify <Obj> <Value>
Write Byte to Port       - o <Port> <Byte>
Write Word to Port       - ow <Port> <Word>
Write DWord to Port      - od <Port> <DWord>
Step Over AML Code       - p
Quit to Kernel Debugger  - q
Display Context Info.    - r <Context>
Run Method               - run <MethodName> | <CodeAddr> [<ArgList>]
Set Debugger Options     - set [traceon | traceoff] [nesttraceon | nesttraceoff] [spewon | spewoff]
                               [dbgbrkon | dbgbrkoff] [lbrkon | lbrkoff] [errbrkon | errbrkoff] 
                               [verboseon | verboseoff] [logon | logoff] [logmuton | logmutoff] 
Trace Into AML Code      - t
Interpreter Trace Mode   - trace [trigon] [trigoff] [level=<n>]
                                 [add=<TrigPtStr] [zap=<TrigPtList>]
Unassemble AML code      - u [<MethodName> | <CodeAddr>]


AMLI(? for help)-> 

ACPI 裡面比較常用到的指令集
!acpicache displays all of the ACPI tables cached by the hardware application layer (HAL)

!acpiinf displays information on the configuration of the ACPI

!acpiirqarb displays the contents of the ACPI IRQ arbiter structure

!facs displays a Firmware ACPI Control Structure

!fadt displays a Fixed ACPI Description Table

!mapic displays an ACPI Multiple APIC Table

!nsobj displays an ACPI namespace object

!nstree displays a section of the ACPI namespace tree


!rsdt displays the ACPI Root System Description Table

!acpikd.help  For a complete list of ACPI-related extensions.

Reference
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/acpi-debugging

星期三, 1月 10, 2018

如何透過DevCon.exe 去開跟關你的Device Manager內的設備


如何透過DevCon.exe 去開跟關你的Device Manager內的設備


  當你安裝WDK, Visual Studio 或是Windows SDK時,這些安裝檔裡面就會包含DevCon.exe。
 
  我的DevCon.exe是在底下這個路徑內找到的:

     C:\Program Files (x86)\Windows Kits\10\Tools\x64\DevCon.exe

 當然,如果你想要自己Build source code的話,你也可以從底下的路徑找到這個source code:

    https://github.com/Microsoft/Windows-driver-samples/tree/master/setup/devcon

我自己也用VS2013 成功建構出來這個執行檔,只是有個小地方要注意,就是你build code之前,要用command prompt(Build environment)先執行底下的指令,先把msg.h 建立出來,不然你沒辦法用專案檔案去compiler , 因為會出現會找不到msg.h的ERROR.

   C:\DevCon >  mc msg.mc   會產生msg.h

底下就是一些基本的指令操作:

1)先找你要開關的Device的HWID(我是存到一個文字檔慢慢找):
devcon hwids * > D:\hwids.txt  

2) 使用底下指令去disable , 記得在HW ID前面加@
devcon /r disable "@ACPI\DELL0812\3&31FF937C&0"

3) 使用底下指令去enable, 記得在HW ID前面加@,然後HWID要用" "包起來.
devcon /r enable "@ACPI\DELL0812\3&31FF937C&0"

4) 使用底下指令去重新scan hardware
devcon rescan

5) 使用底下指令可以做重新開機動作

devcon reboot

至於其他跟寫driver時會用到的指令功能,大家就看底下微軟的詳細說明囉~

Reference
https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/devcon-examples


星期二, 11月 01, 2016

ACPICA Programmer Reference Guide


隨手記錄ㄧ下AE_NOT_FOUND 出現的ㄧ些原因.

AE_NOT_FOUND : The name was not found in the namespace
AE_NOT_FOUND : A valid RSDP could not be located.
AE_NOT_FOUND : There is no table with this Signature currently loaded, or the table of the specified Instance is not loaded.

AE_NOT_FOUND : The object referenced by the combination of the Object and Pathname was not found within the namespace.

AE_NOT_FOUND: The child object parameter is the last object of the given type within the parent — a next child object was not found. If Child is NULL, this exception means that the parent object has no children.

AE_NOT_FOUND: One or more of the segments of the pathname refers to a non-existent object.

AE_NOT_FOUND: A valid ACPI table was not found at the specified Address.

AE_NOT_FOUND: An ACPI table with Signature was not found.

範例:
ACPI Error: Method parse/execution failed [\_SB.PCI0.LPCB.ECDV.ECIN] (Node 008E3F28), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\_SB.PCI0.LPCB.ECDV._REG] (Node 008E3F70), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\_SB.PCI0._INI] (Node 008D5790), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\ALSD._STA] (Node 008DD4C8), AE_NOT_FOUND (20160930/psparse-632)




星期五, 2月 19, 2016

不進步就是退步


     
     
     -- 以下並非以偏概全,純屬個人工作體驗  --

     幾年前加入了一家日商公司,原本抱持著可以跟世界上製作第一台NB的公司裡的業界前輩學習更深入的BIOS知識,但發現事實是殘酷的,經過了多年後的改變,那邊慢慢的研發精神已經沒有那麼積極了,我不會說這家公司很糟,因為還是有很多日本/台灣/大陸/其他Region同事還是努力的在做事情,但是一家公司的文化卻讓肯做事情的人事情越做越多,不肯做事情/事情做不好的人越做越少,乃至於冗員就越來越多,聊八卦破壞團隊精神的人就多(做不好不會被裁員)。

     而開發的方面,日商還是擁有許多比較封閉的開發方式,而「閉門造車」或許有其好處也有相對的壞處,而在一個世界潮流改變很快速的地方,如果不能一直學習成長,那就只能讓人超車。

     因此,幾經嘗試改變周遭同事態度失敗和思考之後,我決定離開那些負面思考/消極態度的同事以及封閉的開發方式的環境,以避免個人養老心態的產生和負面心態的養成。所以在去年所以我選擇加入了另一家外商公司,開始學習不一樣領域的知識,並繼續讓自己保持正向的思考與競爭力。

     然而,在這個新的工作領域中,我的工作內容暫時不需要自己去寫程式,雖然暫時放棄的寫程式的機會,但是我卻多了許多的機會去接觸不同的人事物,並讓自己反省過去到底浪費的多少生命在ㄧ些「不必要的人事物」 上面。

     然而「不進步就是退步」,在最近看到ㄧ些前日商台灣同事連被詢問留下機會都沒有,就被直接裁員,最近才在找工作,心中更是感概萬千。

    雖然很想幫忙,但面對到友情/現實時,我們也只能選擇性幫忙。畢竟社會是現實的,冗員與戰力你只能選擇有戰力的幫忙,否則接納到冗員的公司也只能自求多福了。
       
     所以,在世界競爭激烈的環境之下,唯有自己持續進步,在遇到這種公司關閉/退出市場或是裁員時,我們才能在裡面繼續生存下去。
                                                                                                                                      2016.02 Harrison


星期一, 2月 23, 2015

Compiler intrinsics(內建函數)

EDK2 中開/關VC++內建函數的方式

平常如果你使用Compiler /Oi 選項時,Compiler自己遇到內建函數時會自己去產生CODE到你的程式碼之中,如果你想要自己寫這些內建函數時,就必須要用/Oi- 去關閉他,以免被當成內建函數而出現Compiler error訊息。

例如,我想在我自己的xxx.c 中自己實作一個 ceil() 函數,那你可以透過EDK2 build option override方式在xxx.dsc 中來對你的xxx.inf 設定Compiler option,他只會影響你的xxx.inf。

$(MY_PATH)\xxx.inf {
  <BuildOptions>
    *_*_X64_CC_FLAGS = /Oi-
}


星期四, 12月 25, 2014

開啟CMD.EXE並一次執行多個DOS指令的方式(Command Prompt and Batch file)

這篇文章是分享如何開啟CMD.EXE時並一次執行多個DOS指令的方式。

為什麼要分享這個冷知識?
因為現在是冬天了,所以很冷。

好吧,我承認這是個很無聊的一篇文章,大家就將就點看吧 :)

首先呢,我們都知道Command Prompt 是執行CMD.EXE後就會產生出來的一個畫面,那我們能不能寫個批次檔去執行CMD.EXE又可以執行很多筆指令呢? 答案是可以的,做法就是寫個批次檔,然後透過"雙引號"去把所有指令包起來,指令跟指令中間加入 && 就可以了:


   CMD.EXE  "指令1 && 指令2 && 指令3....&&指令n"

底下就是兩個批次檔的範例,批次檔內會去執行簡單的DOS指令,執行完畢後會出現一個Command Prompt停在那邊。





那大家可能會好奇我用在哪裡? 因為我使用SlickEdit 去編寫BIOS CODE,因為懶惰,所以想說我只要開啟 BUILD TIP底下任何一個檔案,然後按個鈕,我就可以進入到工作目錄並且設定好Visual Studio 的環境讓我可以直接Compiler code....就醬~




※ 上圖可以看到我在SlickEdit 內開啟了一個檔案,叫做NT32Pkg.dsc ,然後我設定了兩個快捷鈕,這兩個快捷鈕可以讓我選擇設定VS2012/VS2010的環境,按下去之後他會幫我呼叫設定環境的批次檔,環境設定好之後會直接幫我進入到NT32Pkg.dsc 目錄(E:\UDK2014.SP1\NT32Pkg),然後我就可以很方便地在Command Prompt內做我要做的事情了。

底下是我在那兩個快捷鍵內的設定值,有分成CMD.EXE的設定方式跟BATCH的方式,差別就只是在於呼叫CMD.EXE去做事情還是自己寫個批次檔,然後呼叫那個批次檔而已。

CMD.EXE的方式:
cmd /E:ON /V:ON /k  ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat" && cd/d "%f\..""


BATCH FILE的方式(除了描述在快捷鈕之外,要多寫一個批次檔):
"C:\Apps\TEST.bat" %f

TEST.bat的內容:
@ECHO OFF
CALL "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
cd/d "%1\.."
CMD.EXE 

上述中的%f 是SlickEdit內的參數,%f = 目前檔案的完整路徑。
以上面的範例來說:

    %f   = e:\UDK2014.SP1\Nt32Pkg\Nt32Pkg
 
最後,我承認科技使用來自於人的惰性,不然也不會有這個冷知識可以分享,哈~