brintos

brintos / linux-shallow public Read only

0
0
Text · 9.0 KiB · 7df949f Raw
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