[GH-ISSUE #1421] Add support for Acer A514-52-56CT #1223

Closed
opened 2026-02-26 00:34:42 +03:00 by kerem · 1 comment
Owner

Originally created by @georgiptr on GitHub (Feb 18, 2025).
Original GitHub issue: https://github.com/hirschmann/nbfc/issues/1421

I would like to add support for Acer A514-52-56CT. I don't have enough experience, so a little bit of help will be greatly appreciated.

What I've done so far:

  1. I looked at the actual chip inside the laptop. It is: ITE IT8987E 1937-BXA SK0AJB
  2. I dumped the DSDT table. The DSDT Editor app didn't work. I used RWEverything. The decompiled code is here:
    Acer A514-52-56CT DSDT.txt

Another dump:
DSDT Interesting.txt

However, following this guide, I wasn't able to find what I need.
3. I used "nbfc.exe config --recommend" command and I tried all existing configurations, but they didn't work.
4. I dumped the EC registers using "ec-probe.exe monitor"
5. Outputs:

01 no fan.txt
02 low fan.txt
03 medium fan.txt
04 high fan.txt

I asked OpenAI's o3-mini to infer the interesting registers. Results:
Hex values, and decimal values in braces.

Fan: 0x50 (80) / 0x54 (84)
No Fan: 0x2C (44)
Low Speed: 0x36 (54)
Medium Speed: 0x3C (60)
High Speed: 0x41 (65)

Temperature: 0x09 (9)
No fan: 0x23 (35)
Low: 0x2E (46)
Medium: 0x31 (49)
High: 0x39 (57)

Those are correct. Register 0x09 shows the temperature and 0x50 (mirrored in 0x54) has values, corresponding to the fan speeds.

When I manually set 0x50 to some other value, the fan speed changes. But it goes back to the one that the laptop wants almost immediately. If I force my value several times each second, it stays. But this is wrong.

Then I obtained the ITE IT8987E documentation:

IT8987_B_V0.3.1_102513 Unlocked.pdf

It is unlocked, so you can copy from it. The interesting parts from this PDF are also mentioned in this issue: https://github.com/hirschmann/nbfc/issues/1198

Relevant information (citations + screenshots):

The PWM uses the 32.768 kHz Clock, EC Clock or 6.14 MHz Clock as a reference for its PWM output. The
prescaler divider values in CiCRPS register which divides the PWM input clock into its working clock
respectively. Each channel can select their prescaler divider by {PCSSGH, PCSSGL} register. The prescaler
divider COCPRS register has 8-bit counter value; and the {CiMCRPS, CiCRPS}(i=4,6,7) has 16-bit counter
value. The PWM provides eight 8-bit PWM outputs, which are PWMO to PWM7. Each PWM output is controlled
by its Duty Cycle registers (DCRi, i =0 to 7). All PWM output is controlled by a Cycle Time register (CTR).
When PWM working clock is enabled, the PWM cycle output is high when the value in the DCRi register is
greater than the value in CTR down-counter. When the value of DCRi register is not greater than the value in
CTR down-counter, the PWMi cycle output is on LOW and PWMi cycle output polarity can be inversed by INVPi
register.

When the value in CTR counter down-counter reaches 0, the value in CTR counter will be reloaded then start
down-counter until the PWM working clock is disabled.

The PWM module supports duty cycles ranging from 0% to 100%.
The PWMi output signal cycle time is:
n(CiCPRS + 1) x (CTR + 1) x T clk
Where:
• T clk is the period of PWM input clock = (1 / 32.768 kHz) or (1 / FreqEC), which is selected by PCFS3-0 in
PCFSR regiser. (FreqEC is listed in Table 10-2 on page 484)
• The PWMi output signal duty cycle (in %, when INVPi is 0) is:
(DCRi) / (CTR + 1) x 100.
In the following cases, the PWMi output is hold at a state(low or high):
•PWMi output is still low when the content of DCRi is greater than the CTR value.
•PWMi output is still high when the content of DCRi is equal to the CTR value.
•PWMi output is still low when the content of DCRi =0 & INVPi = 0 is in PWMPOL register.
PWM Inhibit Mode
The PWM is in an inhibit mode when PCCE in ZTIER Register is 0. In this mode, the PWM input clock is
disabled (stopped). The PWMi signal is 0 when INVPi bit is 0; it is 1 when INVPi bit is 1. It is recommended the
PRSC and CTR registers should be updated in a PWM inhibit mode.

7.12.3.2 Manual Fan Control Mode
The content of the Tachometer Reading Register is still updated according to the sampling counter that
samples the tachometer input (TACH0A/B pin for FAN1 of the local sensor zone and TACH1A/B pin for FAN2 of
the remote sensor zone). The sampling rate (fs) is FreqEC / 128. (FreqEC is listed in Table 10-2 on page 484)
Fan Speed (R.P.M.) = 60 / ( 1/fs sec * {FnTMRR, FnTLRR} * P)
n denotes 1 or 2
P denotes the numbers of square pulses per revolution.
And {FnTMRR, FnTLRR} = 0000h denotes Fan Speed is zero.

7.12.3.3 Manual Color Frequency Control Mode

In this mode, the software may monitor the Frequency Reading Register to control the frequency of the input
signal.
The content of the Color Frequency Reading Register keeps being updated every 31.25 ms, and the sample
counter is the input signal from GPIOJO.

Registers:

Image

Other information:

Image

Image

I also understand that the EC can have an "automatic mode" when the fan speeds are controlled by a closed loop monitoring the temperature and a "manual mode" when this doesn't happen. I have no idea how to enable the "manual mode". Also, the registers that show the fan speeds might not be the ones that change them. Or they could be the same. As I said, reading 0x50 gets the fan speed, and writing to the same registere changes the fan speed for a very short time. If I write in a loop very fast, the speed stays what I want, but I guess this is not what we need.

The registers from the documentation don't map directly to what I'm dumping and changing with ec-probe.exe. May there is an offset? The documentation states that "The registers are listed below and the base address is 1800h", but simply adding it also doesn't work. I guess the mapping is more complex than that. Any help will be greatly appreciated!

I've come so far. Please, help me, or give me some idea on how to continue. I'm very motivated and I will do whatever is necessary to complete this and create a working PR. I'm a software developer myself. But I need help in this domain.

Edit: after discussing with OpenAI's o1 for ages, looking at the documentation, poking around in registers and event automating the poking process, I don't think I will have the time to do this. If anyone can help, great. But this will take significant amount of time that I don't have.

Originally created by @georgiptr on GitHub (Feb 18, 2025). Original GitHub issue: https://github.com/hirschmann/nbfc/issues/1421 I would like to add support for Acer A514-52-56CT. I don't have enough experience, so a little bit of help will be greatly appreciated. What I've done so far: 1. I looked at the actual chip inside the laptop. It is: ITE IT8987E 1937-BXA SK0AJB 2. I dumped the DSDT table. The DSDT Editor app didn't work. I used RWEverything. The decompiled code is here: [Acer A514-52-56CT DSDT.txt](https://github.com/user-attachments/files/18846834/Acer.A514-52-56CT.DSDT.txt) Another dump: [DSDT Interesting.txt](https://github.com/user-attachments/files/18855037/DSDT.Interesting.txt) However, following this [guide](https://github.com/hirschmann/nbfc/wiki/Analyze-your-notebook%27s-DSDT), I wasn't able to find what I need. 3. I used "nbfc.exe config --recommend" command and I tried all existing configurations, but they didn't work. 4. I dumped the EC registers using "ec-probe.exe monitor" 5. Outputs: [01 no fan.txt](https://github.com/user-attachments/files/18846863/01.no.fan.txt) [02 low fan.txt](https://github.com/user-attachments/files/18846866/02.low.fan.txt) [03 medium fan.txt](https://github.com/user-attachments/files/18846868/03.medium.fan.txt) [04 high fan.txt](https://github.com/user-attachments/files/18846870/04.high.fan.txt) I asked OpenAI's o3-mini to infer the interesting registers. Results: Hex values, and decimal values in braces. Fan: 0x50 (80) / 0x54 (84) No Fan: 0x2C (44) Low Speed: 0x36 (54) Medium Speed: 0x3C (60) High Speed: 0x41 (65) Temperature: 0x09 (9) No fan: 0x23 (35) Low: 0x2E (46) Medium: 0x31 (49) High: 0x39 (57) Those are correct. Register 0x09 shows the temperature and 0x50 (mirrored in 0x54) has values, corresponding to the fan speeds. When I manually set 0x50 to some other value, the fan speed changes. But it goes back to the one that the laptop wants almost immediately. If I force my value several times each second, it stays. But this is wrong. Then I obtained the ITE IT8987E documentation: [IT8987_B_V0.3.1_102513 Unlocked.pdf](https://github.com/user-attachments/files/18846922/IT8987_B_V0.3.1_102513.Unlocked.pdf) It is unlocked, so you can copy from it. The interesting parts from this PDF are also mentioned in this issue: https://github.com/hirschmann/nbfc/issues/1198 Relevant information (citations + screenshots): The PWM uses the 32.768 kHz Clock, EC Clock or 6.14 MHz Clock as a reference for its PWM output. The prescaler divider values in CiCRPS register which divides the PWM input clock into its working clock respectively. Each channel can select their prescaler divider by {PCSSGH, PCSSGL} register. The prescaler divider COCPRS register has 8-bit counter value; and the {CiMCRPS, CiCRPS}(i=4,6,7) has 16-bit counter value. The PWM provides eight 8-bit PWM outputs, which are PWMO to PWM7. Each PWM output is controlled by its Duty Cycle registers (DCRi, i =0 to 7). All PWM output is controlled by a Cycle Time register (CTR). When PWM working clock is enabled, the PWM cycle output is high when the value in the DCRi register is greater than the value in CTR down-counter. When the value of DCRi register is not greater than the value in CTR down-counter, the PWMi cycle output is on LOW and PWMi cycle output polarity can be inversed by INVPi register. When the value in CTR counter down-counter reaches 0, the value in CTR counter will be reloaded then start down-counter until the PWM working clock is disabled. The PWM module supports duty cycles ranging from 0% to 100%. The PWMi output signal cycle time is: n(CiCPRS + 1) x (CTR + 1) x T clk Where: • T clk is the period of PWM input clock = (1 / 32.768 kHz) or (1 / FreqEC), which is selected by PCFS3-0 in PCFSR regiser. (FreqEC is listed in Table 10-2 on page 484) • The PWMi output signal duty cycle (in %, when INVPi is 0) is: (DCRi) / (CTR + 1) x 100. In the following cases, the PWMi output is hold at a state(low or high): •PWMi output is still low when the content of DCRi is greater than the CTR value. •PWMi output is still high when the content of DCRi is equal to the CTR value. •PWMi output is still low when the content of DCRi =0 & INVPi = 0 is in PWMPOL register. PWM Inhibit Mode The PWM is in an inhibit mode when PCCE in ZTIER Register is 0. In this mode, the PWM input clock is disabled (stopped). The PWMi signal is 0 when INVPi bit is 0; it is 1 when INVPi bit is 1. It is recommended the PRSC and CTR registers should be updated in a PWM inhibit mode. 7.12.3.2 Manual Fan Control Mode The content of the Tachometer Reading Register is still updated according to the sampling counter that samples the tachometer input (TACH0A/B pin for FAN1 of the local sensor zone and TACH1A/B pin for FAN2 of the remote sensor zone). The sampling rate (fs) is FreqEC / 128. (FreqEC is listed in Table 10-2 on page 484) Fan Speed (R.P.M.) = 60 / ( 1/fs sec * {FnTMRR, FnTLRR} * P) n denotes 1 or 2 P denotes the numbers of square pulses per revolution. And {FnTMRR, FnTLRR} = 0000h denotes Fan Speed is zero. 7.12.3.3 Manual Color Frequency Control Mode In this mode, the software may monitor the Frequency Reading Register to control the frequency of the input signal. The content of the Color Frequency Reading Register keeps being updated every 31.25 ms, and the sample counter is the input signal from GPIOJO. Registers: ![Image](https://github.com/user-attachments/assets/ac54c6d1-7d14-4aa7-9f0e-743c3a50f7b6) Other information: ![Image](https://github.com/user-attachments/assets/dcc9c974-0e64-4bc8-8975-71339725463c) ![Image](https://github.com/user-attachments/assets/02ad6d88-e0cb-4e3c-990a-b973fac54a2b) I also understand that the EC can have an "automatic mode" when the fan speeds are controlled by a closed loop monitoring the temperature and a "manual mode" when this doesn't happen. I have no idea how to enable the "manual mode". Also, the registers that show the fan speeds might not be the ones that change them. Or they could be the same. As I said, reading 0x50 gets the fan speed, and writing to the same registere changes the fan speed for a very short time. If I write in a loop very fast, the speed stays what I want, but I guess this is not what we need. The registers from the documentation don't map directly to what I'm dumping and changing with ec-probe.exe. May there is an offset? The documentation states that "The registers are listed below and the base address is 1800h", but simply adding it also doesn't work. I guess the mapping is more complex than that. Any help will be greatly appreciated! I've come so far. Please, help me, or give me some idea on how to continue. I'm very motivated and I will do whatever is necessary to complete this and create a working PR. I'm a software developer myself. But I need help in this domain. Edit: after discussing with OpenAI's o1 for ages, looking at the documentation, poking around in registers and event automating the poking process, I don't think I will have the time to do this. If anyone can help, great. But this will take significant amount of time that I don't have.
kerem 2026-02-26 00:34:42 +03:00
  • closed this issue
  • added the
    Stale
    label
Author
Owner

@github-actions[bot] commented on GitHub (Aug 23, 2025):

This issue is stale because it has been open more than 180 days with no activity. If nobody comments within 7 days, this issue will be closed

<!-- gh-comment-id:3216026333 --> @github-actions[bot] commented on GitHub (Aug 23, 2025): This issue is stale because it has been open more than 180 days with no activity. If nobody comments within 7 days, this issue will be closed
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/nbfc-hirschmann#1223
No description provided.