<BR> 在VORTEX86上可供使用的CMOS RAM的預(yù)留空間為48字節(jié),用戶可用匯編或C語(yǔ)言編程來(lái)<BR> 使用這些空間。端口地址為70H~71H。<BR> 在VORTEX86中,因端口70H的第7位為NMI的屏蔽位,所以最大的定址范圍為7FH (128 bytes)。<BR> 另一個(gè)128bytes,我們可通過(guò)PCI BIOS的功能來(lái)使用位于RTC SRAM高端的128 bytes,以下演示<BR> 程式介紹如何打開(kāi)、關(guān)閉高端的128 bytes。<BR> 使能高端的128 bytes<BR> 在使用RTC SRAM高端的128 bytes時(shí),我們需要設(shè)置RTC控制暫存器第7位的LPC橋控制暫存<BR> 器。LPC橋控制暫存器的端口號(hào)是1039H,驅(qū)動(dòng)位址為0008H,RTC控制暫存器的端口為48H。<BR> ReadCMOS()/WriteCMOS()<BR> 我們提供兩個(gè)函數(shù)ReadCMOS()/WriteCMOS(),方便用戶讀寫(xiě)CMOS RAM。在VORTEX86<BR> 的CMOS RAM中還剩余48 bytes,地址從0~47,可供用戶編程自由讀寫(xiě)。<BR> C 語(yǔ)言源代碼<BR> #include <stdio.h><BR> #include <conio.h><BR> #define PCI_BIOS_INTERRUPT 0x1A<BR> #define PCI_BIOS_FUNCTION_ID 0xB1<BR> #define PCI_BIOS_PRESENT 0x01<BR> #define PCI_BIOS_FIND_DEVICE 0x02<BR> #define PCI_BIOS_READ_CONFIG_BYTE 0x08<BR> #define PCI_BIOS_READ_CONFIG_WORD 0x09<BR> #define PCI_BIOS_WRITE_CONFIG_BYTE 0x0B<BR> #define PCI_BIOS_WRITE_CONFIG_WORD 0x0C<BR> unsigned char _cBusNum;<BR> unsigned char _cDeviceNum;<BR> char IsPciBiosPresent();<BR> char PciBios_FindDevice(unsigned nVenderID, unsigned nDeviceID, int nIndex,<BR> unsigned char *pcBusNum, unsigned char *pcDeviceNum);<BR> unsigned int PciBios_ReadWord (char cBusNum, char cDeviceNum, int nOffset);<BR> unsigned char PciBios_ReadByte (char cBusNum, char cDeviceNum, int nOffset);<BR> char PciBios_WriteByte(char cBusNum, char cDeviceNum, int nOffset,<BR> unsigned char cvalue);<BR> /*<BR> 可供使用的VORTEX86 CMOS RAM的預(yù)留空間為48 bytes<BR> 用ReadCmos() 和 WriteCmos()函數(shù)來(lái)操作48 bytes,地址從(00h-2fh)<BR> 使用函數(shù)將幫助你讀寫(xiě)CMOS RAM,共48 bytes .<BR> */<BR> unsigned char ReadCMOS(unsigned char cIdx)<BR> {<BR> unsigned char c;<BR> if(cIdx>=0x2f)<BR> return 0;<BR> /* 設(shè)置RTC控制暫存器,使能RTC SRAM高端的128 bytes */<BR> PciBios_WriteByte(_cBusNum,_cDeviceNum,0x48,PciBios_ReadByte(_cBusNum,_cDeviceNum,0x4<BR> 8)|0x80);<BR> outp(0x70,0x50+cIdx);<BR> c = inp(0x71);<BR> /*清除RTC控制暫存器的第7位,關(guān)閉RTC SRAM 高端的128 bytes */<BR> PciBios_WriteByte(_cBusNum,_cDeviceNum,0x48,PciBios_ReadByte(_cBusNum,_cDeviceNum,0x4<BR> 8)&0x7f);<BR> return c;<BR> }<BR> void WriteCMOS(unsigned char cIdx,unsigned char cvalue)<BR> {<BR> if(cIdx>=0x2f)<BR> return;<BR> /*設(shè)置RTC控制暫存器的第7位,使能RTC SRAM 高端的128 bytes */<BR> PciBios_WriteByte(_cBusNum,_cDeviceNum,0x48,PciBios_ReadByte(_cBusNum,_cDeviceNum,0x4<BR> 8)|0x80);<BR> outp(0x70,0x50+cIdx);<BR> outp(0x71,cvalue);<BR> /* Clear bit 7 of RTC control register to disable upper 128 bytes RTC SRAM */<BR> PciBios_WriteByte(_cBusNum,_cDeviceNum,0x48,PciBios_ReadByte(_cBusNum,_cDeviceNum,0x4<BR> 8)&0x7f);<BR> }<BR> void main()<BR> {<BR> int i;<BR> unsigned char cBusNum, cDeviceNum;<BR> /* 檢測(cè) PCI BIOS */<BR> if(!IsPciBiosPresent())<BR> {<BR> printf("Unable to find PCI BIOS.\n");<BR> return;<BR> }<BR> /*找端口號(hào)和驅(qū)動(dòng)器地址 */<BR> PciBios_FindDevice(0x1039,0x0008,0,&cBusNum,&cDeviceNum);<BR> /* 測(cè)試函數(shù)*/<BR> WriteCMOS(13,0x55);<BR> printf("Read the value we wrote: %x\n",ReadCMOS(13));<BR> }<BR> char IsPciBiosPresent()<BR> {<BR> char cRet;<BR> asm {<BR> mov ah, PCI_BIOS_FUNCTION_ID<BR> mov al, PCI_BIOS_PRESENT<BR> int PCI_BIOS_INTERRUPT<BR> mov cRet, ah<BR> }<BR> return !cRet;<BR> }<BR> char PciBios_FindDevice(unsigned nVenderID, unsigned nDeviceID, int nIndex,<BR> unsigned char *pcBusNum, unsigned char *pcDeviceNum)<BR> {<BR> unsigned char cRet, cBus, cDevice;<BR> asm {<BR> mov ah, PCI_BIOS_FUNCTION_ID<BR> mov al, PCI_BIOS_FIND_DEVICE<BR> mov cx, nDeviceID<BR> mov dx, nVenderID<BR> mov si, nIndex<BR> int PCI_BIOS_INTERRUPT<BR> mov cRet, ah<BR> mov cBus, bh<BR> mov cDevice, bl<BR> }<BR> *pcBusNum = cBus;<BR> *pcDeviceNum = cDevice;<BR> return !cRet;<BR> }<BR> unsigned int PciBios_ReadWord(char cBusNum, char cDeviceNum, int nOffset)<BR> {<BR> unsigned char cRet;<BR> unsigned int nData;<BR> nOffset &= 0xFFFE;<BR> asm {<BR> mov ah, PCI_BIOS_FUNCTION_ID<BR> mov al, PCI_BIOS_READ_CONFIG_WORD<BR> mov bh, cBusNum<BR> mov bl, cDeviceNum<BR> mov di, nOffset<BR> int PCI_BIOS_INTERRUPT<BR> mov cRet, ah<BR> mov nData, cx<BR> }<BR> if(cRet)<BR> return -1;<BR> return nData;<BR> }<BR> unsigned char PciBios_ReadByte(char cBusNum, char cDeviceNum, int nOffset)<BR> {<BR> unsigned char data, cRet;<BR> asm{<BR> mov ah, PCI_BIOS_FUNCTION_ID<BR> mov al, PCI_BIOS_READ_CONFIG_BYTE<BR> mov bh, cBusNum<BR> mov bl, cDeviceNum<BR> mov di, nOffset<BR> int PCI_BIOS_INTERRUPT<BR> mov cRet, ah<BR> mov data, cl<BR> }<BR> if(cRet)<BR> return -1;<BR> return data;<BR> }<BR> char PciBios_WriteByte(char cBusNum, char cDeviceNum, int nOffset, unsigned char cvalue)<BR> {<BR> unsigned char cRet;<BR> asm {<BR> mov ah, PCI_BIOS_FUNCTION_ID<BR> mov al, PCI_BIOS_WRITE_CONFIG_BYTE<BR> mov bh, cBusNum<BR> mov bl, cDeviceNum<BR> mov di, nOffset<BR> mov cl, cvalue<BR> int PCI_BIOS_INTERRUPT<BR> mov cRet, ah<BR> }<BR> return !cRet;<BR> }<BR> 技術(shù)支持<BR> 如果你想獲得更多的技術(shù)支持,請(qǐng)登陸我們的網(wǎng)站:<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=http://www.dmp.com.cn> http://www.dmp.com.cn</a>。<BR> 或給我們發(fā)郵件:mailto:tech@dmp.com.cn。</P><P> 詳情點(diǎn)擊;<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=http://www.icop.com.cn/tech/dmp-hw/bios/Use_Free_Space_in_AMI_BIOS_on_M6117D.pdf> http://www.icop.com.cn/tech/dmp-hw/bios/Use_Free_Space_in_AMI_BIOS_on_M6117D.pdf</a>
|