30天自制操作系统吧 关注:1,380贴子:4,760
  • 15回复贴,共1

在铁娃娃OS上添加软件关机,软件重启功能。

只看楼主收藏回复

小假期里,总想做点什么。选择了软件关机,重启功能这两个项目。这两个项目都是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);后,电脑就会重启。
上一张静态的桌面图,无法表现实际的关机,重启的动态过程。



IP属地:上海1楼2024-04-07 20:50回复
    想再添加一个“待机”功能。
    这个要比关机,重启难,因为还要考虑恢复的过程。现在只完成了前半部的功能,
    即进入sleep的状态。后半部分是按电源开关,屏幕却显示了"resume failure",说明
    中间是丢失了信息。
    上个没有完成"待机"功能的图:

    有空再说,主要的要细读SPEC才行。
    有关机和重启功能,也满足了。
    04.07.


    IP属地:上海2楼2024-04-07 22:12
    回复
      哪里可以下载这个系统,能给个下载链接吗


      IP属地:安徽3楼2024-04-16 08:35
      收起回复
        《添加液晶屏的背光控制功能》
        大致思路是用ICH9中的GPIO输入输出口,控制背灯的开关。我是按类似单片机的I/O口
        去理解GPIO的。 要控制背灯开关,这就要涉及主板上的电路。我没有实验用的笔记本电脑
        (Satellite L21)的主板电路图,只能用手头上的其他型号东芝电脑电路图作参考。每个型号
        的主板上的每个GPIO口的控制对象应该是不一样的,否则ICH9应该有说明的。
        步骤如下:
        1,找到GPIOBaseAddress,它是放在0x48~0x4B寄存器里。

        在搜索PCI设备时,得到0x48~0x4B内的数值是0xEE81。因为bit0=1,表示是I/O
        口,要屏蔽掉。实际GPIO基地址数值为0xEE80。
        2,由GPIOBASE+Offset,得到与GPIO相关的控制寄存器,数据寄存器。见下表:

        解释一下:
        0x00~0x03:是选择作为I/O口使用的设置,32bit对应32个端子,选1表示为I/O口使
        用,选0表示是GPIO的固有的功能,比如A/D转换(测量传感器温度,电池的电压)。
        0x04~0x07:是选择输入或输出的设置。
        0x0C~0x0F:当选择GPIO端子为输出时的电平,1是高电平,0就是低电平。
        表格上的红色文字,是我的电脑实际得到的数值。
        我采取32个I/O全部设置为输出模式,全部输出为高电平,或全部输出为低电平,
        观察有什么变化没有?结果什么变化都没有。
        我不甘心,再看看另外32个GPIO口:
        0x30~0x33:选择作为I/O口使用的设置。
        0x34~0x37:选择输入或输出的设置。
        0x38~0x3B:选择GPIO端子输出时的电平。
        有结果了,当其中的bit24=0时,背灯关闭;bit24=1时,背灯会亮了。
        其他bit的GPIO是些什么功能,我还一无所知。
        3,具体实现办法
        添加一个计时器,当计时达到10分钟后,执行命令:
        io_out32(0xEE80 + 0x38, 0x0CFEFFB3);//bit24=0 LCD off. 背灯关闭。
        桌面上添加一个[背灯]按钮,鼠标点击后,也执行上面那条命令。
        恢复背灯的办法很简单,随便按哪个键后,执行命令:
        io_out32(0xEE80 + 0x38, 0x0DFEFFB3);//bit24=1,LCD on. 背灯点亮。
        4,上一个桌面截图,上面有GPIOBaseAddress数值,GPIOBaseAddress+0x38寄存器的
        内容。

        如果再进行下去,应该还有散热风扇的控制,充电池电压测量,温度传感器测量,音量
        旋钮控制,背光亮度控制等等。因为没有电路图,用摸索的办法,是很花时间的。而且也未
        必能摸索到。
        这次找到背光的控制端子实在是瞎猫刚巧碰上的。
        4.21


        IP属地:上海4楼2024-04-21 22:08
        回复
          厉害啊,这个是不是开源OS路线


          IP属地:安徽5楼2024-04-22 21:58
          回复
            实机(东芝L21)运行的铁娃娃的视频。手机拍摄屏幕,聚焦不太好,麦克风声音偏小。
            视频放在百度网盘。
            链接:https://pan.baidu.com/s/1hCV4gtuJMDqqUvdNqKWHKQ
            提取码:feos


            IP属地:上海7楼2024-04-28 13:11
            收起回复
              FeOS 体验版:
              1,在QEMU虚拟机上使用
              名称:FeosQEMU.img
              特征: XGA 32bit全彩显示。
              功能: mpeg1解码视频,无声卡对应。
              有几个小游戏程序。
              方法:与操作纸娃娃系统相同,文件名改成自己习惯的名称就行了。
              2,在VMware虚拟机上使用
              名称:FeosVM10.img
              特征:XGA 32bit全彩显示。
              功能:有wavplay播放器,运用SB16声卡。我在VMware10虚拟机上通过。
              ~.vmx中要添加一行 sound.virtualDev= "SB16",设置虚拟声卡。
              有几个小游戏程序。
              方法:先安装VMware虚拟机软件。
              链接:https://pan.baidu.com/s/1dpqvkRMHsFIFFqncCUTO4g
              提取码:feos
              注:在操作中,有些细节会出现bug,无视即可。
              2024.05.04


              IP属地:上海8楼2024-05-04 09:30
              回复