小華的部落格: 2MB SPI Flash Part

搜尋此網誌

網頁

星期四, 1月 24, 2008

2MB SPI Flash Part

這幾天為了換2MB 的SPI Flash part 真的有夠緊張的,因為急著要給產線使用,因此要在3天內把BIOS code porting 好,今天剛好把code給改好了,所以順便留下筆記給自己以後參考。

檢查項目:

1. ICH 能不能把Cycle 轉送到SPI/LPC ,預設是PCI
2.ICH 轉送的位址範圍是否支援到2MB
預設為PCI時,CPU cycle會轉送到 PCI Bus從4G頂端往下 4MB,如果改成轉送到 SPI/LPC時,需設定D0/D8暫存器,並且選擇哪一個Range需要被轉送到LPC/SPI 介面 (即BIOS Size,或Mapping 大小)。

3.EC 是否能支援到2MB ,華x 的EC chip需設定其內部暫存器,一共3個,分別是:
(1) 控制BIOS size大小的暫存器(i386 mode)
(2) SPI 暫存器 (告知EC底下的SPI Flash Part的大小)
(3)??? 暫存器(忘記叫啥名稱了,設定值需要跟BIOS size設定的一樣)

4. 目前是使用SPI cmd去Write/Erase ,但是讀取的時候是使用mapping方式,也就是直接存取線性位址內的資料就可以讀取到BIOS ROM內的資料(其他的就是HW動作做掉,當CPU讀取線性位址時,會把位址轉給LPC介面下的EC,EC內的LPC 介面會有SHM介面,此介面會把此位址訊號轉成SPI實體位址,並透過SPI Controller將資料讀取出來,所以這部份是EC支援),除了這個方式外,還可以自己撰寫SPIRead() routine,不過一般BIOS從Power on開始,這個Routine都還不能執行,因此Power on後,都是EC負責把BIOS ROM資料Mapping 到線性位址。

ex:

線性位址方式讀取BIOS ROM資料 : Memcpy (buffer , address , size);
SPI cmd方式讀取BIOS ROM資料 : SPIRead(buffer,address,size);

void SPIRead(...)
{
SPITransfer(OPCODE=Read , buffer , address,size);
}

11 則留言:

匿名 提到...

分享一下自己對於SPI的經驗:原公司在最新一代的南橋產品中加入了SPI controller.剛好那時沒事,便被assigned去寫FPGA的測試程式,以便測試SPI的所有功能.

1.先談SPI ROM.SPI ROM就其名稱而言是serial interface.現在很多的spec都主打 serial transfer,並且使用高頻率來當作clock. ROM本身的基本運作就是三個:erase,read,and write.

當erase時,所有的SPI ROM 內部的 array都被設為"1".所以,erase完後可以檢查:是否所有的bit=1以確定 erase ok.

當write時,是只能將原本是1的部分寫成0.(可以想成:one AND gate,2 inputs一為 "1",另一為Data)

2.次談Controller部分.Controller的實作基本上比一般的複雜,因為考慮到相容性的問題.

在執行SPI access時,基本的sequence is:
a.prepare command,address
b.start transfer !
c.check status

If Read,則等status完畢,直接去H/W register讀取其可.

If Write,則要特別注意:除了需要檢查 host的status外(代表command打出去了),還要檢查 device端的status(因為,對於ROM言,將資料寫到 array 需要時間) ! 總而言之,有2 status要檢查,否則必出錯.

*ROM本身有status register可供讀取.

3.BIOS在開機過程中會 access SPI ! 因此,必須提供四個東西給BIOS,以便在access時可以順利:
a. SPI ROM attribute
b. SPI erase routine
c. SPI write routine
d. SPI read routine

*要注意:因為 SPI erase size若太大,將可能意外erase到原有BIOS內有用的資料,導致 system hang during POST...

4.SPI ROM有可能直接接在SB,或是接在EC下;此時,需要研讀EC spec知道SPI access method.一般都比內建在SB內的 controller簡易.

匿名 提到...

小華您好^^~我有一個問題想請教您,就是我手邊有一塊板子,上面有SPI_Header。這塊板子的南橋原本就有RAID0/1的功能,但被鎖住了只能使用RAID1,應該是廠商故意的,不知是否有方法能enable RAID 0的功能呢?謝謝您~

小華的部落格 提到...

1.我沒用做過 RAID, 所以我不清楚那部份的資訊。

2.我接觸的 Platform 中 SPI 存取保護有兩層,一層是南僑SPI Controller,另一層是各家廠商的SPI Flash Part,這邊說的保護是指Lock/Unlock 以及權限...等(我自己分類的)。

3.SPI Controller對SPI Flash Part存取時的保護方式可以由南僑提供的文件中知道做法(我接觸的是Inxxl,他是屬於保密文件所以我也沒辦法詳細跟你說做法,你可以自己參考一下文件)。

4.SPI Flash Part部分則是看Flash Part廠商的Datasheet中就會說明,一般就是透過Status Registers 去Lock/Unlock某些Blocks。

5.我不清楚你是使用哪個南僑,而你說的SPI_Header是指Flash Descriptor嗎?

我是建議你從SPI Controller下手,理論上這部分應該會很詳細的去說明R/W方式,所以你只要把設定打開然後送正確的OPCODE給SPI Flash Part應該就可以了。

其他詳細的細節像是Write Enable...等就要參考實際電路跟Datasheet我才能給你建議了^^! 希望個人的一些小資訊能幫的上你的忙。

Unknown 提到...

Hi 小華,
也是要請教一下 SPI 的問題,南橋是 ICH7,BIOS flash 接在 LPC,SPI 接了一個 256K 的 FRAM。要寫 FRAM 的測試程式,因為第一次接觸 SPI BUS,雖然 Datasheet 都有說明每個暫存器和 OP-Code,但是沒有相關的 porting guide,例如填寫暫存器的順序,偵測狀態流程等等。請問哪裡有相關資料可以參考,或是可以簡易教學一下 SPI R/W function。

小華的部落格 提到...

1.如果你是BIOS工程師且你是使用EFI 的程式碼,裡面有C的範例程式可以去讀寫ICH上面的SPI Flsah part,如果要實做成DOS版的Ap的話,你必須先開啟Bigreal mode之後才能對SPI功能暫存器讀寫。

2.如果你不是BIOS工程師,而你又想要純K ICH Spec去做的話也可以,不過要花一些時間,因為你要花一些時間去了解如何控制Controller (其實都寫在Spec內了),目前我是使用ㄧ次Read 64bytes到一塊記憶體Buffers 的方式來做的,ㄧ次就是讀64 bytes,然後位址往下加後再讀64 bytes..一直到讀完你要的size為止,你可以看ICH Spec ,他會有提到去哪邊下指令,然後去哪個暫存器讀出來。

匿名 提到...

想問一下關于SPI Descriptor Mode的問題..
我想有支持descriptor mode的BIOS應該在最低的地阯offset0處有signature 0FF0A55Ah,而ICH在檢測到這個有傚到signature,就會切到descriptor mode; 否則就是legacy mode,即從高位阯到reset vector處開機。
而flash descriptor最大size為4KB,其中包含到一個叫做master region的東西可以對BIOS的各個位置進行讀寫保護設置。
現在我的問題是:這一塊flash descriptor能不能對他進行寫操作呢?比如我要update BIOS的話可不可以刷掉這一塊?具體步驟是什么呢?
我有註意到spec上提到若將GPIO33拉low就可以不管flash descriptor,從而可以全部刷掉。不知道大大有沒有接觸過這個問題?還有沒有別的方法呢?

小華的部落格 提到...

這部分是Intel的東西,我沒辦法在BLOG跟你說,不過我建議你去看看ME/AMT的東西,然後下載他的工具自己玩一下就會知道了!

匿名 提到...

Hi! Harrison:
您好! 目前有遇到一個問題是在efi bios開機過程中抓不到flash part!! (read ID fail) 我無法mapping 到spi的command and status port. 也就是說我看到page 000FFD00 and FFFFFD00是一模一樣的 看起來好像是big real mode 沒開. 可是EFI bios 不是已經跑在protect mode了ㄇㄚ?? 3Q :)

FLASH 提到...

小华,
我们专做华邦的SPI,有自已的封装厂,容量从2M-32M,如有需要请联系。

QQ:5033 17006
MSN:66kitty@163.com

探索者 提到...

你好看到你提到操作SPI FLASH后,想问个问题呢,我现在是设置ICH10 的OPMENU里设置咯访问FLASH的操作码,当然OPTYPE也对应设置,在OPERA中放入咯使能写操作码,然后就是设置SSFC—Software Sequencing Flash Control Register来控制指令发

当我在使用块擦除FLASH时只能擦BLOCK 0 其他BLOCK都檫不成功,但用FLASH的全擦指令是能把整个FLASH檫掉咯

还有写指令只能写BLOCK的前面一部分,后面部分写不成功



是我考虑的ICH里的寄存器里少设置咯吗,还是什么原因出现这种情况的如果你感觉不方便在这里回答,麻烦给我发个EMAIL:
binghuo70@126.com麻烦大侠咯

匿名 提到...

小華您好,我現在用的SPI是直接接在SB。我現在要write資料進去會發生問題。
我的步驟:
1. 將ADDR和要輸入的DATA設好
2. OPCODE和type填好
3. data cycle 和 data count也設好
4. 將bit GO設為一
就會出現error
我想請教的是 在write data之前要注意甚麼嗎?protection?或是command後面需不需要跟address?
謝謝