Coil whine al tener fuente USB-C enchufada
==========================================


* Es un problema conocido con la "Lenovo E14 Gen 2", versión Intel.

* Lo empecé a notar el primer día, el Jueves 21 Abr.
* Fue al ver un video de youtube en el que explicaban como solucionar un Windows Update que se aplicaba con error. Pensaba que el sonido venîa del video.
* Antes de ver ese video, la temp de la CPU se había ido a 95°C por estar escaneando todo el C: con Avira y a la vez que Windows Update estaba buscando updates.
* Al ver videos youtube es que empecé a jugar con el brillo de la pantalla, que había estado alto las horas anteriores.

* Desaparece al desenchufar la fuente USB-C.
* A decir verdad, escuchando muy de cerca, se puede oir todavía algo de coil whine incluso si la fuente está desenchufada.
* El coil whine aumenta al bajar el brillo de la pantalla.
* Insoportable si la pantalla está apagada con la laptop encendida (no suspendida)
* Al apagar la laptop el coil whine continua si:
      .Está enchufada a USB-C
      .En BIOS está activada la opción de seguir cargando ports USB incluso apagada.
  Al desactivar esa opción de BIOS, deja de hacer coil whine al apagarla o suspenderla.
* Mientras está cargando la batería, cuando aun es menos de 100%, desaparece el coil whine.
* Conclusión: Está presente cuando hay bajo consumo de energía.
              Los cargadores USB-C tienen múltiples voltages:
                    5V, 9V, 15V y 20V
              Mi conclusión es que al bajar el voltage, aparece el coil whine.
              => UPDATE: Compré un "2in1 USB Tester", resulta que el voltaje siempre está por los 20Volts.
* Con 'upower -d' pude ver que la laptop es capaz de consumir 3Watts o menos en idle. O sea, que es
  posible que con 5V x 1A del cargador USB-C se alimente toda la laptop.

* Battery Threshold, de 75% a 80%: Lo sugirió uno, pero no estoy seguro que haya hecho una diferencia
  mientras lo probé. Se activa desde el software Lenovo Vantage -> Devices -> Power -> Battery Threshold.
  Queda activado incluso al bootear Linux porque debe ser una opción oculta del BIOS. No está entre las opciones del BIOS.c

* Uno en reddit sugiere desenchufar el cargador, esperar que la batería baje a 95% y volver a enchufarlo. Dice
  que hace eso al comienzo del día y se va el sonido.
  ==> Lo hice y mejora con el cargador original, se puede suspender a sleep y no hace más ruido ahí, y mejora 
      el ruido en los distintos brillos. No es una solución completa.
      Puede ser que el "Trickle Charge" que se debe hacer en 100% de batería, interfiere. Los trickle charge suelen
      ser pulsos no continuos, que me imagino que pueden ser audibles(?).

* Encima esta laptop apaga completamente el CPU cooler fan, con lo cual el ruido no se enmascara con 
  otro ruido de fondo. Al no tener disco rígido mecánico tampoco se enmascara con eso.
  Y eso significa que en idle el único consumo constante es el backlight de la pantalla.
  Porque la CPU y el SSD reducen su consumo a casi nada en idle, y pegan pulsos de actividad.

* Voltajes según fuente:
          Original hecha por Liteon:  20.4V
          Genérica 2power:            20.1V  (casi sin coil whine)
          Genérica Amazon Basics:     19.8V  (sin coil whine)
  Dependerá del voltaje? Será que cuando la batería está en 100% el voltaje compite con el de la fuente?
  Notar este mensaje en el log:
          Apr 23 21:55:59 tina upowerd[905]: energy_full (47,200000) is greater than energy_full_design (45,730000)
  O sea que la batería viene con más capacidad, raro, o el sensor de voltaje de la batería está descalibrado.
  En 100% da 12.6V, según 'upower -d', lo correcto para tres celdas de 4.2V. Pero quizás está corrido.
    De todas formas, al activar Battery Threshold de 80%, no se soluciona el problema. Se hace equivalente
  a desenchufar a 95% y que quede en "state: pending-charge" (según "upower -d"). Es decir, el sonido baja
  pero no se elimina.

Ideas
=====
    @Destildar carga USB mientras apagada en BIOS. 
     ==> Mejoró al apagar y suspender!
    #Probar con un cargador USB-C que no tenga bajos voltages. Que sea solo de 20V. (no existen)  
     ==> Cargador marca 2power: idéntico comportamiento. Incluso bug del UCSI.
    #Battery Threshold. 
     ==> No hizo diferencia, aunque es buena idea para prolongar la vida de la batería.
    #Desactivar port Thunderbolt 4 desde el BIOS. Ver qué onda.
     ==> Todo igual.
    #Voltímetro USB-C. Para saber si el whine es por switchear a 5V.
     .Si nunca switchea, puede ser que el adaptador no es de 3A en 5V si no 2A en 5V.
     .O que el adaptador no tenga el protocolo necesario.
     .O un bug de software en el Embedded Controller que no conversa con el adaptador para negociar el voltaje.
     => UPDATE: Nunca switchea a algo menor a 20V.
                OJO: El Voltímetro se actualiza cada tipo 2 segundos y no puede ver transients.
    -Osciloscopio en Vbus.
     Algo raro pasa con la fuente original que no pasa con la 2power ni la AmazonBasics.
     Con el voltímetro no se ve nada raro, solo se ve que es 0.3V más alto (en promedio).
     Hay que ver los transients. Con un cable USB tipo A abierto, quizás el Voltímetro USB puentee
     el Vcc del tipo A con el VBus del USB tipo C. Hay que tener cuidado porque si se toca el Vbus con el GND
     se puede romper algo.
     Resultados posibles:
        .Ruido de línea de 50Hz al bajar la potencia.
        .Ruido de 5KHz al bajar la potencia (que la fuente baja el duty cycle, el PWM, etc.)
        .Interrupciones periódicas en el trazo, reseteos, y un voltaje pico mayor a 20.4V que en promedio da 20.4V.
         (posible porque en la etiqueta la fuente se jacta de 0.0345W en standby, a ver si al bajar la potencia se manda un standby)
        .Bajadas a 15V o 9V o 5V momentáneas, por mala negociación del PD (Power Delivery) entre 
         la laptop y el chip de la fuente.
    -Por lo que veo online, hay fotos de cargadores "Lenovo 65W USB-C" que dicen fabricado en 2018.
     Hay hechos por Liteon como el mío, y hechos por Chicony, con las mismas dimensiones.
     Hay de 2 y de 3 patas.
    -No se si la 3ra pata sirva para puentearla a la masa del USB-C o si solo la usan para shieldear el chasis
     de la fuente, con un metal interno, para detectar fugas por disyuntor, solo eso, y algo de reducción de EMI en la fuente.

    @Probar deshabilitar CPU Power Management en BIOS, a ver si hace un piso de consumo en watts.
    ==> ANDUVO! Aunque aumentó 10°C o 20°C la CPU. Antes 35°C ahora 50°C.
        Ahora son 3Watts fijos de piso la CPU según 'turbostat'. Antes 0.4W CPU idle con variaciones rápidas.
        Se eliminó COMPLETAMENTE el coil whine.
        En todos los niveles de brillo, y pantalla apagada, desapareció el coil whine.
        Con un analizador de espectro sonoro de Android en el celu vi que no se escucha nada tampoco inaudible de 0 a 22KHz.
        Apoya la teoría de que la fuente activa el Green Mode y el standby con el bajo consumo.
        Togglear Intel SpeedStep no hizo nada. La opción que cuenta es "CPU Power Management" en OFF.
      ->OJO! Al suspender, se sigue calentando la CPU. No se puede suspender la máquina con esta opción en OFF. A los 5m estaba en 74°C.
        
    #Probar no apagar ventilador fan cpu cooler para tener piso de consumo.
    ==> No se puede. Activé la opción:
            # cat /etc/modprobe.d/thinkpad_acpi.conf
            options thinkpad_acpi fan_control=1
        Y ahora puedo setear niveles de fan manuales, o volver a 'auto':
            echo level 5 > /proc/acpi/ibm/fan
            echo level 2 > /proc/acpi/ibm/fan
            echo level auto > /proc/acpi/ibm/fan
            cat /proc/acpi/ibm/fan
        Pero arranca por 2 segundos y rampea para abajo a 0rpm en niveles 0 a 4. Y en nivel 5 se va a 3300rpm directamente.
        No hay intermedio entre 0 y 3300rpm. Re mal.

    #Probar sacar 'intel_pstate' como cpufreq driver y probar verdadero modo 'performance'/'ondemand'/'powersave'.
    ==> No sirvió. O sea, CpuSlow, CpuFast, y cambiar el scaling_min_freq tenían efecto en cambiar la velocidad
        del CPU pero no tenían efecto en el consumo mínimo en watts.

    @Probar deshabilitar C-States escribiendo a cpu_dma_latency y manteniéndolo abierto:
     ==> ÉXITO! Anduvo!!
         Ahora el brillo en 15% no hace ningún ruido. Bajar el brillo a 0% tampoco casi.
         Pero el screensaver que apaga la pantalla sí que hace ruido, a diferencia de poner OFF en "CPU Power Management"
         Debe ser que además del backlight, en screensaver se apaga algún chip o Intel Graphics. Tarda 1 segundo luego de oscurecer la pantalla en empezar el sonido.
         Los valores que andan bien son 250us y 200us y 100us y 10us y 5us y 1us, casi equivalentes a 2.5W ~ 2.7W. Con 0 se va muy alto el CPU a 9.0Watts.
         El valor de 1000us y 500us y 400us y 300us ya no anda bien, porque vuelve el sonido y el PkgWatt es errático.
         El valor default sin correr el programa es 2000000000, (que serían 2000segundos?), que en hexa es 0x77359400.
         Con este método, se puede suspender la laptop a sleep y la temperatura de la CPU sigue bajando.
         Bajar programa de:
                 https://wiki.bu.ost.ch/infoportal/_media/embedded_systems/ethercat/controlling_processor_c-state_usage_in_linux_v1.1_nov2013.pdf
         Hay que agregarle un par de includes:
                #include <stdint.h>
                #include <stdlib.h>
                #include <unistd.h>
         Compilar:
                gcc cpu_c.c -o cpu_c
         Correr:
                # ./cpu_c 5
                setting latency to 5 us
                ^C
                # ./cpu_c 10
                setting latency to 10 us
         El valor se escribe en binario:
                juanma@tina:~$ l /dev/cpu_dma_latency
                crw------- 1 root root 10, 124 May  2 20:04 /dev/cpu_dma_latency
                juanma@tina:~$ sudo cat /dev/cpu_dma_latency | hexdump -C
                00000000  00 94 35 77                                       |..5w|
                00000004
                juanma@tina:~$ sudo cat /dev/cpu_dma_latency | hexdump -C
                00000000  05 00 00 00                                       |....|
                00000004
                juanma@tina:~$ sudo cat /dev/cpu_dma_latency | hexdump -C
                00000000  0a 00 00 00                                       |....|
                00000004
         Apenas se cierra con CTRL+C, vuelve el coil whine y /dev/cpu_dma_latency vuelve al valor original.
         Las latencias posibles salen de acá:
                # cat /sys/devices/system/cpu/cpu0/cpuidle/*/latency
                0
                1
                253
                1048
                # cat /sys/devices/system/cpu/cpu0/cpuidle/*/name
                POLL
                C1_ACPI
                C2_ACPI
                C3_ACPI
                # 
        UPDATE: Malas noticias, el turbo queda recortado cuando se deshabilitan los C-States estos > C1.
                Con C-States disabled:
                    $ ./benchmark 504500
                    Elapsed: 15.978s
                    41871 prime numbers were found between 2 and 504500
                Con C-States enabled:
                    $ sudo systemctl stop lenovo_fix_coil_whine
                    $ ./benchmark 504500
                    Elapsed: 14.493s
                    41871 prime numbers were found between 2 and 504500
                Es una diferencia de 9.3% de velocidad. Según turbostat, uno alcanza 3800MHz y el otro 4200MHz.
                Los resultados son bien repetibles.
                Esto es una motivación para conseguir una buena fuente, además del tema temperaturas.


      @Idea: Comprar fuente con ficha europea o certificación europea.
       La teoría es que el cap anti interferencia va a estar pensado para 240V en vez de 110V y que
       eso de alguna manera ayude a que funcione bien el touchpad sin interferencia.
            -La Satechi PD 100W tiene ActivePFC, pero un chip "PowerIntegrations SC1936C" que tiene Green Mode.
             El ActivePFC es porque es >= 100W.
             Tiene signo de FCC, con lo cual es un punto a favor de que podría andar el touchpad sin EMI. Parece trucho el logo igualmente.
             El pequeńo detalle es que la AmazonBasics también tiene signo de FCC y el touchpad no funciona.
             Tiene unos buenos filtros inductores a la salida.
             Hay reviews que dicen que calienta mucho con una laptop macbook pro de 16" pulgadas (ahí anda a 100W seguro).
             Un review dice que con una Lenovo Extreme la ve como 60W, pero eso seguro es usar un cable de 60W sin chip.
             => La Satechi tiene certificación ETL, que es de USA.

            -La "Anker PowerPort iii 65W" gris, tiene un chip "PowerIntegrations INN4075C" que tiene Green Mode y además ZVS (Zero Voltage Switching). 
             No tiene ActivePFC.
             No tiene signo FCC.
             También tiene inductores a la salida pero parecen poca cosa.
             Hay reviews que dicen que calienta y que falla espectacularmente.
             => No me inspira confianza.

            -La "McDodo 100W" es muy parecida a una "Baseus 100w".
        ==> COMPRÉ LA SATECHI!
            ==> La Satechi no tiene coil whine!
                La Satechi mientras no se usen dos dedos en el touchpad, no lo hace trabar.
                Si se traba el touchpad, es cuestión de esperar un poco y se le pasa. Hasta la próxima vez
                que se hace scroll con dos dedos o se dejan apoyados dos dedos, y entonces se vuelven a trabar los taps
                y el movimiento se hace lento y con lagging.
                  En cambio con la Amazon Basics, el touchpad empeora solo de usarlo con un solo dedo.
                Al rato se le pasa pero vuelve de solo volver a usarlo.
                  Otra cosa, con la Satechi hasta ahora no tuve el bug del UCSI al iniciar.
                Gracias al cable McDodo, el Lenovo Vantage dice que la fuente es de 100Watts.

      -Medir con PowerMeter el factor de potencia de la fuente original. 
       Porque el ebook de fuentes menciona que puede haber audible noise en alrededor del punto en que el ActivePFC 
       se activa. Se desactiva para bajas potencias.
       De hecho, cuando la laptop está apagada o cuando está en Sleep, no se escucha coil whine. Entonces no-load no es problema
       high load tampoco es problema. El problema es alrededor de 3Watts.
       Si el power factor es 0.6 o menos, entonces no hay PFC. Si es 0.9, hay PFC.
       ==> RESULTADO: PowerMeter dice:
                      Con coil whine, brillo 15%:                  4.0W        y 0.30 PF (PowerFactor), casi fijo
                      Sin coil whine, sin c-states:                8.3W fijo   y 0.41 PF fijo
                      Sin coil whine, sin c-states, Fan3300RPM:      9W fijo   y 0.41 PF fijo
                      Sin c-states, br15%, un youtube fullscreen:   13W        y 0.45 PF
                      Con c-states, br15%, un youtube fullscreen:   12W        y 0.45 ~ 0.50 PF
                      Con c-states, br15%, youtube 720 minimizado   9.0W       y 0.40 PF
                      Sin c-states, br15%, youtube 720 minimizado   9.6W       y 0.42 PF
                      Sin c-states, brillo 0%:                      7.9W       y 0.40 PF
                      Sin c-states, brillo 100%:                    10.3W      y 0.43 PF
                      Con c-states, brillo 80%:                 6W ~ 7W        y ~0.37 PF
                      Con c-states, brillo 100%:                6.5W ~ 7.5W    y ~0.39 PF 
                      Booteando, grub screen:                     19.6W        y 0.51 PF
                      Booteando, máximo instantáneo:              39.7W
                      Sleep, sin c-states, sin coil whine:         0.9W        y 0.12 PF (fijos)
                      Sleep, con c-states, pero sin coil whine:    0.7W        y 0.09 PF (fijos)
                      (pruebas hechas con batería al 99%, not charging, y en brillo 15% si no se especifica)
                      Nota1: Parece haber un 0.3W extra en los booteos que tienen el bug UCSI.

                      AMAZON BASICS:
                      Sin coil whine, sin c-states:                8.0W fijo   y 0.45 PF fijo
                      Con c-states:                                3.9W casi fijo y 0.37 ~ 0.41 PF
                      Sin c-states, br15%, un youtube fullscreen:   12W        y 0.50 PF
                      Con c-states, br15%, youtube 720 minimizado   8.6W       y 0.46 PF
                      Sin c-states, br15%, youtube 720 minimizado   9.1W       y 0.46 PF
                      Sleep, con c-states:                          1.0W       y 0.19 PF (fijos)

       

      -Ver con tester, habiendo descargado low side contra high side, medir capacitancia con el capacheck o con tester.
      @Ver con OSC para confirmar que el problema es EMI:
            -Lenovo:
                -100mV ripple.
                -Spikes gigantes de 1Vpp cuando baja la potencia a 3.5W (170mA @ 20.4V) y se escucha el coil whine de la laptop.
                 El ripple se mantiene de 100mV cuando aparecen los spikes.
            -AmazonBasics:
                -180mV ripple.
                -No hay spikes pero se "ensucia" el trazo al bajar la potencia (también 1Vpp!). No hay coil whine en la laptop.
                 El ripple se mantiene de 180mV al bajar la potencia.
            ==> La teoría es que:
                    .Los spikes causan el coil whine, y provienen del Burst Mode del green mode.
                    .El ripple alto causa el touchpad errático.
                -La pregunta es si todas las fuentes que tienen Green Mode y BurstMode van a tener esos spikes
                 tan altos o si es un problema de inestabilidad con este modelo de fuente Lenovo.
                -Lo ideal sería saber qué chip usa la Lenovo, pero no hay teardowns detallados online.
                 Es claro que es un problema de diseño y no de construcción, porque dos fuentes Lenovo distintas hacen lo mismo.
                -La otra pregunta es cómo saber de antemano si una fuente va a tener mucho ripple o no.
                 Quizás está relacionado con el inductor de filtrado a la salida, o con el Y capacitor de reducción de interefencia.
                 Como el ripple sube y baja al yo acercar las manos a los cables y al teclado de la laptop,
                 suena a que puede ser el Y capacitor absorbiendo más o menos según el modelo de fuente.
                 O sea, quizás el ripple que medí no tiene nada que ver con la regulación de las fuentes y tiene
                 todo que ver con la longitud de los cables del OSC y el Y capacitor.
                 De hecho, en el libro "Essential Guide To Power Supplies", dicen que para medir ripple hay que usar una técnica especial
                 sin cablecito cocodrilo de tierra, en vez directo en el probe del OSC en la malla de gnd.
      @Ver cuánto es mucho ripple en el que hace reviews de fuentes.
           => El de "lygte-info.dk" considerố 66mV como buen ripple/noise y 110mV como mal noise. 
              Hubo una fuente de 9mV y otra de 10mV también, con outputs bien bien chatos.
           => Un comentario de Youtube en el video de teardown de "Apple 20W USB-C" de ChargerLAB, dice:
                    """Measure the output voltage ripple. The ripple should not exceed 200mV. Good 10-80mV.   (VBUS Oscilloscope)"""





Workarounds:
===========
    -Evitar apagar la pantalla: Configurar o que vaya directo a sleep o que no apague nunca la pantalla.
     => Dim Screen en vez de ScreenPowersave, no hace ruido. Sumar un slideshow en Lock Screen c/5m para ciclar los pixels y evitar Image Retention de IPS.
    -No bajar el brillo. Configurar colores de font de bajo brillo en Konsole y Yakuake para no necesitar bajar mucho el brillo.
    -Poner música.
    -Usar desenchufada, como un celular.
    -Desenchufar, que descargue 1% la batería, y volver a enchufar. Se va el ruido por esa sesión!
     Creo que al no ver la batería en 100%, el chip negocia 20Volts y queda en eso.




