Port 60/64 and commands from 40h~4Fh are only example and common for most of EC but may be your EC use different ports and commands ( this should be found in the EC datasheet which you have deleted
) but if it uses the same commands but no response from the EC when you use it , then the only way is to modify the EC FW ( or may be you can add some statements in the DSDT to control fan speeds .
The plug&play ID for the fans is PNP0C0B .
Just like this example :-
Code:
Scope(\_SB) {
Processor(
CPU0,
1, // unique number for this processor
0x110, // system IO address of Pblk Registers
0x06 // length in bytes of PBlk
) {}
Scope(\_SB.PCI0.ISA0) {
Device(EC0) {
Name(_HID, EISAID("PNP0C09")) // ID for this EC
// current resource description for this EC
Name(_CRS,
ResourceTemplate() {
IO(Decode16,0x62,0x62,0,1)
IO(Decode16,0x66,0x66,0,1)
})
Name(_GPE, 0) // GPE index for this EC
// create EC's region and field for thermal support
OperationRegion(EC0, EmbeddedControl, 0, 0xFF)
Field(EC0, ByteAcc, Lock, Preserve) {
MODE, 1, // thermal policy (quiet/perform)
FAN, 1, // fan power (on/off)
, 6, // reserved
TMP, 8, // current temp
AC0, 8, // active cooling temp (fan high)
, 8, // reserved
PSV, 8, // passive cooling temp
CS4 8, // critical S4 temp
CRT, 8 // critical temp
}
// following is a method that OSPM will schedule after
// it receives an SCI and queries the EC to receive value 7
Method(_Q07) {
Notify (\_SB.PCI0.ISA0.EC0.TZ0, 0x80)
} // end of Notify method
// fan cooling on/off - engaged at AC0 temp
PowerResource(PFAN, 0, 0) {
Method(_STA) { Return (\_SB.PCI0.ISA0.EC0.FAN) } // check power state
Method(_STA) { Return (\_SB.PCI0.ISA0.EC0.FAN) } // check power state
Method(_ON) { Store (One, \_SB.PCI0.ISA0.EC0.FAN) } // turn on fan
Method(_OFF) { Store ( Zero, \_SB.PCI0.ISA0.EC0.FAN) } // turn off fan
}
// Create FAN device object
Device (FAN) {
// Device ID for the FAN
Name(_HID, EISAID("PNP0C0B"))
// list power resource for the fan
Name(_PR0, Package(){PFAN})
}
// create a thermal zone
ThermalZone (TZ0) {
Method(_TMP) { Return (\_SB.PCI0.ISA0.EC0.TMP )} // get current temp
Method(_AC0) { Return (\_SB.PCI0.ISA0.EC0.AC0) } // fan high temp
Name(_AL0, Package(){\_SB.PCI0.ISA0.EC0.FAN}) // fan is act cool dev
Method(_PSV) { Return (\_SB.PCI0.ISA0.EC0.PSV) } // passive cooling temp
Name(_PSL, Package (){\_SB.CPU0}) // passive cooling devices
Method(_CS4) { Return (\_SB.PCI0.ISA0.EC0.CS4) } // get critical S4 temp
Method(_CRT) { Return (\_SB.PCI0.ISA0.EC0.CRT) } // get critical temp
Method(_SCP, 1) { Store (Arg1, \_SB.PCI0.ISA0.EC0.MODE) } // set cooling mode
Name(_TC1, 4) // bogus example constant
Name(_TC2, 3) // bogus example constant
Name(_TSP, 150) // passive sampling = 15 sec
Name(_TZP, 0) // polling not required
} // end of TZ0
} // end of ECO
} // end of \_SB.PCI0.ISA0 scope-
} // end of \_SB scope
And for multiple fan speeds , use code like this :-
Code:
Scope(\_SB) {
Processor(
CPU0,
1, // unique number for this processor
0x110, // system IO address of Pblk Registers
0x06 // length in bytes of PBlk
) {}
Scope(\_SB.PCI0.ISA0) {
Device(EC0) {
Name(_HID, EISAID("PNP0C09")) // ID for this EC
// current resource description for this EC
Name(_CRS,
ResourceTemplate() {
IO(Decode16,0x62,0x62,0,1)
IO(Decode16,0x66,0x66,0,1)
})
Name(_GPE, 0) // GPE index for this EC
// create EC's region and field for thermal support
OperationRegion(EC0, EmbeddedControl, 0, 0xFF)
Field(EC0, ByteAcc, Lock, Preserve) {
MODE, 1, // thermal policy (quiet/perform)
FAN0, 1, // fan strength high/off
FAN1, 1, // fan strength low/off
, 5, // reserved
TMP, 8, // current temp
AC0, 8, // active cooling temp (high)
AC1, 8, // active cooling temp (low)
PSV, 8, // passive cooling temp
CS4 8, // critical S4 temp
CRT, 8 // critical temp
}
// following is a method that OSPM will schedule after it
// receives an SCI and queries the EC to receive value 7
Method(_Q07) {
Notify (\_SB.PCI0.ISA0.EC0.TZ0, 0x80)
} end of Notify method
// fan cooling mode high/off - engaged at AC0 temp
PowerResource(FN10, 0, 0) {
Method(_STA) { Return (\_SB.PCI0.ISA0.EC0.FAN0) } // check power state
Method(_ON) { Store (One, \_SB.PCI0.ISA0.EC0.FAN0) } // turn on fan at high
Method(_OFF) { Store (Zero, \_SB.PCI0.ISA0.EC0.FAN0) }// turn off fan
}
// fan cooling mode low/off - engaged at AC1 temp
PowerResource(FN11, 0, 0) {
Method(_STA) { Return (\_SB.PCI0.ISA0.EC0.FAN1) } // check power state
Method(_ON) { Store (One, \_SB.PCI0.ISA0.EC0.FAN1) } // turn on fan at low
Method(_OFF) { Store (Zero, \_SB.PCI0.ISA0.EC0.FAN1) }// turn off fan
// Following is a single fan with two speeds. This is represented
// by creating two logical fan devices. When FN2 is turned on then
// the fan is at a low speed. When FN1 and FN2 are both on then
// the fan is at high speed.
//
// Create FAN device object FN1
Device (FN1) {
// Device ID for the FAN
Name(_HID, EISAID("PNP0C0B"))
Name(_PR0, Package(){FN10, FN11})
}
// Create FAN device object FN2
Device (FN2) {
// Device ID for the FAN
Name(_HID, EISAID("PNP0C0B"))
Name(_PR0, Package(){FN10})
}
// create a thermal zone
ThermalZone (TZ0) {
Method(_TMP) { Return (\_SB.PCI0.ISA0.EC0.TMP )} // get current temp
Method(_AC0) { Return (\_SB.PCI0.ISA0.EC0.AC0) } // fan high temp
Method(_AC1) { Return (\_SB.PCI0.ISA0.EC0.AC1) } // fan low temp
Name(_AL0, Package() {\_SB.PCI0.ISA0.EC0.FN1}) // active cooling (high)
Name(_AL1, Package() {\_SB.PCI0.ISA0.EC0.FN2}) // active cooling (low)
Method(_PSV) { Return (\_SB.PCI0.ISA0.EC0.PSV) } // passive cooling temp
Name(_PSL, Package() {\_SB.CPU0}) // passive cooling devices
Method(_CS4) { Return (\_SB.PCI0.ISA0.EC0.CS4) } // get critical S4 temp
Method(_CRT) { Return (\_SB.PCI0.ISA0.EC0.CRT) } // get crit. temp
Method(_SCP, 1) { Store (Arg1, \_SB.PCI0.ISA0.EC0.MODE) } // set cooling mode
Name(_TC1, 4) // bogus example constant
Name(_TC2, 3) // bogus example constant
Name(_TSP, 150) // passive sampling = 15 sec
Name(_TZP, 0) // polling not required
} // end of TZ0
} // end of ECO
} // end of \_SB.PCI0.ISA0 scope
} // end of \_SB scope
These are just examples , use you own EC ID But the FAN ID is the same in the example ........... also tweak the code as you like .
you can download the ACPI datasheet and look for this , its fully explained there with more examples .
I was thinking to make one for my ACER 5536G with AMD chipset and CPU but don`t have time ......... i just read most of the datasheet and knew how to do it but don`t have time as i can`t finish modifying BIOSes in the forum to begin doing this
I hope the unlocked BIOS works well