examples/sensorbd_demo: add adc example
authorJunhwan Park <junhwan.park@samsung.com>
Fri, 21 Apr 2017 02:34:17 +0000 (11:34 +0900)
committerHeesub Shin <heesub.shin@samsung.com>
Sat, 6 May 2017 10:51:23 +0000 (19:51 +0900)
Can not test adc with sensor board. This is because only ADC0-3 channels
are available. However, to test basic adc sampling I add this patch.

Change-Id: Id919b724ad8744b85ccec15469582cd91f4af2dd
Signed-off-by: Junhwan Park <junhwan.park@samsung.com>
apps/examples/sensorbd_demo/Kconfig
apps/examples/sensorbd_demo/examples/adc_test.c [new file with mode: 0644]
apps/examples/sensorbd_demo/sensorbd_main.c

index ab6beae..1521a24 100644 (file)
@@ -1,5 +1,8 @@
 config EXAMPLES_SENSORBOARD
        bool "Sensor Board Example"
+       select ANALOG
+       select ADC
+       select S5J_ADC
        select GPIO
        select S5J_GPIO
        select SPI
diff --git a/apps/examples/sensorbd_demo/examples/adc_test.c b/apps/examples/sensorbd_demo/examples/adc_test.c
new file mode 100644 (file)
index 0000000..87d93ea
--- /dev/null
@@ -0,0 +1,106 @@
+/****************************************************************************
+ *
+ * Copyright 2016 Samsung Electronics All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the License.
+ *
+ ****************************************************************************/
+/****************************************************************************
+ * examples/examples/sensorbd/examples/adc_test.c
+ *
+ *   Copyright (C) 2012 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#include <errno.h>
+#include <fcntl.h>
+#include <tinyara/analog/adc.h>
+#include <tinyara/analog/ioctl.h>
+
+#define S5J_ADC_MAX_CHANNELS   4
+
+void adctest_main(int argc, char *argv[])
+{
+       int fd, ret;
+       struct adc_msg_s sample[S5J_ADC_MAX_CHANNELS];
+       size_t readsize;
+       ssize_t nbytes;
+
+       fd = open("/dev/adc0", O_RDONLY);
+       if (fd < 0) {
+               printf("%s: open failed: %d\n", __func__, errno);
+               return;
+       }
+
+       for (;;) {
+               ret = ioctl(fd, ANIOC_TRIGGER, 0);
+               if (ret < 0) {
+                       printf("%s: ioctl failed: %d\n", __func__, errno);
+                       close(fd);
+                       return;
+               }
+
+               readsize = S5J_ADC_MAX_CHANNELS * sizeof(struct adc_msg_s);
+               nbytes = read(fd, sample, readsize);
+               if (nbytes < 0) {
+                       if (errno != EINTR) {
+                               printf("%s: read failed: %d\n", __func__, errno);
+                               close(fd);
+                               return;
+                       }
+               } else if (nbytes == 0) {
+                       printf("%s: No data read, Ignoring\n");
+               } else {
+                       int nsamples = nbytes / sizeof(struct adc_msg_s);
+                       if (nsamples * sizeof(struct adc_msg_s) != nbytes) {
+                               printf("%s: read size=%ld is not a multiple of sample size=%d, Ignoring\n", __func__, (long)nbytes, sizeof(struct adc_msg_s));
+                       } else {
+                               printf("Sample:\n");
+                               int i;
+                               for (i = 0; i < nsamples; i++) {
+                                       printf("%d: channel: %d, value: %d\n", i + 1, sample[i].am_channel, sample[i].am_data);
+                               }
+                       }
+               }
+       }
+
+       close(fd);
+}
index 6653c7a..0622664 100644 (file)
@@ -15,6 +15,7 @@ static void show_usage(FAR const char *program)
        printf(" %s mpu9250    : i2c 9-axis motion tracking sensor(MPU9250) test\n", program);
        printf(" %s k6ds3      : spi 6-axis acceler sensor(K6DS3) test\n", program);
        printf(" %s lis3lv02qd : spi 3-axis acceler sensor(LIS3LV02QD) test\n", program);
+       printf(" %s adctest    : adc print all chnnel value\n", program);
 }
 
 #ifdef CONFIG_BUILD_KERNEL
@@ -49,6 +50,8 @@ int sensorbd_main(int argc, FAR char *argv[])
                        k6ds3_main(argc, argv);
                } else if (strcmp(argv[1], "lis3lv02qd") == 0) {
                        lis3lv02qd_main(argc, argv);
+               } else if (strcmp(argv[1], "adctest") == 0) {
+                       adctest_main(argc, argv);
                } else {
                        show_usage(argv[0]);
                }