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