drv_sound_wm8904.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-03-12 Vandoul the first version
  9. */
  10. #ifndef __DRV_SOUND_WM8904_H__
  11. #define __DRV_SOUND_WM8904_H__
  12. #include <rtthread.h>
  13. typedef enum
  14. {
  15. WM8904_RESET = 0x00,
  16. WM8904_ANALOG_ADC_0 = 0x0A,
  17. WM8904_POWER_MGMT_0 = 0x0C,
  18. WM8904_POWER_MGMT_2 = 0x0E,
  19. WM8904_POWER_MGMT_3 = 0x0F,
  20. WM8904_POWER_MGMT_6 = 0x12,
  21. WM8904_CLK_RATES_0 = 0x14,
  22. WM8904_CLK_RATES_1 = 0x15,
  23. WM8904_CLK_RATES_2 = 0x16,
  24. WM8904_AUDIO_IF_0 = 0x18,
  25. WM8904_AUDIO_IF_1 = 0x19,
  26. WM8904_AUDIO_IF_2 = 0x1A,
  27. WM8904_AUDIO_IF_3 = 0x1B,
  28. WM8904_DAC_DIG_1 = 0x21,
  29. WM8904_DAC_DIG_0 = 0x27,
  30. WM8904_ANALOG_LEFT_IN_0 = 0x2C,
  31. WM8904_ANALOG_RIGHT_IN_0 = 0x2D,
  32. WM8904_ANALOG_LEFT_IN_1 = 0x2E,
  33. WM8904_ANALOG_RIGHT_IN_1 = 0x2F,
  34. WM8904_ANALOG_OUT1_LEFT = 0x39,
  35. WM8904_ANALOG_OUT1_RIGHT = 0x3A,
  36. WM8904_ANALOG_OUT12_ZC = 0x3D,
  37. WM8904_DC_SERVO_0 = 0x43,
  38. WM8904_ANALOG_HP_0 = 0x5A,
  39. WM8904_CHRG_PUMP_0 = 0x62,
  40. WM8904_CLS_W_0 = 0x68,
  41. WM8904_WRT_SEQUENCER_0 = 0x6C,
  42. WM8904_WRT_SEQUENCER_3 = 0x6F,
  43. WM8904_WRT_SEQUENCER_4 = 0x70,
  44. WM8904_DAC_DIGITAL_VOLUME_LEFT = 0x1E,
  45. WM8904_DAC_DIGITAL_VOLUME_RIGHT = 0x1F,
  46. WM8904_ADC_DIGITAL_VOLUME_LEFT = 0x24,
  47. WM8904_ADC_DIGITAL_VOLUME_RIGHT = 0x25,
  48. WM8904_ANALOG_OUT2_LEFT = 0x3B,
  49. WM8904_ANALOG_OUT2_RIGHT = 0x3C,
  50. /* FLL control register */
  51. WM8904_FLL_CONTROL_1 = 0x74,
  52. WM8904_FLL_CONTROL_2 = 0x75,
  53. WM8904_FLL_CONTROL_3 = 0x76,
  54. WM8904_FLL_CONTROL_4 = 0x77,
  55. WM8904_FLL_CONTROL_5 = 0x78,
  56. /* GPIO control register */
  57. WM8904_GPIO_CONTROL_1 = 0x79,
  58. WM8904_GPIO_CONTROL_2 = 0x7A,
  59. WM8904_GPIO_CONTROL_3 = 0x7B,
  60. WM8904_GPIO_CONTROL_4 = 0x7C,
  61. /* FLL nco */
  62. WM89004_FLL_NCO_TEST_0 = 0xF7,
  63. WM89004_FLL_NCO_TEST_1 = 0xF8,
  64. }wm8904_reg_t;
  65. #define WM8904_LRC_POLARITY_POS (4U)
  66. #define WM8904_LRC_POLARITY_NOOMAL (0)
  67. #define WM8904_LRC_POLARITY_INVERTED (1U << WM8904_LRC_POLARITY_POS)
  68. typedef enum _wm8904_module
  69. {
  70. WM8904_MODULE_ADC = 0, /*!< module ADC */
  71. WM8904_MODULE_DAC, /*!< module DAC */
  72. WM8904_MODULE_PGA, /*!< module PGA */
  73. WM8904_MODULE_HEADPHONE, /*!< module headphone */
  74. WM8904_MODULE_LINEOUT, /*!< module line out */
  75. }wm8904_module_t;
  76. enum
  77. {
  78. WM8904_HEADPHONE_LEFT = 1U,
  79. WM8904_HEADPHONE_RIGHT = 2U,
  80. WM8904_LINEOUT_LEFT = 4U,
  81. WM8904_LINEOUT_RIGHT = 8U,
  82. };
  83. typedef enum _wm8904_timeslot{
  84. WM8904_TIMESLOT_0 = 0U,
  85. WM8904_TIMESLOT_1,
  86. }wm8904_timeslot_t;
  87. typedef enum
  88. {
  89. WM8904_PROTOCOL_RIGHT_JUSTIFIED = 0x00,
  90. WM8904_PROTOCOL_LEFT_JUSTIFIED = 0x01,
  91. WM8904_PROTOCOL_I2S = 0x02,
  92. WM8904_PROTOCOL_PCMA = 0x03,
  93. WM8904_PROTOCOL_PCMB = 0x13,
  94. }wm8904_protocol_t;
  95. /*! @brief The SYSCLK / fs ratio. */
  96. typedef enum _wm8904_fs_ratio
  97. {
  98. WM8904_FSRATIO_64X = 0x0, /*!< SYSCLK is 64 * sample rate * frame width */
  99. WM8904_FSRATIO_128X = 0x1, /*!< SYSCLK is 128 * sample rate * frame width */
  100. WM8904_FSRATIO_192X = 0x2, /*!< SYSCLK is 192 * sample rate * frame width */
  101. WM8904_FSRATIO_256X = 0x3, /*!< SYSCLK is 256 * sample rate * frame width */
  102. WM8904_FSRATIO_384X = 0x4, /*!< SYSCLK is 384 * sample rate * frame width */
  103. WM8904_FSRATIO_512X = 0x5, /*!< SYSCLK is 512 * sample rate * frame width */
  104. WM8904_FSRATIO_768X = 0x6, /*!< SYSCLK is 768 * sample rate * frame width */
  105. WM8904_FSRATIO_1024X = 0x7, /*!< SYSCLK is 1024 * sample rate * frame width */
  106. WM8904_FSRATIO_1408X = 0x8, /*!< SYSCLK is 1408 * sample rate * frame width */
  107. WM8904_FSRATIO_1536X = 0x9 /*!< SYSCLK is 1536 * sample rate * frame width */
  108. } wm8904_fs_ratio_t;
  109. /*! @brief Sample rate. */
  110. typedef enum _wm8904_sample_rate
  111. {
  112. WM8904_SAMPLERATE_8kHz = 0x0, /*!< 8 kHz */
  113. WM8904_SAMPLERATE_12kHz = 0x1, /*!< 12kHz */
  114. WM8904_SAMPLERATE_16kHz = 0x2, /*!< 16kHz */
  115. WM8904_SAMPLERATE_24kHz = 0x3, /*!< 24kHz */
  116. WM8904_SAMPLERATE_32kHz = 0x4, /*!< 32kHz */
  117. WM8904_SAMPLERATE_48kHz = 0x5, /*!< 48kHz */
  118. WM8904_SAMPLERATE_11025Hz = 0x6, /*!< 11.025kHz */
  119. WM8904_SAMPLERATE_22050Hz = 0x7, /*!< 22.05kHz */
  120. WM8904_SAMPLERATE_44100Hz = 0x8 /*!< 44.1kHz */
  121. } wm8904_sample_rate_t;
  122. /*! @brief Bit width. */
  123. typedef enum _wm8904_bit_width
  124. {
  125. WM8904_BITWIDTH_16 = 0x0, /*!< 16 bits */
  126. WM8904_BITWIDTH_20 = 0x1, /*!< 20 bits */
  127. WM8904_BITWIDTH_24 = 0x2, /*!< 24 bits */
  128. WM8904_BITWIDTH_32 = 0x3 /*!< 32 bits */
  129. } wm8904_bit_width_t;
  130. enum
  131. {
  132. WM8904_RECORD_SOURCE_DIFFERENTIAL_LINE = 1U, /*!< record source from differential line */
  133. WM8904_RECORD_SOURCE_LINE_INPUT = 2U, /*!< record source from line input */
  134. WM8904_RECORD_SOURCE_DIFFERENTIAL_MIC = 4U, /*!< record source from differential mic */
  135. WM8904_RECORD_SOURCE_DIGITAL_MIC = 8U, /*!< record source from digital microphone */
  136. };
  137. enum
  138. {
  139. WM8904_RECORD_CHANNEL_LEFT1 = 1U, /*!< left record channel 1 */
  140. WM8904_RECORD_CHANNEL_LEFT2 = 2U, /*!< left record channel 2 */
  141. WM8904_RECORD_CHANNEL_LEFT3 = 4U, /*!< left record channel 3 */
  142. WM8904_RECORD_CHANNEL_RIGHT1 = 1U, /*!< right record channel 1 */
  143. WM8904_RECORD_CHANNEL_RIGHT2 = 2U, /*!< right record channel 2 */
  144. WM8904_RECORD_CHANNEL_RIGHT3 = 4U, /*!< right record channel 3 */
  145. WM8904_RECORD_CHANNEL_DIFFERENTIAL_POSITIVE1 = 1U, /*!< differential positive record channel 1 */
  146. WM8904_RECORD_CHANNEL_DIFFERENTIAL_POSITIVE2 = 2U, /*!< differential positive record channel 2 */
  147. WM8904_RECORD_CHANNEL_DIFFERENTIAL_POSITIVE3 = 4U, /*!< differential positive record channel 3 */
  148. WM8904_RECORD_CHANNEL_DIFFERENTIAL_NEGATIVE1 = 8U, /*!< differential negative record channel 1 */
  149. WM8904_RECORD_CHANNEL_DIFFERENTIAL_NEGATIVE2 = 16U, /*!< differential negative record channel 2 */
  150. WM8904_RECORD_CHANNEL_DIFFERENTIAL_NEGATIVE3 = 32U, /*!< differential negative record channel 3 */
  151. };
  152. /*! @brief wm8904 play source
  153. *
  154. */
  155. enum
  156. {
  157. WM8904_PLAY_SOURCE_PGA = 1U, /*!< play source PGA, bypass ADC */
  158. WM8904_PLAY_SOURCE_DAC = 4U, /*!< play source Input3 */
  159. };
  160. /*! @brief wm8904_fll_clk_source */
  161. typedef enum _wm8904_fll_clk_source
  162. {
  163. WM8904_FLL_CLK_SOURCE_MCLK = 0U, /**< wm8904 FLL clock source from MCLK */
  164. }wm8904_fll_clk_source_t;
  165. /*! @brief wm8904 fll configuration */
  166. typedef struct _wm8904_fll_config
  167. {
  168. wm8904_fll_clk_source_t source; /*!< fll reference clock source */
  169. rt_uint32_t ref_clock_hz; /*!< fll reference clock frequency */
  170. rt_uint32_t output_clock_hz; /*!< fll output clock frequency */
  171. }wm8904_fll_config_t;
  172. /*! @brief Audio format configuration. */
  173. typedef struct _wm8904_audio_format
  174. {
  175. wm8904_fs_ratio_t fsRatio; /*!< SYSCLK / fs ratio */
  176. wm8904_sample_rate_t sampleRate; /*!< Sample rate */
  177. wm8904_bit_width_t bitWidth; /*!< Bit width */
  178. } wm8904_audio_format_t;
  179. struct wm8904_config
  180. {
  181. const char *i2c_bus_name;
  182. const char *i2s_bus_name;
  183. int i2c_addr;
  184. wm8904_protocol_t protocol;
  185. wm8904_audio_format_t format;
  186. };
  187. #define WM8904_I2C_ADDRESS (0x1A)
  188. #define WM8904_I2C_BITRATE (400000U)
  189. /* WM8904 maximum volume */
  190. #define WM8904_MAP_HEADPHONE_LINEOUT_MAX_VOLUME 0x3FU
  191. #define WM8904_DAC_MAX_VOLUME 0xC0U
  192. #endif