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).
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.
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
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.
carlos@macbsd:~ $ grep "Trackpad liberado (atp0 desconectado)" /var/log/messages Nov 6 00:05:06 macbsd resume[2530]: Trackpad liberado (atp0 desconectado) Nov 6 00:05:26 macbsd resume[2977]: Trackpad liberado (atp0 desconectado) Nov 6 08:24:47 macbsd resume[3407]: Trackpad liberado (atp0 desconectado) Nov 6 08:51:22 macbsd resume[2500]: Trackpad liberado (atp0 desconectado) Nov 6 09:49:32 macbsd resume[3018]: Trackpad liberado (atp0 desconectado)
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.
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!.




