/*
 * Project: Si4463 Radio Library for AVR and Arduino
 * Author: Zak Kemble, contact@zakkemble.co.uk
 * Copyright: (C) 2017 by Zak Kemble
 * License: GNU GPL v3 (see License.txt)
 * Web: http://blog.zakkemble.co.uk/si4463-radio-library-avr-arduino/
 */

#ifndef SI446X_DEFS_H_
#define SI446X_DEFS_H_

#define SI446X_CMD_POWER_UP				0x02
#define SI446X_CMD_NOP					0x00
#define SI446X_CMD_PART_INFO			0x01
#define SI446X_CMD_FUNC_INFO			0x10
#define SI446X_CMD_SET_PROPERTY			0x11
#define SI446X_CMD_GET_PROPERTY			0x12
#define SI446X_CMD_GPIO_PIN_CFG			0x13
#define SI446X_CMD_FIFO_INFO			0x15
#define SI446X_CMD_GET_INT_STATUS		0x20
#define SI446X_CMD_REQUEST_DEVICE_STATE	0x33
#define SI446X_CMD_CHANGE_STATE			0x34
#define SI446X_CMD_READ_CMD_BUFF		0x44
#define SI446X_CMD_READ_FRR_A			0x50
#define SI446X_CMD_READ_FRR_B			0x51
#define SI446X_CMD_READ_FRR_C			0x53
#define SI446X_CMD_READ_FRR_D			0x57
#define SI446X_CMD_IRCAL				0x17
#define SI446X_CMD_IRCAL_MANUAL			0x1a
#define SI446X_CMD_START_TX				0x31
#define SI446X_CMD_TX_HOP				0x37
#define SI446X_CMD_WRITE_TX_FIFO		0x66
#define SI446X_CMD_PACKET_INFO			0x16
#define SI446X_CMD_GET_MODEM_STATUS		0x22
#define SI446X_CMD_START_RX				0x32
#define SI446X_CMD_RX_HOP				0x36
#define SI446X_CMD_READ_RX_FIFO			0x77
#define SI446X_CMD_GET_ADC_READING		0x14
#define SI446X_CMD_GET_PH_STATUS		0x21
#define SI446X_CMD_GET_CHIP_STATUS		0x23

#define SI446X_INT_CTL_CHIP_LOW_BATT_EN	1
#define SI446X_INT_CTL_CHIP_WUT_EN		0

typedef enum
{
	SI446X_ADC_CONV_TEMP = 16,
	SI446X_ADC_CONV_BATT = 8,
	SI446X_ADC_CONV_GPIO = 4
} si446x_adc_conv_t;

typedef enum
{
	SI446X_ADC_RANGE_0P8 = 0,
	SI446X_ADC_RANGE_1P6 = 4,
	SI446X_ADC_RANGE_3P2 = 5,
	SI446X_ADC_RANGE_2P4 = 8,
	SI446X_ADC_RANGE_3P6 = 9
} si446x_adc_range_t;

#define SI446X_FIFO_CLEAR_RX			0x02
#define SI446X_FIFO_CLEAR_TX			0x01

#define GLOBAL_PROP(prop)	((SI446X_PROP_GROUP_GLOBAL<<8) | prop)
#define INT_PROP(prop)		((SI446X_PROP_GROUP_INT<<8) | prop)
#define PKT_PROP(prop)		((SI446X_PROP_GROUP_PKT<<8) | prop)
#define PA_PROP(prop)		((SI446X_PROP_GROUP_PA<<8) | prop)
#define MATCH_PROP(prop)	((SI446X_PROP_GROUP_MATCH<<8) | prop)

#define SI446X_GLOBAL_CONFIG			GLOBAL_PROP(0x03)
#define SI446X_FIFO_MODE_HALF_DUPLEX	0x10

#define SI446X_GLOBAL_CLK_CFG			GLOBAL_PROP(0x01)
#define SI446X_DIVIDED_CLK_DIS			0x00
#define SI446X_DIVIDED_CLK_EN			0x40
#define SI446X_DIVIDED_CLK_SEL_DIV_1	0<<5
#define SI446X_DIVIDED_CLK_SEL_DIV_2	1<<5
#define SI446X_DIVIDED_CLK_SEL_DIV_3	2<<5
#define SI446X_DIVIDED_CLK_SEL_DIV_7_5	3<<5
#define SI446X_DIVIDED_CLK_SEL_DIV_10	4<<5
#define SI446X_DIVIDED_CLK_SEL_DIV_15	5<<5
#define SI446X_DIVIDED_CLK_SEL_DIV_30	6<<5
#define SI446X_DIVIDED_CLK_32K_SEL_OFF	0x00
#define SI446X_DIVIDED_CLK_32K_SEL_RC	0x01
#define SI446X_DIVIDED_CLK_32K_SEL_XTAL	0x02

#define SI446X_GLOBAL_LOW_BATT_THRESH	GLOBAL_PROP(0x02)
#define SI446X_GLOBAL_WUT_CONFIG		GLOBAL_PROP(0x04)
#define SI446X_GLOBAL_WUT_M				GLOBAL_PROP(0x05)
#define SI446X_GLOBAL_WUT_R				GLOBAL_PROP(0x07)
#define SI446X_GLOBAL_WUT_LDC			GLOBAL_PROP(0x08)
#define SI446X_WUT_SLEEP				5
#define SI446X_LDC_MAX_PERIODS_FOREVER	0<<6
#define SI446X_LDC_MAX_PERIODS_TWO		1<<6
#define SI446X_LDC_MAX_PERIODS_FOUR		2<<6
#define SI446X_LDC_MAX_PERIODS_EIGHT	3<<6
#define SI446X_GLOBAL_WUT_CONFIG_WUT_LDC_EN_RX	1<<6
#define SI446X_GLOBAL_WUT_CONFIG_WUT_EN			1
#define SI446X_GLOBAL_WUT_CONFIG_WUT_LBD_EN		2

#define SI446X_INT_CTL_ENABLE			INT_PROP(0x00)
#define SI446X_INT_CTL_PH_ENABLE		INT_PROP(0x01)
#define SI446X_INT_CTL_MODEM_ENABLE		INT_PROP(0x02)
#define SI446X_INT_CTL_CHIP_ENABLE		INT_PROP(0x03)
#define SI446X_FILTER_MATCH_PEND		7
#define SI446X_FILTER_MISS_PEND			6
#define SI446X_PACKET_SENT_PEND			5
#define SI446X_PACKET_RX_PEND			4
#define SI446X_CRC_ERROR_PEND			3
#define SI446X_INVALID_SYNC_PEND		5
#define SI446X_SYNC_DETECT_PEND			0
#define SI446X_LOW_BATT_PEND			1
#define SI446X_WUT_PEND					0

#define SI446X_MATCH_VALUE_1			MATCH_PROP(0x00)
#define SI446X_MATCH_EN					0x40

#define	SI446X_PA_PWR_LVL				PA_PROP(0x01)

#define SI446X_PKT_FIELD_1_LENGTH		PKT_PROP(0x0D)
#define SI446X_PKT_FIELD_2_LENGTH		PKT_PROP(0x11)
#define SI446X_PKT_FIELD_2_LENGTH_LOW	PKT_PROP(0x12)

#endif /* SI446X_DEFS_H_ */
