1 /*
2  * Copyright 2012 Michael Ossmann <mike@ossmann.com>
3  * Copyright 2012 Jared Boone <jared@sharebrained.com>
4  *
5  * This file is part of HackRF.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef __SI5351C_H
24 #define __SI5351C_H
25 
26 #ifdef __cplusplus
27 extern "C"
28 {
29 #endif
30 
31 #include <stdint.h>
32 #include <stdbool.h>
33 
34 #include "i2c_bus.h"
35 
36 #define SI_INTDIV(x)  (x*128-512)
37 
38 #define SI5351C_CLK_POWERDOWN	(1<<7)
39 #define SI5351C_CLK_INT_MODE	(1<<6)
40 #define SI5351C_CLK_FRAC_MODE	(0<<6)
41 
42 #define SI5351C_CLK_PLL_SRC(x)	(x<<5)
43 #define SI5351C_CLK_PLL_SRC_A	0
44 #define SI5351C_CLK_PLL_SRC_B	1
45 
46 #define SI5351C_CLK_INV			(1<<4)
47 
48 #define SI5351C_CLK_SRC(x)		(x<<2)
49 #define SI5351C_CLK_SRC_XTAL			0
50 #define SI5351C_CLK_SRC_CLKIN			1
51 #define SI5351C_CLK_SRC_MULTISYNTH_0_4	2
52 #define SI5351C_CLK_SRC_MULTISYNTH_SELF	3
53 
54 #define SI5351C_CLK_IDRV(x) (x<<0)
55 #define SI5351C_CLK_IDRV_2MA 0
56 #define SI5351C_CLK_IDRV_4MA 1
57 #define SI5351C_CLK_IDRV_6MA 2
58 #define SI5351C_CLK_IDRV_8MA 3
59 
60 #define SI5351C_LOS (1<<4)
61 
62 enum pll_sources {
63 	PLL_SOURCE_UNINITIALIZED = -1,
64 	PLL_SOURCE_XTAL = 0,
65 	PLL_SOURCE_CLKIN = 1,
66 };
67 
68 typedef struct {
69 	i2c_bus_t* const bus;
70 	uint8_t i2c_address;
71 } si5351c_driver_t;
72 
73 void si5351c_disable_all_outputs(si5351c_driver_t* const drv);
74 void si5351c_disable_oeb_pin_control(si5351c_driver_t* const drv);
75 void si5351c_power_down_all_clocks(si5351c_driver_t* const drv);
76 void si5351c_set_crystal_configuration(si5351c_driver_t* const drv);
77 void si5351c_enable_xo_and_ms_fanout(si5351c_driver_t* const drv);
78 void si5351c_configure_pll_sources(si5351c_driver_t* const drv);
79 void si5351c_configure_pll_multisynth(si5351c_driver_t* const drv);
80 void si5351c_reset_pll(si5351c_driver_t* const drv);
81 void si5351c_configure_multisynth(si5351c_driver_t* const drv,
82 		const uint_fast8_t ms_number,
83     	const uint32_t p1, const uint32_t p2, const uint32_t p3,
84     	const uint_fast8_t r_div);
85 void si5351c_configure_clock_control(si5351c_driver_t* const drv, const enum pll_sources source);
86 void si5351c_enable_clock_outputs(si5351c_driver_t* const drv);
87 void si5351c_set_int_mode(si5351c_driver_t* const drv, const uint_fast8_t ms_number, const uint_fast8_t on);
88 void si5351c_set_clock_source(si5351c_driver_t* const drv, const enum pll_sources source);
89 bool si5351c_clkin_signal_valid(si5351c_driver_t* const drv);
90 
91 void si5351c_write_single(si5351c_driver_t* const drv, uint8_t reg, uint8_t val);
92 uint8_t si5351c_read_single(si5351c_driver_t* const drv, uint8_t reg);
93 void si5351c_write(si5351c_driver_t* const drv, const uint8_t* const data, const size_t data_count);
94 void si5351c_clkout_enable(si5351c_driver_t* const drv, uint8_t enable);
95 
96 #ifdef __cplusplus
97 }
98 #endif
99 
100 #endif /* __SI5351C_H */
101