1.PCI 配置空间的访问?
PCIe的配置空间访问怎么访问呢?1.当然是0XCF8/0XCFC了,但是其只能访问配置空间的256byte,所以在pci express下还有memory-map方式访问。
-CF8/CFC:
mov dx,0CF8 ;set dx = config address port address
mov eax,80040000 ;enable=1, bus 4, dev 0, Func 0, DW 0
out dx,eax ;set up address port
mov dx,0CFC ; set dx = config data port address
in ax,dx ;2 byte read from config data port
-memory-map
mov ax,[50400000] ;memory-mapped IO read
//这个地址算法:
PCI Express* Config space base address+Bus Number*100000h+Device Number*8000h+Function Number*1000h+Register offset.
*一个pci express的配置空间有FFFH=4Kbyte,所以 memory-mapped IO range需要256*32*8*4=256M大小的空间。
*PCI Express* Config space base address在哪里?HECBASE有定义它的值。这个register怎么去找?看MCH吧,它一样有两种方式去找的。
2..How to access memory SPD by Smbus?
SPD的信息很多很有用的,Smbus上挂的东西还挺多的:Smart battery、thermal senser等
首先得找到Smubus的controller,这就要知道这个controller也是个pci device,计算机架构都从PCI开始延伸展开的,以前是CPU为中心,现在呢?呵呵
1.当PCI scan的时候,怎么去知道这是一个什么device呢?呼呼,看看pci配置空间就知道有个class code的三bytes一项了,就是通过它去判断了: base Class 、sub-class、Programming Interface。每个byte值的具体含义这个你就要查了(http://www.pcidatabase.com/)。
2.看看Offset 20 - 23h它就是SMBUS Base Address Register,(有很多registers 256bytes根本放不了),找到它然后就是大家熟悉的什么base address+offset访问我们需要的东西了。
3.确保SMBus Host Enable bit是打开的,这个bit在Host Configuration Register里,大多数它是在offset 40H。
4.现在我开始关系SMBUS I/O Registers了:Status register、Control register、Command(index) register、Slaver address register、Data register。这些register干嘛的啊,具体看datasheet吧。
5.真多,以前没发现整理资料挺麻烦:
--1.因为SMbus上还有其他Device,所以先要选择对哪一个Device操作(把slave address->Transmit Slave Address寄存器中);SPD的slave address的高4位是固定的,是1010b,跟着的低3位由RAM所在Address决定,最低位用来决定读写,1为读,0为写。
--2.SPD中有256Byte的数据,需要读哪一个的值,就将这个值的offset送到command(index)register中。
--3.对control register下start动作,同时也决定以byte读还是以word读。这一动作执行之后,SMBus会将指定的SPD中的值读到Data register中。
--4.根据status register中的值,判断上一步执行是否成功。
--5.从Data register中读值
3.SMBIOS的理解?
我觉得就是收集系统的各个方面的信息方便其他人获取。。。。。。