Частоты и делители

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

android: MCLK = 11.3 MHz, SDAC=BCLK=2.8 MHz, SDALRCK=44.1 kHz Linux: MCLK=absent, SDAC=BCLK=11.3 MHz, SDALRCK=44.1 kHz Вывод: i2s1 не понятно куда идет... audio или pll_a_out0 идет туда, куда должна идти i2s1


Возьмем для примера две похожие строки из Appendix A и попытаемся разобраться, что за делители выставляются в регистрах 60h и 62h.

Ошибка создания миниатюры: Не удаётся сохранить эскиз по месту назначения

Рассматривать делители будем пока только относительно воспроизведения (т.е. нас интересует DAC - digital to analogue - цифровые данные в аналоговые). Имеем: частота дискретизации (?) [3-й столбец] - 44100 (44.1 кГц) (а) частота (???) [2-й столбец] - 2822400 (2.8224 МГц) (б) частота (???) [2-й столбец] - 1411200 (1.4112 МГц) основная частота [1-й столбец] - 22579200 (22,5792 МГц)

Рассмотрим отношения частот:

1411200 / 44100 = 32
22579200 / 1411200 = 16
2822400 / 44100 = 64
22579200 / 2822400 = 8


Рассмотрим значения регистров 60h 62h: При переходе от варианта (а) к варианту (б) изменилось только значение регистра 60h, значит только он и будет интересовать нас в данном случае. Распишем значения (Reg-60h: Stereo DAC Clock Control_1): (а) Reg 60h (3075 - 11000001110101)

[15 12] 0011 (3): stereo_i2s_bclk_div1 0000: /1, 0001: /2,..., 1111: /16
11  0: Reserved
[10 8] 000 (0): stereo_i2s_bclk_div2 000: /2, 001: /4, 010: /8, 011: /16, 100: /32, Others: Reserved
[7 4] 0111 (7): stereo_i2s_ad_lrck_div1 0000: /1, 0001: /2 ..., 1111: / 16
[3 1] 010 (2): stereo_i2s_ad_lrck_div2 000: /2, 001: /4, 010: /8, 011: /16, 100: /32, Others: Reserved
0   1: stereo_i2s_da_lrck_div 0: /32, 1: /64

stereo_i2s_bclk_div1 = 1/4 stereo_i2s_bclk_div2 = 1/2 stereo_i2s_da_lrck_div = 1/64 div1 * div2 = 1/8

(б) Reg 60h (3174 - 11000101110100)

[15 12] 0011 (3): stereo_i2s_bclk_div1 0000: /1, 0001: /2,..., 1111: /16
11  0: Reserved
[10 8] 001 (1): stereo_i2s_bclk_div2 000: /2, 001: /4, 010: /8, 011: /16, 100: /32, Others: Reserved
[7 4] 0111 (7): stereo_i2s_ad_lrck_div1 0000: /1, 0001: /2 ..., 1111: / 16
[3 1] 010 (2): stereo_i2s_ad_lrck_div2 000: /2, 001: /4, 010: /8, 011: /16, 100: /32, Others: Reserved
0   0: stereo_i2s_da_lrck_div 0: /32, 1: /64

stereo_i2s_bclk_div1 = 1/4 stereo_i2s_bclk_div2 = 1/4 stereo_i2s_da_lrck_div = 1/32 div1 * div2 = 1/16

Фантастика :) Мы получили соотношения частот! Теперь нужно разобраться, от чего меняется частота в столбце 2. Есть предположение, что это связано с количеством каналов звука! ...


Согласно определению sampling rate имеем: Fs - частота дискретизации (sampling rate, sample rate, or sampling frequency). 1/Fs - длительность сампла (sampling period or sampling interval)

Ошибка создания миниатюры: Не удаётся сохранить эскиз по месту назначения

BCLK должна быть такой, чтобы за период времени влезли все данные. Т.е. чтобы впихнуть данные (2 канала, 16 бит на канал) с частотой дискретизации Fs нужно, чтобы BLCK было равно 2 * 16 * Fs = 32 * Fs. В нашем случае 32 * 44.1 кГц = 1.4112 МГц

SLRCK должна быть равна Fs, если у нас один канал, и должна быть вдвое больше, если каналов 2. В нашем случае 2 * 44.1 кГц = 88.2 кГц.

Согласно даташиту

When PLL1 is enabled, MCLK is suggested to provide
frequency between 2.048MHz to 40MHz, and PLL1 should be configured to support 512*Fs

основная частота (Stereo_I2S_SYSCLK) должна быть равна 512 * Fs. В нашем случае 512 * 44.1 кГц = 22.5792 МГц


tegra2_clocks.c in trimslice

            /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
             * currently done in the pinmux code. */

I found difference in dev1 clock initialization between our source tree and nv-tegra/trimslice. In our tree cdev1 have parent. In other trees it is have no parent and specified rate and max_rate. Is it matter ? ...

https://gitorious.org/trimslice-kernel/trimslice-kernel/blobs/master/arch/arm/mach-tegra/tegra2_clocks.c#line1705 https://gitorious.org/trimslice-kernel/trimslice-kernel/blobs/master/arch/arm/mach-tegra/board-trimslice.c#line235 vs https://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/arch/arm/mach-tegra/board-paz00.c#line423 https://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/arch/arm/mach-tegra/tegra2_clocks.c#line1968

логи с изменениями для клока cdev1


Разбираем PINGROUP для CDEV1 по исходникам тошибы

PINGROUP(CDEV1, AUDIO, OSC,       PLLA_OUT,  PLLM_OUT1, AUDIO_SYNC,    OSC,       0x14, 4,  0x88, 2,  0xA8, 0),

0x14, 4 - arch/arm/mach-tegra/include/ap20/arapb_misc.h

// Register APB_MISC_PP_TRISTATE_REG_A_0
#define APB_MISC_PP_TRISTATE_REG_A_0                    _MK_ADDR_CONST(0x14)
#define APB_MISC_PP_TRISTATE_REG_A_0_Z_CDEV1_RANGE                      4:4

0x88, 2 - arch/arm/mach-tegra/include/ap20/arapb_misc.h

// Register APB_MISC_PP_PIN_MUX_CTL_C_0
#define APB_MISC_PP_PIN_MUX_CTL_C_0                     _MK_ADDR_CONST(0x88)
#define APB_MISC_PP_PIN_MUX_CTL_C_0_CDEV1_SEL_RANGE                     3:2
#define APB_MISC_PP_PIN_MUX_CTL_C_0_CDEV1_SEL_OSC                       _MK_ENUM_CONST(0)
#define APB_MISC_PP_PIN_MUX_CTL_C_0_CDEV1_SEL_PLLA_OUT                  _MK_ENUM_CONST(1)
#define APB_MISC_PP_PIN_MUX_CTL_C_0_CDEV1_SEL_PLLM_OUT1                 _MK_ENUM_CONST(2)
#define APB_MISC_PP_PIN_MUX_CTL_C_0_CDEV1_SEL_AUDIO_SYNC                        _MK_ENUM_CONST(3)

0xa8, 0 - arch/arm/mach-tegra/include/ap20/arapb_misc.h

// Register APB_MISC_PP_PULLUPDOWN_REG_C_0
#define APB_MISC_PP_PULLUPDOWN_REG_C_0                  _MK_ADDR_CONST(0xa8)
#define APB_MISC_PP_PULLUPDOWN_REG_C_0_CDEV1_PU_PD_WOFFSET                      0x0

Табличка для pll_a у марвина http://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/arch/arm/mach-tegra/tegra2_clocks.c#line1697 Табличка для pll_a в froyo http://gitorious.org/ac100/kernel/blobs/toshiba_froyo/arch/arm/mach-tegra/tegra2_clocks.c#line905