Part Number: AM3354
Tool/software: Linux
Hi,
I am using AM3354 and mcasp0 for audio and I have made processor as master and applied 24Mhz mclock on AHCLKX pin. as per the clocking block of TRM I read mcasp register and Its showing proper devider values for bclock but when I measure bclock shows 24MHz clock, my audio is not playing and I am able to hear only noice on speaker.
I have gone through register description and and found in AHCLKXCTL register description that :
"In the special case where the transmit bit clock (ACLKX) is internally generated and the programmable bit clock divider is set to divide-
by-1 (CLKXDIV = 0 in ACLKXCTL), AHCLKX is directly passed through to the ACLKX pin."
Thats true in my case when initialization << [get reg] reg [b0], val [0x60] >> but bclock is calculated and devider value is filled when doing aplay for the first time.
These are my register dumps when doing "aplay test.wav" :
Here is mapping
44h GBLCTL
A0h XGBLCTL
B0h ACLKXCTL
B4h AHCLKXCTL
base : 0x48038000 ( All reg address and values are in hex )
[set bits]: reg [a0] val [200]
[get reg] reg [a0], val [200]
[set bits]: reg [a0] val [100]
[get reg] reg [a0], val [300]
[set bits]: reg [a0] val [400]
[get reg] reg [a0], val [700]
[get reg] reg [c0], val [10c]
[set bits]: reg [a0] val [800]
[get reg] reg [a0], val [f00]
[set bits]: reg [a0] val [1000]
[get reg] reg [a0], val [1f00]
[set bits]: reg [bc] val [1]
[get reg] reg [a0], val [1f00] // printing these registers in "mcasp_start_tx" function.
[get reg] reg [44], val [1f00] // printing these registers in "mcasp_start_tx" function.
[get reg] reg [b4], val [00] // printing these registers in "mcasp_start_tx" function.
[get reg] reg [b0], val [2f] // printing these registers in "mcasp_start_tx" function. ( I have set 'f' as bclock devider ACLKX register here is the proff)
Starts Audio widget Shutdown process.
[clear bits] : reg [bc] val [1]
[get reg] reg [6c], val [13]
[get reg] reg [b0], val [2f]
[set reg] reg [a0], val [0]
[set reg] reg [c0], val [ffffffff]
[clear bits] : reg [fa039000] val [10000]
This is my sound node with generic "simple-audio-codec driver"
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "Price";
simple-audio-card,widgets =
"Speaker", "Speaker";
simple-audio-card,routing =
"Speaker", "SPKOUTRN",
"Speaker", "SPKOUTRP",
"Speaker", "SPKOUTLN",
"Speaker", "SPKOUTLP";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&cpu_master>;
simple-audio-card,frame-master = <&cpu_master>;
cpu_master: simple-audio-card,cpu {
sound-dai = <&mcasp0>;
system-clock-frequency = <24576000>;
system-clock-id = <MCASP_CLK_HCLK_AHCLK>;
};
sound_master: simple-audio-card,codec {
sound-dai = <&codec>;
system-clock-frequency = <24576000>;
system-clock-id = <1>;
};
};
mcasp0_pins: mcasp0_pins { /* CHECK */
pinctrl-single,pins = <
0x1a0 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_aclkr.AUD_BCLK */
0x190 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_aclkx.AUD_BCLK */
0x1a4 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_fsr.AUD_FSR */
0x194 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_fsx.AUD_FSX */
0x198 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp0_axr0.AUD_OUT */
0x1a8 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp0_axr1.AUD_IN*/
0x19c (PIN_INPUT_PULLUP | MUX_MODE0) /* mcasp0_ahclkr.AUD_MCLK */
0x1ac (PIN_INPUT_PULLUP | MUX_MODE0) /* mcasp0_ahclkx.AUD_MCLK */
>;
};
Can you help me out in this case? Do I have to initialize divider in initialization?

