Páginas

Buscar este blog

jueves, 5 de noviembre de 2026

Cómo arreglar la suspensión y el trackpad en una MacBook Pro 2012 con FreeBSD 14.5

El reto: hacer que una MacBook Pro de 2012 duerma (y despierte)

Instalar FreeBSD en hardware de Apple es un ejercicio de paciencia. Los MacBooks son máquinas excelentes, pero su firmware ACPI y sus controladores propietarios (como el del trackpad o el de la virtualización) no están pensados para colaborar con sistemas operativos que no sean macOS.

Hace unos días me propuse arreglar dos de los problemas más frustrantes de mi MacBook Pro de 2012 con FreeBSD 14.5: conseguir que el equipo suspenda correctamente (S3) sin apagarse, y lograr que el trackpad siga funcionando al despertar. Lo que sigue es el diario de a bordo de cómo lo resolví, con los comandos exactos y las trampas que encontré por el camino. Gran parte de las pistas iniciales las encontré en la excelente guía de Joshua: A Full Guide: FreeBSD on a MacBook Pro 11.4 (A1398).

El hardware: MacBook Pro de 2012 (Ivy Bridge), con FreeBSD 14.5-RELEASE. El sistema usa el driver gráfico i915kms y el sistema de gestión de energía ACPI.

Problema 1: El equipo se apaga en lugar de suspender

Al ejecutar acpiconf -s 3 o cerrar la tapa, el sistema no entraba en S3 (suspensión): se apagaba por completo. El primer paso fue activar el "modo de prueba" de ACPI para ver qué driver estaba fallando. Si el sistema sobrevive al bounce de suspensión, el problema está en la reanudación; si se apaga, el problema está en la preparación.

# Activar el modo de rebote y probar la suspensión
sysctl debug.acpi.suspend_bounce=1
acpiconf -s 3

En mi caso, el equipo se apagaba de golpe. La causa, documentada en la guía de Joshua sobre FreeBSD en MacBooks, era el módulo vmm (el hipervisor de bhyve). Al intentar suspender, el chip de virtualización de Intel se quedaba en un estado inconsistente y el kernel entraba en pánico.

La regla de oro: si usas vm_enable="YES" en /etc/rc.conf, el módulo vmm se carga automáticamente. Este módulo rompe la suspensión en hardware Apple. La solución es descargarlo antes de dormir.

Añadí los siguientes comandos a los scripts de suspensión y reanudación de FreeBSD para gestionar vmm automáticamente:

# En /etc/rc.suspend (antes del exit 0)
/sbin/kldunload -f vmm

# En /etc/rc.resume (después de los sync)
/sbin/kldload vmm

Con esto, el equipo ya entraba en suspensión sin apagarse. El primer gran obstáculo estaba superado.

Problema 2: El trackpad se queda "muerto" al despertar

Una vez resuelta la suspensión, apareció el segundo problema (y el más puñetero). Al despertar, el trackpad dejaba de responder por completo. En FreeBSD 14, los drivers para el hardware de Apple (wsp y atp) ya vienen compilados en el kernel o se cargan automáticamente. El conflicto surge porque, tras la reanudación, el driver atp se le adelanta al wsp y secuestra el dispositivo, dejando el trackpad inoperativo.

Comprobé qué driver tenía el control tras el arranque:

usbconfig -d ugen2.9 show_ifdrv

# Salida:
# ugen2.9.0: ukbd0: <Apple Inc. Apple Internal Keyboard / Trackpad>
# ugen2.9.1: atp0: <Apple Inc. Apple Internal Keyboard / Trackpad>
# ugen2.9.2: ums0: <Apple Inc. Apple Internal Keyboard / Trackpad>

Ahí estaba el conflicto: los drivers atp0 y ums0 estaban capturando el dispositivo, impidiendo que el driver correcto de Apple, wsp, pudiera inicializar el trackpad. Tras probar varios quirks en el loader.conf (sin éxito), el descubrimiento clave fue ejecutar manualmente el siguiente comando al despertar:

/usr/sbin/devctl detach atp0

¡Bingo! Al liberar atp0, el trackpad volvía a la vida inmediatamente. El problema era que atp0 secuestraba el dispositivo durante la reanudación, bloqueando la carga de wsp y dejando el hardware inoperativo.

La solución final: automatizar la liberación del driver

El comando devctl detach funcionaba a mano, pero al meterlo en /etc/rc.resume fallaba porque se ejecutaba antes de que el bus USB hubiera registrado atp0. La solución fue crear un bucle de espera que intentara desconectar el driver varias veces hasta que el dispositivo estuviera listo:

# En /etc/rc.resume (al final, antes del exit 0)
# Esperar a que atp0 aparezca y luego desconectarlo
for i in $(seq 1 20); do
    if /usr/sbin/devctl detach atp0 2>/dev/null; then
        break
    fi
    sleep 0.5
done

Este bucle espera hasta 10 segundos (20 intentos de 0,5 segundos) para que atp0 esté disponible. En cuanto lo detecta, lo desconecta, liberando el trackpad para que wsp lo recupere.

Archivos finales de configuración

Para que todo quede documentado, estos son los archivos clave tal y como quedaron en mi sistema:

/boot/loader.conf

No se necesitan módulos adicionales para los drivers del trackpad: vienen en el kernel.

kern.geom.label.disk_ident.enable="0"
kern.geom.label.gptid.enable="0"
cryptodev_load="YES"
zfs_load="YES"
asmc_load="YES"
coretemp_load="YES"
hint.hdaa.0.nid21.config="as=1 seq=15"
hint.hdaa.0.nid20.config="as=1 seq=0"
acpi_video_load="YES"
screen.font="8x14"
loader_logo="beastie"
autoboot_delay="3"

/etc/rc.suspend

# ... (código base del script)
# Descargar vmm antes de dormir
/sbin/kldunload -f vmm

/bin/rm -f /var/run/rc.suspend.pid
if [ $subsystem = "apm" ]; then
	/usr/sbin/zzz
else
	/usr/sbin/acpiconf -k 0
fi

exit 0

/etc/rc.resume

# ... (código base del script)
# Recargar vmm
/sbin/kldload vmm

# Esperar a que atp0 aparezca y luego desconectarlo
for i in $(seq 1 20); do
    if /usr/sbin/devctl detach atp0 2>/dev/null; then
        logger -t resume "Trackpad liberado (atp0 desconectado)"
        break
    fi
    sleep 0.5
done

# Ejecutar scripts de reanudación estándar
files=`rcorder ${rcorder_opts} /etc/rc.d/* ${local_rc} 2>/dev/null`
# ...
exit 0
Consejo de depuración: Añadiendo el logger -t resume dentro del bucle, dejamos constancia en /var/log/messages de que el script hizo su trabajo (o de si falló). Es muy útil para diagnosticar problemas en el futuro.

El resultado: una MacBook Pro renacida

Con estos cambios, la MacBook Pro de 2012 ahora:

  • Suspende correctamente al cerrar la tapa o pulsar el botón de encendido.
  • Despierta sin apagarse, gracias a la gestión de vmm.
  • Recupera el trackpad automáticamente, con gestos y clicks funcionando.
  • Mantiene la red y el resto de periféricos operativos al despertar.
Conclusión: FreeBSD en hardware Apple requiere paciencia, pero es totalmente funcional. El truco está en entender la guerra de drivers (wsp vs atp), gestionar los módulos del kernel (vmm) con scripts de suspensión, y usar devctl detach para liberar dispositivos secuestrados. Con estos ajustes, una MacBook de 2012 puede seguir siendo un portátil productivo con FreeBSD.

FreeBSD es genial!.

No hay comentarios:

Publicar un comentario