samples: sensor: remove fxos8700-hid
This sample uses the FXOS8700 compatible accelerometer to emulate relative mouse movement. While this is an interesting example, it does not provide anything unique in terms of sensor drivers or USB device support. The example has no documentation and unsafe report buffer handling. The example would need to be completely rewritten to make it generic and use any accelerometer, e.g. with an accel0 alias. From a USB perspective, there is no interest in maintaining this sample or porting it to the new device support and new HID device API. Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
This commit is contained in:
parent
d084d83baf
commit
85bd852050
4 changed files with 0 additions and 286 deletions
|
@ -1,8 +0,0 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
cmake_minimum_required(VERSION 3.20.0)
|
||||
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||
project(fxos8700-hid)
|
||||
|
||||
FILE(GLOB app_sources src/*.c)
|
||||
target_sources(app PRIVATE ${app_sources})
|
|
@ -1,17 +0,0 @@
|
|||
CONFIG_LOG=y
|
||||
CONFIG_USB_DEVICE_STACK=y
|
||||
CONFIG_USB_DEVICE_HID=y
|
||||
CONFIG_USB_DEVICE_PRODUCT="Zephyr HID accelerometer mouse sample"
|
||||
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
|
||||
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
|
||||
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n
|
||||
|
||||
CONFIG_STDOUT_CONSOLE=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_SENSOR=y
|
||||
CONFIG_FXOS8700_MODE_ACCEL=y
|
||||
CONFIG_FXOS8700_TRIGGER_OWN_THREAD=y
|
||||
CONFIG_SENSOR_LOG_LEVEL_DBG=y
|
||||
|
||||
CONFIG_GPIO=y
|
||||
CONFIG_CBPRINTF_FP_SUPPORT=y
|
|
@ -1,10 +0,0 @@
|
|||
sample:
|
||||
name: USB HID accelerometer mouse sample
|
||||
tests:
|
||||
sample.sensor.usb.fxos8700-hid:
|
||||
depends_on: usb_device
|
||||
platform_allow: frdm_k64f
|
||||
harness: usb
|
||||
tags:
|
||||
- usb
|
||||
- sensors
|
|
@ -1,251 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2018 qianfan Zhao
|
||||
* Copyright (c) 2018 Nordic Semiconductor ASA
|
||||
* Copyright (c) 2019 Intel Corp
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/drivers/gpio.h>
|
||||
#include <zephyr/drivers/sensor.h>
|
||||
|
||||
#include <zephyr/usb/usb_device.h>
|
||||
#include <zephyr/usb/class/usb_hid.h>
|
||||
|
||||
#define LOG_LEVEL LOG_LEVEL_DBG
|
||||
LOG_MODULE_REGISTER(main);
|
||||
|
||||
#define SW0_NODE DT_ALIAS(sw0)
|
||||
#define SW1_NODE DT_ALIAS(sw1)
|
||||
|
||||
#if DT_NODE_HAS_STATUS(SW0_NODE, okay)
|
||||
static const struct gpio_dt_spec sw0_gpio = GPIO_DT_SPEC_GET(SW0_NODE, gpios);
|
||||
#endif
|
||||
|
||||
/* If second button exists, use it as right-click. */
|
||||
#if DT_NODE_HAS_STATUS(SW1_NODE, okay)
|
||||
static const struct gpio_dt_spec sw1_gpio = GPIO_DT_SPEC_GET(SW1_NODE, gpios);
|
||||
#endif
|
||||
|
||||
static const struct gpio_dt_spec led_gpio = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);
|
||||
|
||||
|
||||
static const uint8_t hid_report_desc[] = HID_MOUSE_REPORT_DESC(2);
|
||||
|
||||
static uint32_t def_val[4];
|
||||
static volatile uint8_t status[4];
|
||||
static K_SEM_DEFINE(sem, 0, 1); /* starts off "not available" */
|
||||
static struct gpio_callback gpio_callbacks[4];
|
||||
|
||||
#define MOUSE_BTN_REPORT_POS 0
|
||||
#define MOUSE_X_REPORT_POS 1
|
||||
#define MOUSE_Y_REPORT_POS 2
|
||||
|
||||
#define MOUSE_BTN_LEFT BIT(0)
|
||||
#define MOUSE_BTN_RIGHT BIT(1)
|
||||
#define MOUSE_BTN_MIDDLE BIT(2)
|
||||
|
||||
|
||||
static void left_button(const struct device *gpio, struct gpio_callback *cb,
|
||||
uint32_t pins)
|
||||
{
|
||||
uint32_t cur_val;
|
||||
uint8_t state = status[MOUSE_BTN_REPORT_POS];
|
||||
|
||||
cur_val = gpio_pin_get(gpio, pins);
|
||||
if (def_val[0] != cur_val) {
|
||||
state |= MOUSE_BTN_LEFT;
|
||||
} else {
|
||||
state &= ~MOUSE_BTN_LEFT;
|
||||
}
|
||||
|
||||
if (status[MOUSE_BTN_REPORT_POS] != state) {
|
||||
status[MOUSE_BTN_REPORT_POS] = state;
|
||||
k_sem_give(&sem);
|
||||
}
|
||||
}
|
||||
|
||||
#if DT_NODE_HAS_STATUS(SW1_NODE, okay)
|
||||
static void right_button(const struct device *gpio, struct gpio_callback *cb,
|
||||
uint32_t pins)
|
||||
|
||||
{
|
||||
uint32_t cur_val;
|
||||
uint8_t state = status[MOUSE_BTN_REPORT_POS];
|
||||
|
||||
cur_val = gpio_pin_get(gpio, pins);
|
||||
if (def_val[0] != cur_val) {
|
||||
state |= MOUSE_BTN_RIGHT;
|
||||
} else {
|
||||
state &= ~MOUSE_BTN_RIGHT;
|
||||
}
|
||||
|
||||
if (status[MOUSE_BTN_REPORT_POS] != state) {
|
||||
status[MOUSE_BTN_REPORT_POS] = state;
|
||||
k_sem_give(&sem);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int callbacks_configure(const struct gpio_dt_spec *gpio,
|
||||
gpio_callback_handler_t handler,
|
||||
struct gpio_callback *callback, uint32_t *val)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!device_is_ready(gpio->port)) {
|
||||
LOG_ERR("%s: device not ready.", gpio->port->name);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
gpio_pin_configure_dt(gpio, GPIO_INPUT);
|
||||
|
||||
ret = gpio_pin_get_dt(gpio);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
*val = (uint32_t)ret;
|
||||
|
||||
gpio_init_callback(callback, handler, BIT(gpio->pin));
|
||||
gpio_add_callback(gpio->port, callback);
|
||||
gpio_pin_interrupt_configure_dt(gpio, GPIO_INT_EDGE_TO_ACTIVE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool read_accel(const struct device *dev)
|
||||
{
|
||||
struct sensor_value val[3];
|
||||
int ret;
|
||||
|
||||
ret = sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, val);
|
||||
if (ret < 0) {
|
||||
LOG_ERR("Cannot read sensor channels");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* For printing double we need to use printf with
|
||||
* printf("%10.6f\n", sensor_value_to_double(x));
|
||||
*/
|
||||
LOG_DBG("int parts: X %d Y %d", val[0].val1, val[1].val1);
|
||||
|
||||
/* TODO: Add proper calculations */
|
||||
|
||||
if (val[0].val1 != 0) {
|
||||
status[MOUSE_X_REPORT_POS] = val[0].val1 * 4;
|
||||
}
|
||||
|
||||
if (val[1].val1 != 0) {
|
||||
status[MOUSE_Y_REPORT_POS] = val[1].val1 * 4;
|
||||
}
|
||||
|
||||
if (val[0].val1 != 0 || val[1].val1 != 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static void trigger_handler(const struct device *dev,
|
||||
const struct sensor_trigger *tr)
|
||||
{
|
||||
ARG_UNUSED(tr);
|
||||
|
||||
/* Always fetch the sample to clear the data ready interrupt in the
|
||||
* sensor.
|
||||
*/
|
||||
if (sensor_sample_fetch(dev)) {
|
||||
LOG_ERR("sensor_sample_fetch failed");
|
||||
return;
|
||||
}
|
||||
|
||||
if (read_accel(dev)) {
|
||||
k_sem_give(&sem);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret;
|
||||
uint8_t report[4] = { 0x00 };
|
||||
const struct device *accel_dev, *hid_dev;
|
||||
|
||||
if (!gpio_is_ready_dt(&led_gpio)) {
|
||||
LOG_ERR("%s: device not ready.", led_gpio.port->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
hid_dev = device_get_binding("HID_0");
|
||||
if (hid_dev == NULL) {
|
||||
LOG_ERR("Cannot get USB HID Device");
|
||||
return 0;
|
||||
}
|
||||
|
||||
gpio_pin_configure_dt(&led_gpio, GPIO_OUTPUT);
|
||||
|
||||
if (callbacks_configure(&sw0_gpio, &left_button, &gpio_callbacks[0], &def_val[0])) {
|
||||
LOG_ERR("Failed configuring left button callback.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if DT_NODE_HAS_STATUS(SW1_NODE, okay)
|
||||
if (callbacks_configure(&sw1_gpio, &right_button, &gpio_callbacks[1], &def_val[1])) {
|
||||
LOG_ERR("Failed configuring right button callback.");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
accel_dev = DEVICE_DT_GET_ONE(nxp_fxos8700);
|
||||
if (!device_is_ready(accel_dev)) {
|
||||
LOG_ERR("%s: device not ready.", accel_dev->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sensor_value attr = {
|
||||
.val1 = 6,
|
||||
.val2 = 250000,
|
||||
};
|
||||
|
||||
if (sensor_attr_set(accel_dev, SENSOR_CHAN_ALL,
|
||||
SENSOR_ATTR_SAMPLING_FREQUENCY, &attr)) {
|
||||
LOG_ERR("Could not set sampling frequency");
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sensor_trigger trig = {
|
||||
.type = SENSOR_TRIG_DATA_READY,
|
||||
.chan = SENSOR_CHAN_ACCEL_XYZ,
|
||||
};
|
||||
|
||||
if (sensor_trigger_set(accel_dev, &trig, trigger_handler)) {
|
||||
LOG_ERR("Could not set trigger");
|
||||
return 0;
|
||||
}
|
||||
|
||||
usb_hid_register_device(hid_dev, hid_report_desc,
|
||||
sizeof(hid_report_desc), NULL);
|
||||
|
||||
ret = usb_enable(NULL);
|
||||
if (ret != 0) {
|
||||
LOG_ERR("Failed to enable USB");
|
||||
return 0;
|
||||
}
|
||||
|
||||
usb_hid_init(hid_dev);
|
||||
|
||||
while (true) {
|
||||
k_sem_take(&sem, K_FOREVER);
|
||||
|
||||
report[MOUSE_BTN_REPORT_POS] = status[MOUSE_BTN_REPORT_POS];
|
||||
report[MOUSE_X_REPORT_POS] = status[MOUSE_X_REPORT_POS];
|
||||
status[MOUSE_X_REPORT_POS] = 0U;
|
||||
report[MOUSE_Y_REPORT_POS] = status[MOUSE_Y_REPORT_POS];
|
||||
status[MOUSE_Y_REPORT_POS] = 0U;
|
||||
hid_int_ep_write(hid_dev, report, sizeof(report), NULL);
|
||||
|
||||
/* Toggle LED on sent report */
|
||||
gpio_pin_toggle_dt(&led_gpio);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue