最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲

[公告2019/01/08] 請注意:我再次重申,部落格文章的程式碼,是要提供各位參考與學習,一旦網頁改版請自行修改,別要求東要求西要我主動修改,你們用我寫東西賺錢了、交差了,請問有分我一杯羹嗎?既然賺錢沒分我,請問有什麼理由要求我修改,如果沒能力改,就花錢來找我上課。

[公告2019/12/01] 若各位有 Excel VBA 案子開發需求,歡迎與我聯繫,可接案處理。

[公告2020/05/22] 頁面載入速度慢,起因為部分JS來源(alexgorbatchev.com)失效導致頁面載入變慢,目前已做調整,請多見諒。

2013年8月14日 星期三

Intel chipset的GPIO 找法

一直想整理有關GPIO的內容,近期又有機會用到,心血來潮順道整理一下,給有需要的人參考,順便也記錄一下相關知識重點,以便未來複習用。
GPIO全名是通用輸出輸入埠(General Purpose Input/Output),是一組可供使用者由程式控制其數位信號IO的接腳。
從Intel 的ICH Chipset到 PCH Chipset,其GPIO Pin找法幾乎如出一轍,直到SOC的 Chipset才有因架構變更而改變,這裡將介紹以PCH Chipset:Intel Intel® 6 Series Chipset and Intel® C200 Series Chipset 來做介紹。
先概略簡述整個操作過程,第 一步找出GPIOBASE,跳至選擇所要的Pin腳(使用GPIO_USE_SELx Register),判斷可否讀寫(使用GP_IO_SELx Register),最後存取指定Pin腳(使用GP_LVLx Register)。
x其為Register Bit對應GPIO Pin的階層(預設為1,在Spec上不會特別去寫),機ˋ本上一個Bit對應一個Pin腳。
x
Bit/Pin range
1
0~31
2
32~63
3
64~95
下面就一步步大領大家找出Intel GPIO Pin的位置,這裡舉例找尋GPIO16與GPIO48的數值。
Step 1. 找出 GPIO Base Address(GPIOBASE)。
在Intel Intel® 6 Series Chipset and Intel® C200 Series Chipset Datasheet中,GPIOBASE位於LPC Interface Bridge Registers表格欄位Offset 0x48~0x4B的位置。

透過RW中Bus0、Dev1F、Fun0 Offset 0x48取一個DWORD的長度,再與0x0000FF80運算得出GPIOBASE真實位址。

Step 2. GPIOBASE其有效位址為Bit7~Bit15,GPIOBASE=0x00000501 & 0x0000FF80 = 0x500。

透過RW IO Spec找出GPIOBASE在機器上對應的位置。

Step 3. 設定GPIO_USE_SEL Register Bit16與GPIO_USE_SEL2 Register Bit48為1,因為1代表可使用GPIO,0代表native function,如不設定則GP_IO_SEL與GP_LVL將無法使用。

GPIO16 :將0x502 (GPIOBASE + 00h + 16 / 8 = 0x502)的bit 0設為1。


GPIO48:將0x532 (GPIOBASE + 30h + (48-32) / 8 = 0x532)的bit 0設為1。


Step 4. 判別GP_IO_SEL Register Bit16與GP_IO_SEL2 Register Bit48的狀態,0為可讀寫,1為唯讀。
GPIO16:判別0x506(GPIOBASE + 04h + 16 / 8 = 0x506) bit0 = 0,為可讀寫的Pin。


GPIO48:判別0x536(GPIOBASE + 34h + (48-32) / 8 = 0x536) bit0 = 0,為可讀寫的Pin。


Step 5. 存取GP_LVL Register Bit16與GP_LVL2 Register Bit48的狀態。
GPIO16:取出0x50E (GPIOBASE + 0Ch + 16 / 8 = 0x50E)的bit0的值。


GPIO48:取出0x53A (GPIOBASE + 38h + (48 -32) / 8 = 0x53A)的bit0的值。


以上是使用RW找出Intel GPIO的方法,有了上述的方法我們是不是可以隨心所欲地修改GPIO呢?答案是錯,因為如果不知道每根Pin的意義,亂修改將會導致系統發生嚴重的錯誤,輕則重開機即可,重則送電腦公司維修,基於以上的情況,部分PC主機板或是NB主機板會將GPIO Control Register設起來,主要是防止上述情況發生,這樣的好處是防止GPIO Pin被亂修改,有關GPIO Control Register可參考LPC Interface Bridge Registers (D31:F0) offset 0x4C bit0。

沒有留言:

張貼留言