267 lines
9.6 KiB
C
267 lines
9.6 KiB
C
/****************************************************************************
|
|
* include/nuttx/rc/lirc_dev.h
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __INCLUDE_NUTTX_RC_LIRC_DEV_H
|
|
#define __INCLUDE_NUTTX_RC_LIRC_DEV_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#include <nuttx/list.h>
|
|
#include <nuttx/semaphore.h>
|
|
#include <nuttx/lirc.h>
|
|
|
|
#include <time.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Inline Functions
|
|
****************************************************************************/
|
|
|
|
static inline uint64_t lirc_get_timestamp(void)
|
|
{
|
|
struct timespec ts;
|
|
|
|
clock_systime_timespec(&ts);
|
|
return 1000000000ull * ts.tv_sec + ts.tv_nsec;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Public Types
|
|
****************************************************************************/
|
|
|
|
/* enum lirc_driver_type_e - type of the LIRC driver.
|
|
*
|
|
* LIRC_DRIVER_SCANCODE: Driver or hardware generates a scancode.
|
|
* LIRC_DRIVER_IR_RAW: Driver or hardware generates pulse/space sequences.
|
|
* It needs a Infra-Red pulse/space decoder
|
|
* LIRC_DRIVER_IR_RAW_TX: Device transmitter only,
|
|
* driver requires pulse/space data sequence.
|
|
*/
|
|
|
|
enum lirc_driver_type_e
|
|
{
|
|
LIRC_DRIVER_SCANCODE = 0,
|
|
LIRC_DRIVER_IR_RAW,
|
|
LIRC_DRIVER_IR_RAW_TX,
|
|
};
|
|
|
|
/* The Raw interface is specific to InfraRed. */
|
|
|
|
struct lirc_raw_event_s
|
|
{
|
|
union
|
|
{
|
|
uint32_t duration;
|
|
uint32_t carrier;
|
|
};
|
|
|
|
uint8_t duty_cycle;
|
|
|
|
unsigned pulse:1;
|
|
unsigned reset:1;
|
|
unsigned timeout:1;
|
|
unsigned carrier_report:1;
|
|
};
|
|
|
|
/* struct lirc_ops_s - The lower half driver operations
|
|
* driver_type: specifies if protocol decoding is done in hard/software
|
|
* open: allow drivers to enable polling/irq when IR input dev is opened.
|
|
* close: allow drivers to disable polling/irq when IR input dev is closed.
|
|
* s_tx_mask: set transmitter mask (for devices with multiple tx outputs)
|
|
* s_tx_carrier: set transmit carrier frequency
|
|
* s_tx_duty_cycle: set transmit duty cycle (0% - 100%)
|
|
* s_rx_carrier_range: inform driver about carrier it is expected to handle
|
|
* tx_ir: transmit raw data to IR
|
|
* tx_scancode: transmit scancodes to IR
|
|
* s_learning_mode: enable wide band receiver used for learning
|
|
* s_carrier_report: enable carrier reports
|
|
* s_timeout: set hardware timeout in us
|
|
*/
|
|
|
|
struct lirc_lowerhalf_s;
|
|
struct lirc_ops_s
|
|
{
|
|
enum lirc_driver_type_e driver_type;
|
|
CODE int (*open)(FAR struct lirc_lowerhalf_s *lower);
|
|
CODE void (*close)(FAR struct lirc_lowerhalf_s *lower);
|
|
CODE int (*s_tx_mask)(FAR struct lirc_lowerhalf_s *lower,
|
|
unsigned int mask);
|
|
CODE int (*s_tx_carrier)(FAR struct lirc_lowerhalf_s *lower,
|
|
unsigned int carrier);
|
|
CODE int (*s_tx_duty_cycle)(FAR struct lirc_lowerhalf_s *lower,
|
|
unsigned int duty_cycle);
|
|
CODE int (*s_rx_carrier_range)(FAR struct lirc_lowerhalf_s *lower,
|
|
unsigned int min, unsigned int max);
|
|
CODE int (*tx_ir)(FAR struct lirc_lowerhalf_s *lower,
|
|
FAR unsigned int *txbuf, unsigned int n);
|
|
CODE int (*tx_scancode)(FAR struct lirc_lowerhalf_s *lower,
|
|
FAR struct lirc_scancode *txbuf);
|
|
CODE int (*s_learning_mode)(FAR struct lirc_lowerhalf_s *lower,
|
|
int enable);
|
|
CODE int (*s_carrier_report) (FAR struct lirc_lowerhalf_s *lower,
|
|
int enable);
|
|
CODE int (*s_timeout)(FAR struct lirc_lowerhalf_s *lower,
|
|
unsigned int timeout);
|
|
};
|
|
|
|
/* struct lirc_lowerhalf_s - represents a remote control device
|
|
* ops: the lirc lowerhalf driver operations
|
|
* priv: the pointer to lirc upperhalf handle, it's updated by lirc_register.
|
|
* timeout: optional time after which device stops sending data
|
|
* min_timeout: minimum timeout supported by device
|
|
* max_timeout: maximum timeout supported by device
|
|
* buffer_bytes: The size of intermediate buffer, in bytes unit. we recommend
|
|
* size is a multiple of unsigned int for LIRC_DRIVER_IR_RAW,
|
|
* is a multiple of struct lirc_scancode for
|
|
* LIRC_DRIVER_SCANCODE. we don't need to set buffer_bytes for
|
|
* LIRC_DRIVER_IR_RAW_TX.
|
|
* rx_resolution: resolution (in us) of input sampler
|
|
* tx_resolution: resolution (in us) of output sampler
|
|
*/
|
|
|
|
struct lirc_lowerhalf_s
|
|
{
|
|
FAR const struct lirc_ops_s *ops;
|
|
FAR void *priv;
|
|
unsigned int timeout;
|
|
unsigned int min_timeout;
|
|
unsigned int max_timeout;
|
|
unsigned int buffer_bytes;
|
|
unsigned int rx_resolution;
|
|
unsigned int tx_resolution;
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
#undef EXTERN
|
|
#if defined(__cplusplus)
|
|
#define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: lirc_register
|
|
*
|
|
* Description:
|
|
* This function binds an instance of a "lower half" lirc driver with the
|
|
* "upper half" RC device and registers that device so that can be used
|
|
* by application code.
|
|
*
|
|
* We will register the chararter device. ex: /dev/lirc%d(0, 1, ...)
|
|
*
|
|
* Input Parameters:
|
|
* lower - A pointer to an instance of lower half lirc driver.
|
|
* devno - The user specifies device number, from 0. If the
|
|
* devno alerady exists, -EEXIST will be returned.
|
|
*
|
|
* Returned Value:
|
|
* OK if the driver was successfully register; A negated errno value is
|
|
* returned on any failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int lirc_register(FAR struct lirc_lowerhalf_s *lower, int devno);
|
|
|
|
/****************************************************************************
|
|
* Name: lirc_unregister
|
|
*
|
|
* Description:
|
|
* This function unregister character node and release all resource about
|
|
* upper half driver.
|
|
*
|
|
* Input Parameters:
|
|
* lower - A pointer to an instance of lower half lirc driver.
|
|
* devno - The user specifies device number, from 0.
|
|
****************************************************************************/
|
|
|
|
void lirc_unregister(FAR struct lirc_lowerhalf_s *lower, int devno);
|
|
|
|
/****************************************************************************
|
|
* Name: lirc_sample_event
|
|
*
|
|
* Description:
|
|
* Lirc lowerhalf driver sends raw IR data to lirc upperhalf buffer, to
|
|
* notify userspace to read IR data.
|
|
*
|
|
* The type of data is a sequence of pulse and space codes, as a seriers
|
|
* of unsigned values.
|
|
*
|
|
* The upper 8 bits determine the packet type, and the lower 24 bits the
|
|
* payload.
|
|
*
|
|
* Input Parameters:
|
|
* lower - A pointer to an instance of lower half lirc driver.
|
|
* sample - The data of receiving from IR device
|
|
****************************************************************************/
|
|
|
|
void lirc_sample_event(FAR struct lirc_lowerhalf_s *lower,
|
|
unsigned int sample);
|
|
|
|
/****************************************************************************
|
|
* Name: lirc_raw_event
|
|
*
|
|
* Description:
|
|
* Lirc lowerhalf driver sends IR data to lirc upperhalf buffer, to
|
|
* notify userspace to read IR data.
|
|
*
|
|
* The type of data is struct lirc_raw_event_s.
|
|
*
|
|
* Input Parameters:
|
|
* lower - A pointer to an instance of lower half lirc driver.
|
|
* ev - The data of receiving from IR device
|
|
****************************************************************************/
|
|
|
|
void lirc_raw_event(FAR struct lirc_lowerhalf_s *lower,
|
|
struct lirc_raw_event_s ev);
|
|
|
|
/****************************************************************************
|
|
* Name: lirc_scancode_event
|
|
*
|
|
* Description:
|
|
* Lirc lowerhalf driver sends IR data to lirc upperhalf buffer, to
|
|
* notify userspace to read IR data.
|
|
*
|
|
* The type of data is struct lirc_scancode.
|
|
*
|
|
* Input Parameters:
|
|
* lower - A pointer to an instance of lower half lirc driver.
|
|
* lsc - The data of receiving from IR device
|
|
****************************************************************************/
|
|
|
|
void lirc_scancode_event(FAR struct lirc_lowerhalf_s *lower,
|
|
FAR struct lirc_scancode *lsc);
|
|
|
|
#undef EXTERN
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
#endif
|