高精度定时器HPET和I/O APIC一样,用的是内存映射,映射的地址保存在BIOS提供的ACPI表格中
我们首先来获取这个地址
获取HPET的I/O内存地址
先来看一下文档的30-31页:
关键就是那个表格,我们先把他写成C语言的形式
(注意:部分内容在上一篇中已经提过,不再重复了,参见http://blog.csdn.net/goodqt/article/details/15337067)
typedef struct ACPIHeaderHpet{
ACPIHeader header;
u32 eventTimerBlockID;
ACPIAddressFormat baseAddress;
u8 hpetNumber;
u16 minTickInPeriodicMode;
u8 attribute;
} __attribute__ ((packed)) ACPIHeaderHpet;
typedef struct ACPIAddressFormat{
u8 addressSpaceID;
u8 registerBitWidth;
u8 registerBitOffset;
u8 reserved;
u64 address;
} __attribute__ ((packed)) ACPIAddressFormat;
对照上面的表格看吧
有了这个,下一步就很好写了
static int parseDT(ACPIHeader *dt)
{
u32 signature = dt->signature;
char signatureString[5];
memcpy((void *)signatureString,(const void *)&signature,4);
signatureString[4] = '\0';
printk("Found device %s from ACPI.\n",signatureString);
if(signature == *(u32 *)"APIC")
parseApic((ACPIHeaderApic *)dt);
else if(signature = *(u32 *)"HPET")
parseHpet((ACPIHeaderHpet *)dt);
return 0;
}
找到HPET的表格
static int parseHpet(ACPIHeaderHpet *hpet)
{
char temp[20];
temp[0] = '0';
temp[1] = 'x';
pointer address = (pointer)hpet->baseAddress.address;
hpetAddress = (u8 *)pa2va(address);
itoa(address,temp + 2,0x10,16,'0',1);
printk("\nFound HPET:Address => %s.\n&