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
|
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。
沒有留言:
張貼留言