blob: 1d8461bf462a5c357cf83e1af93474921e311e99 [file] [log] [blame] [edit]
/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
* *
This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
* *
You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* *
Description:
*/
#include <common.h>
#include <command.h>
#include <asm/saradc.h>
#define SARADC_VALUE "saradc_val"
static int current_channel = -1;
static int do_saradc_open(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int channel;
channel = simple_strtoul(argv[1], NULL, 10);
if ((channel < 0) || (channel >= AML_ADC_SARADC_CHAN_NUM))
{
printf("No such channel(%d) in SARADC! open failed!\n", channel);
return -1;
}
saradc_enable();
current_channel = channel;
// printf("SARADC open channel(%d).\n", channel);
return 0;
}
static int do_saradc_close(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
saradc_disable();
current_channel = -1;
printf("SARADC closed.\n");
return 0;
}
static int do_saradc_getval(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char value_str[10];
int val = get_adc_sample_gxbb(current_channel);
printf("SARADC channel(%d) is 0x%x.\n", current_channel, val);
sprintf(value_str, "0x%x", val);
setenv(SARADC_VALUE, value_str);
return 0;
}
static int do_saradc_getval_12bit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char value_str[10];
int val = get_adc_sample_gxbb_12bit(current_channel);
printf("SARADC channel(%d) is 0x%x.\n", current_channel, val);
sprintf(value_str, "0x%x", val);
setenv(SARADC_VALUE, value_str);
return 0;
}
static int do_saradc_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
saradc_sample_test();
return 0;
}
static int do_saradc_get_in_range(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char value_str[10];
int max, min;
int val = get_adc_sample_gxbb(current_channel);
min = simple_strtoul(argv[1], NULL, 10);
max = simple_strtoul(argv[2], NULL, 10);
int donot_setenv = 0;
if (argc > 3) {
donot_setenv = simple_strtoul(argv[2], NULL, 10);
}
if ((val<min) || (val>max)) {
debug("SARADC channel(%d) is 0x%x, Out of range(0x%x~0x%x)!\n",
current_channel, val, min, max);
return -1;
}
debug("SARADC channel(%d) is 0x%x (0x%x~0x%x).\n",
current_channel, val, min, max);
sprintf(value_str, "0x%x", val);
if (!donot_setenv)
setenv(SARADC_VALUE, value_str);
return 0;
}
static int do_saradc_get_in_range_12bit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
char value_str[10];
int max, min;
int val = get_adc_sample_gxbb_12bit(current_channel);
min = simple_strtoul(argv[1], NULL, 10);
max = simple_strtoul(argv[2], NULL, 10);
int donot_setenv = 0;
if (argc > 3) {
donot_setenv = simple_strtoul(argv[2], NULL, 10);
}
if ((val<min) || (val>max)) {
debug("SARADC channel(%d) is 0x%x, Out of range(0x%x~0x%x)!\n",
current_channel, val, min, max);
return -1;
}
debug("SARADC channel(%d) is 0x%x (0x%x~0x%x).\n",
current_channel, val, min, max);
sprintf(value_str, "0x%x", val);
if (!donot_setenv)
setenv(SARADC_VALUE, value_str);
return 0;
}
static cmd_tbl_t cmd_saradc_sub[] = {
U_BOOT_CMD_MKENT(open, 2, 0, do_saradc_open, "", ""),
U_BOOT_CMD_MKENT(close, 1, 0, do_saradc_close, "", ""),
U_BOOT_CMD_MKENT(getval, 1, 0, do_saradc_getval, "", ""),
U_BOOT_CMD_MKENT(test, 1, 0, do_saradc_test, "", ""),
U_BOOT_CMD_MKENT(get_in_range, 3, 0, do_saradc_get_in_range, "", ""),
};
static int do_saradc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
cmd_tbl_t *c;
/* Strip off leading 'bmp' command argument */
argc--;
argv++;
c = find_cmd_tbl(argv[0], &cmd_saradc_sub[0], ARRAY_SIZE(cmd_saradc_sub));
if (c) {
return c->cmd(cmdtp, flag, argc, argv);
} else {
cmd_usage(cmdtp);
return 1;
}
}
U_BOOT_CMD(
saradc, 8, 0, do_saradc,
"saradc sub-system",
"saradc open <channel> - open a SARADC channel\n"
"saradc close - close the SARADC\n"
"saradc getval - get the value in current channel\n"
"saradc test - test the SARADC by channel-7\n"
"saradc get_in_range <min> <max> - return 0 if current value in the range of current channel\n"
);
static cmd_tbl_t cmd_saradc_12bit_sub[] = {
U_BOOT_CMD_MKENT(open, 2, 0, do_saradc_open, "", ""),
U_BOOT_CMD_MKENT(close, 1, 0, do_saradc_close, "", ""),
U_BOOT_CMD_MKENT(getval, 1, 0, do_saradc_getval_12bit, "", ""),
U_BOOT_CMD_MKENT(get_in_range, 3, 0, do_saradc_get_in_range_12bit, "", ""),
};
static int do_saradc_12bit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
cmd_tbl_t *c;
/* Strip off leading 'bmp' command argument */
argc--;
argv++;
c = find_cmd_tbl(argv[0], &cmd_saradc_12bit_sub[0], ARRAY_SIZE(cmd_saradc_12bit_sub));
if (c) {
return c->cmd(cmdtp, flag, argc, argv);
} else {
cmd_usage(cmdtp);
return 1;
}
}
U_BOOT_CMD(
saradc_12bit, 8, 0, do_saradc_12bit,
"saradc sub-system",
"saradc_12bit open <channel> - open a SARADC channel\n"
"saradc_12bit close - close the SARADC\n"
"saradc_12bit getval - get the value in current channel\n"
"saradc_12bit get_in_range <min> <max> - return 0 if current value in the range of current channel\n"
);