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>
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
2010-11-17 19:28:38 +03:00
extern int rc_core_debug ;
2011-08-22 02:56:45 +04:00
# define IR_dprintk(level, fmt, ...) \
do { \
if ( rc_core_debug > = level ) \
2014-07-26 06:25:36 +04:00
printk ( KERN_DEBUG pr_fmt ( fmt ) , # # __VA_ARGS__ ) ; \
2011-08-22 02:56:45 +04:00
} while ( 0 )
2009-12-11 14:34:07 +03:00
2016-07-17 15:16:57 +03:00
/**
* enum rc_driver_type - type of the RC output
*
* @ RC_DRIVER_SCANCODE : Driver or hardware generates a scancode
* @ RC_DRIVER_IR_RAW : Driver or hardware generates pulse / space sequences .
* It needs a Infra - Red pulse / space decoder
*/
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 ,
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
} ;
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-03-02 14:00:15 +03:00
* @ initialized : 1 if the device init has completed , 0 otherwise
2014-04-05 02:06:06 +04:00
* @ sysfs_groups : sysfs attribute groups
2010-10-29 23:08:23 +04:00
* @ input_name : name of the input child device
* @ 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
2014-04-04 03:32:21 +04:00
* @ allowed_protocols : bitmask with the supported RC_BIT_ * protocols
* @ enabled_protocols : bitmask with the enabled RC_BIT_ * protocols
* @ allowed_wakeup_protocols : bitmask with the supported RC_BIT_ * wakeup protocols
* @ enabled_wakeup_protocols : bitmask with the enabled RC_BIT_ * wakeup protocols
* @ 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
* @ 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
2010-04-04 21:06:55 +04:00
* @ change_protocol : allow changing the protocol used on hardware decoders
2014-03-01 03:17:05 +04:00
* @ change_wakeup_protocol : allow changing the protocol used for wakeup
* filtering
2010-04-04 21:06:55 +04:00
* @ 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
2014-04-05 02:06:01 +04:00
* @ s_wakeup_filter : set the wakeup scancode filter
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-03-02 14:00:15 +03:00
atomic_t initialized ;
2014-04-05 02:06:06 +04:00
const struct attribute_group * sysfs_groups [ 5 ] ;
2010-10-29 23:08:23 +04:00
const char * input_name ;
const char * input_phys ;
struct input_id input_id ;
char * driver_name ;
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 ;
2014-04-04 03:32:21 +04:00
u64 allowed_protocols ;
u64 enabled_protocols ;
u64 allowed_wakeup_protocols ;
u64 enabled_wakeup_protocols ;
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 ;
u32 last_keycode ;
2014-04-04 03:31:30 +04:00
enum rc_type 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 ;
2012-10-12 02:11:54 +04:00
int ( * change_protocol ) ( struct rc_dev * dev , u64 * rc_type ) ;
2014-03-01 03:17:05 +04:00
int ( * change_wakeup_protocol ) ( struct rc_dev * dev , u64 * rc_type ) ;
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
*
* returns a pointer to struct rc_dev .
*/
2010-11-17 19:53:11 +03:00
struct rc_dev * rc_allocate_device ( void ) ;
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
/**
* 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 ) ;
2016-07-17 15:16:57 +03:00
/**
* rc_open - Opens a RC device
*
* @ rdev : pointer to struct rc_dev .
*/
2013-07-22 11:22:57 +04:00
int rc_open ( struct rc_dev * rdev ) ;
2016-07-17 15:16:57 +03:00
/**
* rc_open - Closes a RC device
*
* @ rdev : pointer to struct rc_dev .
*/
2013-07-22 11:22:57 +04:00
void rc_close ( struct rc_dev * rdev ) ;
2010-11-17 19:53:11 +03:00
void rc_repeat ( struct rc_dev * dev ) ;
2014-04-04 03:31:30 +04:00
void rc_keydown ( struct rc_dev * dev , enum rc_type protocol , u32 scancode , u8 toggle ) ;
void rc_keydown_notimeout ( struct rc_dev * dev , enum rc_type 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-08 22:10:27 +04:00
enum raw_event_type {
IR_SPACE = ( 1 < < 0 ) ,
IR_PULSE = ( 1 < < 1 ) ,
IR_START_EVENT = ( 1 < < 2 ) ,
IR_STOP_EVENT = ( 1 < < 3 ) ,
2010-03-25 02:47:53 +03:00
} ;
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 ) ;
int ir_raw_event_store_edge ( struct rc_dev * dev , enum raw_event_type type ) ;
int ir_raw_event_store_with_filter ( struct rc_dev * dev ,
2010-07-31 18:59:22 +04:00
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 ) ;
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 ) ;
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 ;
}
2010-11-17 19:53:11 +03:00
# endif /* _RC_CORE */