blob: 5a5664045c0db0f4f9d0f6f73f66f4a60b12d9a2 [file] [edit]
/*
* Copyright 2015 Chromium OS Authors
* Command for testing audio driver.
*/
#include <drivers/sound/sound.h>
#include "common.h"
/* Do not play sounds for longer than this number of milliseconds. */
#define MAX_DURATION_MS (5 * 1000)
/* Developer mode beep details */
#define DEV_BEEP_FREQUENCY 400
#define DEV_BEEP_DURATION 120
static int beep(unsigned long freq, unsigned long duration)
{
int res = sound_start(freq);
if (!res) {
/* Nonblocking API must be used. */
u64 target_time = timer_us(0) + duration * 1000;
/* Wait in case this was an non-blocking call. */
while (timer_us(0) < target_time)
;
res = sound_stop();
if (res) {
printf("attempt to stop failed with %d\n", res);
return CMD_RET_FAILURE;
}
} else {
res = sound_play(duration, freq);
if (res) {
printf("error: attempt to play failed with %d\n", res);
return CMD_RET_FAILURE;
}
}
return CMD_RET_SUCCESS;
}
static int do_devbeep(cmd_tbl_t *cmbtp, int flag, int argc, char * const argv[])
{
u64 target_time;
/* First beep */
beep(DEV_BEEP_FREQUENCY, DEV_BEEP_DURATION);
/* Wait for duration */
target_time = timer_us(0) + (DEV_BEEP_DURATION * 1000);
while (timer_us(0) < target_time)
;
/* Second beep */
beep(DEV_BEEP_FREQUENCY, DEV_BEEP_DURATION);
return CMD_RET_SUCCESS;
}
static int do_audio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
unsigned long freq;
unsigned long duration;
if (argc < 3) {
printf("Required command line parameters missing\n");
return CMD_RET_USAGE;
}
freq = strtoul(argv[1], 0, 10);
duration = strtoul(argv[2], 0, 10);
if ((freq < 20) || (freq > 20000)) {
printf("Invalid frequency %ld Hertz\n", freq);
return CMD_RET_FAILURE;
}
if (!duration)
return CMD_RET_SUCCESS;
if (duration > MAX_DURATION_MS) {
printf("Capping duration from %ld to %d milliseconds\n",
duration, MAX_DURATION_MS);
duration = MAX_DURATION_MS;
}
if (argc > 3) {
uint32_t volume = (uint32_t) strtoul(argv[3], 0, 10);
printf("Setting volume to %d\n", volume);
sound_set_volume(volume);
}
return beep(freq, duration);
}
U_BOOT_CMD(
audio, 4, 1,
"rudimentary audio capabilities test",
"\n<freq> <duration> [<volume>] - play sound of <freq> Hz for "
"<duration>\n"
" milliseconds at volume <volume>"
);
U_BOOT_CMD(
devbeep, 1, 1,
"developer mode timeout beep",
"\n"
);