├── Google-Cave-1.0-Cave ├── sklnau8825max.conf ├── Google-Cave-1.0-Cave.conf ├── Speaker.conf └── Headphone.conf └── README.md /Google-Cave-1.0-Cave/sklnau8825max.conf: -------------------------------------------------------------------------------- 1 | Google-Cave-1.0-Cave.conf -------------------------------------------------------------------------------- /Google-Cave-1.0-Cave/Google-Cave-1.0-Cave.conf: -------------------------------------------------------------------------------- 1 | Comment "Cave internal card" 2 | 3 | SectionUseCase."Speaker" { 4 | File "Speaker.conf" 5 | Comment "Speaker" 6 | } 7 | 8 | SectionUseCase."Headphone" { 9 | File "Headphone.conf" 10 | Comment "Headphone" 11 | } 12 | 13 | ValueDefaults { 14 | PlaybackCTL "hw:sklnau8825max" 15 | CaptureCTL "hw:sklnau8825max" 16 | CaptureChannels "2" 17 | PlaybackChannels "2" 18 | } 19 | 20 | SectionDefaults [ 21 | cdev "hw:sklnau8825max" 22 | cset "name='DAC Oversampling Rate' 128" 23 | cset "name='Pin5-Port0 Mux' 1" 24 | cset "name='Pin6-Port0 Mux' 2" 25 | cset "name='Pin7-Port0 Mux' 3" 26 | cset "name='codec0_out mo media0_in mi Switch' on" 27 | cset "name='codec1_out mo media0_in mi Switch' off" 28 | cset "name='Spk Switch' on" 29 | cset "name='Headphone Jack Switch' off" 30 | cset "name='Headset Mic Switch' off" 31 | cset "name='media0_out mo codec0_in mi Switch' off" 32 | cset "name='media0_out mo dmic01_hifi_in mi Switch' on" 33 | cset "name='Mic Volume' 255" 34 | ] -------------------------------------------------------------------------------- /Google-Cave-1.0-Cave/Speaker.conf: -------------------------------------------------------------------------------- 1 | SectionVerb { 2 | Value { 3 | TQ "HiFi" 4 | CapturePCM "hw:sklnau8825max,3" 5 | PlaybackPCM "hw:sklnau8825max,0" 6 | } 7 | 8 | EnableSequence [ 9 | cdev "hw:sklnau8825max" 10 | cset "name='codec0_out mo media0_in mi Switch' on" 11 | cset "name='codec1_out mo media0_in mi Switch' off" 12 | cset "name='Spk Switch' on" 13 | cset "name='Headphone Jack Switch' off" 14 | ] 15 | DisableSequence [ 16 | ] 17 | } 18 | 19 | SectionDevice."Speaker".0 { 20 | Comment "Speaker" 21 | Value { 22 | PlaybackChannels "2" 23 | } 24 | EnableSequence [ 25 | ] 26 | DisableSequence [ 27 | ] 28 | } 29 | 30 | SectionDevice."Internal Mic".0 { 31 | Comment "Internal Mic" 32 | Value { 33 | CaptureChannels "2" 34 | CapturePriority "1" 35 | } 36 | EnableSequence [ 37 | cdev "hw:sklnau8825max" 38 | cset "name='Headset Mic Switch' off" 39 | cset "name='media0_out mo codec0_in mi Switch' off" 40 | cset "name='media0_out mo dmic01_hifi_in mi Switch' on" 41 | cset "name='Mic Volume' 255" 42 | ] 43 | 44 | DisableSequence [ 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /Google-Cave-1.0-Cave/Headphone.conf: -------------------------------------------------------------------------------- 1 | SectionVerb { 2 | Value { 3 | TQ "HiFi" 4 | CapturePCM "hw:sklnau8825max,3" 5 | PlaybackPCM "hw:sklnau8825max,0" 6 | } 7 | EnableSequence [ 8 | cdev "hw:sklnau8825max" 9 | cset "name='codec0_out mo media0_in mi Switch' off" 10 | cset "name='codec1_out mo media0_in mi Switch' on" 11 | cset "name='Spk Switch' off" 12 | cset "name='Headphone Jack Switch' on" 13 | ] 14 | DisableSequence [ 15 | ] 16 | } 17 | 18 | SectionDevice."Internal Mic".0 { 19 | Comment "Internal Mic" 20 | Value { 21 | CaptureChannels "2" 22 | CapturePriority "1" 23 | } 24 | EnableSequence [ 25 | cdev "hw:sklnau8825max" 26 | cset "name='Headset Mic Switch' off" 27 | cset "name='media0_out mo codec0_in mi Switch' off" 28 | cset "name='media0_out mo dmic01_hifi_in mi Switch' on" 29 | cset "name='Mic Volume' 255" 30 | ] 31 | DisableSequence [ 32 | ] 33 | } 34 | 35 | SectionDevice."Headphone".0 { 36 | Comment "Headphone" 37 | Value { 38 | JackName "sklnau8825max Headset Jack" 39 | PlaybackChannels "2" 40 | } 41 | EnableSequence [ 42 | ] 43 | DisableSequence [ 44 | ] 45 | } 46 | 47 | SectionDevice."Mic".0 { 48 | Comment "Headset Mic" 49 | Value { 50 | JackName "sklnau8825max Headset Jack" 51 | CaptureChannels "2" 52 | CapturePriority "2" 53 | CaptureControl "Mic" 54 | } 55 | EnableSequence [ 56 | cdev "hw:sklnau8825max" 57 | cset "name='Headset Mic Switch' on" 58 | cset "name='media0_out mo codec0_in mi Switch' on" 59 | cset "name='media0_out mo dmic01_hifi_in mi Switch' off" 60 | ] 61 | DisableSequence [ 62 | ] 63 | } 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Getting audio to work on ASUS Chromebook C302CA 2 | 3 | This guide assumes you are using up-to-date ArchLinux 4 | 5 | Note: on kernel >= `5.4.arch1-1`, module `snd-soc-skl` needs to be manually built by setting `CONFIG_SND_SOC_INTEL_SKYLAKE=m` to get audio working. 6 | 7 | ## Preparation 8 | 1. On an **up-to-date** ChromeOS, open the terminal and copy the firmware files to somewhere convenient to use. e.g. 9 | ```bash 10 | sudo mkdir /mnt/stateful_partition/cros-firmware-75.0.3770.19 11 | sudo cp -r /lib/firmware/ /mnt/stateful_partition/cros-firmware-75.0.3770.19/ 12 | ``` 13 | 2. [Download this repo](https://github.com/nebulakl/cave-audio/archive/master.zip) and extract the files 14 | 15 | ## To get audio working (with pulseaudio) 16 | 17 | 1. Copy the firmware files from ChromeOS to `/lib/firmware/intel` in ArchLinux. **Make sure the symlinks are pointing to the correct files** 18 | ```bash 19 | sudo cp -r cros-firmware-75.0.3770.19/lib/firmware/intel /lib/firmware/intel 20 | ``` 21 | **Note:** as of ChromeOS 75.0.3770.19, `/lib/firmware/intel/dsp_fw_release.bin` should point to `dsp_fw_release_v969.bin`. 22 | 23 | 2. Copy `dfw_sst.bin` to `/lib/firmware/` 24 | ```bash 25 | sudo cp dfw_sst.bin /lib/firmware/ 26 | ``` 27 | 28 | 3. Copy `Google-Cave-1.0-Cave` to `/usr/share/alsa/ucm/` 29 | ```bash 30 | sudo cp -r Google-Cave-1.0-Cave /usr/share/alsa/ucm/ 31 | ``` 32 | 33 | 4. Create a symbolic link for `Google-Cave-1.0-Cave` folder. 34 | ```bash 35 | sudo ln -s /usr/share/alsa/ucm/Google-Cave-1.0-Cave/ /usr/share/alsa/ucm/sklnau8825max 36 | ``` 37 | 38 | 5. Blacklist `snd_hda_intel` module by putting the following in `/etc/modprobe.d/c302ca-audio.conf` 39 | ``` 40 | blacklist snd_hda_intel 41 | ``` 42 | 43 | 6. The following steps may reduce popping sound (YMMV) 44 | 45 | https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Glitches,_skips_or_crackling 46 | https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Pops_when_starting_and_stopping_playback 47 | 48 | 7. Reboot and audio should be working now 49 | 50 | **Note:** You may need to repeat step 1 every time the package `linux-firmware` gets updated. 51 | 52 | ## To switch between the speaker and the headphone automatically with jack detection 53 | The following method is just a **workaround** because it only works with one user. Ideally `pulseaudio` should take care of this. (Need more research on `alsa ucm`) 54 | 55 | 1. Install the `acpid` package 56 | 2. Put the following in `/etc/acpi/events/plugheadphone` 57 | ``` 58 | event=jack/headphone HEADPHONE plug 59 | action=sudo -u YOUR_USER_NAME XDG_RUNTIME_DIR=/run/user/YOUR_USER_ID pactl set-card-profile 0 Headphone 60 | ``` 61 | and put the following in `/etc/acpi/events/unplugheadphone` 62 | ``` 63 | event=jack/headphone HEADPHONE unplug 64 | action=sudo -u YOUR_USER_NAME XDG_RUNTIME_DIR=/run/user/YOUR_USER_ID pactl set-card-profile 0 Speaker 65 | ``` 66 | replace `YOUR_USER_NAME` and `YOUR_USER_ID` accordingly. 67 | 68 | 3. Enable and start `acpid` service 69 | ``` 70 | sudo systemctl enable --now acpid 71 | ``` 72 | --------------------------------------------------------------------------------