🔊 Audio del iMac 2017 en Linux — Cirrus Logic CS8409
🇪🇸 Español · 🇬🇧 English · Versión actual: 1.2.0 · Novedades
Solución completa para que funcionen los altavoces internos, los auriculares y el HDMI de los Apple iMac de 2017 (iMac18,1 · iMac18,2 · iMac18,3) en Linux.
Incluye un driver parcheado basado en davidjo/snd_hda_macbookpro, un instalador universal con menú (Fedora, Ubuntu/Debian, Arch, openSUSE y NixOS), compilación automática con DKMS para que sobreviva a las actualizaciones del kernel, un selector de modo altavoces / auriculares y la configuración de PipeWire / WirePlumber para usar los altavoces y el HDMI a la vez.
git clone https://github.com/riqgonzalo/imac-2017-linux-audio-cs8409.git
cd imac-2017-linux-audio-cs8409
./instalar_audio_imac.sh # elige la opción 1 (autodetectar)
🙏 ¿Te ha funcionado (o no)? Cuéntalo aquí con tu modelo y distro. Cada reporte ayuda a otros dueños de iMac.
Índice
- El problema
- ¿Es mi equipo?
- Por qué ocurre (causa raíz)
- La solución: qué cambia este driver
- Requisitos
- Instalación
- El instalador, opción por opción
- Qué hace la instalación, paso a paso
- Archivos que crea o modifica en el sistema
- Modo altavoces / auriculares (
force_speakers) - Altavoces internos + HDMI al mismo tiempo
- NixOS
- Actualizaciones del kernel
- Diagnóstico y solución de problemas
- Desinstalar
- Limitaciones conocidas
- Estructura del repositorio
- Créditos y licencia
1. El problema
Al instalar Linux en un iMac de 2017 aparece alguno de estos síntomas:
- 🔇 Los altavoces internos no suenan, aunque el control de volumen se mueve y las apps parecen reproducir.
- 🎧 El sistema dice que hay auriculares conectados cuando no los hay, y la salida queda fijada en «Auriculares».
- Solo aparece la salida HDMI / DisplayPort, o ninguna salida analógica.
- Al conectar o desconectar el jack no cambia nada.
- Tras actualizar el kernel, el sonido que se había conseguido desaparece otra vez.
2. ¿Es mi equipo?
| Modelo (identificador) | Equipo | Probado |
|---|---|---|
iMac18,1 |
iMac 21,5” (2017) | ✅ Principal |
iMac18,2 |
iMac 21,5” Retina 4K (2017) | Previsto (mismo hardware de audio) |
iMac18,3 |
iMac 27” Retina 5K (2017) | Previsto (mismo hardware de audio) |
| MacBook Pro con CS8409 | MacBook Pro 2016–2017 | Soportado por el driver original |
Compruébalo así:
# Modelo del equipo
cat /sys/class/dmi/id/product_name # → iMac18,1 / iMac18,2 / iMac18,3
# Chip de audio
grep -m1 Codec /proc/asound/card*/codec#* # → Codec: Cirrus Logic CS8409
# Subsystem ID de Apple
grep -m1 "Subsystem Id" /proc/asound/card*/codec#* # → 0x106b1000 / 0x106b0f00 / 0x106b0e00
Si el codec es Cirrus Logic CS8409 y el subsystem empieza por 0x106b, esta solución es para ti.
3. Por qué ocurre (causa raíz)
El audio de estos iMac está repartido en varios chips:
┌──────────────────────────────┐
Intel HDA ───►│ Cirrus Logic CS8409 │ puente HDA ⇄ I²C/I²S
(PCH, 00:1f.3)│ (codec "bridge") │
└───────┬───────────────┬──────┘
│ I²C / I²S │ I²C / I²S
┌─────────▼──────┐ ┌─────▼───────────────────┐
│ Cirrus CS42L83 │ │ Amplificadores TI │
│ codec del jack │ │ TAS5764x ("TAS57642") │
│ (auriculares, │ │ → 4 altavoces internos │
│ micro, sensor)│ │ (2 tweeter + 2 woofer)│
└────────────────┘ └─────────────────────────┘
- El kernel estándar no sabe programar el hardware de Apple. El módulo
snd_hda_codec_cs8409del kernel soporta placas Dell y de referencia de Cirrus, pero no la secuencia de arranque que Apple usa para los amplificadores y el codec del jack. Sin ella los amplificadores nunca se encienden. - El driver de davidjo (snd_hda_macbookpro) reimplementa esa secuencia extrayéndola de macOS y funciona en MacBook Pro y en varios iMac.
- Pero en el iMac el sensor del jack se lee al revés. El driver original asume que los iMac (
0x106b1000,0x106b0f00,0x106b0e00) tienen el circuito de detección invertido y llama acs42l83_tip_sense(codec, 1). En estos equipos eso provoca un falso positivo permanente de «auriculares conectados»: el driver marcajack_present = 1, envía todo el audio a la salida de auriculares y silencia los altavoces internos.
4. La solución: qué cambia este driver
La carpeta snd_hda_macbookpro_imac/ es el driver de davidjo con tres cambios. Están también en un parche aparte: parches/imac-cs8409.patch (generado contra el commit 89b22ff del original).
4.1 Sensor del jack sin invertir — patch_cirrus/patch_cirrus_real84.h
- // apparently the imacs use an inverted circuit for physical sensing of jack being plugged in
- if (codec->core.subsystem_id == 0x106b1000 || codec->core.subsystem_id == 0x106b0f00 || codec->core.subsystem_id == 0x106b0e00)
- cs42l83_tip_sense(codec, 1);
- else
- cs42l83_tip_sense(codec, 0);
+ /* Do not invert tip sense (invert = 0).
+ * Inverting tip sense causes false positive headphone presence on iMacs,
+ * locking the audio subsystem to headphones and muting internal speakers.
+ */
+ cs42l83_tip_sense(codec, 0);
Es la corrección principal: con el sensor sin invertir, el driver ve el jack vacío, enciende los amplificadores y usa los altavoces.
4.2 Nuevo parámetro force_speakers — patch_cirrus/cirrus_apple.h
static int force_speakers = 0;
module_param(force_speakers, int, 0644);
MODULE_PARM_DESC(force_speakers, "Force internal speakers active (1 = always force speakers, 0 = auto)");
Es una opción del módulo que se puede cambiar en caliente desde /sys/module/snd_hda_codec_cs8409/parameters/force_speakers (permisos 0644):
| Valor | Comportamiento |
|---|---|
0 (por defecto) |
Automático: altavoces sin jack, auriculares al conectar el jack. |
1 |
Altavoces forzados: se ignora el jack. Es la salida de emergencia si en tu unidad el sensor sigue dando falsos positivos. |
Se consulta en todos los puntos donde el driver decide la salida:
| Archivo | Punto de decisión | Cambio |
|---|---|---|
cirrus_apple.h |
Respuesta al pin sense del jack | jack_present → !force_speakers && jack_present |
patch_cirrus_new84.h |
Preparación del stream de reproducción (2 sitios) | ídem |
patch_cirrus_real84.h |
Arranque: «auriculares ya conectados» | retval & 0x80 → !force_speakers && (retval & 0x80) |
patch_cirrus_real84.h |
Interrupción de conexión del jack | no marca el jack si force_speakers=1 |
4.3 install.cirrus.driver.sh termina con éxito en DKMS
- ls -lA $update_dir
- exit
+ ls -lA $update_dir 2>/dev/null || ls -lA /lib/modules/${UNAME}/extra 2>/dev/null || true
+ exit 0
En Fedora, DKMS instala el módulo en /lib/modules/<kernel>/extra y no en updates/dkms. El ls del original fallaba y el script devolvía error aunque la instalación hubiera ido bien.
5. Requisitos
- Un iMac 2017 (o MacBook Pro) con CS8409 (ver sección 2).
- Una distribución tradicional (no inmutable) de estas familias:
- RPM: Fedora, RHEL, CentOS, Rocky, AlmaLinux, openSUSE/SLES (en RHEL y derivados se activa EPEL automáticamente para
dkms) - DEB: Ubuntu, Debian, Linux Mint, Pop!_OS, elementary, Zorin
- Arch: Arch Linux, Manjaro, EndeavourOS, Garuda
- NixOS (genera un módulo declarativo)
- RPM: Fedora, RHEL, CentOS, Rocky, AlmaLinux, openSUSE/SLES (en RHEL y derivados se activa EPEL automáticamente para
- Conexión a Internet (para dependencias y, si hace falta, el driver original).
sudo. El instalador pide la contraseña solo.- PipeWire + WirePlumber para la parte de HDMI simultáneo (por defecto en las distros actuales).
- Cualquier escritorio: los accesos directos usan la terminal predeterminada (Konsole, GNOME Console, etc.).
Comprobación de hardware
Antes de tocar nada, el instalador comprueba que el equipo sea un Mac con Cirrus Logic CS8409: codec CS8409 con subsystem de Apple (0x106b…), o modelo iMac18,1-3 / MacBookPro13,x-14,x. En cualquier otro PC muestra el modelo detectado y avisa de que podría quedarse sin sonido. Solo continúa si escribes CONTINUAR. Así se protege, por ejemplo, a un portátil Dell con CS8409 o a un PC con Realtek, que usan la misma dirección de audio Intel (00:1f.3).
Compatibilidad probada (v1.2.0)
Probado en contenedores (detección de la distro y existencia de todos los paquetes en sus repositorios) y con las pruebas automáticas de pruebas/test_scripts.sh:
| Distribución | Detección | Paquetes | Notas |
|---|---|---|---|
| Fedora 44 | RPM ✔ | ✔ | wget lo aporta wget2-wget |
| Rocky Linux 9 | RPM ✔ | ✔ | dkms llega desde EPEL (se activa solo) |
| openSUSE Tumbleweed | RPM ✔ | ✔ | |
| Ubuntu 24.04 | DEB ✔ | ✔ | |
| Debian 13 | DEB ✔ | ✔ | |
| Arch Linux | Arch ✔ | ✔ | |
| Fedora Kinoite (inmutable) | Bloqueado ✔ | — | Avisa de que no es compatible |
| PC no Apple (HP con Realtek) | — | — | Detectado como no compatible ✔ |
La compilación del módulo y el sonido solo pueden probarse en un iMac real; los contenedores comprueban todo lo demás.
6. Instalación
Opción A: terminal
git clone https://github.com/riqgonzalo/imac-2017-linux-audio-cs8409.git
cd imac-2017-linux-audio-cs8409
./instalar_audio_imac.sh
Elige 1) Autodetectar e instalar automáticamente. Al terminar oirás un sonido de prueba. Si los módulos estaban en uso, el instalador ofrece reiniciar.
Importante: no muevas ni borres la carpeta del repositorio antes de instalar. El instalador busca el driver parcheado en
./snd_hda_macbookpro_imac. Tras la instalación el código queda copiado en/usr/src/snd_hda_macbookpro-0.1y la carpeta ya no es necesaria.
Opción B: accesos directos de escritorio
./crear_lanzadores.sh
Crea en el menú de aplicaciones (y en el Escritorio) dos accesos que apuntan a la carpeta donde clonaste el repo:
- Instalador Audio Apple (CS8409): abre el instalador en la terminal de tu escritorio.
- Modo de Audio Apple (Altavoces / Auriculares): abre el selector de modo.
7. El instalador, opción por opción
=============================================================================
INSTALADOR UNIVERSAL DE AUDIO APPLE (CIRRUS CS8409 / TAS57642) v1.2.0
Soporte probado para iMac18,1, iMac18,2, iMac18,3 y MBP
=============================================================================
Kernel activo : 6.x.y
Sistema : Fedora Linux 4x (Workstation Edition)
Usuario : tu_usuario
-----------------------------------------------------------------------------
1) Autodetectar e instalar automáticamente (Recomendado)
2) Instalar en sistemas basados en RPM (Fedora, RHEL, CentOS, openSUSE)
3) Instalar en sistemas basados en DEB (Ubuntu, Debian, Linux Mint, Pop!_OS)
4) Instalar en sistemas basados en Arch (Arch Linux, Manjaro, EndeavourOS)
5) Generar módulo para Nix / NixOS (experimental)
6) Configurar conmutación independiente HDMI / Altavoces (WirePlumber)
7) Diagnóstico de audio y prueba de altavoces
8) Desinstalar el controlador
9) Salir
Después de cada opción el instalador vuelve al menú.
| Opción | Función interna | Qué hace |
|---|---|---|
| 1 | autodetectar_e_instalar |
Lee /etc/os-release (ID e ID_LIKE) y lanza el flujo RPM, DEB, Arch o Nix que corresponda. Si detecta un sistema inmutable (rpm-ostree), se detiene y avisa. |
| 2 | instalar_rpm |
Dependencias con dnf (o zypper), compilación DKMS, configuración e initramfs con dracut. |
| 3 | instalar_deb |
Dependencias con apt-get, compilación DKMS, configuración e initramfs con update-initramfs. |
| 4 | instalar_arch |
Dependencias con pacman (elige linux-headers, -lts, -zen o -hardened según tu kernel) e initramfs con mkinitcpio -P. |
| 5 | instalar_nix |
Genera /etc/nixos/cs8409-audio.nix (experimental, ver sección 12). |
| 6 | configurar_dual_audio_hdmi_altavoces |
Solo la parte de PipeWire/WirePlumber y reinicia el audio del usuario. |
| 7 | diagnostico_audio |
Muestra el módulo cargado y su archivo, si tiene el parche del iMac, parámetros, DKMS, el servicio guardián, el estado del jack y las salidas de PipeWire. Reproduce un sonido de prueba si lo pides. |
| 8 | desinstalar |
Quita el módulo DKMS, el servicio guardián y toda la configuración, y regenera el initramfs (ver sección 15). |
| 9 | — | Sale. |
8. Qué hace la instalación, paso a paso
Los flujos RPM, DEB y Arch siguen la misma secuencia:
Paso 0: elevación a root
Si no se ejecuta como root, el script se relanza con exec sudo bash "$0". También detecta el usuario real ($SUDO_USER) para configurar su PipeWire y su carpeta personal. Las órdenes de audio del usuario (systemctl --user, pactl, pw-play) se ejecutan dentro de su sesión con runuser.
Cada paso importante se comprueba. Si algo falla (dependencias, descarga, compilación), el instalador lo dice claramente, no toca los módulos de audio y vuelve al menú. Todo queda registrado en /var/log/instalar_audio_imac.log.
Paso 1: dependencias
| Familia | Paquetes |
|---|---|
| Fedora / RHEL | kernel-devel-$(uname -r) kernel-devel-matched kernel-headers gcc make patch git dkms alsa-utils wget psmisc |
| openSUSE | kernel-devel kernel-default-devel gcc make patch git dkms alsa-utils wget psmisc |
| Debian / Ubuntu | linux-headers-$(uname -r) build-essential dkms alsa-utils patch git wget psmisc |
| Arch | base-devel dkms alsa-utils wget patch git psmisc linux[-lts/-zen/-hardened]-headers |
Paso 2: código fuente del driver (preparar_fuentes)
Quita el registro DKMS anterior y el código viejo, y copia el driver parcheado a /usr/src/snd_hda_macbookpro-0.1, la ruta que espera DKMS. Lo busca en este orden:
./snd_hda_macbookpro_imac(la carpeta de este repo), lo normal.~/snd_hda_macbookprodel usuario, si contienepatch_cirrus/cirrus_apple.h.- Respaldo: descarga el driver original de GitHub y le aplica
parches/imac-cs8409.patch. Si el original ha cambiado tanto que el parche no aplica, hace al menos la corrección del jack consed.
Paso 3: compilación con DKMS (compilar_con_dkms)
Primero comprueba que estén las cabeceras de tu kernel (/lib/modules/<kernel>/build). Avisa de que la descarga y la compilación pueden tardar entre 5 y 20 minutos, y luego ejecuta install.cirrus.driver.sh -i, mostrando la salida en pantalla y guardándola en el registro. Ese script:
- descarga el código fuente del subsistema de sonido exactamente de tu versión de kernel;
- le aplica los parches de Apple de davidjo (más los de este repo);
- compila solo
snd-hda-codec-cs8409.ko; - lo registra en DKMS (
dkms.conf,AUTOINSTALL="yes"), que lo instala en/lib/modules/<kernel>/extraoupdates/dkms.
Funciona con kernels anteriores y posteriores a la reorganización del sonido de la 6.17: el script detecta la versión y usa install.cirrus.driver.pre617.sh si hace falta.
Al terminar, el instalador verifica el resultado: el script tiene que acabar sin error y tiene que existir snd-hda-codec-cs8409.ko* en extra/ o updates/. Si no se cumplen las dos cosas, la instalación se detiene ahí.
Paso 4: persistencia (configurar_modprobe_y_guard)
- Escribe
/etc/modprobe.d/cs8409.confconforce_speakers=0, o conservaforce_speakers=1si ya lo tenías elegido. - Instala
/usr/local/bin/check-cs8409-driver.sh, que comprueba si existe el módulo para el kernel arrancado. Si falta y están las cabeceras, lo compila condkms install --forcey ejecutadepmod. Si faltan las cabeceras, solo lo anota en el registro del sistema. Nunca hace fallar el arranque. - Crea y habilita el servicio
cs8409-audio-guard.service. Se ejecuta en segundo plano cuando ya hay red (After=network-online.target,WantedBy=multi-user.target), con prioridad baja de CPU y disco, así que no retrasa el arranque ni el escritorio. - Habilita
dkms.servicesi existe.
Paso 5: perfiles de audio (configurar_dual_audio_hdmi_altavoces)
Configura ALSA Card Profile y WirePlumber para tener altavoces, HDMI y micrófono a la vez (ver sección 11).
Paso 6: initramfs
Regenera el initramfs para que arranque con el módulo nuevo: dracut --force (Fedora), update-initramfs -u (Debian/Ubuntu) o mkinitcpio -P (Arch).
Paso 7: recarga en caliente y prueba (reiniciar_modulos_y_probar)
- Guarda los volúmenes de ALSA (
alsactl store). - Detiene con normalidad PipeWire y WirePlumber del usuario (
systemctl --user stop, sockets incluidos). - Si otro programa sigue usando
/dev/snd/*(un navegador, Discord…), no lo cierra: muestra su nombre y deja la activación para el próximo reinicio. - Si nada usa el audio, descarga
snd_hda_intelysnd_hda_codec_cs8409(sin forzar) y los vuelve a cargar con el modo guardado encs8409.conf. - Vuelve a arrancar PipeWire y, si la recarga funcionó, busca la salida analógica, quita el silencio, pone el volumen al 40 %, selecciona el puerto altavoces y reproduce
complete.oga. Nunca usahw:/plughw:directamente, porque no tienen control de volumen. - Si hace falta reiniciar, te lo pregunta.
9. Archivos que crea o modifica en el sistema
| Ruta | Propósito |
|---|---|
/usr/src/snd_hda_macbookpro-0.1/ |
Código del driver para DKMS |
/lib/modules/<kernel>/extra/snd-hda-codec-cs8409.ko* (o updates/dkms/) |
Módulo compilado |
/etc/modprobe.d/cs8409.conf |
Parámetro force_speakers persistente |
/usr/local/bin/check-cs8409-driver.sh |
Script guardián |
/etc/systemd/system/cs8409-audio-guard.service |
Servicio guardián en el arranque |
/etc/alsa-card-profile/mixer/profile-sets/default.conf |
Copia del perfil por defecto |
/etc/alsa-card-profile/mixer/profile-sets/9999-custom.conf |
Perfil «Altavoces + HDMI + Micrófono» |
/etc/alsa-card-profile/mixer/paths/hdmi-output-{0,1,2}.conf |
HDMI sin depender del estado del conector |
/etc/wireplumber/wireplumber.conf.d/50-imac-audio.conf |
Perfil por defecto y nombres de las salidas |
~/.config/alsa-card-profile/… y ~/.config/wireplumber/… |
Réplica en el perfil del usuario |
/etc/nixos/cs8409-audio.nix |
Solo en NixOS |
/var/lib/alsa/asound.state |
Volúmenes guardados por alsactl |
/var/log/instalar_audio_imac.log |
Registro de cada instalación (salida de la compilación incluida) |
10. Modo altavoces / auriculares (force_speakers)
./cambiar_modo_audio.sh
============================================================
CONFIGURADOR DE MODO DE AUDIO APPLE (CS8409)
============================================================
Modo actual: Detección Automática (force_speakers=0)
Selecciona el modo deseado:
1) Activar Detección Automática (Altavoces <-> Auriculares)
2) Forzar Altavoces Internos permanentemente
3) Salir
El script:
- lee el modo actual de
/sys/module/snd_hda_codec_cs8409/parameters/force_speakers; - escribe el nuevo valor en ese mismo archivo, así que el cambio se aplica al momento sin reiniciar;
- lo guarda en
/etc/modprobe.d/cs8409.confpara que se mantenga tras reiniciar.
A mano sería así:
# Ver el modo actual
cat /sys/module/snd_hda_codec_cs8409/parameters/force_speakers
# Forzar altavoces ahora mismo
echo 1 | sudo tee /sys/module/snd_hda_codec_cs8409/parameters/force_speakers
# Hacerlo permanente
echo "options snd_hda_codec_cs8409 force_speakers=1" | sudo tee /etc/modprobe.d/cs8409.conf
Si el módulo cargado no tiene el parche del iMac, el selector lo avisa, y el modo se guarda igualmente para cuando lo tenga. Si el archivo cs8409.conf existe pero no tiene la línea force_speakers, la añade sin borrar lo demás.
Si al cambiar en caliente la salida no conmuta enseguida, conecta y desconecta el jack o reinicia la reproducción. El driver evalúa el parámetro al recibir eventos del jack y al iniciar un stream.
11. Altavoces internos + HDMI al mismo tiempo
Por defecto, PipeWire ofrece un perfil por tarjeta: o salida analógica o HDMI. Como en el iMac ambos cuelgan de la misma controladora Intel HDA (0000:00:1f.3), conectar una pantalla externa puede «robar» el audio a los altavoces.
La opción 6 (que también forma parte de la instalación completa) crea:
Un perfil combinado (9999-custom.conf):
[Profile output:analog-stereo+output:hdmi-all+input:analog-stereo]
description = Altavoces internos + HDMI + Micrófono
output-mappings = analog-stereo hdmi-stereo hdmi-stereo-extra1 hdmi-stereo-extra2
input-mappings = analog-stereo
priority = 8000
skip-probe = yes
Rutas HDMI que no dependen del estado del conector (state.unplugged = unknown), para que las salidas HDMI no desaparezcan ni se apaguen.
Una regla de WirePlumber que fija ese perfil en la tarjeta, desactiva el cambio automático de perfil (api.acp.auto-profile = false) y pone nombres claros a cada salida:
| Nodo de PipeWire | Nombre visible |
|---|---|
alsa_output.pci-0000_00_1f.3.analog-stereo |
Altavoces internos (iMac) |
alsa_output.pci-0000_00_1f.3.hdmi-stereo |
Audio HDMI (Pantalla / Proyector) |
alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra1 |
Audio HDMI 2 (DisplayPort) |
alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra2 |
Audio HDMI 3 (Thunderbolt / DisplayPort) |
Así puedes elegir cada salida por separado en los ajustes de sonido de KDE o GNOME, o enviar apps distintas a salidas distintas.
12. NixOS
🧪 Experimental: no se ha probado en NixOS.
En NixOS no se compila nada a mano. La opción 5 genera /etc/nixos/cs8409-audio.nix, un módulo declarativo que:
- construye
snd-hda-codec-cs8409desdedavidjo/snd_hda_macbookproparaconfig.boot.kernelPackages; - aplica la corrección del jack (
cs42l83_tip_sense(codec, 0)) enpostPatch; - lo añade a
boot.extraModulePackages; - instala el perfil combinado y la regla de WirePlumber con
environment.etc.
Para activarlo:
# /etc/nixos/configuration.nix
imports = [ ./hardware-configuration.nix ./cs8409-audio.nix ];
sudo nixos-rebuild switch
La primera vez fallará con un error de hash, porque se usa
lib.fakeSha256. Copia el hashgot: sha256-…que muestra Nix, ponlo en el camposha256y vuelve a ejecutarnixos-rebuild switch. El módulo de NixOS solo aplica la corrección del jack: no incluye el parámetroforce_speakers.
13. Actualizaciones del kernel
El módulo está compilado para un kernel concreto, así que hay dos protecciones para que el sonido no se pierda al actualizar:
- DKMS (
AUTOINSTALL="yes"): cuando el gestor de paquetes instala un kernel nuevo, DKMS recompila el módulo automáticamente, siempre que estén instaladas las cabeceras de ese kernel. cs8409-audio-guard.service: en cada arranque, ya con red y en segundo plano, comprueba que el módulo exista para el kernel actual. Si falta, lo compila; el audio de Apple se activará en el siguiente reinicio. Mira qué hizo conjournalctl -u cs8409-audio-guard.
En Fedora,
kernel-devel-matchedhace que las cabeceras se actualicen junto con el kernel. En Debian/Ubuntu instala el metapaquete de cabeceras (p. ej.linux-headers-generic) para el mismo efecto.
14. Diagnóstico y solución de problemas
La opción 7 del instalador lo muestra todo de una vez. A mano:
lsmod | grep -E "cs8409|snd_hda_intel" # ¿módulo cargado?
modinfo snd_hda_codec_cs8409 | grep -E "filename|parm" # ¿es el de DKMS? ¿tiene force_speakers?
cat /sys/module/snd_hda_codec_cs8409/parameters/force_speakers
dkms status # snd_hda_macbookpro/0.1, <kernel>: installed
sudo dmesg | grep -iE "cs8409|cs42l83|tas57" # mensajes del driver
amixer -c 0 contents | grep -A2 -i "Headphone Jack" # estado del jack según ALSA
pactl list sinks short # salidas de PipeWire
systemctl status cs8409-audio-guard.service
| Síntoma | Causa probable | Solución |
|---|---|---|
modinfo muestra un archivo en kernel/sound/… (no extra ni updates) |
Se carga el módulo del kernel, no el parcheado | sudo depmod -a y reinicia. Comprueba dkms status. |
modinfo no lista force_speakers |
El módulo cargado no lleva el parche del iMac | Reinstala con la opción 1 desde la carpeta del repo. |
dkms status vacío o «added» |
La compilación falló | Instala las cabeceras de tu kernel exacto (uname -r) y vuelve a instalar. |
| Sigue diciendo «Auriculares» sin nada conectado | Falso positivo del sensor | ./cambiar_modo_audio.sh → opción 2. |
| Sonido solo tras reiniciar | Los módulos estaban en uso al instalar | Normal: el instalador pide reiniciar. |
| «LA INSTALACIÓN NO SE COMPLETÓ» | Falló una dependencia, la descarga o la compilación | Lee /var/log/instalar_audio_imac.log. Lo más habitual: falta Internet o las cabeceras de tu kernel exacto. |
| La instalación parece colgada | Está descargando el código del kernel o compilando | Espera (5–20 min). Puedes seguirlo con sudo tail -f /var/log/instalar_audio_imac.log. |
| Sin sonido tras actualizar el kernel | Faltaban las cabeceras del kernel nuevo | Instálalas y ejecuta sudo /usr/local/bin/check-cs8409-driver.sh. |
| El módulo no carga: «Key was rejected by service» | Secure Boot activo con un módulo sin firmar | Desactiva Secure Boot o firma el módulo (MOK). |
| No aparece el perfil «Altavoces internos + HDMI» | WirePlumber no recargado | systemctl --user restart pipewire wireplumber. |
Volumen muy alto en hw:0,0 |
Ese dispositivo no tiene control de volumen | Usa siempre la salida por defecto de PipeWire. |
15. Desinstalar
Usa la opción 8) Desinstalar el controlador del instalador. Pide confirmación, quita todo y regenera el initramfs.
Si lo prefieres a mano, estos son los pasos:
sudo dkms remove -m snd_hda_macbookpro/0.1 --all
sudo rm -rf /usr/src/snd_hda_macbookpro-0.1
sudo systemctl disable --now cs8409-audio-guard.service
sudo rm -f /etc/systemd/system/cs8409-audio-guard.service /usr/local/bin/check-cs8409-driver.sh
sudo rm -f /etc/modprobe.d/cs8409.conf
sudo rm -f /etc/wireplumber/wireplumber.conf.d/50-imac-audio.conf \
/etc/alsa-card-profile/mixer/profile-sets/9999-custom.conf \
/etc/alsa-card-profile/mixer/profile-sets/default.conf \
/etc/alsa-card-profile/mixer/paths/hdmi-output-{0,1,2}.conf
rm -f ~/.config/wireplumber/wireplumber.conf.d/50-imac-audio.conf \
~/.config/alsa-card-profile/mixer/profile-sets/{9999-custom,default}.conf \
~/.config/alsa-card-profile/mixer/paths/hdmi-output-{0,1,2}.conf
sudo systemctl daemon-reload
sudo depmod -a
# Regenera el initramfs: dracut --force | update-initramfs -u | mkinitcpio -P
Después reinicia y volverá a cargarse el módulo snd_hda_codec_cs8409 del kernel.
16. Limitaciones conocidas
- Distribuciones inmutables no soportadas (Fedora Silverblue/Kinoite, Bazzite, openSUSE Aeon, etc.):
/usres de solo lectura y los paquetes se instalan conrpm-ostree. La compilación DKMS de este instalador no funciona ahí tal cual. - Los nombres de nodo de PipeWire asumen la controladora en
0000:00:1f.3, que es la del iMac 2017. En otro hardware habría que adaptarlos. - Micrófono: según el autor del driver, la grabación tiene un nivel muy bajo (igual que en macOS) y la integración del micrófono no está completa.
- Gestión de energía: el driver mantiene los amplificadores siempre encendidos. La suspensión no está probada.
- El sonido no será idéntico al de macOS, que aplica filtros digitales propios a tweeters y woofers.
force_speakerslo añade este repo: no existe en el driver original ni en el módulo de NixOS generado.- El instalador no tiene modo simulación: instala paquetes y escribe en
/etcy/usr/srcdirectamente. - Las pruebas de
pruebas/test_scripts.shsimulan los comandos del sistema; no sustituyen a una prueba en un iMac real.
17. Estructura del repositorio
imac-2017-linux-audio-cs8409/
├── instalar_audio_imac.sh # Instalador universal con menú
├── cambiar_modo_audio.sh # Selector automático / altavoces forzados
├── crear_lanzadores.sh # Crea los accesos directos del escritorio
├── pruebas/
│ └── test_scripts.sh # Pruebas sin hardware (bash pruebas/test_scripts.sh)
├── lanzadores/
│ ├── Instalador_Audio_Apple.desktop.in
│ └── Modo_Audio_Apple.desktop.in
├── parches/
│ └── imac-cs8409.patch # Cambios respecto a davidjo/snd_hda_macbookpro
├── snd_hda_macbookpro_imac/ # Driver completo ya parcheado (lo usa el instalador)
│ ├── install.cirrus.driver.sh
│ ├── install.cirrus.driver.pre617.sh
│ ├── dkms.conf
│ ├── patch_cirrus/ # Código del codec CS8409 + soporte Apple
│ └── ...
├── CHANGELOG.md # Historial de versiones
├── LICENSE # GPL-2.0
└── README.md
18. Créditos y licencia
- Driver original: davidjo/snd_hda_macbookpro. Todo el trabajo de ingeniería inversa del CS8409, el CS42L83 y los amplificadores de Apple es suyo.
- Corrección para iMac 2017, parámetro
force_speakers, instalador universal, selector de modo y configuración de PipeWire: @riqgonzalo.
Como el driver deriva de código GPL-2.0, todo el repositorio se distribuye bajo la GNU General Public License v2.
⚠️ Este software modifica módulos del kernel y la configuración del sistema de sonido. Se ofrece sin garantía. Úsalo bajo tu responsabilidad.