Jump to content
Sign in to follow this  
Followers 0
Slice

Different sensors projects

49 posts in this topic

Recommended Posts

1 hour ago, Mike Ranger said:

Thanks all for clarifying. I can confirm that the new Super I/O is really working great. All is missing is the link to the well known Apps like Istat for example.

The question is really if I understood you correctly:

 

How to close that bridge from the raw data Super I/O to, for example IStat, which most Mac/Hack users have installed and using. I think the main reason that not more users have switched to VirtualSMC is exactly that reason.... and sorry for stating that in this thread....hope it is not off-topic.

 

If I officially submit that as a request, where would that go.... into the VirtualSMC one?

 

Thanks again, Mike

to support sensors in iStat Menus you need to write help@bjango.zendesk.com, maybe they will agree to consider this possibility.

Share this post


Link to post
Share on other sites
Advertisement
Quote

to support sensors in iStat Menus you need to write help@bjango.zendesk.com, maybe they will agree to consider this possibility.

 

I am pretty certain they will not.

The FakeSMC Sensor Kexts are programmed so that Apps like Istat can work with the data.

 

I wanted to share my perspective that the main reason VirtualSMC together with the provided Sensor-Kexts is not used by more users due to the lack of providing sensor information that can be used by e.g. Istat.

I tried to communicate here what I have read in numerous forums why people stick with FakeSMC plus Sensors. For me this is working perfectly fine and also the reason why I have not switched to VirtualSMC.

 

My point is what currently hinders adoption of VirtualSMC plus Sensor.kexts it that missing link to Istat. And there seems no appetite by any developers to start implementing any drivers. For this reason, VirtualSMC will probably not be used by many Hackintosh users for the time being, until that changes.

 

 

 

Share this post


Link to post
Share on other sites

iStat implements support for HWSensors sensors by explicitly detecting FakeSMC kext presence and using a dedicated SMC key mapping for it. It is up to them whether to also add support for Acidanthera sensors, but for obvious reasons we will not create a FakeSMC service in I/O Registry or add HWSensors SMC keys.

 

Share this post


Link to post
Share on other sites

@vit9696: gotcha..... I think you will  agree that adoption of VirtualSMC&Sensors  will not really happen unless happy Istat users (like myself) have a solution. I am not proposing who should implement this solution, just saying that FakeSMC will remain most Hack-Users choice for that reason.

 

 

Share this post


Link to post
Share on other sites
On 1/8/2020 at 8:44 AM, Mike Ranger said:

So I can confirm that everything works.... 

In order to get more functionality, I would have to create a DSDT for the LCP  sensors. The problem I have however is, that looking through my DSDT, I have no good idea how to translate this info correctly.

I will try to better understand.

Hi @Mike Ranger if you manage to create a working SSDT-xxx for LCP sensors, please can you share it? I would also need to create one and I also do not know where to start from nor how to structure the ACPI code inside... thank you!

Share this post


Link to post
Share on other sites

I have SuperIO chip (Winbond) registers in DSDT and yes, it is possible to read Voltages, FANs and Temps from here

but this part of code is not available in all the DSDTs

OperationRegion (HWRE, SystemIO, IOHW, 0x0A)
        Field (HWRE, ByteAcc, NoLock, Preserve)
        {
            Offset (0x05), 
            HIDX,   8, 
            HDAT,   8
        }

        IndexField (HIDX, HDAT, ByteAcc, NoLock, Preserve)
        {
            Offset (0x04), 
            CHNM,   1, 
            CFNM,   1, 
            CHNS,   2, 
            CFNS,   2, 
            Offset (0x05), 
            SYST,   8, 
            TRGT,   8, 
            Offset (0x08), 
            SSDN,   8, 
            CSDN,   8, 
            SSUP,   8, 
            CSUP,   8, 
            Offset (0x20), 
            VCOR,   8, 
            V12V,   8, 
            Offset (0x23), 
            V33V,   8, 
            Offset (0x25), 
            V50V,   8, 
            Offset (0x27), 
            MBTE,   8, 
            FAN1,   8, 
            FAN2,   8, 
            FAN3,   8, 
            Offset (0x3F), 
            CFN3,   8, 
            Offset (0x47), 
            FDR1,   8, 
            Offset (0x4B), 
            FD13,   8, 
            FD15,   8, 
            Offset (0x4E), 
            BSEL,   3, 
            Offset (0x4F), 
            Offset (0x50), 
            TSR1,   8, 
                ,   7, 
            TSR2,   1, 
            Offset (0x53), 
            FAN4,   8, 
            Offset (0x59), 
            FND4,   8, 
            Offset (0x5D), 
            FD21,   8
        }
    }

 

Share this post


Link to post
Share on other sites

@MacKonstiI have a working solution with FakeSMC and Sensors. I would gladly switch to VirtualSMC but however I understand too little how to implement a solution that would work with Istat.

 

 

Share this post


Link to post
Share on other sites
1 hour ago, Mike Ranger said:

@Rodion2010

Can you give more context for your DSDT?

What do you achieve with it?

Thanks, Mike

Sample SSDT to read from SuperIO for ACPI.kext (HWsensors3)

/*
 * Intel ACPI Component Architecture
 * AML/ASL+ Disassembler version 20200110 (64-bit version)
 * Copyright (c) 2000 - 2020 Intel Corporation
 * 
 * Disassembling to symbolic ASL+ operators
 *
 * Disassembly of iASLrFLzrb.aml, Tue Jan 14 11:57:21 2020
 *
 * Original Table Header:
 *     Signature        "SSDT"
 *     Length           0x00000CCA (3274)
 *     Revision         0x01
 *     Checksum         0x19
 *     OEM ID           "APPLE"
 *     OEM Table ID     "SSDT-MON"
 *     OEM Revision     0x00000001 (1)
 *     Compiler ID      "INTL"
 *     Compiler Version 0x20190509 (538510601)
 */
DefinitionBlock ("", "SSDT", 1, "APPLE", "SSDT-MON", 0x00000001)
{
    External (_SB_.PCI0.LPCB, DeviceObj)

    Name (IOHW, 0x0290)
    Scope (_SB.PCI0.LPCB)
    {
        Device (SIOR)
        {
            Name (_HID, EisaId ("PNP0C02") /* PNP Motherboard Resources */)  // _HID: Hardware ID
            Method (HWV0, 0, NotSerialized)
            {
                Return ((VCOR * 0x08))
            }

            Method (HWV1, 0, NotSerialized)
            {
                Return ((V12V * 0x08))
            }

            Method (HWV3, 0, NotSerialized)
            {
                Return ((V33V * 0x08))
            }

            Method (HWV5, 0, NotSerialized)
            {
                Return ((V50V * 0x08))
            }

            Method (HWT0, 0, NotSerialized)
            {
                Local1 = MBTE /* \_SB_.PCI0.LPCB.SIOR.MBTE */
                Local1 *= 0x0A
                Return (Local1)
            }

            Method (HWT1, 0, NotSerialized)
            {
                BSEL = One
                Local1 = TSR1 /* \_SB_.PCI0.LPCB.SIOR.TSR1 */
                Local1 *= 0x0A
                Local2 = TSR2 /* \_SB_.PCI0.LPCB.SIOR.TSR2 */
                Local2 *= 0x05
                Local1 += Local2
                Return (Local1)
            }

            Method (HWF0, 0, NotSerialized)
            {
                Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                BSEL = Zero
                Local1 = (FD21 & 0x20)
                Local1 >>= 0x05
                Local1 *= 0x04
                Local2 = (FDR1 & 0x30)
                Local2 >>= 0x04
                Local1 += Local2
                If (((Local1 > 0x05) || (Local1 < 0x02)))
                {
                    If ((Local0 > 0xF0))
                    {
                        Local1 = 0x02
                    }
                    ElseIf ((Local0 < 0x1E))
                    {
                        Local1 = 0x05
                    }
                    Else
                    {
                        Local1 = 0x03
                    }

                    Divide (Local1, 0x04, Local2, Local3)
                    Local3 <<= 0x05
                    Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                    Local4 &= 0xDF
                    FD21 = (Local3 | Local4)
                    Local4 = FDR1 /* \_SB_.PCI0.LPCB.SIOR.FDR1 */
                    Local4 &= 0xCF
                    Local2 <<= 0x04
                    Local4 |= One
                    FDR1 = (Local4 | Local2)
                }

                While ((((Local0 > 0xF0) && (Local1 < 0x05)) || ((Local0 < 
                    0x1E) && (Local1 > 0x02))))
                {
                    If (((Local0 > 0xF0) && (Local1 < 0x05)))
                    {
                        Local1 += One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x05
                        Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                        Local4 &= 0xDF
                        FD21 = (Local3 | Local4)
                        Local4 = FDR1 /* \_SB_.PCI0.LPCB.SIOR.FDR1 */
                        Local4 &= 0xCF
                        Local2 <<= 0x04
                        Local4 |= One
                        FDR1 = (Local4 | Local2)
                        Sleep (0x32)
                        Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                        Sleep (0x32)
                        Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                        Sleep (0x32)
                        Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                    }
                    Else
                    {
                        Local1 -= One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x05
                        Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                        Local4 &= 0xDF
                        FD21 = (Local3 | Local4)
                        Local4 = FDR1 /* \_SB_.PCI0.LPCB.SIOR.FDR1 */
                        Local4 &= 0xCF
                        Local2 <<= 0x04
                        Local4 |= One
                        FDR1 = (Local4 | Local2)
                        Sleep (0x32)
                        Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                        Sleep (0x32)
                        Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                        Sleep (0x32)
                        Local0 = FAN1 /* \_SB_.PCI0.LPCB.SIOR.FAN1 */
                    }
                }

                If (((Local0 == 0xFF) && (Local1 == 0x05)))
                {
                    Return (Zero)
                }

                If (((Local0 == Zero) && (Local1 == 0x02)))
                {
                    Return (0xFFFF)
                }

                Local2 = One
                While (Local1)
                {
                    Local2 *= 0x02
                    Local1--
                }

                Local0 *= Local2
                Divide (0x00149970, Local0, Local1, Local0)
                Return (Local0)
            }

            Method (HWF1, 0, NotSerialized)
            {
                BSEL = Zero
                Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                Local1 = (FD21 & 0x40)
                Local1 >>= 0x06
                Local1 *= 0x04
                Local2 = (FDR1 & 0xC0)
                Local2 >>= 0x06
                Local1 += Local2
                If (((Local1 > 0x05) || (Local1 < 0x02)))
                {
                    If ((Local0 > 0xF0))
                    {
                        Local1 = 0x02
                    }
                    ElseIf ((Local0 < 0x1E))
                    {
                        Local1 = 0x05
                    }
                    Else
                    {
                        Local1 = 0x03
                    }

                    Divide (Local1, 0x04, Local2, Local3)
                    Local3 <<= 0x06
                    Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                    Local4 &= 0xBF
                    FD21 = (Local3 | Local4)
                    Local4 = FDR1 /* \_SB_.PCI0.LPCB.SIOR.FDR1 */
                    Local4 &= 0x3F
                    Local2 <<= 0x06
                    Local4 |= One
                    FDR1 = (Local4 | Local2)
                }

                While ((((Local0 > 0xF0) && (Local1 < 0x05)) || ((Local0 < 
                    0x1E) && (Local1 > 0x02))))
                {
                    If (((Local0 < 0x1E) && (Local1 > 0x02)))
                    {
                        Local1 -= One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x06
                        Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                        Local4 &= 0xBF
                        FD21 = (Local3 | Local4)
                        Local4 = FDR1 /* \_SB_.PCI0.LPCB.SIOR.FDR1 */
                        Local4 &= 0x3F
                        Local2 <<= 0x06
                        Local4 |= One
                        FDR1 = (Local4 | Local2)
                        Sleep (0x32)
                        BSEL = Zero
                        Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                        Sleep (0x32)
                        Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                        Sleep (0x32)
                        Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                    }
                    Else
                    {
                        Local1 += One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x06
                        Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                        Local4 &= 0xBF
                        FD21 = (Local3 | Local4)
                        Local4 = FDR1 /* \_SB_.PCI0.LPCB.SIOR.FDR1 */
                        Local4 &= 0x3F
                        Local2 <<= 0x06
                        Local4 |= One
                        FDR1 = (Local4 | Local2)
                        Sleep (0x32)
                        BSEL = Zero
                        Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                        Sleep (0x32)
                        Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                        Sleep (0x32)
                        Local0 = FAN2 /* \_SB_.PCI0.LPCB.SIOR.FAN2 */
                    }
                }

                If (((Local0 == 0xFF) && (Local1 == 0x05)))
                {
                    Return (Zero)
                }

                If (((Local0 == Zero) && (Local1 == 0x02)))
                {
                    Return (0xFFFF)
                }

                Local2 = One
                While (Local1)
                {
                    Local2 *= 0x02
                    Local1--
                }

                Local0 *= Local2
                Divide (0x00149970, Local0, Local1, Local0)
                Return (Local0)
            }

            Method (HWF2, 0, NotSerialized)
            {
                Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                BSEL = Zero
                Local1 = (FD21 & 0x80)
                Local1 >>= 0x07
                Local1 *= 0x04
                Divide (FD13, 0x40, Local2, Local3)
                Local1 += Local3
                If (((Local1 > 0x05) || (Local1 < 0x02)))
                {
                    If ((Local0 > 0xF0))
                    {
                        Local1 = 0x02
                    }
                    ElseIf ((Local0 < 0x1E))
                    {
                        Local1 = 0x05
                    }
                    Else
                    {
                        Local1 = 0x03
                    }

                    Divide (Local1, 0x04, Local2, Local3)
                    Local3 <<= 0x07
                    Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                    Local4 &= 0x7F
                    FD21 = (Local3 | Local4)
                    Local3 = FD13 /* \_SB_.PCI0.LPCB.SIOR.FD13 */
                    Local3 &= 0x3F
                    Local2 *= 0x40
                    Local2 += Local3
                    FD13 = Local2
                }

                While ((((Local0 > 0xF0) && (Local1 < 0x05)) || ((Local0 < 
                    0x1E) && (Local1 > 0x02))))
                {
                    If (((Local0 > 0xF0) && (Local1 < 0x05)))
                    {
                        If ((Local0 == 0xFF))
                        {
                            Local1 = 0x05
                        }
                        Else
                        {
                            Local1 += One
                        }

                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x07
                        Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                        Local4 &= 0x7F
                        FD21 = (Local3 | Local4)
                        Local3 = FD13 /* \_SB_.PCI0.LPCB.SIOR.FD13 */
                        Local3 &= 0x3F
                        Local2 *= 0x40
                        Local2 += Local3
                        FD13 = Local2
                        If ((Local0 != 0xFF))
                        {
                            Sleep (0x32)
                        }

                        Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                        Sleep (0x32)
                        Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                        Sleep (0x32)
                        Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                    }
                    Else
                    {
                        Local1 -= One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x07
                        Local4 = FD21 /* \_SB_.PCI0.LPCB.SIOR.FD21 */
                        Local4 &= 0x7F
                        FD21 = (Local3 | Local4)
                        Local3 = FD13 /* \_SB_.PCI0.LPCB.SIOR.FD13 */
                        Local3 &= 0x3F
                        Local2 *= 0x40
                        Local2 += Local3
                        FD13 = Local2
                        Sleep (0x32)
                        Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                        Sleep (0x32)
                        Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                        Sleep (0x32)
                        Local0 = FAN3 /* \_SB_.PCI0.LPCB.SIOR.FAN3 */
                    }
                }

                If (((Local0 == 0xFF) && (Local1 == 0x05)))
                {
                    Return (Zero)
                }

                If (((Local0 == Zero) && (Local1 == 0x02)))
                {
                    Return (0xFFFF)
                }

                Local2 = One
                While (Local1)
                {
                    Local2 *= 0x02
                    Local1--
                }

                Local0 *= Local2
                Divide (0x00149970, Local0, Local1, Local0)
                Return (Local0)
            }

            Method (HWF4, 0, NotSerialized)
            {
                BSEL = 0x05
                Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                BSEL = Zero
                Local1 = (FND4 & 0x80)
                Local1 >>= 0x08
                Local1 *= 0x04
                Local2 = (FND4 & 0x0C)
                Local2 >>= 0x02
                Local1 += Local2
                If (((Local1 > 0x05) || (Local1 < 0x02)))
                {
                    If ((Local0 > 0xF0))
                    {
                        Local1 = 0x02
                    }
                    ElseIf ((Local0 < 0x1E))
                    {
                        Local1 = 0x05
                    }
                    Else
                    {
                        Local1 = 0x03
                    }

                    Divide (Local1, 0x04, Local2, Local3)
                    Local3 <<= 0x08
                    Local2 <<= 0x02
                    Local4 = FND4 /* \_SB_.PCI0.LPCB.SIOR.FND4 */
                    Local4 &= 0x73
                    Local3 |= Local2
                    FND4 = (Local3 | Local4)
                }

                While ((((Local0 > 0xF0) && (Local1 < 0x05)) || ((Local0 < 
                    0x1E) && (Local1 > 0x02))))
                {
                    If (((Local0 > 0xF0) && (Local1 < 0x05)))
                    {
                        Local1 += One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x08
                        Local2 <<= 0x02
                        Local4 = FND4 /* \_SB_.PCI0.LPCB.SIOR.FND4 */
                        Local4 &= 0x73
                        Local3 |= Local2
                        FND4 = (Local3 | Local4)
                        If ((Local0 != 0xFF))
                        {
                            Sleep (0x32)
                        }

                        BSEL = 0x05
                        Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                        Sleep (0x32)
                        Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                        Sleep (0x32)
                        Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                        BSEL = Zero
                    }
                    Else
                    {
                        Local1 -= One
                        Divide (Local1, 0x04, Local2, Local3)
                        BSEL = Zero
                        Local3 <<= 0x08
                        Local2 <<= 0x02
                        Local4 = FND4 /* \_SB_.PCI0.LPCB.SIOR.FND4 */
                        Local4 &= 0x73
                        Local3 |= Local2
                        FND4 = (Local3 | Local4)
                        Sleep (0x32)
                        BSEL = 0x05
                        Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                        Sleep (0x32)
                        Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                        Sleep (0x32)
                        Local0 = FAN4 /* \_SB_.PCI0.LPCB.SIOR.FAN4 */
                        BSEL = Zero
                    }
                }

                If (((Local0 == 0xFF) && (Local1 == 0x05)))
                {
                    Return (Zero)
                }

                If (((Local0 == Zero) && (Local1 == 0x02)))
                {
                    Return (0xFFFF)
                }

                Local2 = One
                While (Local1)
                {
                    Local2 *= 0x02
                    Local1--
                }

                Local0 *= Local2
                Divide (0x00149970, Local0, Local1, Local0)
                Return (Local0)
            }

            Name (FNDT, Package (0x08)
            {
                One, 
                0x02, 
                0x04, 
                0x08, 
                0x10, 
                0x20, 
                0x40, 
                0x80
            })
            Method (HWF3, 0, NotSerialized)
            {
                BSEL = Zero
                Local0 = CFN3 /* \_SB_.PCI0.LPCB.SIOR.CFN3 */
                Local1 = (FD15 & 0x80)
                Local1 >>= 0x05
                Local2 = (FND4 & 0x03)
                Local1 |= Local2
                If (((Local1 > 0x05) || (Local1 < 0x02)))
                {
                    If ((Local0 > 0xF0))
                    {
                        Local1 = 0x02
                    }
                    ElseIf ((Local0 < 0x1E))
                    {
                        Local1 = 0x05
                    }
                    Else
                    {
                        Local1 = 0x03
                    }

                    Local2 = (Local1 << 0x05)
                    Local2 &= 0x80
                    Local3 = (FD15 & 0x7F)
                    Local3 |= Local2
                    FD15 = Local3
                    Local2 = (Local1 & 0x03)
                    Local3 = (FND4 & 0xFC)
                    Local3 |= Local2
                    FND4 = Local3
                }

                While ((((Local0 > 0xF0) && (Local1 < 0x05)) || ((Local0 < 
                    0x1E) && (Local1 > 0x02))))
                {
                    If (((Local0 > 0xF0) && (Local1 < 0x05)))
                    {
                        Local1++
                    }
                    Else
                    {
                        Local1--
                    }

                    Local2 = (Local1 << 0x05)
                    Local2 &= 0x80
                    Local3 = (FD15 & 0x7F)
                    Local3 |= Local2
                    FD15 = Local3
                    Local2 = (Local1 & 0x03)
                    Local3 = (FND4 & 0xFC)
                    Local3 |= Local2
                    FND4 = Local3
                    Sleep (0x32)
                    Local0 = CFN3 /* \_SB_.PCI0.LPCB.SIOR.CFN3 */
                    Sleep (0x32)
                    Local0 = CFN3 /* \_SB_.PCI0.LPCB.SIOR.CFN3 */
                    Sleep (0x32)
                    Local0 = CFN3 /* \_SB_.PCI0.LPCB.SIOR.CFN3 */
                }

                If (((Local0 == 0xFF) && (Local1 == 0x05)))
                {
                    Return (Zero)
                }

                If (((Local0 == Zero) && (Local1 == 0x02)))
                {
                    Return (0xFFFF)
                }

                Local2 = DerefOf (FNDT [Local1])
                Local0 *= Local2
                Divide (0x00149970, Local0, Local1, Local0)
                Return (Local0)
            }

            OperationRegion (HWRE, SystemIO, IOHW, 0x0A)
            Field (HWRE, ByteAcc, NoLock, Preserve)
            {
                Offset (0x05), 
                HIDX,   8, 
                HDAT,   8
            }

            IndexField (HIDX, HDAT, ByteAcc, NoLock, Preserve)
            {
                Offset (0x04), 
                CHNM,   1, 
                CFNM,   1, 
                CHNS,   2, 
                CFNS,   2, 
                Offset (0x05), 
                SYST,   8, 
                TRGT,   8, 
                Offset (0x08), 
                SSDN,   8, 
                CSDN,   8, 
                SSUP,   8, 
                CSUP,   8, 
                Offset (0x20), 
                VCOR,   8, 
                V12V,   8, 
                Offset (0x23), 
                V33V,   8, 
                Offset (0x25), 
                V50V,   8, 
                Offset (0x27), 
                MBTE,   8, 
                FAN1,   8, 
                FAN2,   8, 
                FAN3,   8, 
                Offset (0x3F), 
                CFN3,   8, 
                Offset (0x47), 
                FDR1,   8, 
                Offset (0x4B), 
                FD13,   8, 
                FD15,   8, 
                Offset (0x4E), 
                BSEL,   3, 
                Offset (0x4F), 
                Offset (0x50), 
                TSR1,   8, 
                    ,   7, 
                TSR2,   1, 
                Offset (0x53), 
                FAN4,   8, 
                Offset (0x59), 
                FND4,   8, 
                Offset (0x5D), 
                FD21,   8
            }
        }

        Device (ASOC)
        {
            Name (_HID, "ATK0110")  // _HID: Hardware ID
            Name (VPAR, Package (0x04)
            {
                Package (0x03)
                {
                    Zero, 
                    One, 
                    Zero
                }, 

                Package (0x03)
                {
                    0x22, 
                    0x22, 
                    Zero
                }, 

                Package (0x03)
                {
                    0x14, 
                    0x0A, 
                    Zero
                }, 

                Package (0x03)
                {
                    0x3C, 
                    0x0A, 
                    Zero
                }
            })
            Method (VGET, 1, NotSerialized)
            {
                If ((Arg0 == Zero))
                {
                    Return (^^SIOR.HWV0 ())
                }

                If ((Arg0 == One))
                {
                    Return (^^SIOR.HWV3 ())
                }

                If ((Arg0 == 0x02))
                {
                    Return (^^SIOR.HWV5 ())
                }

                If ((Arg0 == 0x03))
                {
                    Return (^^SIOR.HWV1 ())
                }

                Return (Zero)
            }

            Method (TGET, 1, NotSerialized)
            {
                If ((Arg0 == Zero))
                {
                    Return (^^SIOR.HWT1 ())
                }

                If ((Arg0 == One))
                {
                    Return (^^SIOR.HWT0 ())
                }

                Return (Zero)
            }

            Method (FGET, 1, NotSerialized)
            {
                If ((Arg0 == Zero))
                {
                    Return (^^SIOR.HWF1 ())
                }

                If ((Arg0 == One))
                {
                    Return (^^SIOR.HWF2 ())
                }

                If ((Arg0 == 0x02))
                {
                    Return (^^SIOR.HWF4 ())
                }

                If ((Arg0 == 0x03))
                {
                    Return (^^SIOR.HWF0 ())
                }

                If ((Arg0 == 0x04))
                {
                    Return (^^SIOR.HWF3 ())
                }

                Return (Zero)
            }

            Method (RVLT, 1, NotSerialized)
            {
                Local0 = (Arg0 & 0xFFFF)
                Local1 = VGET (Local0)
                Local2 = DerefOf (DerefOf (VPAR [Local0]) [Zero])
                Local3 = DerefOf (DerefOf (VPAR [Local0]) [One])
                Local4 = DerefOf (DerefOf (VPAR [Local0]) [0x02])
                Local5 = (Local1 * (Local2 + Local3))
                Local5 /= Local3
                Local5 += Local4
                Return (Local5)
            }

            Method (RTMP, 1, NotSerialized)
            {
                Local0 = (Arg0 & 0xFFFF)
                Local1 = TGET (Local0)
                Return (Local1)
            }

            Method (RFAN, 1, NotSerialized)
            {
                Local0 = (Arg0 & 0xFFFF)
                Local1 = FGET (Local0)
                Return (Local1)
            }
        }

        Device (FSAM)
        {
            Name (_HID, EisaId ("APP0111"))  // _HID: Hardware ID
            Name (_CID, "monitor")  // _CID: Compatible ID
            Method (TSYS, 0, NotSerialized)
            {
                Local1 = \_SB.PCI0.LPCB.ASOC.RTMP (One)
                Return ((Local1 / 0x0A))
            }

            Method (TCPU, 0, NotSerialized)
            {
                Local1 = \_SB.PCI0.LPCB.ASOC.RTMP (Zero)
                Return ((Local1 / 0x0A))
            }

            Method (VCPU, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RVLT (Zero))
            }

            Method (VP0R, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RVLT (0x03))
            }

            Method (VSN3, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RVLT (One))
            }

            Method (VSN1, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RVLT (0x02))
            }

            Method (FAN0, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RFAN (Zero))
            }

            Method (FAN1, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RFAN (One))
            }

            Method (FAN2, 0, NotSerialized)
            {
                Return (\_SB.PCI0.LPCB.ASOC.RFAN (0x02))
            }
        }
    }
}

 

Share this post


Link to post
Share on other sites

@Rodion2010

It would help, if you could provide the following information:

- FakeSMC or VirtualSMC?

- Does this work with Istat as well?

 

I have a perfect solution for FakeSMC plus Sensors.... So I am looking for options around that utilize VirtualSMC, particularly with IStat, since I moved from Clover to OpenCore.

If that is what you provided, how to tweak your SSDT for other systems?

 

Regards, Mike

Share this post


Link to post
Share on other sites
19 hours ago, Mike Ranger said:

@Rodion2010

It would help, if you could provide the following information:

- FakeSMC or VirtualSMC?

- Does this work with Istat as well?

 

I have a perfect solution for FakeSMC plus Sensors.... So I am looking for options around that utilize VirtualSMC, particularly with IStat, since I moved from Clover to OpenCore.

If that is what you provided, how to tweak your SSDT for other systems?

 

Regards, Mike

1 FakeSMC + ACPIMonitor from here https://github.com/CloverHackyColor/FakeSMC3_with_plugins

2 yes

There is no ACPIMonitor for VSMC yet

Share this post


Link to post
Share on other sites

yes... the current strategy seems the SuperIO.

I am looking for a solution for the SuperIO because I am using OpenCore.

OpenCore officially does not support FakeSMC anymore.

 

SuperIO seems to provide the raw-data.... drivers are missing... so only HWSensors apps are fully working.

 

Regards, Mike

Share this post


Link to post
Share on other sites
6 hours ago, Mike Ranger said:

OpenCore officially does not support FakeSMC anymore.

 

Where is this info from? FakeSMC can be loaded by OpenCore exactly as any other kext

Share this post


Link to post
Share on other sites
5 hours ago, Rodion2010 said:

Where is this info from? FakeSMC can be loaded by OpenCore exactly as any other kext

Well.... if you read the documentation, it tells me that everything around FakeSMC might work but then it might not.

The use of FakeSMC is certainly not encouraged.... so.... with further development of OpenCore, things might actually break with FakeSMC.

 

 

Share this post


Link to post
Share on other sites
1 hour ago, Mike Ranger said:

... if you read the documentation,

 

what , more exactly, " tells me that everything around FakeSMC might work but then it might not."

https://github.com/acidanthera/OpenCorePkg/blob/master/Docs/Configuration.pdf

  1. SmcRevision
    Type: plist data, 6 bytes
    Failsafe: Not installed
    Description: Sets REV in gEfiMiscSubClassGuid. Custom property read by VirtualSMC or FakeSMC to generate SMC REV key.

  2. SmcBranch
    Type: plist data, 8 bytes
    Failsafe: Not installed
    Description: Sets RBr in gEfiMiscSubClassGuid. Custom property read by VirtualSMC or FakeSMC to generate SMC RBr key.

  3. SmcPlatform
    Type: plist data, 8 bytes
    Failsafe: Not installed
    Description: Sets RPlt in gEfiMiscSubClassGuid. Custom property read by VirtualSMC or FakeSMC to generate SMC RPlt key.

  4.  

    1. AppleSmcIo
      Type: plist boolean

    Description: Reinstalls Apple SMC I/O protocol with a builtin version.

    This protocol replaces legacy VirtualSmc UEFI driver, and is compatible with any SMC kernel extension. However, in case FakeSMC kernel extension is used, manual NVRAM key variable addition may be needed.

     

    no more results for FakeSMC and we may use any of them

    What documentation do you read?

Edited by Rodion2010

Share this post


Link to post
Share on other sites
18 hours ago, Mike Ranger said:

Well.... if you read the documentation, it tells me that everything around FakeSMC might work but then it might not.

 

 

answer from the author:

"There are no compatibility restrictions with Apple SMC / FakeSMC / VirtualSMC."

I think he knows better ))

Edited by Rodion2010

Share this post


Link to post
Share on other sites
6 hours ago, vector sigma said:

Care to update your bootloader as is not showing the motherboard name? Say that because without OEM informations the configuration will not be automatically detected.

I'm using the OpenCore 0.5.5 bootloader, not sure what I need to do?

 

Share this post


Link to post
Share on other sites
On 2/18/2020 at 4:40 AM, vector sigma said:

Thanks to had taken the time to ensure fans connectors are right. The file is identical on what it's already on Github..

 

@vector sigma

  Please take a look. My motherboard is MSI B360M BAZOOKA PlUS, Clover boot, VirtualSMC.kext and its sensors. Now the name of the motherboard is correctly identified, but each voltage value is wrong. Use AIDA64 to check the sensor model is Nuvoton NCT6797D-M , What should I do to get the correct voltage value and fans value?

MSI.thumb.png.72c3772132737876b867153afc1a774f.png

 

1964997679_MSIAIDA64.png.c9531c42bc1a0297abf45d2288ea3ecb.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By kevin_1351
      tl;dr: VirtualSMC causes me a flood of log messages and correlated cpu spikes. FakeSMC doesn't.
       
      Hi, I have almost finalized my Huawei Matebook X Pro Opencore setup and everything is working very well besides wifi/bt ofc (which is about to change).
       
      However, I noticed how the cpu usage sometimes went up a little and when looking at the Console I could see a never-ending flood of:
      default 14:05:05.983292+0100 loginwindow clamshellStateChanged | Clamshell state changed: closed=0, shouldSleepWhenClosed=2 default 14:05:05.982975+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:05.982996+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:06.985932+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:06.985949+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:06.986134+0100 loginwindow clamshellStateChanged | Clamshell state changed: closed=0, shouldSleepWhenClosed=2 default 14:05:39.426574+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:39.426729+0100 loginwindow clamshellStateChanged | Clamshell state changed: closed=0, shouldSleepWhenClosed=2 default 14:05:39.426585+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:41.431085+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:41.431097+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:41.431246+0100 loginwindow clamshellStateChanged | Clamshell state changed: closed=0, shouldSleepWhenClosed=2 default 14:05:42.433068+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:42.433227+0100 loginwindow clamshellStateChanged | Clamshell state changed: closed=0, shouldSleepWhenClosed=2 default 14:05:42.433078+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:43.434453+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:43.434465+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:43.434622+0100 loginwindow clamshellStateChanged | Clamshell state changed: closed=0, shouldSleepWhenClosed=2 default 14:05:44.436155+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0 default 14:05:44.436166+0100 kernel PMRD: clamshell closed 0, disabled 0, desktopMode 0, ac 0 sleepDisabled 0  
      As you can see, multiple of these per second. Another guy with the same computer is also having this issue and posted a dsdt change to fix it. This fix didn't solve anything though
      He tried to limit the Notify call by implementing a state change requirement before calling Notify.
       
      Here is the original acpi:
      Scope (_SB) { Device (LID) { Name (_HID, EisaId ("PNP0C0D") /* Lid Device */) // _HID: Hardware ID Method (_LID, 0, NotSerialized) // _LID: Lid Status { Local0 = One Local0 = ^^PCI0.LPCB.EC0.RPIN (0x05, 0x06) If ((Local0 == 0x55)) { Local0 = Zero } Else { Local0 = One } ^^PCI0.GFX0.CLID = Local0 Return (Local0) } } Device (PWRB) { Name (_HID, EisaId ("PNP0C0C") /* Power Button Device */) // _HID: Hardware ID Method (_STA, 0, NotSerialized) // _STA: Status { Return (0x0B) } } } Scope (_SB.PCI0.LPCB.EC0) { Method (_Q81, 0, NotSerialized) // _Qxx: EC Query, xx=0x00-0xFF { Local0 = ^^^^LID._LID () If ((Local0 == Zero)) { ADBG ("LID-OFF") SGOV (0x02030009, Zero) SGOV (0x02060000, Zero) } Else { ADBG ("LID-ON") SGOV (0x02030009, One) SGOV (0x02060000, One) Notify (ALSD, 0x80) // Status Change } Notify (LID, 0x80) // Status Change } } Which he changed to: 
      Scope (_SB) { Device (LID) { Name (_OLD, One) // assuming everything else.. the lid should start open? Name (_HID, EisaId ("PNP0C0D") /* Lid Device */) // _HID: Hardware ID Method (_LID, 0, NotSerialized) // _LID: Lid Status { Local0 = One Local0 = ^^PCI0.LPCB.EC0.RPIN (0x05, 0x06) If ((Local0 == 0x55)) { Local0 = Zero } Else { Local0 = One } Return (Local0) } } Device (PNLF) { Name (_HID, EisaId ("APP0002")) // _HID: Hardware ID Name (_CID, "backlight") // _CID: Compatible ID Name (_UID, 0x0A) // _UID: Unique ID Name (_STA, 0x0B) // _STA: Status } Device (PWRB) { Name (_HID, EisaId ("PNP0C0C") /* Power Button Device */) // _HID: Hardware ID Method (_STA, 0, NotSerialized) // _STA: Status { Return (0x0B) } } } Scope (_SB.PCI0.LPCB.EC0) { Method (_Q81, 0, NotSerialized) // _Qxx: EC Query, xx=0x00-0xFF { Local0 = ^^^^LID._LID () If ((Local0 == Zero)) { ADBG ("LID-OFF") SGOV (0x02030009, Zero) SGOV (0x02060000, Zero) } Else { ADBG ("LID-ON") SGOV (0x02030009, One) SGOV (0x02060000, One) Notify (ALSD, 0x80) // Status Change } If ((^^^^LID._OLD != Local0)) { Notify (LID, 0x80) // Status Change ^^^^LID._OLD = Local0 } } } Besides me not seeing any reason to declare _OLD in LID. The idea itself shouldn't be too bad right? Well, as I said, his fix didn't work.
       
      In fact, to prove that Method _Q81 doesn't have anything to do with the issue at all, I created a Clover/Opencore patch to change _Q81 to XQ81. This resulted in my lid not working at all of course, but the log flooding still persisted!
      So _Q81 doesn't have anything to do with the issue afaik.
       
      Now, further Google searches led me to a chinese post where he tied the issue to VirtualSMC. And indeed, by migrating to FakeSMC the issue is no more.
       
      Unfortunately, I'm very fond of VirtualSMC for various reasons. So I would very much like to keep it. If not I'd have to implement the old way of doing Battery monitoring etcetc. Which isn't very elegant and update proof as it requires DSDT patching.
       
      So, I do believe that the issue may very well be in the DSDT code, perhaps in the ambient light part. I'm not very skilled at this and just started studying the ACPI spec 3 days ago.
       
      Could someone please help me out? Thanks a lot in advance
       
       
      origin.zip
      OC.zip
    • By Slice
      This thread devoted to share information about different SMC keys found or investigated anywhere.
       
      What are they?
      SMC keys is a somehow language to speak between macOS and hardware microcontroller presented in real Mac and absent in Hackintosh.
      They inform macOS about Hardware ID and current status. Moreover macOS can write something through SMC protocol to control hardware.
      FakeSMC ( ©Netkas) is the driver to emulate this microcontroller on PC having no such device which is necessary to boot macOS here.
      But FakeSMC contain only ~20 keys while real Mac answers ~200 keys.
      Some keys we added by HWSensors project reporting temperatures, FAN speeds, voltages etc.
      Some keys are model dependent was added by Clover to be sure if user changed model in GUI then corresponding keys will be changed automatically.
      Clover sets
      LogDataHub(&gEfiMiscSubClassGuid, L"RPlt", &gSettings.RPlt, 8);
      LogDataHub(&gEfiMiscSubClassGuid, L"RBr", &gSettings.RBr, 8);
      LogDataHub(&gEfiMiscSubClassGuid, L"EPCI", &gSettings.EPCI, 4);
      LogDataHub(&gEfiMiscSubClassGuid, L"REV", &gSettings.REV, 6);
      LogDataHub(&gEfiMiscSubClassGuid, L"BEMB", &gSettings.Mobile, 1);
      BEMB - is a mobility sign. =0 -desktop, =1 - mobile.
      REV - SMC hardware revision, changes sometimes with Apple updates.
      RPlt, RBr and EPCI is hardware capabilities, noticed used in Intel HD drivers.
       
      Structure.
      All SMC keys consists of name 4 ascii chars as 32bit integer, type and value.
      Types:
       "flag", len 1
       "ui8 ", len 1
       "ui16", len 2
       "sp78", len 2
       "ui32", len 4
      "fp2e", len 2
      "fpe2", len 2
      "{rev", and others...
       
      List of known keys
      SMC_list.plist.zip
      More keys will be discussed in the thread
       
       
      Feel free to share you knowledge and ask about noticed keys.
    • By Slice
      Hi all,
       
      I created an installer for my version of FakeSMC with plugins and applications latest revision.
       
      Compatibility from 10.6 up to 10.15.
      Test, please.

      Download here: HWSensors.pkg.zip
      See my signature
       
      02.11.2019
      New project home
      https://github.com/CloverHackyColor/FakeSMC3_with_plugins
      FakeSMC v3.5.3 and plugins
       
      HWMonitorSMC2 at
      https://github.com/CloverHackyColor/HWMonitorSMC2
       
       
      FakeSMC 3.4.0 revision 751
      HWSensors.pkg-751.zip
       
      New project home is
      https://sourceforge.net/projects/hwsensors3.hwsensors.p/
      where you can download most recent versions.
      Now it is FakeSMC 3.4.1
       
      Explanations about the difference between versions 3 and 6
        #137 
       
      20.05.2016
      Revision 32 with explanation at    #220 
       
      10.10.2017
      FakeSMC is 3.5.0 compatible with High Sierra.
      New plugin VoodooBatterySMC created on the base of VoodooBattery by Superhai but with SMC keys generating to show Battery voltage and amperage. As well it created key BATP needed for right speedstep and FileVault2.
      Other kexts revised.
×