/**************************************************************************** * 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 #include #include #include #include /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /**************************************************************************** * Inline Functions ****************************************************************************/ static inline uint64_t lirc_get_timestamp(void) { struct timespec ts; #ifdef CONFIG_CLOCK_MONOTONIC clock_gettime(CLOCK_MONOTONIC, &ts); #else clock_gettime(CLOCK_REALTIME, &ts); #endif 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