HPM SDK
HPMicro Software Development Kit
hpm_wm8960.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2021 NXP
4  * Copyright (c) 2022 HPMicro
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  *
8  */
9 
10 #ifndef _HPM_W8960_H_
11 #define _HPM_W8960_H_
12 
13 #include "hpm_i2c_drv.h"
14 #include "hpm_common.h"
15 #include "hpm_wm8960_regs.h"
16 
17 #define WM8960_I2C_ADDR 0x1A
18 
19 typedef enum wm8960_module {
20  wm8960_module_adc = 0, /* ADC module in WM8960 */
21  wm8960_module_dac = 1, /* DAC module in WM8960 */
22  wm8960_module_vref = 2, /* VREF module */
23  wm8960_module_headphone = 3, /* Headphone */
24  wm8960_module_micbais = 4, /* Mic bias */
25  wm8960_module_ana_in = 6, /* Analog in PGA */
26  wm8960_module_lineout = 7, /* Line out module */
27  wm8960_module_speaker = 8, /* Speaker module */
28  wm8960_module_output_mixer = 9, /* Output mixer */
30 
31 /* wm8960 play source for output mixer */
32 typedef enum wm8960_play_source {
33  wm8960_play_source_input_mixer = 1, /* Input Boost Mixer to Output Mixer */
34  wm8960_play_source_input3 = 2, /* L/RINPUT3 to Output Mixer */
35  wm8960_play_source_dac = 4, /* DAC to Output Mixer */
37 
38 /* WM8960 data route */
39 typedef enum wm8960_route {
40  wm8960_route_bypass = 0, /* ANA_IN->Headphone. */
41  wm8960_route_playback = 1, /* I2SIN->DAC->Headphone. */
42  wm8960_route_playback_and_record = 2, /* I2SIN->DAC->Headphone, ANA_IN->ADC->I2SOUT. */
43  wm8960_route_record = 5 /* ANA_IN->ADC->I2SOUT. */
45 
46 /* The audio data transfer protocol choice */
47 typedef enum wm8960_protocol {
48  wm8960_bus_i2s = 2, /* I2S type */
49  wm8960_bus_left_justified = 1, /* Left justified mode */
50  wm8960_bus_right_justified = 0, /* Right justified mode */
51  wm8960_bus_pcma = 3, /* PCM A mode */
52  wm8960_bus_pcmb = 3 | (1 << 4) /* PCM B mode */
54 
55 /* wm8960 input source */
56 typedef enum wm8960_input {
57  wm8960_input_closed = 0, /* Input device is closed */
58  wm8960_input_single_ended_mic = 1, /* Input as single ended mic, only use L/RINPUT1 */
59  wm8960_input_differential_mic_input2 = 2, /* Input as differential mic, use L/RINPUT1 and L/RINPUT2 */
60  wm8960_input_differential_mic_input3 = 3, /* Input as differential mic, use L/RINPUT1 and L/RINPUT3*/
61  wm8960_input_line_input2 = 4, /* Input as line input, only use L/RINPUT2 */
62  wm8960_input_line_input3 = 5 /* Input as line input, only use L/RINPUT3 */
64 
65 /* wm8960 audio format */
66 typedef struct wm8960_audio_format {
67  uint32_t mclk_hz; /* master clock frequency */
68  uint32_t sample_rate; /* sample rate */
69  uint32_t bit_width; /* bit width */
71 
72 /* configure structure of WM8960 */
73 typedef struct wm8960_config {
74  wm8960_route_t route; /* Audio data route.*/
75  wm8960_protocol_t bus; /* Audio transfer protocol */
76  bool enable_speaker; /* True means enable class D speaker as output, false means no */
77  wm8960_input_t left_input; /* Left input source for WM8960 */
78  wm8960_input_t right_input; /* Right input source for wm8960 */
79  wm8960_play_source_t play_source; /* play source */
80  wm8960_audio_format_t format; /* Audio format */
82 
83 typedef struct {
84  I2C_Type *ptr; /* I2C bus */
85  uint8_t slave_address; /* code device address */
87 
88 
89 #if defined(__cplusplus)
90 extern "C" {
91 #endif
92 
100 
109 
119 
127 
135 
143 
161 hpm_stat_t wm8960_set_volume(wm8960_control_t *control, wm8960_module_t module, uint32_t volume);
162 
170 hpm_stat_t wm8960_set_module(wm8960_control_t *control, wm8960_module_t module, bool enable);
171 
180 hpm_stat_t wm8960_config_input_to_output_mixer(wm8960_control_t *control, uint32_t play_source);
181 
194 hpm_stat_t wm8960_set_data_format(wm8960_control_t *control, uint32_t sysclk, uint32_t sample_rate, uint32_t bits);
195 
196 
204 hpm_stat_t wm8960_write_reg(wm8960_control_t *control, uint8_t reg, uint16_t val);
205 
211 hpm_stat_t wm8960_read_reg(uint8_t reg, uint16_t *val);
212 
220 hpm_stat_t wm8960_modify_reg(wm8960_control_t *control, uint8_t reg, uint16_t mask, uint16_t val);
221 
222 #ifdef __cplusplus
223 }
224 #endif
225 
226 #endif /* _WM8960_H_ */
uint32_t hpm_stat_t
Definition: hpm_common.h:123
hpm_stat_t wm8960_set_module(wm8960_control_t *control, wm8960_module_t module, bool enable)
Enable/disable expected module.
Definition: hpm_wm8960.c:109
wm8960_input
Definition: hpm_wm8960.h:56
@ wm8960_input_differential_mic_input2
Definition: hpm_wm8960.h:59
@ wm8960_input_differential_mic_input3
Definition: hpm_wm8960.h:60
@ wm8960_input_single_ended_mic
Definition: hpm_wm8960.h:58
@ wm8960_input_line_input2
Definition: hpm_wm8960.h:61
@ wm8960_input_line_input3
Definition: hpm_wm8960.h:62
@ wm8960_input_closed
Definition: hpm_wm8960.h:57
struct wm8960_config wm8960_config_t
wm8960_protocol
Definition: hpm_wm8960.h:47
@ wm8960_bus_pcmb
Definition: hpm_wm8960.h:52
@ wm8960_bus_i2s
Definition: hpm_wm8960.h:48
@ wm8960_bus_pcma
Definition: hpm_wm8960.h:51
@ wm8960_bus_right_justified
Definition: hpm_wm8960.h:50
@ wm8960_bus_left_justified
Definition: hpm_wm8960.h:49
hpm_stat_t wm8960_read_reg(uint8_t reg, uint16_t *val)
Read register from WM8960 using I2C.
Definition: hpm_wm8960.c:506
hpm_stat_t wm8960_init(wm8960_control_t *control, wm8960_config_t *config)
WM8960 initialize function.
Definition: hpm_wm8960.c:27
enum wm8960_play_source wm8960_play_source_t
hpm_stat_t wm8960_set_data_format(wm8960_control_t *control, uint32_t sysclk, uint32_t sample_rate, uint32_t bits)
Configure the data format of audio data.
Definition: hpm_wm8960.c:416
hpm_stat_t wm8960_set_left_input(wm8960_control_t *control, wm8960_input_t input)
Set left audio input source in WM8960.
Definition: hpm_wm8960.c:220
wm8960_module
Definition: hpm_wm8960.h:19
@ wm8960_module_headphone
Definition: hpm_wm8960.h:23
@ wm8960_module_vref
Definition: hpm_wm8960.h:22
@ wm8960_module_micbais
Definition: hpm_wm8960.h:24
@ wm8960_module_output_mixer
Definition: hpm_wm8960.h:28
@ wm8960_module_ana_in
Definition: hpm_wm8960.h:25
@ wm8960_module_adc
Definition: hpm_wm8960.h:20
@ wm8960_module_lineout
Definition: hpm_wm8960.h:26
@ wm8960_module_dac
Definition: hpm_wm8960.h:21
@ wm8960_module_speaker
Definition: hpm_wm8960.h:27
hpm_stat_t wm8960_config_input_to_output_mixer(wm8960_control_t *control, uint32_t play_source)
SET the WM8960 play source.
Definition: hpm_wm8960.c:463
hpm_stat_t wm8960_set_data_route(wm8960_control_t *control, wm8960_config_t *config)
Set audio data route in WM8960.
Definition: hpm_wm8960.c:169
enum wm8960_route wm8960_route_t
enum wm8960_protocol wm8960_protocol_t
wm8960_route
Definition: hpm_wm8960.h:39
@ wm8960_route_record
Definition: hpm_wm8960.h:43
@ wm8960_route_playback_and_record
Definition: hpm_wm8960.h:42
@ wm8960_route_bypass
Definition: hpm_wm8960.h:40
@ wm8960_route_playback
Definition: hpm_wm8960.h:41
struct wm8960_audio_format wm8960_audio_format_t
wm8960_play_source
Definition: hpm_wm8960.h:32
@ wm8960_play_source_input_mixer
Definition: hpm_wm8960.h:33
@ wm8960_play_source_input3
Definition: hpm_wm8960.h:34
@ wm8960_play_source_dac
Definition: hpm_wm8960.h:35
enum wm8960_input wm8960_input_t
hpm_stat_t wm8960_write_reg(wm8960_control_t *control, uint8_t reg, uint16_t val)
Write register to WM8960 using I2C.
Definition: hpm_wm8960.c:492
hpm_stat_t wm8960_deinit(wm8960_control_t *control)
Deinit the WM8960 codec.
Definition: hpm_wm8960.c:92
hpm_stat_t wm8960_set_volume(wm8960_control_t *control, wm8960_module_t module, uint32_t volume)
Set the volume of different modules in WM8960.
Definition: hpm_wm8960.c:334
hpm_stat_t wm8960_set_right_input(wm8960_control_t *control, wm8960_input_t input)
Set right audio input source in WM8960.
Definition: hpm_wm8960.c:277
hpm_stat_t wm8960_set_protocol(wm8960_control_t *control, wm8960_protocol_t protocol)
Set the audio transfer protocol.
Definition: hpm_wm8960.c:104
hpm_stat_t wm8960_modify_reg(wm8960_control_t *control, uint8_t reg, uint16_t mask, uint16_t val)
Modify some bits in the register using I2C.
Definition: hpm_wm8960.c:516
enum wm8960_module wm8960_module_t
Definition: hpm_i2c_regs.h:12
Definition: hpm_wm8960.h:66
uint32_t bit_width
Definition: hpm_wm8960.h:69
uint32_t mclk_hz
Definition: hpm_wm8960.h:67
uint32_t sample_rate
Definition: hpm_wm8960.h:68
Definition: hpm_wm8960.h:73
wm8960_protocol_t bus
Definition: hpm_wm8960.h:75
wm8960_route_t route
Definition: hpm_wm8960.h:74
wm8960_play_source_t play_source
Definition: hpm_wm8960.h:79
wm8960_audio_format_t format
Definition: hpm_wm8960.h:80
wm8960_input_t left_input
Definition: hpm_wm8960.h:77
bool enable_speaker
Definition: hpm_wm8960.h:76
wm8960_input_t right_input
Definition: hpm_wm8960.h:78
Definition: hpm_wm8960.h:83
I2C_Type * ptr
Definition: hpm_wm8960.h:84
uint8_t slave_address
Definition: hpm_wm8960.h:85