17ca3415dc
From branch: redwood-s-oss Change-Id: I797a2a9e9bbde8f9bf750b7429977747c31bd8a6
156 lines
4.5 KiB
C
Executable File
156 lines
4.5 KiB
C
Executable File
/**
|
|
* Copyright Elliptic Labs 2015-2016
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/kfifo.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
#define ELLIPTIC_DATA_IO_AP_TO_DSP 0
|
|
#define ELLIPTIC_DATA_IO_DSP_TO_AP 1
|
|
|
|
#define ELLIPTIC_DATA_IO_READ_OK 0
|
|
#define ELLIPTIC_DATA_IO_READ_BUSY 1
|
|
#define ELLIPTIC_DATA_IO_READ_CANCEL 2
|
|
|
|
#define ELLIPTIC_MSG_BUF_SIZE 512
|
|
|
|
/* wake source timeout in ms*/
|
|
#define ELLIPTIC_WAKEUP_TIMEOUT 250
|
|
|
|
#define ELLIPTIC_DATA_FIFO_SIZE (PAGE_SIZE)
|
|
|
|
#define ULTRASOUND_RX_PORT_ID 0
|
|
#define ULTRASOUND_TX_PORT_ID 1
|
|
|
|
/* Elliptic Labs UltraSound Module */
|
|
#define ELLIPTIC_ULTRASOUND_DISABLE 0
|
|
#define ELLIPTIC_ULTRASOUND_ENABLE 1
|
|
#define ELLIPTIC_ULTRASOUND_SET_PARAMS 2
|
|
#define ELLIPTIC_ULTRASOUND_GET_PARAMS 3
|
|
#define ELLIPTIC_ULTRASOUND_RAMP_DOWN 4
|
|
|
|
/** Param ID definition */
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_DATA 3
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_DATA 11
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_ENGINE_VERSION 12
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_BUILD_BRANCH 14
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_CALIBRATION_V2_DATA 15
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_SENSORHUB 16
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_DIAGNOSTICS_DATA 17
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_TAG 18
|
|
#define ELLIPTIC_ULTRASOUND_PARAM_ID_ML_DATA 19
|
|
|
|
#define ELLIPTIC_DATA_READ_BUSY 0
|
|
#define ELLIPTIC_DATA_READ_OK 1
|
|
#define ELLIPTIC_DATA_READ_CANCEL 2
|
|
|
|
#define ELLIPTIC_ALL_DEVICES -1
|
|
#define ELLIPTIC_DEVICE_0 0
|
|
#define ELLIPTIC_DEVICE_1 1
|
|
|
|
enum elliptic_message_id {
|
|
ELLIPTIC_MESSAGE_PAYLOAD, /* Input to AP*/
|
|
ELLIPTIC_MESSAGE_RAW, /* Output from AP*/
|
|
ELLIPTIC_MESSAGE_CALIBRATION,
|
|
ELLIPTIC_MESSAGE_CALIBRATION_V2,
|
|
ELLIPTIC_MESSAGE_DIAGNOSTICS,
|
|
ELLIPTIC_MAX_MESSAGE_IDS
|
|
};
|
|
|
|
typedef enum {
|
|
ELLIPTIC_DATA_PUSH_FROM_KERNEL,
|
|
ELLIPTIC_DATA_PUSH_FROM_USERSPACE
|
|
} elliptic_data_push_t;
|
|
|
|
struct elliptic_data {
|
|
/* wake lock timeout */
|
|
unsigned int wakeup_timeout;
|
|
|
|
/* members for top half interrupt handling */
|
|
struct kfifo fifo_isr;
|
|
spinlock_t fifo_isr_spinlock;
|
|
wait_queue_head_t fifo_isr_not_empty;
|
|
struct mutex user_buffer_lock;
|
|
|
|
/* buffer to swap data from isr fifo to userspace */
|
|
uint8_t isr_swap_buffer[ELLIPTIC_MSG_BUF_SIZE];
|
|
|
|
atomic_t abort_io;
|
|
|
|
/* debug counters, reset between open/close */
|
|
uint32_t isr_fifo_discard;
|
|
|
|
/* debug counters, persistent */
|
|
uint32_t isr_fifo_discard_total;
|
|
uint32_t userspace_read_total;
|
|
uint32_t isr_write_total;
|
|
|
|
};
|
|
|
|
/* Elliptic IO module API (implemented by IO module)*/
|
|
|
|
int elliptic_data_io_initialize(void);
|
|
int elliptic_data_io_cleanup(void);
|
|
|
|
int32_t elliptic_data_io_write(uint32_t message_id, const char *data,
|
|
size_t data_size);
|
|
|
|
int32_t elliptic_data_io_transact(uint32_t message_id, const char *data,
|
|
size_t data_size, char *output_data, size_t output_data_size);
|
|
|
|
|
|
/* Elliptic driver API (implemented by main driver)*/
|
|
int elliptic_data_initialize(struct elliptic_data *,
|
|
size_t max_queue_size, unsigned int wakeup_timeout, int id);
|
|
|
|
int elliptic_data_cleanup(struct elliptic_data *);
|
|
|
|
void elliptic_data_reset_debug_counters(struct elliptic_data *);
|
|
void elliptic_data_update_debug_counters(struct elliptic_data *);
|
|
void elliptic_data_print_debug_counters(struct elliptic_data *);
|
|
|
|
/* Called from elliptic device read */
|
|
size_t elliptic_data_pop(struct elliptic_data *,
|
|
char __user *buffer, size_t buffer_size);
|
|
|
|
/* Used for cancelling a blocking read */
|
|
void elliptic_data_cancel(struct elliptic_data *);
|
|
|
|
/* Called from IO module*/
|
|
int elliptic_data_push(int deviceid, const char *buffer, size_t buffer_size, elliptic_data_push_t);
|
|
|
|
/* Writes to io module and user space control */
|
|
int32_t elliptic_data_write(uint32_t message_id,
|
|
const char *data, size_t data_size);
|
|
|
|
/* Opens port */
|
|
int elliptic_open_port(int portid);
|
|
|
|
/* Closes port */
|
|
int elliptic_close_port(int portid);
|
|
|
|
/* Opens port */
|
|
int elliptic_io_open_port(int portid);
|
|
|
|
/* Closes port */
|
|
int elliptic_io_close_port(int portid);
|
|
|
|
/* Create device node for userspace io driver*/
|
|
int elliptic_userspace_io_driver_init(void);
|
|
void elliptic_userspace_io_driver_exit(void);
|
|
|
|
/* Create device node for userspace io driver*/
|
|
int elliptic_userspace_ctrl_driver_init(void);
|
|
void elliptic_userspace_ctrl_driver_exit(void);
|
|
int32_t elliptic_userspace_ctrl_write(uint32_t message_id,
|
|
const char *data, size_t data_size);
|
|
|