BIOS实战之读写逻辑设备(SIO)
前幾天提到了SIO有關的,之前略有研究,不過確實實際只研究過小部分功能,也就做龍芯BIOS的時候參與過SIO的有關編程,因為這個東西筆記本是肯定不會用的,筆記本用EC,這個SIO也就相當于PC板上的EC了,某位大佬既然問了我這些,回去立馬找了份SIO芯片的文檔,仔細看了下,也算查漏補缺了,這篇主要記錄讀寫邏輯設備的原理以及有關編程
咱們還是以IT8738芯片為例子(實際最新的芯片不得而知,手上就這一份SPEC)
下面的代碼未曾實踐過,只是我根據spec寫出來的,沒寫對的煩請指正
邏輯設備號(LDN),LDN在芯片文檔中的配置章節有提到,我們來看下,分別是1、2、3、4、5、6、7、8、A、F、10、11、12、19
之前在SIO相關知識以及Smart Fan的初步實現文章中提到過怎么操作SIO,那么讀寫邏輯設備,咱們先把流程理順一下:
1、進入PNP mode
2、選擇邏輯設備
3、讀取該邏輯設備的寄存器
4、寫該邏輯設備某個寄存器的值
5、退出PNP mode
根據這個流程,我們可以直接寫5個函數:
1、進入PNP mode
void EnterPnpMode(void) {IoWrite8(0x2E, 0x87);IoWrite8(0x2E, 0x01);IoWrite8(0x2E, 0x55);IoWrite8(0x2E, 0x55); ?return; }2、選擇邏輯設備
void SelectLDN (void) {//LDN Selectionunsigned int LDNumber;scanf("%x",&LDNumber);printf("Now LDN:%x",LDNumber);IoWrite8(0x2E,0x07);IoWrite8(0x2F,LDNumber);return; }3、讀取該邏輯設備的寄存器
void ReadLdnRegister(void) {unsigned int row,col;unsigned int addr=0;unsigned int value[16][16];printf("--------------------------------------------------------------\n\n");printf("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");for(row=0;row<16;row++){for(col=0;col<16;col++){IoWrite8(0x2E,addr);value[row][col]=IoRead8(0x2F);if(value[row][col]<16){printf("0%X ",value[row][col]);}else{ printf("%x ",value[row][col]);}addr++;}printf("\n");}return; }4、寫該邏輯設備的某個寄存器值
void WriteLdnRegister(void) {char order;unsigned int index,data;printf("Do you need to write registers? YES please intput W NO input Q:"); scanf("%c",&order); if(order == 'W'){printf("Please input Index:");scanf("%x",&index);printf("Please input Data:");scanf("%x",&data);IoWrite8(0x2E,index);Iowrite8(0x2F,data);} else{printf("Exit write ld reg:");return;}return; }5、退出Pnp mode
void ExitPnpMode (void) {unsigned int ?RegData = 0;IoWrite8(0x2E, 0x02);RegData = IoRead8(0x2F) | BIT1;IoWrite8(0x2E, 0x02); ?IoWrite8(0x2F, RegData);return; }ok,有了上述的函數,我們就可以寫main函數了,整體的不寫了,很容易,怎么組合怎么寫,反正得在這個邏輯內,先進PNP mode,中間選擇LDN,才能讀寫寄存器,最后退出,總體就是這樣吧。
總結
以上是生活随笔為你收集整理的BIOS实战之读写逻辑设备(SIO)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遇见CUBA CLI
- 下一篇: OpenStack----Nova 计算