小假期里,总想做点什么。选择了软件关机,重启功能这两个项目。这两个项目都是ACPI
下面的电源管理功能。
首先,搜索电脑实机中的ACPI设备的在PCI中分配的位置,与《ICH9》SPEC上注明的
BUS:0-DEV:31-FUNC:0,结果是一致的。
搜索到的VID=8086,DID=2919。
ACPI基地址的存放位置不是在熟习的10h~13h寄存器里,而是在40h~43h里。我搜索到的
数值是0xD801,bit0=1,说明是I/O口,屏蔽掉bit0,基地址值就是0xD800。
第二步,由 基地址值就是0xD800 + 偏移量,读取ACPI的寄存器图。
读到前面几个寄存器的数值,我填入在上面的SPEC表格中。
我主要是用了这几个寄存器,简单实现了软件关机,软件重启的功能。
我也不想介绍ACPI的复杂原理了,因为自己也是一知半解。
第三步,几个主要的ACPI寄存器功能测试
00h~01寄存器: 当按一下电脑的电源开关时,bit8(PowerButtonStatus)会置1。
02h~03寄存器:发现如果置bit11=0,按电源开关后的30秒准时关机。
08h~0B计算器一直在不断计数。
电脑实机的运行与SPEC相吻合,没有走偏。
第四步,关机。
对04h~07h寄存器写入0x00003c02,电脑即刻关机。
我在桌面下方,临时安排了一个[关机]的按钮,当鼠标点击这个Button时
执行: io_out32( 0xD800+0x04 ,0x00003C02);操作,电脑shutdown。
这里,我省略了执行中的App程序保护,数据保护等等。很单纯就是软件关机。
第五步,重启。
我采用的是对0xcF9口地址写0x06。看到0xcf9口地址,会联想到在搜索PCI的
配置空间时,遇到的一个地址口0xCF8。它们是贴隔壁的邻居。
同样,临时安排了一个[重启]按钮,当鼠标点击这个Button时
执行: io_out8(0xCF9, 0x06);后,电脑就会重启。
上一张静态的桌面图,无法表现实际的关机,重启的动态过程。
下面的电源管理功能。
首先,搜索电脑实机中的ACPI设备的在PCI中分配的位置,与《ICH9》SPEC上注明的
BUS:0-DEV:31-FUNC:0,结果是一致的。
搜索到的VID=8086,DID=2919。
ACPI基地址的存放位置不是在熟习的10h~13h寄存器里,而是在40h~43h里。我搜索到的
数值是0xD801,bit0=1,说明是I/O口,屏蔽掉bit0,基地址值就是0xD800。
第二步,由 基地址值就是0xD800 + 偏移量,读取ACPI的寄存器图。
读到前面几个寄存器的数值,我填入在上面的SPEC表格中。
我主要是用了这几个寄存器,简单实现了软件关机,软件重启的功能。
我也不想介绍ACPI的复杂原理了,因为自己也是一知半解。
第三步,几个主要的ACPI寄存器功能测试
00h~01寄存器: 当按一下电脑的电源开关时,bit8(PowerButtonStatus)会置1。
02h~03寄存器:发现如果置bit11=0,按电源开关后的30秒准时关机。
08h~0B计算器一直在不断计数。
电脑实机的运行与SPEC相吻合,没有走偏。
第四步,关机。
对04h~07h寄存器写入0x00003c02,电脑即刻关机。
我在桌面下方,临时安排了一个[关机]的按钮,当鼠标点击这个Button时
执行: io_out32( 0xD800+0x04 ,0x00003C02);操作,电脑shutdown。
这里,我省略了执行中的App程序保护,数据保护等等。很单纯就是软件关机。
第五步,重启。
我采用的是对0xcF9口地址写0x06。看到0xcf9口地址,会联想到在搜索PCI的
配置空间时,遇到的一个地址口0xCF8。它们是贴隔壁的邻居。
同样,临时安排了一个[重启]按钮,当鼠标点击这个Button时
执行: io_out8(0xCF9, 0x06);后,电脑就会重启。
上一张静态的桌面图,无法表现实际的关机,重启的动态过程。