2009-12-11 08:34:07 -03:00
/*
* Remote Controller core header
*
2010-03-24 20:47:53 -03:00
* Copyright ( C ) 2009 - 2010 by Mauro Carvalho Chehab < mchehab @ redhat . com >
*
2009-12-11 08: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 .
*/
# ifndef _IR_CORE
# define _IR_CORE
# include <linux/spinlock.h>
2010-03-20 20:59:44 -03:00
# include <linux/kfifo.h>
# include <linux/time.h>
2010-03-21 13:00:55 -03:00
# include <linux/timer.h>
2010-04-02 20:01:00 -03:00
# include <media/rc-map.h>
2009-12-11 08:34:07 -03:00
extern int ir_core_debug ;
# define IR_dprintk(level, fmt, arg...) if (ir_core_debug >= level) \
printk ( KERN_DEBUG " %s: " fmt , __func__ , # # arg )
2010-04-06 23:21:46 -03:00
enum rc_driver_type {
RC_DRIVER_SCANCODE = 0 , /* Driver or hardware generates a scancode */
RC_DRIVER_IR_RAW , /* Needs a Infra-Red pulse/space decoder */
} ;
2010-04-04 14:06:55 -03:00
/**
* struct ir_dev_props - Allow caller drivers to set special properties
2010-04-06 23:21:46 -03:00
* @ driver_type : specifies if the driver or hardware have already a decoder ,
* or if it needs to use the IR raw event decoders to produce a scancode
2010-04-04 14:06:55 -03:00
* @ allowed_protos : bitmask with the supported IR_TYPE_ * protocols
* @ scanmask : some hardware decoders are not capable of providing the full
* 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
2010-07-31 11:59:22 -03: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 11:59:23 -03:00
* @ rx_resolution : resolution ( in ns ) of input sampler
* @ tx_resolution : resolution ( in ns ) of output sampler
2010-04-04 14:06:55 -03:00
* @ priv : driver - specific data , to be used on the callbacks
* @ 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-16 17:55:25 -03:00
* @ s_tx_mask : set transmitter mask ( for devices with multiple tx outputs )
* @ s_tx_carrier : set transmit carrier frequency
2010-07-31 11:59:23 -03:00
* @ s_tx_duty_cycle : set transmit duty cycle ( 0 % - 100 % )
* @ s_rx_carrier : inform driver about carrier it is expected to handle
2010-06-16 17:55:25 -03:00
* @ tx_ir : transmit IR
2010-07-31 11:59:22 -03:00
* @ s_idle : optional : enable / disable hardware idle mode , upon which ,
2010-07-31 11:59:23 -03:00
device doesn ' t interrupt host until it sees IR pulses
* @ s_learning_mode : enable wide band receiver used for learning
2010-04-04 14:06:55 -03:00
*/
2009-12-14 00:16:55 -03:00
struct ir_dev_props {
2010-04-06 23:21:46 -03:00
enum rc_driver_type driver_type ;
unsigned long allowed_protos ;
u32 scanmask ;
2010-07-31 11:59:22 -03:00
u32 timeout ;
u32 min_timeout ;
u32 max_timeout ;
2010-07-31 11:59:23 -03:00
u32 rx_resolution ;
u32 tx_resolution ;
2010-07-31 11:59:22 -03:00
2010-06-16 17:55:25 -03:00
void * priv ;
2010-04-06 23:21:46 -03:00
int ( * change_protocol ) ( void * priv , u64 ir_type ) ;
int ( * open ) ( void * priv ) ;
void ( * close ) ( void * priv ) ;
2010-06-16 17:55:25 -03:00
int ( * s_tx_mask ) ( void * priv , u32 mask ) ;
int ( * s_tx_carrier ) ( void * priv , u32 carrier ) ;
2010-07-31 11:59:23 -03:00
int ( * s_tx_duty_cycle ) ( void * priv , u32 duty_cycle ) ;
int ( * s_rx_carrier_range ) ( void * priv , u32 min , u32 max ) ;
2010-07-02 00:38:09 -03:00
int ( * tx_ir ) ( void * priv , int * txbuf , u32 n ) ;
2010-07-31 11:59:22 -03:00
void ( * s_idle ) ( void * priv , int enable ) ;
2010-07-31 11:59:23 -03:00
int ( * s_learning_mode ) ( void * priv , int enable ) ;
2009-12-14 00:16:55 -03:00
} ;
2009-12-11 09:44:23 -03:00
struct ir_input_dev {
2010-03-11 12:41:56 -03:00
struct device dev ; /* device */
2010-03-12 21:18:14 -03:00
char * driver_name ; /* Name of the driver module */
2009-12-13 16:00:08 -03:00
struct ir_scancode_table rc_tab ; /* scan/key table */
unsigned long devno ; /* device number */
2010-07-31 11:59:22 -03:00
struct ir_dev_props * props ; /* Device properties */
2010-03-20 20:59:44 -03:00
struct ir_raw_event_ctrl * raw ; /* for raw pulse/space events */
2010-04-02 15:58:29 -03:00
struct input_dev * input_dev ; /* the input device associated with this device */
2010-07-31 11:59:22 -03:00
bool idle ;
2010-03-21 12:15:16 -03:00
/* key info - needed by IR keycode handlers */
2010-04-02 15:58:29 -03:00
spinlock_t keylock ; /* protects the below members */
bool keypressed ; /* current state */
unsigned long keyup_jiffies ; /* when should the current keypress be released? */
struct timer_list timer_keyup ; /* timer for releasing a keypress */
u32 last_keycode ; /* keycode of last command */
u32 last_scancode ; /* scancode of last command */
u8 last_toggle ; /* toggle of last command */
2009-12-11 09:44:23 -03:00
} ;
2010-03-20 20:59:44 -03:00
2010-04-08 15:10:27 -03: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-24 20:47:53 -03:00
} ;
2009-12-14 02:16:36 -03:00
# define to_ir_input_dev(_attr) container_of(_attr, struct ir_input_dev, attr)
2009-12-11 09:44:23 -03:00
2010-04-08 15:10:27 -03:00
/* From ir-keytable.c */
2010-04-02 13:18:42 -03:00
int __ir_input_register ( struct input_dev * dev ,
2009-12-14 00:16:55 -03:00
const struct ir_scancode_table * ir_codes ,
2010-07-31 11:59:22 -03:00
struct ir_dev_props * props ,
2010-03-12 21:18:14 -03:00
const char * driver_name ) ;
2009-12-11 08:34:07 -03:00
2010-04-02 13:18:42 -03:00
static inline int ir_input_register ( struct input_dev * dev ,
const char * map_name ,
2010-07-31 11:59:22 -03:00
struct ir_dev_props * props ,
2010-04-02 13:18:42 -03:00
const char * driver_name ) {
struct ir_scancode_table * ir_codes ;
2010-04-02 20:01:00 -03:00
struct ir_input_dev * ir_dev ;
int rc ;
if ( ! map_name )
return - EINVAL ;
2010-04-02 02:33:35 -03:00
2010-04-02 13:18:42 -03:00
ir_codes = get_rc_map ( map_name ) ;
2010-07-31 11:59:21 -03:00
if ( ! ir_codes ) {
ir_codes = get_rc_map ( RC_MAP_EMPTY ) ;
if ( ! ir_codes )
return - EINVAL ;
}
2010-04-02 13:18:42 -03:00
2010-04-02 20:01:00 -03:00
rc = __ir_input_register ( dev , ir_codes , props , driver_name ) ;
if ( rc < 0 )
return - EINVAL ;
ir_dev = input_get_drvdata ( dev ) ;
if ( ! rc & & ir_dev - > props & & ir_dev - > props - > change_protocol )
rc = ir_dev - > props - > change_protocol ( ir_dev - > props - > priv ,
ir_codes - > ir_type ) ;
return rc ;
2010-04-02 13:18:42 -03:00
}
2010-04-02 20:01:00 -03:00
void ir_input_unregister ( struct input_dev * input_dev ) ;
2010-04-02 02:33:35 -03:00
2010-04-08 15:10:27 -03:00
void ir_repeat ( struct input_dev * dev ) ;
void ir_keydown ( struct input_dev * dev , int scancode , u8 toggle ) ;
2010-04-16 18:27:58 -03:00
u32 ir_g_keycode_from_table ( struct input_dev * input_dev , u32 scancode ) ;
2009-12-13 16:00:08 -03:00
2010-04-08 15:10:27 -03:00
/* From ir-raw-event.c */
2009-12-13 16:00:08 -03:00
2010-04-15 18:46:00 -03:00
struct ir_raw_event {
unsigned pulse : 1 ;
unsigned duration : 31 ;
} ;
# define IR_MAX_DURATION 0x7FFFFFFF /* a bit more than 2 seconds */
2010-04-08 13:10:00 -03:00
void ir_raw_event_handle ( struct input_dev * input_dev ) ;
2010-04-15 18:46:00 -03:00
int ir_raw_event_store ( struct input_dev * input_dev , struct ir_raw_event * ev ) ;
2010-04-08 13:10:00 -03:00
int ir_raw_event_store_edge ( struct input_dev * input_dev , enum raw_event_type type ) ;
2010-07-31 11:59:22 -03:00
int ir_raw_event_store_with_filter ( struct input_dev * input_dev ,
struct ir_raw_event * ev ) ;
void ir_raw_event_set_idle ( struct input_dev * input_dev , int idle ) ;
2010-04-15 18:46:00 -03:00
static inline void ir_raw_event_reset ( struct input_dev * input_dev )
{
struct ir_raw_event ev = { . pulse = false , . duration = 0 } ;
ir_raw_event_store ( input_dev , & ev ) ;
ir_raw_event_handle ( input_dev ) ;
}
2010-04-08 13:10:00 -03:00
2010-03-24 20:47:53 -03:00
# endif /* _IR_CORE */