1 /* 2 * This file is part of the libsigrok project. 3 * 4 * Copyright (C) 2014 Bert Vermeulen <bert@biot.com> 5 * Copyright (C) 2017,2019 Frank Stettner <frank-stettner@gmx.net> 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 3 of the License, or 10 * (at your option) 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. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #ifndef LIBSIGROK_HARDWARE_SCPI_PPS_PROTOCOL_H 22 #define LIBSIGROK_HARDWARE_SCPI_PPS_PROTOCOL_H 23 24 #include <stdint.h> 25 #include <glib.h> 26 #include <libsigrok/libsigrok.h> 27 #include "libsigrok-internal.h" 28 #include "scpi.h" 29 30 #define LOG_PREFIX "scpi-pps" 31 32 enum pps_scpi_cmds { 33 SCPI_CMD_REMOTE = 1, 34 SCPI_CMD_LOCAL, 35 SCPI_CMD_BEEPER, 36 SCPI_CMD_BEEPER_ENABLE, 37 SCPI_CMD_BEEPER_DISABLE, 38 SCPI_CMD_SELECT_CHANNEL, 39 SCPI_CMD_GET_MEAS_VOLTAGE, 40 SCPI_CMD_GET_MEAS_CURRENT, 41 SCPI_CMD_GET_MEAS_POWER, 42 SCPI_CMD_GET_MEAS_FREQUENCY, 43 SCPI_CMD_GET_VOLTAGE_TARGET, 44 SCPI_CMD_SET_VOLTAGE_TARGET, 45 SCPI_CMD_GET_FREQUENCY_TARGET, 46 SCPI_CMD_SET_FREQUENCY_TARGET, 47 SCPI_CMD_GET_CURRENT_LIMIT, 48 SCPI_CMD_SET_CURRENT_LIMIT, 49 SCPI_CMD_GET_OUTPUT_ENABLED, 50 SCPI_CMD_SET_OUTPUT_ENABLE, 51 SCPI_CMD_SET_OUTPUT_DISABLE, 52 SCPI_CMD_GET_OUTPUT_REGULATION, 53 SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION, 54 SCPI_CMD_SET_OVER_TEMPERATURE_PROTECTION_ENABLE, 55 SCPI_CMD_SET_OVER_TEMPERATURE_PROTECTION_DISABLE, 56 SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION_ACTIVE, 57 SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ENABLED, 58 SCPI_CMD_SET_OVER_VOLTAGE_PROTECTION_ENABLE, 59 SCPI_CMD_SET_OVER_VOLTAGE_PROTECTION_DISABLE, 60 SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ACTIVE, 61 SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_THRESHOLD, 62 SCPI_CMD_SET_OVER_VOLTAGE_PROTECTION_THRESHOLD, 63 SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ENABLED, 64 SCPI_CMD_SET_OVER_CURRENT_PROTECTION_ENABLE, 65 SCPI_CMD_SET_OVER_CURRENT_PROTECTION_DISABLE, 66 SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ACTIVE, 67 SCPI_CMD_GET_OVER_CURRENT_PROTECTION_THRESHOLD, 68 SCPI_CMD_SET_OVER_CURRENT_PROTECTION_THRESHOLD, 69 }; 70 71 /* Defines the SCPI dialect */ 72 enum pps_scpi_dialect { 73 SCPI_DIALECT_UNKNOWN = 1, 74 SCPI_DIALECT_HP_COMP, 75 SCPI_DIALECT_HP_66XXB, 76 SCPI_DIALECT_PHILIPS, 77 }; 78 79 /* 80 * These are bit values denoting features a device can have either globally, 81 * in scpi_pps.features, or on a per-channel-group basis in 82 * channel_group_spec.features. 83 */ 84 enum pps_features { 85 PPS_OTP = (1 << 0), 86 PPS_OVP = (1 << 1), 87 PPS_OCP = (1 << 2), 88 PPS_INDEPENDENT = (1 << 3), 89 PPS_SERIES = (1 << 4), 90 PPS_PARALLEL = (1 << 5), 91 }; 92 93 struct scpi_pps { 94 const char *vendor; 95 const char *model; 96 const enum pps_scpi_dialect dialect; 97 uint64_t features; 98 const uint32_t *devopts; 99 unsigned int num_devopts; 100 const uint32_t *devopts_cg; 101 unsigned int num_devopts_cg; 102 const struct channel_spec *channels; 103 unsigned int num_channels; 104 const struct channel_group_spec *channel_groups; 105 unsigned int num_channel_groups; 106 const struct scpi_command *commands; 107 int (*probe_channels) (struct sr_dev_inst *sdi, struct sr_scpi_hw_info *hwinfo, 108 struct channel_spec **channels, unsigned int *num_channels, 109 struct channel_group_spec **channel_groups, unsigned int *num_channel_groups); 110 int (*init_acquisition) (const struct sr_dev_inst *sdi); 111 int (*update_status) (const struct sr_dev_inst *sdi); 112 }; 113 114 struct channel_spec { 115 const char *name; 116 /* Min, max, programming resolution, spec digits, encoding digits. */ 117 double voltage[5]; 118 double current[5]; 119 double power[5]; 120 double frequency[5]; 121 double ovp[5]; 122 double ocp[5]; 123 }; 124 125 struct channel_group_spec { 126 const char *name; 127 uint64_t channel_index_mask; 128 uint64_t features; 129 /* The mqflags will only be applied to voltage and current channels! */ 130 enum sr_mqflag mqflags; 131 }; 132 133 struct pps_channel { 134 enum sr_mq mq; 135 enum sr_mqflag mqflags; 136 unsigned int hw_output_idx; 137 const char *hwname; 138 int digits; 139 }; 140 141 struct pps_channel_instance { 142 enum sr_mq mq; 143 int command; 144 const char *prefix; 145 }; 146 147 struct pps_channel_group { 148 uint64_t features; 149 }; 150 151 enum acq_states { 152 STATE_VOLTAGE, 153 STATE_CURRENT, 154 STATE_STOP, 155 }; 156 157 struct dev_context { 158 const struct scpi_pps *device; 159 160 gboolean beeper_was_set; 161 struct channel_spec *channels; 162 struct channel_group_spec *channel_groups; 163 164 struct sr_channel *cur_acquisition_channel; 165 struct sr_sw_limits limits; 166 }; 167 168 SR_PRIV extern unsigned int num_pps_profiles; 169 SR_PRIV extern const struct scpi_pps pps_profiles[]; 170 171 SR_PRIV int select_channel(const struct sr_dev_inst *sdi, struct sr_channel *ch); 172 SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data); 173 174 #endif 175