2009-12-11 14:34:07 +03:00
/*
* Remote Controller core header
*
2014-02-07 14:03:07 +04:00
* Copyright ( C ) 2009 - 2010 by Mauro Carvalho Chehab
2010-03-25 02:47:53 +03:00
*
2009-12-11 14:34:07 +03:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
2010-11-17 19:53:11 +03:00
# ifndef _RC_CORE
# define _RC_CORE
2009-12-11 14:34:07 +03:00
# include <linux/spinlock.h>
2017-09-26 16:34:47 +03:00
# include <linux/cdev.h>
2010-03-21 02:59:44 +03:00
# include <linux/kfifo.h>
# include <linux/time.h>
2010-03-21 19:00:55 +03:00
# include <linux/timer.h>
2010-04-03 03:01:00 +04:00
# include <media/rc-map.h>
2009-12-11 14:34:07 +03:00
2016-07-17 15:16:57 +03:00
/**
2017-09-24 12:24:58 +03:00
* enum rc_driver_type - type of the RC driver .
2016-07-17 15:16:57 +03:00
*
2017-09-24 12:24:58 +03:00
* @ RC_DRIVER_SCANCODE : Driver or hardware generates a scancode .
2016-12-16 09:12:15 +03:00
* @ RC_DRIVER_IR_RAW : Driver or hardware generates pulse / space sequences .
* It needs a Infra - Red pulse / space decoder
* @ RC_DRIVER_IR_RAW_TX : Device transmitter only ,
* driver requires pulse / space data sequence .
2016-07-17 15:16:57 +03:00
*/
2010-04-07 06:21:46 +04:00
enum rc_driver_type {
2016-07-17 15:16:57 +03:00
RC_DRIVER_SCANCODE = 0 ,
RC_DRIVER_IR_RAW ,
2016-12-16 09:12:15 +03:00
RC_DRIVER_IR_RAW_TX ,
2010-04-07 06:21:46 +04:00
} ;
2014-01-17 17:58:49 +04:00
/**
* struct rc_scancode_filter - Filter scan codes .
* @ data : Scancode data to match .
* @ mask : Mask of bits of scancode to compare .
*/
struct rc_scancode_filter {
u32 data ;
u32 mask ;
} ;
/**
* enum rc_filter_type - Filter type constants .
* @ RC_FILTER_NORMAL : Filter for normal operation .
* @ RC_FILTER_WAKEUP : Filter for waking from suspend .
* @ RC_FILTER_MAX : Number of filter types .
*/
enum rc_filter_type {
RC_FILTER_NORMAL = 0 ,
RC_FILTER_WAKEUP ,
RC_FILTER_MAX
} ;
2017-11-03 00:21:13 +03:00
/**
* struct lirc_fh - represents an open lirc file
* @ list : list of open file handles
* @ rc : rcdev for this lirc chardev
* @ carrier_low : when setting the carrier range , first the low end must be
* set with an ioctl and then the high end with another ioctl
* @ send_timeout_reports : report timeouts in lirc raw IR .
* @ rawir : queue for incoming raw IR
* @ scancodes : queue for incoming decoded scancodes
* @ wait_poll : poll struct for lirc device
* @ send_mode : lirc mode for sending , either LIRC_MODE_SCANCODE or
* LIRC_MODE_PULSE
* @ rec_mode : lirc mode for receiving , either LIRC_MODE_SCANCODE or
* LIRC_MODE_MODE2
*/
struct lirc_fh {
struct list_head list ;
struct rc_dev * rc ;
int carrier_low ;
bool send_timeout_reports ;
DECLARE_KFIFO_PTR ( rawir , unsigned int ) ;
DECLARE_KFIFO_PTR ( scancodes , struct lirc_scancode ) ;
wait_queue_head_t wait_poll ;
u8 send_mode ;
u8 rec_mode ;
} ;
2010-04-04 21:06:55 +04:00
/**
2010-10-29 23:08:23 +04:00
* struct rc_dev - represents a remote control device
* @ dev : driver model ' s view of this device
2016-09-30 23:42:07 +03:00
* @ managed_alloc : devm_rc_allocate_device was used to create rc_dev
2014-04-05 02:06:06 +04:00
* @ sysfs_groups : sysfs attribute groups
2017-07-01 19:13:19 +03:00
* @ device_name : name of the rc child device
2010-10-29 23:08:23 +04:00
* @ input_phys : physical path to the input child device
* @ input_id : id of the input child device ( struct input_id )
* @ driver_name : name of the hardware driver which registered this device
* @ map_name : name of the default keymap
2010-11-17 20:28:27 +03:00
* @ rc_map : current scan / key table
2011-05-11 22:14:31 +04:00
* @ lock : used to ensure we ' ve filled in all protocol details before
* anyone can call show_protocols or store_protocols
2015-05-20 01:03:17 +03:00
* @ minor : unique minor remote control device number
2010-10-29 23:08:23 +04:00
* @ raw : additional data for raw pulse / space devices
* @ input_dev : the input child device used to communicate events to userspace
2011-05-11 22:14:31 +04:00
* @ driver_type : specifies if protocol decoding is done in hardware or software
2010-10-29 23:08:23 +04:00
* @ idle : used to keep track of RX state
2015-03-31 20:48:10 +03:00
* @ encode_wakeup : wakeup filtering uses IR encode API , therefore the allowed
* wakeup protocols is the set of all raw encoders
2017-08-07 23:20:58 +03:00
* @ allowed_protocols : bitmask with the supported RC_PROTO_BIT_ * protocols
* @ enabled_protocols : bitmask with the enabled RC_PROTO_BIT_ * protocols
* @ allowed_wakeup_protocols : bitmask with the supported RC_PROTO_BIT_ * wakeup
* protocols
* @ wakeup_protocol : the enabled RC_PROTO_ * wakeup protocol or
* RC_PROTO_UNKNOWN if disabled .
2014-04-04 03:32:21 +04:00
* @ scancode_filter : scancode filter
* @ scancode_wakeup_filter : scancode wakeup filters
2014-04-04 03:32:26 +04:00
* @ scancode_mask : some hardware decoders are not capable of providing the full
2010-04-04 21:06:55 +04:00
* scancode to the application . As this is a hardware limit , we can ' t do
* anything with it . Yet , as the same keycode table can be used with other
* devices , a mask is provided to allow its usage . Drivers should generally
* leave this field in blank
2014-04-04 03:32:26 +04:00
* @ users : number of current users of the device
2010-10-29 23:08:23 +04:00
* @ priv : driver - specific data
* @ keylock : protects the remaining members of the struct
* @ keypressed : whether a key is currently pressed
* @ keyup_jiffies : time ( in jiffies ) when the current keypress should be released
* @ timer_keyup : timer for releasing a keypress
2017-11-24 01:37:10 +03:00
* @ timer_repeat : timer for autorepeat events . This is needed for CEC , which
* has non - standard repeats .
2010-10-29 23:08:23 +04:00
* @ last_keycode : keycode of last keypress
2014-04-04 03:31:30 +04:00
* @ last_protocol : protocol of last keypress
2010-10-29 23:08:23 +04:00
* @ last_scancode : scancode of last keypress
* @ last_toggle : toggle value of last command
2010-07-31 18:59:22 +04:00
* @ timeout : optional time after which device stops sending data
* @ min_timeout : minimum timeout supported by device
* @ max_timeout : maximum timeout supported by device
2010-07-31 18:59:23 +04:00
* @ rx_resolution : resolution ( in ns ) of input sampler
* @ tx_resolution : resolution ( in ns ) of output sampler
2017-09-26 16:34:47 +03:00
* @ lirc_dev : lirc device
* @ lirc_cdev : lirc char cdev
2017-09-23 17:41:13 +03:00
* @ gap_start : time when gap starts
* @ gap_duration : duration of initial gap
* @ gap : true if we ' re in a gap
2017-11-03 00:21:13 +03:00
* @ lirc_fh_lock : protects lirc_fh list
* @ lirc_fh : list of open files
2017-09-26 14:31:29 +03:00
* @ registered : set to true by rc_register_device ( ) , false by
* rc_unregister_device
2010-04-04 21:06:55 +04:00
* @ change_protocol : allow changing the protocol used on hardware decoders
* @ open : callback to allow drivers to enable polling / irq when IR input device
* is opened .
* @ close : callback to allow drivers to disable polling / irq when IR input device
* is opened .
2010-06-17 00:55:25 +04:00
* @ s_tx_mask : set transmitter mask ( for devices with multiple tx outputs )
* @ s_tx_carrier : set transmit carrier frequency
2010-07-31 18:59:23 +04:00
* @ s_tx_duty_cycle : set transmit duty cycle ( 0 % - 100 % )
2015-08-22 11:25:45 +03:00
* @ s_rx_carrier_range : inform driver about carrier it is expected to handle
2010-06-17 00:55:25 +04:00
* @ tx_ir : transmit IR
2010-10-29 23:08:23 +04:00
* @ s_idle : enable / disable hardware idle mode , upon which ,
* device doesn ' t interrupt host until it sees IR pulses
2010-07-31 18:59:23 +04:00
* @ s_learning_mode : enable wide band receiver used for learning
2010-10-17 02:56:28 +04:00
* @ s_carrier_report : enable carrier reports
2014-04-04 03:31:30 +04:00
* @ s_filter : set the scancode filter
2016-12-05 22:08:35 +03:00
* @ s_wakeup_filter : set the wakeup scancode filter . If the mask is zero
* then wakeup should be disabled . wakeup_protocol will be set to
* a valid protocol if mask is nonzero .
2016-07-10 19:34:38 +03:00
* @ s_timeout : set hardware timeout in ns
2010-04-04 21:06:55 +04:00
*/
2010-10-29 23:08:23 +04:00
struct rc_dev {
struct device dev ;
2016-09-30 23:42:07 +03:00
bool managed_alloc ;
2014-04-05 02:06:06 +04:00
const struct attribute_group * sysfs_groups [ 5 ] ;
2017-07-01 19:13:19 +03:00
const char * device_name ;
2010-10-29 23:08:23 +04:00
const char * input_phys ;
struct input_id input_id ;
2017-07-01 19:13:19 +03:00
const char * driver_name ;
2010-10-29 23:08:23 +04:00
const char * map_name ;
2011-05-11 22:14:31 +04:00
struct rc_map rc_map ;
struct mutex lock ;
2015-05-20 01:03:17 +03:00
unsigned int minor ;
2010-10-29 23:08:23 +04:00
struct ir_raw_event_ctrl * raw ;
struct input_dev * input_dev ;
enum rc_driver_type driver_type ;
2010-07-31 18:59:22 +04:00
bool idle ;
2015-03-31 20:48:10 +03:00
bool encode_wakeup ;
2014-04-04 03:32:21 +04:00
u64 allowed_protocols ;
u64 enabled_protocols ;
u64 allowed_wakeup_protocols ;
2017-08-07 23:20:58 +03:00
enum rc_proto wakeup_protocol ;
2014-04-04 03:32:21 +04:00
struct rc_scancode_filter scancode_filter ;
struct rc_scancode_filter scancode_wakeup_filter ;
2014-04-04 03:32:26 +04:00
u32 scancode_mask ;
2013-07-22 11:22:57 +04:00
u32 users ;
2010-10-29 23:08:23 +04:00
void * priv ;
spinlock_t keylock ;
bool keypressed ;
unsigned long keyup_jiffies ;
struct timer_list timer_keyup ;
2017-11-24 01:37:10 +03:00
struct timer_list timer_repeat ;
2010-10-29 23:08:23 +04:00
u32 last_keycode ;
2017-08-07 23:20:58 +03:00
enum rc_proto last_protocol ;
2010-10-29 23:08:23 +04:00
u32 last_scancode ;
u8 last_toggle ;
u32 timeout ;
u32 min_timeout ;
u32 max_timeout ;
u32 rx_resolution ;
u32 tx_resolution ;
2017-09-23 17:41:13 +03:00
# ifdef CONFIG_LIRC
2017-09-26 16:34:47 +03:00
struct device lirc_dev ;
struct cdev lirc_cdev ;
2017-09-23 17:41:13 +03:00
ktime_t gap_start ;
u64 gap_duration ;
bool gap ;
2017-11-03 00:21:13 +03:00
spinlock_t lirc_fh_lock ;
struct list_head lirc_fh ;
2017-09-23 17:41:13 +03:00
# endif
2017-09-26 14:31:29 +03:00
bool registered ;
2017-08-07 23:20:58 +03:00
int ( * change_protocol ) ( struct rc_dev * dev , u64 * rc_proto ) ;
2010-10-29 23:08:23 +04:00
int ( * open ) ( struct rc_dev * dev ) ;
void ( * close ) ( struct rc_dev * dev ) ;
int ( * s_tx_mask ) ( struct rc_dev * dev , u32 mask ) ;
int ( * s_tx_carrier ) ( struct rc_dev * dev , u32 carrier ) ;
int ( * s_tx_duty_cycle ) ( struct rc_dev * dev , u32 duty_cycle ) ;
int ( * s_rx_carrier_range ) ( struct rc_dev * dev , u32 min , u32 max ) ;
2011-04-28 19:13:58 +04:00
int ( * tx_ir ) ( struct rc_dev * dev , unsigned * txbuf , unsigned n ) ;
2010-10-29 23:08:23 +04:00
void ( * s_idle ) ( struct rc_dev * dev , bool enable ) ;
int ( * s_learning_mode ) ( struct rc_dev * dev , int enable ) ;
int ( * s_carrier_report ) ( struct rc_dev * dev , int enable ) ;
2014-01-17 17:58:49 +04:00
int ( * s_filter ) ( struct rc_dev * dev ,
struct rc_scancode_filter * filter ) ;
2014-04-05 02:06:01 +04:00
int ( * s_wakeup_filter ) ( struct rc_dev * dev ,
struct rc_scancode_filter * filter ) ;
2016-07-10 19:34:38 +03:00
int ( * s_timeout ) ( struct rc_dev * dev ,
unsigned int timeout ) ;
2009-12-11 15:44:23 +03:00
} ;
2010-03-21 02:59:44 +03:00
2010-11-17 19:53:11 +03:00
# define to_rc_dev(d) container_of(d, struct rc_dev, dev)
/*
* From rc - main . c
* Those functions can be used on any type of Remote Controller . They
* basically creates an input_dev and properly reports the device as a
* Remote Controller , at sys / class / rc .
*/
2016-07-17 15:16:57 +03:00
/**
* rc_allocate_device - Allocates a RC device
*
2016-12-16 11:50:58 +03:00
* @ rc_driver_type : specifies the type of the RC output to be allocated
2016-07-17 15:16:57 +03:00
* returns a pointer to struct rc_dev .
*/
2016-12-16 11:50:58 +03:00
struct rc_dev * rc_allocate_device ( enum rc_driver_type ) ;
2016-07-17 15:16:57 +03:00
2016-09-30 23:42:07 +03:00
/**
* devm_rc_allocate_device - Managed RC device allocation
*
* @ dev : pointer to struct device
2016-12-16 11:50:58 +03:00
* @ rc_driver_type : specifies the type of the RC output to be allocated
2016-09-30 23:42:07 +03:00
* returns a pointer to struct rc_dev .
*/
2016-12-16 11:50:58 +03:00
struct rc_dev * devm_rc_allocate_device ( struct device * dev , enum rc_driver_type ) ;
2016-09-30 23:42:07 +03:00
2016-07-17 15:16:57 +03:00
/**
* rc_free_device - Frees a RC device
*
* @ dev : pointer to struct rc_dev .
*/
2010-11-17 19:53:11 +03:00
void rc_free_device ( struct rc_dev * dev ) ;
2016-07-17 15:16:57 +03:00
/**
* rc_register_device - Registers a RC device
*
* @ dev : pointer to struct rc_dev .
*/
2010-11-17 19:53:11 +03:00
int rc_register_device ( struct rc_dev * dev ) ;
2016-07-17 15:16:57 +03:00
2016-09-30 23:42:07 +03:00
/**
* devm_rc_register_device - Manageded registering of a RC device
*
* @ parent : pointer to struct device .
* @ dev : pointer to struct rc_dev .
*/
int devm_rc_register_device ( struct device * parent , struct rc_dev * dev ) ;
2016-07-17 15:16:57 +03:00
/**
* rc_unregister_device - Unregisters a RC device
*
* @ dev : pointer to struct rc_dev .
*/
2010-11-17 19:53:11 +03:00
void rc_unregister_device ( struct rc_dev * dev ) ;
void rc_repeat ( struct rc_dev * dev ) ;
2017-08-07 23:20:58 +03:00
void rc_keydown ( struct rc_dev * dev , enum rc_proto protocol , u32 scancode ,
u8 toggle ) ;
void rc_keydown_notimeout ( struct rc_dev * dev , enum rc_proto protocol ,
u32 scancode , u8 toggle ) ;
2010-11-17 19:53:11 +03:00
void rc_keyup ( struct rc_dev * dev ) ;
u32 rc_g_keycode_from_table ( struct rc_dev * dev , u32 scancode ) ;
/*
* From rc - raw . c
* The Raw interface is specific to InfraRed . It may be a good idea to
* split it later into a separate header .
*/
2010-04-16 01:46:00 +04:00
struct ir_raw_event {
2010-10-17 02:56:28 +04:00
union {
u32 duration ;
2016-03-17 22:39:13 +03:00
u32 carrier ;
2010-10-17 02:56:28 +04:00
} ;
2016-03-17 22:39:13 +03:00
u8 duty_cycle ;
2010-10-17 02:56:28 +04:00
unsigned pulse : 1 ;
unsigned reset : 1 ;
unsigned timeout : 1 ;
unsigned carrier_report : 1 ;
2010-04-16 01:46:00 +04:00
} ;
2016-03-17 22:39:13 +03:00
# define DEFINE_IR_RAW_EVENT(event) struct ir_raw_event event = {}
2010-10-17 02:56:28 +04:00
static inline void init_ir_raw_event ( struct ir_raw_event * ev )
{
memset ( ev , 0 , sizeof ( * ev ) ) ;
}
2015-10-03 18:18:50 +03:00
# define IR_DEFAULT_TIMEOUT MS_TO_NS(125)
2015-06-05 16:30:44 +03:00
# define IR_MAX_DURATION 500000000 /* 500 ms */
2011-01-06 22:59:36 +03:00
# define US_TO_NS(usec) ((usec) * 1000)
# define MS_TO_US(msec) ((msec) * 1000)
# define MS_TO_NS(msec) ((msec) * 1000 * 1000)
2010-04-16 01:46:00 +04:00
2010-10-29 23:08:23 +04:00
void ir_raw_event_handle ( struct rc_dev * dev ) ;
int ir_raw_event_store ( struct rc_dev * dev , struct ir_raw_event * ev ) ;
2017-08-07 15:38:10 +03:00
int ir_raw_event_store_edge ( struct rc_dev * dev , bool pulse ) ;
2010-10-29 23:08:23 +04:00
int ir_raw_event_store_with_filter ( struct rc_dev * dev ,
2018-03-08 17:42:44 +03:00
struct ir_raw_event * ev ) ;
int ir_raw_event_store_with_timeout ( struct rc_dev * dev ,
struct ir_raw_event * ev ) ;
2010-10-29 23:08:23 +04:00
void ir_raw_event_set_idle ( struct rc_dev * dev , bool idle ) ;
2017-08-07 23:20:58 +03:00
int ir_raw_encode_scancode ( enum rc_proto protocol , u32 scancode ,
2015-03-31 20:48:06 +03:00
struct ir_raw_event * events , unsigned int max ) ;
2017-02-25 14:51:30 +03:00
int ir_raw_encode_carrier ( enum rc_proto protocol ) ;
2010-07-31 18:59:22 +04:00
2010-10-29 23:08:23 +04:00
static inline void ir_raw_event_reset ( struct rc_dev * dev )
2010-04-16 01:46:00 +04:00
{
2016-03-17 22:39:13 +03:00
struct ir_raw_event ev = { . reset = true } ;
2010-10-17 02:56:28 +04:00
2010-10-29 23:08:23 +04:00
ir_raw_event_store ( dev , & ev ) ;
2018-05-10 23:41:15 +03:00
dev - > idle = true ;
2010-10-29 23:08:23 +04:00
ir_raw_event_handle ( dev ) ;
2010-04-16 01:46:00 +04:00
}
2010-04-08 20:10:00 +04:00
2010-10-29 23:08:12 +04:00
/* extract mask bits out of data and pack them into the result */
static inline u32 ir_extract_bits ( u32 data , u32 mask )
{
u32 vbit = 1 , value = 0 ;
do {
2010-11-20 02:43:27 +03:00
if ( mask & 1 ) {
if ( data & 1 )
value | = vbit ;
vbit < < = 1 ;
}
data > > = 1 ;
2010-10-29 23:08:12 +04:00
} while ( mask > > = 1 ) ;
return value ;
}
2017-07-30 16:23:11 +03:00
/* Get NEC scancode and protocol type from address and command bytes */
static inline u32 ir_nec_bytes_to_scancode ( u8 address , u8 not_address ,
u8 command , u8 not_command ,
2017-08-07 23:20:58 +03:00
enum rc_proto * protocol )
2017-07-30 16:23:11 +03:00
{
u32 scancode ;
if ( ( command ^ not_command ) ! = 0xff ) {
/* NEC transport, but modified protocol, used by at
* least Apple and TiVo remotes
*/
scancode = not_address < < 24 |
address < < 16 |
not_command < < 8 |
command ;
2017-08-07 23:20:58 +03:00
* protocol = RC_PROTO_NEC32 ;
2017-07-30 16:23:11 +03:00
} else if ( ( address ^ not_address ) ! = 0xff ) {
/* Extended NEC */
scancode = address < < 16 |
not_address < < 8 |
command ;
2017-08-07 23:20:58 +03:00
* protocol = RC_PROTO_NECX ;
2017-07-30 16:23:11 +03:00
} else {
/* Normal NEC */
scancode = address < < 8 | command ;
2017-08-07 23:20:58 +03:00
* protocol = RC_PROTO_NEC ;
2017-07-30 16:23:11 +03:00
}
return scancode ;
}
2010-11-17 19:53:11 +03:00
# endif /* _RC_CORE */