Hello
I am trying to run alsa on an ARM based target AT91SAM9260 based board. The cpu is connected over i2s (atmel's ssc) to a PCM1725 chip. I modifed the AT73C213 driver available in the latest experimental patches from www.at91.com to behave correctly for the PCM1725 chip. Basically all I have done is remove the spi communication with the AT73C213 that regulates the sound output volume. The PCM chip has no such volume control and I use the i2s interface setup as is to send sample data.
I cross compile alsa lib and run the program test/pcm_min which generates as expected random noise on the speaker output. However when I try to run test/pcm I get a divide by zero floating point exception because the library returns a period_size of 0. This despite the fact that the period time is set to 100000 and buffer time is set to 500000. I enabled some debug info in the library and I see the following data dumped to the console.
ACCESS: RW_INTERLEAVED FORMAT: S16_LE SUBFORMAT: STD SAMPLE_BITS: 16 FRAME_BITS: 32 CHANNELS: 2 RATE: 48000 PERIOD_TIME: (20354 20355) PERIOD_SIZE: 977 PERIOD_BYTES: 3908 PERIODS: (4 5) BUFFER_TIME: (81479 81480) BUFFER_SIZE: 3911 BUFFER_BYTES: 15644 TICK_TIME: 10000
How is it possible that the following code from test/pcm.c
err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir); if (err < 0) { printf("Unable to set period time %i for playback: %s\n", period_time, snd_strerror(err)); return err; } err = snd_pcm_hw_params_get_period_size(params, &size, &dir); if (err < 0) { printf("Unable to get period size for playback: %s\n", snd_strerror(err)); return err; }
returns a period_size of 0 when the debug output shows that the period_size has been calculated to be 977?
Can it be that the driver has not initialised the alsa structures properly (the driver file is attached to this email)? Have I mucked something up by removing the spi comm. with the at73c213?
Could this be due to a problem in the cross compilation of alsa-lib? I use the following configure command line:
CC=arm-linux-gcc ./configure \ --host=arm-linux\ --prefix=$HOME/bsp/rootfs/buildroot/build_arm/root/usr\ --with-softfloat
(note: I have also tried it without --with-softfloat)
I have tried digging through the alsa lib code but it is not very clear to me where the returned value for period_size comes from. I appreciate any pointers, hints or tips that can help me to solve and/or understand this problem.
Thanks in advance!
Michel