driver/rc: support IR remote control
N/A guide link: https://www.kernel.org/doc/html/v4.14/media/uapi/rc/lirc-dev.html Change-Id: I84abfc12578d444d72c8c0df31d06d1a85ce0725 Signed-off-by: dongjiuzhu <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
e73e03a33f
commit
2ed6e13241
38
Kconfig
38
Kconfig
@ -1417,6 +1417,44 @@ config DEBUG_PWM_INFO
|
||||
|
||||
endif # DEBUG_PWM
|
||||
|
||||
config DEBUG_RC
|
||||
bool "RC Debug Features"
|
||||
default n
|
||||
depends on DRIVERS_RC
|
||||
---help---
|
||||
Enable RC debug features.
|
||||
|
||||
Support for this debug option is architecture-specific and may not
|
||||
be available for some MCUs.
|
||||
|
||||
if DEBUG_RC
|
||||
|
||||
config DEBUG_RC_ERROR
|
||||
bool "RC Error Output"
|
||||
default n
|
||||
depends on DEBUG_ERROR
|
||||
---help---
|
||||
Enable RC driver error output to SYSLOG.
|
||||
|
||||
Support for this debug option is architecture-specific and may not
|
||||
be available for some MCUs.
|
||||
|
||||
config DEBUG_RC_WARN
|
||||
bool "RC Warnings Output"
|
||||
default n
|
||||
depends on DEBUG_WARN
|
||||
---help---
|
||||
Enable RC driver warning output to SYSLOG.
|
||||
|
||||
config DEBUG_RC_INFO
|
||||
bool "RC Informational Output"
|
||||
default n
|
||||
depends on DEBUG_INFO
|
||||
---help---
|
||||
Enable RC driver informational output to SYSLOG.
|
||||
|
||||
endif # DEBUG_RC
|
||||
|
||||
config DEBUG_RTC
|
||||
bool "RTC Debug Features"
|
||||
default n
|
||||
|
@ -112,3 +112,4 @@ source drivers/1wire/Kconfig
|
||||
source drivers/syslog/Kconfig
|
||||
source drivers/platform/Kconfig
|
||||
source drivers/rf/Kconfig
|
||||
source drivers/rc/Kconfig
|
||||
|
@ -74,6 +74,7 @@ include wireless/Make.defs
|
||||
include contactless/Make.defs
|
||||
include 1wire/Make.defs
|
||||
include rf/Make.defs
|
||||
include rc/Make.defs
|
||||
|
||||
ifeq ($(CONFIG_SPECIFIC_DRIVERS),y)
|
||||
include platform/Make.defs
|
||||
|
10
drivers/rc/Kconfig
Normal file
10
drivers/rc/Kconfig
Normal file
@ -0,0 +1,10 @@
|
||||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
menuconfig DRIVERS_RC
|
||||
bool "Remote Control Device Support"
|
||||
default n
|
||||
---help---
|
||||
Drivers for various remote control
|
33
drivers/rc/Make.defs
Normal file
33
drivers/rc/Make.defs
Normal file
@ -0,0 +1,33 @@
|
||||
############################################################################
|
||||
# drivers/rc/Make.defs
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
# Include remote control drivers
|
||||
|
||||
ifeq ($(CONFIG_DRIVERS_RC),y)
|
||||
|
||||
CSRCS += lirc_dev.c
|
||||
|
||||
# Include remote control driver build support
|
||||
|
||||
DEPPATH += --dep-path rc
|
||||
VPATH += :rc
|
||||
CFLAGS += ${shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)drivers$(DELIM)rc}
|
||||
|
||||
endif # CONFIG_REMOTE_CONTROL
|
1168
drivers/rc/lirc_dev.c
Normal file
1168
drivers/rc/lirc_dev.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -595,6 +595,24 @@
|
||||
# define pwminfo _none
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_RC_ERROR
|
||||
# define rcerr _err
|
||||
#else
|
||||
# define rcerr _none
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_RC_WARN
|
||||
# define rcwarn _warn
|
||||
#else
|
||||
# define rcwarn _none
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_RC_INFO
|
||||
# define rcinfo _info
|
||||
#else
|
||||
# define rcinfo _none
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_RTC_ERROR
|
||||
# define rtcerr _err
|
||||
#else
|
||||
|
@ -99,6 +99,7 @@
|
||||
#define _RPTUNBASE (0x2b00) /* Remote processor tunnel ioctl commands */
|
||||
#define _NOTECTLBASE (0x2c00) /* Note filter control ioctl commands*/
|
||||
#define _NOTERAMBASE (0x2d00) /* Noteram device ioctl commands*/
|
||||
#define _RCIOCBASE (0x2e00) /* Remote Control device ioctl commands */
|
||||
#define _WLIOCBASE (0x8b00) /* Wireless modules ioctl network commands */
|
||||
|
||||
/* boardctl() commands share the same number space */
|
||||
@ -539,6 +540,11 @@
|
||||
#define _NOTERAMIOCVALID(c) (_IOC_TYPE(c) == _NOTERAMBASE)
|
||||
#define _NOTERAMIOC(nr) _IOC(_NOTERAMBASE, nr)
|
||||
|
||||
/* Remote Control drivers ***************************************************/
|
||||
|
||||
#define _RCIOCVALID(c) (_IOC_TYPE(c)==_RCIOCBASE)
|
||||
#define _RCIOC(nr) _IOC(_RCIOCBASE,nr)
|
||||
|
||||
/* Wireless driver network ioctl definitions ********************************/
|
||||
|
||||
/* (see nuttx/include/wireless/wireless.h */
|
||||
|
264
include/nuttx/lirc.h
Normal file
264
include/nuttx/lirc.h
Normal file
@ -0,0 +1,264 @@
|
||||
/****************************************************************************
|
||||
* include/nuttx/lirc.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_LIRC_H
|
||||
#define __INCLUDE_NUTTX_LIRC_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/fs/ioctl.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define PULSE_BIT 0x01000000
|
||||
#define PULSE_MASK 0x00FFFFFF
|
||||
|
||||
#define LIRC_MODE2_SPACE 0x00000000
|
||||
#define LIRC_MODE2_PULSE 0x01000000
|
||||
#define LIRC_MODE2_FREQUENCY 0x02000000
|
||||
#define LIRC_MODE2_TIMEOUT 0x03000000
|
||||
|
||||
#define LIRC_VALUE_MASK 0x00FFFFFF
|
||||
#define LIRC_MODE2_MASK 0xFF000000
|
||||
|
||||
#define LIRC_SPACE(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_SPACE)
|
||||
#define LIRC_PULSE(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_PULSE)
|
||||
#define LIRC_FREQUENCY(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_FREQUENCY)
|
||||
#define LIRC_TIMEOUT(val) (((val)&LIRC_VALUE_MASK) | LIRC_MODE2_TIMEOUT)
|
||||
|
||||
#define LIRC_VALUE(val) ((val)&LIRC_VALUE_MASK)
|
||||
#define LIRC_MODE2(val) ((val)&LIRC_MODE2_MASK)
|
||||
|
||||
#define LIRC_IS_SPACE(val) (LIRC_MODE2(val) == LIRC_MODE2_SPACE)
|
||||
#define LIRC_IS_PULSE(val) (LIRC_MODE2(val) == LIRC_MODE2_PULSE)
|
||||
#define LIRC_IS_FREQUENCY(val) (LIRC_MODE2(val) == LIRC_MODE2_FREQUENCY)
|
||||
#define LIRC_IS_TIMEOUT(val) (LIRC_MODE2(val) == LIRC_MODE2_TIMEOUT)
|
||||
|
||||
/* used heavily by lirc userspace */
|
||||
|
||||
#define lirc_t int
|
||||
|
||||
/* lirc compatible hardware features */
|
||||
|
||||
#define LIRC_MODE2SEND(x) (x)
|
||||
#define LIRC_SEND2MODE(x) (x)
|
||||
#define LIRC_MODE2REC(x) ((x) << 16)
|
||||
#define LIRC_REC2MODE(x) ((x) >> 16)
|
||||
|
||||
#define LIRC_MODE_RAW 0x00000001
|
||||
#define LIRC_MODE_PULSE 0x00000002
|
||||
#define LIRC_MODE_MODE2 0x00000004
|
||||
#define LIRC_MODE_SCANCODE 0x00000008
|
||||
#define LIRC_MODE_LIRCCODE 0x00000010
|
||||
|
||||
#define LIRC_CAN_SEND_RAW LIRC_MODE2SEND(LIRC_MODE_RAW)
|
||||
#define LIRC_CAN_SEND_PULSE LIRC_MODE2SEND(LIRC_MODE_PULSE)
|
||||
#define LIRC_CAN_SEND_MODE2 LIRC_MODE2SEND(LIRC_MODE_MODE2)
|
||||
#define LIRC_CAN_SEND_SCANCODE LIRC_MODE2SEND(LIRC_MODE_SCANCODE)
|
||||
#define LIRC_CAN_SEND_LIRCCODE LIRC_MODE2SEND(LIRC_MODE_LIRCCODE)
|
||||
|
||||
#define LIRC_CAN_SEND_MASK 0x0000003f
|
||||
|
||||
#define LIRC_CAN_SET_SEND_CARRIER 0x00000100
|
||||
#define LIRC_CAN_SET_SEND_DUTY_CYCLE 0x00000200
|
||||
#define LIRC_CAN_SET_TRANSMITTER_MASK 0x00000400
|
||||
|
||||
#define LIRC_CAN_REC_RAW LIRC_MODE2REC(LIRC_MODE_RAW)
|
||||
#define LIRC_CAN_REC_PULSE LIRC_MODE2REC(LIRC_MODE_PULSE)
|
||||
#define LIRC_CAN_REC_MODE2 LIRC_MODE2REC(LIRC_MODE_MODE2)
|
||||
#define LIRC_CAN_REC_SCANCODE LIRC_MODE2REC(LIRC_MODE_SCANCODE)
|
||||
#define LIRC_CAN_REC_LIRCCODE LIRC_MODE2REC(LIRC_MODE_LIRCCODE)
|
||||
|
||||
#define LIRC_CAN_REC_MASK LIRC_MODE2REC(LIRC_CAN_SEND_MASK)
|
||||
|
||||
#define LIRC_CAN_SET_REC_CARRIER (LIRC_CAN_SET_SEND_CARRIER << 16)
|
||||
#define LIRC_CAN_SET_REC_DUTY_CYCLE (LIRC_CAN_SET_SEND_DUTY_CYCLE << 16)
|
||||
|
||||
#define LIRC_CAN_SET_REC_DUTY_CYCLE_RANGE 0x40000000
|
||||
#define LIRC_CAN_SET_REC_CARRIER_RANGE 0x80000000
|
||||
#define LIRC_CAN_GET_REC_RESOLUTION 0x20000000
|
||||
#define LIRC_CAN_SET_REC_TIMEOUT 0x10000000
|
||||
#define LIRC_CAN_SET_REC_FILTER 0x08000000
|
||||
|
||||
#define LIRC_CAN_MEASURE_CARRIER 0x02000000
|
||||
#define LIRC_CAN_USE_WIDEBAND_RECEIVER 0x04000000
|
||||
|
||||
#define LIRC_CAN_SEND(x) ((x)&LIRC_CAN_SEND_MASK)
|
||||
#define LIRC_CAN_REC(x) ((x)&LIRC_CAN_REC_MASK)
|
||||
|
||||
#define LIRC_CAN_NOTIFY_DECODE 0x01000000
|
||||
|
||||
/* IOCTL commands for lirc driver */
|
||||
|
||||
#define LIRC_GET_FEATURES _RCIOC(0x0000)
|
||||
#define LIRC_GET_SEND_MODE _RCIOC(0x0001)
|
||||
#define LIRC_GET_REC_MODE _RCIOC(0x0002)
|
||||
#define LIRC_GET_REC_RESOLUTION _RCIOC(0x0007)
|
||||
#define LIRC_GET_MIN_TIMEOUT _RCIOC(0x0008)
|
||||
#define LIRC_GET_MAX_TIMEOUT _RCIOC(0x0009)
|
||||
|
||||
/* code length in bits, currently only for LIRC_MODE_LIRCCODE */
|
||||
|
||||
#define LIRC_GET_LENGTH _RCIOC(0x000f)
|
||||
#define LIRC_SET_SEND_MODE _RCIOC(0x0011)
|
||||
#define LIRC_SET_REC_MODE _RCIOC(0x0012)
|
||||
|
||||
/* Note: these can reset the according pulse_width */
|
||||
|
||||
#define LIRC_SET_SEND_CARRIER _RCIOC(0x0013)
|
||||
#define LIRC_SET_REC_CARRIER _RCIOC(0x0014)
|
||||
#define LIRC_SET_SEND_DUTY_CYCLE _RCIOC(0x0015)
|
||||
#define LIRC_SET_TRANSMITTER_MASK _RCIOC(0x0017)
|
||||
|
||||
/* when a timeout != 0 is set the driver will send a
|
||||
* LIRC_MODE2_TIMEOUT data packet, otherwise LIRC_MODE2_TIMEOUT is
|
||||
* never sent, timeout is disabled by default
|
||||
*/
|
||||
|
||||
#define LIRC_SET_REC_TIMEOUT _RCIOC(0x0018)
|
||||
|
||||
/* 1 enables, 0 disables timeout reports in MODE2 */
|
||||
|
||||
#define LIRC_SET_REC_TIMEOUT_REPORTS _RCIOC(0x0019)
|
||||
|
||||
/* if enabled from the next key press on the driver will send
|
||||
* LIRC_MODE2_FREQUENCY packets
|
||||
*/
|
||||
|
||||
#define LIRC_SET_MEASURE_CARRIER_MODE _RCIOC(0x001d)
|
||||
|
||||
/* to set a range use LIRC_SET_REC_CARRIER_RANGE with the
|
||||
* lower bound first and later LIRC_SET_REC_CARRIER with the upper bound
|
||||
*/
|
||||
|
||||
#define LIRC_SET_REC_CARRIER_RANGE _RCIOC(0x001f)
|
||||
|
||||
#define LIRC_SET_WIDEBAND_RECEIVER _RCIOC(0x0023)
|
||||
|
||||
/* Return the recording timeout, which is either set by
|
||||
* the ioctl LIRC_SET_REC_TIMEOUT or by the kernel after setting
|
||||
* the protocols.
|
||||
*/
|
||||
|
||||
#define LIRC_GET_REC_TIMEOUT _RCIOC(0x0024)
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
/* struct lirc_scancode - decoded scancode with protocol for use with
|
||||
* LIRC_MODE_SCANCODE
|
||||
*
|
||||
* timestamp: Timestamp in nanoseconds using CLOCK_MONOTONIC when IR
|
||||
* was decoded.
|
||||
* flags: should be 0 for transmit. When receiving scancodes,
|
||||
* LIRC_SCANCODE_FLAG_TOGGLE or LIRC_SCANCODE_FLAG_REPEAT can be set
|
||||
* depending on the protocol
|
||||
* rc_proto: see enum rc_proto
|
||||
* keycode: the translated keycode. Set to 0 for transmit.
|
||||
* scancode: the scancode received or to be sent
|
||||
*/
|
||||
|
||||
struct lirc_scancode
|
||||
{
|
||||
uint64_t timestamp;
|
||||
uint16_t flags;
|
||||
uint16_t rc_proto;
|
||||
uint32_t keycode;
|
||||
uint64_t scancode;
|
||||
};
|
||||
|
||||
/* Set if the toggle bit of rc-5 or rc-6 is enabled */
|
||||
|
||||
#define LIRC_SCANCODE_FLAG_TOGGLE 1
|
||||
|
||||
/* Set if this is a nec or sanyo repeat */
|
||||
|
||||
#define LIRC_SCANCODE_FLAG_REPEAT 2
|
||||
|
||||
/* enum rc_proto - the Remote Controller protocol
|
||||
*
|
||||
* RC_PROTO_UNKNOWN: Protocol not known
|
||||
* RC_PROTO_OTHER: Protocol known but proprietary
|
||||
* RC_PROTO_RC5: Philips RC5 protocol
|
||||
* RC_PROTO_RC5X_20: Philips RC5x 20 bit protocol
|
||||
* RC_PROTO_RC5_SZ: StreamZap variant of RC5
|
||||
* RC_PROTO_JVC: JVC protocol
|
||||
* RC_PROTO_SONY12: Sony 12 bit protocol
|
||||
* RC_PROTO_SONY15: Sony 15 bit protocol
|
||||
* RC_PROTO_SONY20: Sony 20 bit protocol
|
||||
* RC_PROTO_NEC: NEC protocol
|
||||
* RC_PROTO_NECX: Extended NEC protocol
|
||||
* RC_PROTO_NEC32: NEC 32 bit protocol
|
||||
* RC_PROTO_SANYO: Sanyo protocol
|
||||
* RC_PROTO_MCIR2_KBD: RC6-ish MCE keyboard
|
||||
* RC_PROTO_MCIR2_MSE: RC6-ish MCE mouse
|
||||
* RC_PROTO_RC6_0: Philips RC6-0-16 protocol
|
||||
* RC_PROTO_RC6_6A_20: Philips RC6-6A-20 protocol
|
||||
* RC_PROTO_RC6_6A_24: Philips RC6-6A-24 protocol
|
||||
* RC_PROTO_RC6_6A_32: Philips RC6-6A-32 protocol
|
||||
* RC_PROTO_RC6_MCE: MCE (Philips RC6-6A-32 subtype) protocol
|
||||
* RC_PROTO_SHARP: Sharp protocol
|
||||
* RC_PROTO_XMP: XMP protocol
|
||||
* RC_PROTO_CEC: CEC protocol
|
||||
* RC_PROTO_IMON: iMon Pad protocol
|
||||
* RC_PROTO_RCMM12: RC-MM protocol 12 bits
|
||||
* RC_PROTO_RCMM24: RC-MM protocol 24 bits
|
||||
* RC_PROTO_RCMM32: RC-MM protocol 32 bits
|
||||
* RC_PROTO_XBOX_DVD: Xbox DVD Movie Playback Kit protocol
|
||||
*/
|
||||
|
||||
enum rc_proto
|
||||
{
|
||||
RC_PROTO_UNKNOWN = 0,
|
||||
RC_PROTO_OTHER = 1,
|
||||
RC_PROTO_RC5 = 2,
|
||||
RC_PROTO_RC5X_20 = 3,
|
||||
RC_PROTO_RC5_SZ = 4,
|
||||
RC_PROTO_JVC = 5,
|
||||
RC_PROTO_SONY12 = 6,
|
||||
RC_PROTO_SONY15 = 7,
|
||||
RC_PROTO_SONY20 = 8,
|
||||
RC_PROTO_NEC = 9,
|
||||
RC_PROTO_NECX = 10,
|
||||
RC_PROTO_NEC32 = 11,
|
||||
RC_PROTO_SANYO = 12,
|
||||
RC_PROTO_MCIR2_KBD = 13,
|
||||
RC_PROTO_MCIR2_MSE = 14,
|
||||
RC_PROTO_RC6_0 = 15,
|
||||
RC_PROTO_RC6_6A_20 = 16,
|
||||
RC_PROTO_RC6_6A_24 = 17,
|
||||
RC_PROTO_RC6_6A_32 = 18,
|
||||
RC_PROTO_RC6_MCE = 19,
|
||||
RC_PROTO_SHARP = 20,
|
||||
RC_PROTO_XMP = 21,
|
||||
RC_PROTO_CEC = 22,
|
||||
RC_PROTO_IMON = 23,
|
||||
RC_PROTO_RCMM12 = 24,
|
||||
RC_PROTO_RCMM24 = 25,
|
||||
RC_PROTO_RCMM32 = 26,
|
||||
RC_PROTO_XBOX_DVD = 27,
|
||||
};
|
||||
|
||||
#endif
|
271
include/nuttx/rc/lirc_dev.h
Normal file
271
include/nuttx/rc/lirc_dev.h
Normal file
@ -0,0 +1,271 @@
|
||||
/****************************************************************************
|
||||
* 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;
|
||||
|
||||
#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
|
Loading…
x
Reference in New Issue
Block a user