| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @file main.c - DesignWare AIO/Comparator demo on Arduino 101 |
| * |
| * This is used to demo the DesignWare AIO/Comparator. The voltage input |
| * pin is analog in A0 on circuit board, which maps to AIN[10] on chip. |
| * |
| * The comparison is using the internal 3.3V as reference voltage, |
| * so it needs a higher voltage to trigger comparator. |
| * |
| * To test: |
| * 1. Connect the A0 pin to ground via a resistor. Any larger than |
| * 1k Ohm would be fine. This is to avoid floating pin. |
| * 2. Turn on the device. |
| * 3. Wait for device to boot, until "app started" line appeared. |
| * 4. Connect a voltage source higher than 3.3V (the 5V line would work). |
| * The line "*** A0, AIN[10] triggered rising." should appear. |
| * 5. Remove the voltage source. |
| * The line "*** A0, AIN[10] triggered falling." should appear. |
| */ |
| |
| #include <zephyr.h> |
| #include <zephyr/types.h> |
| #include <stdio.h> |
| #include <device.h> |
| #include <aio_comparator.h> |
| |
| /* specify delay between greetings (in ms) */ |
| #define SLEEPTIME 5000 |
| |
| struct cb_data_t { |
| u8_t ain_idx; |
| enum aio_cmp_ref ref; |
| enum aio_cmp_polarity pol; |
| char name[50]; |
| }; |
| |
| static struct cb_data_t cb_data = { |
| .ain_idx = 10, |
| .ref = AIO_CMP_REF_A, |
| .pol = AIO_CMP_POL_RISE, |
| .name = "A0, AIN[10]", |
| }; |
| |
| static void cb(void *param) |
| { |
| struct device *aio_cmp_dev; |
| struct cb_data_t *p = (struct cb_data_t *)param; |
| |
| aio_cmp_dev = device_get_binding(CONFIG_AIO_COMPARATOR_0_NAME); |
| |
| printf("*** %s triggered %s.\n", p->name, |
| (p->pol == AIO_CMP_POL_RISE) ? "rising" : "falling"); |
| |
| if (p->pol == AIO_CMP_POL_RISE) { |
| p->pol = AIO_CMP_POL_FALL; |
| } else { |
| p->pol = AIO_CMP_POL_RISE; |
| } |
| |
| aio_cmp_configure(aio_cmp_dev, p->ain_idx, p->pol, p->ref, cb, p); |
| } |
| |
| void main(void) |
| { |
| struct device *aio_cmp_dev; |
| int i, ret; |
| int cnt = 0; |
| |
| aio_cmp_dev = device_get_binding(CONFIG_AIO_COMPARATOR_0_NAME); |
| if (!aio_cmp_dev) { |
| printf("AIO device driver not found\n"); |
| return; |
| } |
| |
| printf("===== app started ========\n"); |
| |
| for (i = 0; i < 4; i++) { |
| /* REF_A is to use AREF for reference */ |
| ret = aio_cmp_configure(aio_cmp_dev, cb_data.ain_idx, |
| cb_data.pol, cb_data.ref, |
| cb, &cb_data); |
| if (ret) { |
| printf("ERROR registering callback for %s (%d)\n", |
| cb_data.name, ret); |
| } |
| } |
| |
| while (1) { |
| printf("... waiting for event! (%d)\n", ++cnt); |
| |
| /* wait a while */ |
| k_sleep(SLEEPTIME); |
| } |
| } |
| |