1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * userspace interface for pi433 radio module
4  *
5  * Pi433 is a 433MHz radio module for the Raspberry Pi.
6  * It is based on the HopeRf Module RFM69CW. Therefore, inside of this
7  * driver you'll find an abstraction of the rf69 chip.
8  *
9  * If needed this driver could also be extended to support other
10  * devices based on HopeRf rf69 as well as HopeRf modules with a similar
11  * interface such as RFM69HCW, RFM12, RFM95 and so on.
12  *
13  * Copyright (C) 2016 Wolf-Entwicklungen
14  *	Marcus Wolf <linux@wolf-entwicklungen.de>
15  */
16 
17 #ifndef PI433_H
18 #define PI433_H
19 
20 #include <linux/types.h>
21 #include "rf69_enum.h"
22 
23 /*---------------------------------------------------------------------------*/
24 
25 enum option_on_off {
26 	OPTION_OFF,
27 	OPTION_ON
28 };
29 
30 /* IOCTL structs and commands */
31 
32 /**
33  * struct pi433_tx_cfg
34  * describes the configuration of the radio module for sending data
35  * @frequency:
36  * @bit_rate:
37  * @modulation:
38  * @data_mode:
39  * @preamble_length:
40  * @sync_pattern:
41  * @tx_start_condition:
42  * @payload_length:
43  * @repetitions:
44  *
45  * ATTENTION:
46  * If the contents of 'pi433_tx_cfg' ever change
47  * incompatibly, then the ioctl number (see define below) must change.
48  *
49  * NOTE: struct layout is the same in 64bit and 32bit userspace.
50  */
51 #define PI433_TX_CFG_IOCTL_NR	0
52 struct pi433_tx_cfg {
53 	__u32			frequency;
54 	__u16			bit_rate;
55 	__u32			dev_frequency;
56 	enum modulation		modulation;
57 	enum mod_shaping	mod_shaping;
58 
59 	enum pa_ramp		pa_ramp;
60 
61 	enum tx_start_condition	tx_start_condition;
62 
63 	__u16			repetitions;
64 
65 	/* packet format */
66 	enum option_on_off	enable_preamble;
67 	enum option_on_off	enable_sync;
68 	enum option_on_off	enable_length_byte;
69 	enum option_on_off	enable_address_byte;
70 	enum option_on_off	enable_crc;
71 
72 	__u16			preamble_length;
73 	__u8			sync_length;
74 	__u8			fixed_message_length;
75 
76 	__u8			sync_pattern[8];
77 	__u8			address_byte;
78 };
79 
80 /**
81  * struct pi433_rx_cfg
82  * describes the configuration of the radio module for receiving data
83  * @frequency:
84  * @bit_rate:
85  * @modulation:
86  * @data_mode:
87  * @preamble_length:
88  * @sync_pattern:
89  * @tx_start_condition:
90  * @payload_length:
91  * @repetitions:
92  *
93  * ATTENTION:
94  * If the contents of 'pi433_rx_cfg' ever change
95  * incompatibly, then the ioctl number (see define below) must change
96  *
97  * NOTE: struct layout is the same in 64bit and 32bit userspace.
98  */
99 #define PI433_RX_CFG_IOCTL_NR	1
100 struct pi433_rx_cfg {
101 	__u32			frequency;
102 	__u16			bit_rate;
103 	__u32			dev_frequency;
104 
105 	enum modulation		modulation;
106 
107 	__u8			rssi_threshold;
108 	enum threshold_decrement threshold_decrement;
109 	enum antenna_impedance	antenna_impedance;
110 	enum lna_gain		lna_gain;
111 	enum mantisse		bw_mantisse;	/* normal: 0x50 */
112 	__u8			bw_exponent;	/* during AFC: 0x8b */
113 	enum dagc		dagc;
114 
115 	/* packet format */
116 	enum option_on_off	enable_sync;
117 
118 	/* should be used in combination with sync, only */
119 	enum option_on_off	enable_length_byte;
120 
121 	/* operational with sync, only */
122 	enum address_filtering	enable_address_filtering;
123 
124 	/* only operational, if sync on and fixed length or length byte is used */
125 	enum option_on_off	enable_crc;
126 
127 	__u8			sync_length;
128 	__u8			fixed_message_length;
129 	__u32			bytes_to_drop;
130 
131 	__u8			sync_pattern[8];
132 	__u8			node_address;
133 	__u8			broadcast_address;
134 };
135 
136 #define PI433_IOC_MAGIC	'r'
137 
138 #define PI433_IOC_RD_TX_CFG                                             \
139 	_IOR(PI433_IOC_MAGIC, PI433_TX_CFG_IOCTL_NR, char[sizeof(struct pi433_tx_cfg)])
140 #define PI433_IOC_WR_TX_CFG                                             \
141 	_IOW(PI433_IOC_MAGIC, PI433_TX_CFG_IOCTL_NR, char[sizeof(struct pi433_tx_cfg)])
142 
143 #define PI433_IOC_RD_RX_CFG                                             \
144 	_IOR(PI433_IOC_MAGIC, PI433_RX_CFG_IOCTL_NR, char[sizeof(struct pi433_rx_cfg)])
145 #define PI433_IOC_WR_RX_CFG                                             \
146 	_IOW(PI433_IOC_MAGIC, PI433_RX_CFG_IOCTL_NR, char[sizeof(struct pi433_rx_cfg)])
147 
148 #endif /* PI433_H */
149