xref: /rk3399_rockchip-uboot/include/rockchip_ir.h (revision bdbf80c83291311d12133a899e14351bd675a49c)
1*bdbf80c8SZhangbin Tong /*
2*bdbf80c8SZhangbin Tong  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3*bdbf80c8SZhangbin Tong  *
4*bdbf80c8SZhangbin Tong  * SPDX-License-Identifier:     GPL-2.0+
5*bdbf80c8SZhangbin Tong  */
6*bdbf80c8SZhangbin Tong #ifndef __ROCKCHIP_IR_H__
7*bdbf80c8SZhangbin Tong #define __ROCKCHIP_IR_H__
8*bdbf80c8SZhangbin Tong 
9*bdbf80c8SZhangbin Tong #include <linux/bitops.h>
10*bdbf80c8SZhangbin Tong 
11*bdbf80c8SZhangbin Tong /* Registers */
12*bdbf80c8SZhangbin Tong /* High polarity cycles */
13*bdbf80c8SZhangbin Tong #define PWM_HPR_REG	0x04
14*bdbf80c8SZhangbin Tong 
15*bdbf80c8SZhangbin Tong /* Low polarity cycles */
16*bdbf80c8SZhangbin Tong #define PWM_LPR_REG	0x08
17*bdbf80c8SZhangbin Tong 
18*bdbf80c8SZhangbin Tong /* PWM Control */
19*bdbf80c8SZhangbin Tong #define PWM_CTL_REG	0x0c
20*bdbf80c8SZhangbin Tong /* Enable */
21*bdbf80c8SZhangbin Tong #define REG_CTL_EN	BIT(0)
22*bdbf80c8SZhangbin Tong /* capture mode */
23*bdbf80c8SZhangbin Tong #define REG_CTL_MD	BIT(2)
24*bdbf80c8SZhangbin Tong 
25*bdbf80c8SZhangbin Tong /* Interrupt Status */
26*bdbf80c8SZhangbin Tong #define PWM_STA_REG(id)	((4 - (id)) * 0x10)
27*bdbf80c8SZhangbin Tong #define PWM_CH_POL(id)	BIT(id + 8)
28*bdbf80c8SZhangbin Tong 
29*bdbf80c8SZhangbin Tong /* Interrupt Enable */
30*bdbf80c8SZhangbin Tong #define PWM_INT_REG(id)	((4 - (id)) * 0x14)
31*bdbf80c8SZhangbin Tong #define PWM_CH_INT(id)	BIT(id)
32*bdbf80c8SZhangbin Tong 
33*bdbf80c8SZhangbin Tong /* NEC IR Pulse/Space protocol */
34*bdbf80c8SZhangbin Tong #define NEC_NBITS		32
35*bdbf80c8SZhangbin Tong #define NEC_UNIT		562500	/* ns */
36*bdbf80c8SZhangbin Tong #define NEC_HEADER_PULSE	(16 * NEC_UNIT)
37*bdbf80c8SZhangbin Tong #define NEC_HEADER_SPACE	(8  * NEC_UNIT)
38*bdbf80c8SZhangbin Tong #define NEC_BIT_PULSE		(1  * NEC_UNIT)
39*bdbf80c8SZhangbin Tong #define NEC_BIT_0_SPACE		(1  * NEC_UNIT)
40*bdbf80c8SZhangbin Tong #define NEC_BIT_1_SPACE		(3  * NEC_UNIT)
41*bdbf80c8SZhangbin Tong 
42*bdbf80c8SZhangbin Tong #define TO_US(duration)		((duration) / 1000)
43*bdbf80c8SZhangbin Tong #define TO_STR(is_pulse)	((is_pulse) ? "pulse" : "space")
44*bdbf80c8SZhangbin Tong 
45*bdbf80c8SZhangbin Tong #define MAX_NUM_KEYS	60
46*bdbf80c8SZhangbin Tong 
47*bdbf80c8SZhangbin Tong enum nec_state {
48*bdbf80c8SZhangbin Tong 	STATE_INACTIVE,
49*bdbf80c8SZhangbin Tong 	STATE_HEADER_SPACE,
50*bdbf80c8SZhangbin Tong 	STATE_BIT_PULSE,
51*bdbf80c8SZhangbin Tong 	STATE_BIT_SPACE,
52*bdbf80c8SZhangbin Tong };
53*bdbf80c8SZhangbin Tong 
54*bdbf80c8SZhangbin Tong struct rockchip_ir_priv {
55*bdbf80c8SZhangbin Tong 	fdt_addr_t base;
56*bdbf80c8SZhangbin Tong 	ulong freq;
57*bdbf80c8SZhangbin Tong 	ulong period;
58*bdbf80c8SZhangbin Tong 	int id;
59*bdbf80c8SZhangbin Tong 	int num;
60*bdbf80c8SZhangbin Tong 	int keycode;
61*bdbf80c8SZhangbin Tong 	int repeat;
62*bdbf80c8SZhangbin Tong };
63*bdbf80c8SZhangbin Tong 
64*bdbf80c8SZhangbin Tong struct ir_raw_event {
65*bdbf80c8SZhangbin Tong 	u32 duration;
66*bdbf80c8SZhangbin Tong 	unsigned pulse:1;
67*bdbf80c8SZhangbin Tong };
68*bdbf80c8SZhangbin Tong 
69*bdbf80c8SZhangbin Tong struct nec_dec {
70*bdbf80c8SZhangbin Tong 	int state;
71*bdbf80c8SZhangbin Tong 	unsigned count;
72*bdbf80c8SZhangbin Tong 	u32 bits;
73*bdbf80c8SZhangbin Tong };
74*bdbf80c8SZhangbin Tong 
75*bdbf80c8SZhangbin Tong struct rc_map_table {
76*bdbf80c8SZhangbin Tong 	u32 scancode;
77*bdbf80c8SZhangbin Tong 	u32 keycode;
78*bdbf80c8SZhangbin Tong };
79*bdbf80c8SZhangbin Tong 
80*bdbf80c8SZhangbin Tong struct rc_map {
81*bdbf80c8SZhangbin Tong 	u32 usercode;
82*bdbf80c8SZhangbin Tong 	u32 nbuttons;
83*bdbf80c8SZhangbin Tong 	struct rc_map_table scan[MAX_NUM_KEYS];
84*bdbf80c8SZhangbin Tong };
85*bdbf80c8SZhangbin Tong 
86*bdbf80c8SZhangbin Tong /* macros for IR decoders */
eq_margin(unsigned d1,unsigned d2,unsigned margin)87*bdbf80c8SZhangbin Tong static inline bool eq_margin(unsigned d1, unsigned d2, unsigned margin)
88*bdbf80c8SZhangbin Tong {
89*bdbf80c8SZhangbin Tong 	return ((d1 > (d2 - margin)) && (d1 < (d2 + margin)));
90*bdbf80c8SZhangbin Tong }
91*bdbf80c8SZhangbin Tong 
92*bdbf80c8SZhangbin Tong #endif /* __ROCKCHIP_IR_H__ */
93