352 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Remote Controller core raw events header4 *5 * Copyright (C) 2010 by Mauro Carvalho Chehab6 */7 8#ifndef _RC_CORE_PRIV9#define _RC_CORE_PRIV10 11#define RC_DEV_MAX 25612/* Define the max number of pulse/space transitions to buffer */13#define MAX_IR_EVENT_SIZE 51214 15#include <linux/slab.h>16#include <uapi/linux/bpf.h>17#include <media/rc-core.h>18 19/**20 * rc_open - Opens a RC device21 *22 * @rdev: pointer to struct rc_dev.23 */24int rc_open(struct rc_dev *rdev);25 26/**27 * rc_close - Closes a RC device28 *29 * @rdev: pointer to struct rc_dev.30 */31void rc_close(struct rc_dev *rdev);32 33struct ir_raw_handler {34 struct list_head list;35 36 u64 protocols; /* which are handled by this handler */37 int (*decode)(struct rc_dev *dev, struct ir_raw_event event);38 int (*encode)(enum rc_proto protocol, u32 scancode,39 struct ir_raw_event *events, unsigned int max);40 u32 carrier;41 u32 min_timeout;42 43 /* These two should only be used by the mce kbd decoder */44 int (*raw_register)(struct rc_dev *dev);45 int (*raw_unregister)(struct rc_dev *dev);46};47 48struct ir_raw_event_ctrl {49 struct list_head list; /* to keep track of raw clients */50 struct task_struct *thread;51 /* fifo for the pulse/space durations */52 DECLARE_KFIFO(kfifo, struct ir_raw_event, MAX_IR_EVENT_SIZE);53 ktime_t last_event; /* when last event occurred */54 struct rc_dev *dev; /* pointer to the parent rc_dev */55 /* handle delayed ir_raw_event_store_edge processing */56 spinlock_t edge_spinlock;57 struct timer_list edge_handle;58 59 /* raw decoder state follows */60 struct ir_raw_event prev_ev;61 struct ir_raw_event this_ev;62 63#ifdef CONFIG_BPF_LIRC_MODE264 u32 bpf_sample;65 struct bpf_prog_array __rcu *progs;66#endif67#if IS_ENABLED(CONFIG_IR_NEC_DECODER)68 struct nec_dec {69 int state;70 unsigned count;71 u32 bits;72 bool is_nec_x;73 bool necx_repeat;74 } nec;75#endif76#if IS_ENABLED(CONFIG_IR_RC5_DECODER)77 struct rc5_dec {78 int state;79 u32 bits;80 unsigned count;81 bool is_rc5x;82 } rc5;83#endif84#if IS_ENABLED(CONFIG_IR_RC6_DECODER)85 struct rc6_dec {86 int state;87 u8 header;88 u32 body;89 bool toggle;90 unsigned count;91 unsigned wanted_bits;92 } rc6;93#endif94#if IS_ENABLED(CONFIG_IR_SONY_DECODER)95 struct sony_dec {96 int state;97 u32 bits;98 unsigned count;99 } sony;100#endif101#if IS_ENABLED(CONFIG_IR_JVC_DECODER)102 struct jvc_dec {103 int state;104 u16 bits;105 u16 old_bits;106 unsigned count;107 bool first;108 bool toggle;109 } jvc;110#endif111#if IS_ENABLED(CONFIG_IR_SANYO_DECODER)112 struct sanyo_dec {113 int state;114 unsigned count;115 u64 bits;116 } sanyo;117#endif118#if IS_ENABLED(CONFIG_IR_SHARP_DECODER)119 struct sharp_dec {120 int state;121 unsigned count;122 u32 bits;123 unsigned int pulse_len;124 } sharp;125#endif126#if IS_ENABLED(CONFIG_IR_MCE_KBD_DECODER)127 struct mce_kbd_dec {128 /* locks key up timer */129 spinlock_t keylock;130 struct timer_list rx_timeout;131 int state;132 u8 header;133 u32 body;134 unsigned count;135 unsigned wanted_bits;136 } mce_kbd;137#endif138#if IS_ENABLED(CONFIG_IR_XMP_DECODER)139 struct xmp_dec {140 int state;141 unsigned count;142 u32 durations[16];143 } xmp;144#endif145#if IS_ENABLED(CONFIG_IR_IMON_DECODER)146 struct imon_dec {147 int state;148 int count;149 int last_chk;150 unsigned int bits;151 bool stick_keyboard;152 } imon;153#endif154#if IS_ENABLED(CONFIG_IR_RCMM_DECODER)155 struct rcmm_dec {156 int state;157 unsigned int count;158 u32 bits;159 } rcmm;160#endif161};162 163/* Mutex for locking raw IR processing and handler change */164extern struct mutex ir_raw_handler_lock;165 166/* macros for IR decoders */167static inline bool geq_margin(unsigned d1, unsigned d2, unsigned margin)168{169 return d1 > (d2 - margin);170}171 172static inline bool eq_margin(unsigned d1, unsigned d2, unsigned margin)173{174 return ((d1 > (d2 - margin)) && (d1 < (d2 + margin)));175}176 177static inline bool is_transition(struct ir_raw_event *x, struct ir_raw_event *y)178{179 return x->pulse != y->pulse;180}181 182static inline void decrease_duration(struct ir_raw_event *ev, unsigned duration)183{184 if (duration > ev->duration)185 ev->duration = 0;186 else187 ev->duration -= duration;188}189 190/* Returns true if event is normal pulse/space event */191static inline bool is_timing_event(struct ir_raw_event ev)192{193 return !ev.carrier_report && !ev.overflow;194}195 196#define TO_STR(is_pulse) ((is_pulse) ? "pulse" : "space")197 198/* functions for IR encoders */199bool rc_validate_scancode(enum rc_proto proto, u32 scancode);200 201static inline void init_ir_raw_event_duration(struct ir_raw_event *ev,202 unsigned int pulse,203 u32 duration)204{205 *ev = (struct ir_raw_event) {206 .duration = duration,207 .pulse = pulse208 };209}210 211/**212 * struct ir_raw_timings_manchester - Manchester coding timings213 * @leader_pulse: duration of leader pulse (if any) 0 if continuing214 * existing signal215 * @leader_space: duration of leader space (if any)216 * @clock: duration of each pulse/space in ns217 * @invert: if set clock logic is inverted218 * (0 = space + pulse, 1 = pulse + space)219 * @trailer_space: duration of trailer space in ns220 */221struct ir_raw_timings_manchester {222 unsigned int leader_pulse;223 unsigned int leader_space;224 unsigned int clock;225 unsigned int invert:1;226 unsigned int trailer_space;227};228 229int ir_raw_gen_manchester(struct ir_raw_event **ev, unsigned int max,230 const struct ir_raw_timings_manchester *timings,231 unsigned int n, u64 data);232 233/**234 * ir_raw_gen_pulse_space() - generate pulse and space raw events.235 * @ev: Pointer to pointer to next free raw event.236 * Will be incremented for each raw event written.237 * @max: Pointer to number of raw events available in buffer.238 * Will be decremented for each raw event written.239 * @pulse_width: Width of pulse in ns.240 * @space_width: Width of space in ns.241 *242 * Returns: 0 on success.243 * -ENOBUFS if there isn't enough buffer space to write both raw244 * events. In this case @max events will have been written.245 */246static inline int ir_raw_gen_pulse_space(struct ir_raw_event **ev,247 unsigned int *max,248 unsigned int pulse_width,249 unsigned int space_width)250{251 if (!*max)252 return -ENOBUFS;253 init_ir_raw_event_duration((*ev)++, 1, pulse_width);254 if (!--*max)255 return -ENOBUFS;256 init_ir_raw_event_duration((*ev)++, 0, space_width);257 --*max;258 return 0;259}260 261/**262 * struct ir_raw_timings_pd - pulse-distance modulation timings263 * @header_pulse: duration of header pulse in ns (0 for none)264 * @header_space: duration of header space in ns265 * @bit_pulse: duration of bit pulse in ns266 * @bit_space: duration of bit space (for logic 0 and 1) in ns267 * @trailer_pulse: duration of trailer pulse in ns268 * @trailer_space: duration of trailer space in ns269 * @msb_first: 1 if most significant bit is sent first270 */271struct ir_raw_timings_pd {272 unsigned int header_pulse;273 unsigned int header_space;274 unsigned int bit_pulse;275 unsigned int bit_space[2];276 unsigned int trailer_pulse;277 unsigned int trailer_space;278 unsigned int msb_first:1;279};280 281int ir_raw_gen_pd(struct ir_raw_event **ev, unsigned int max,282 const struct ir_raw_timings_pd *timings,283 unsigned int n, u64 data);284 285/**286 * struct ir_raw_timings_pl - pulse-length modulation timings287 * @header_pulse: duration of header pulse in ns (0 for none)288 * @bit_space: duration of bit space in ns289 * @bit_pulse: duration of bit pulse (for logic 0 and 1) in ns290 * @trailer_space: duration of trailer space in ns291 * @msb_first: 1 if most significant bit is sent first292 */293struct ir_raw_timings_pl {294 unsigned int header_pulse;295 unsigned int bit_space;296 unsigned int bit_pulse[2];297 unsigned int trailer_space;298 unsigned int msb_first:1;299};300 301int ir_raw_gen_pl(struct ir_raw_event **ev, unsigned int max,302 const struct ir_raw_timings_pl *timings,303 unsigned int n, u64 data);304 305/*306 * Routines from rc-raw.c to be used internally and by decoders307 */308u64 ir_raw_get_allowed_protocols(void);309int ir_raw_event_prepare(struct rc_dev *dev);310int ir_raw_event_register(struct rc_dev *dev);311void ir_raw_event_free(struct rc_dev *dev);312void ir_raw_event_unregister(struct rc_dev *dev);313int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler);314void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler);315void ir_raw_load_modules(u64 *protocols);316void ir_raw_init(void);317 318/*319 * lirc interface320 */321#ifdef CONFIG_LIRC322int lirc_dev_init(void);323void lirc_dev_exit(void);324void lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev);325void lirc_scancode_event(struct rc_dev *dev, struct lirc_scancode *lsc);326int lirc_register(struct rc_dev *dev);327void lirc_unregister(struct rc_dev *dev);328struct rc_dev *rc_dev_get_from_fd(int fd, bool write);329#else330static inline int lirc_dev_init(void) { return 0; }331static inline void lirc_dev_exit(void) {}332static inline void lirc_raw_event(struct rc_dev *dev,333 struct ir_raw_event ev) { }334static inline void lirc_scancode_event(struct rc_dev *dev,335 struct lirc_scancode *lsc) { }336static inline int lirc_register(struct rc_dev *dev) { return 0; }337static inline void lirc_unregister(struct rc_dev *dev) { }338#endif339 340/*341 * bpf interface342 */343#ifdef CONFIG_BPF_LIRC_MODE2344void lirc_bpf_free(struct rc_dev *dev);345void lirc_bpf_run(struct rc_dev *dev, u32 sample);346#else347static inline void lirc_bpf_free(struct rc_dev *dev) { }348static inline void lirc_bpf_run(struct rc_dev *dev, u32 sample) { }349#endif350 351#endif /* _RC_CORE_PRIV */352