X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fchronovu-la%2Fprotocol.c;h=da772f5b1d8f5ffcdb1d3ab46227dad39dc2922d;hb=deb7615262ac4f9cc0750a08351afa7cbf9c34d5;hp=7dc4f6bc14652b4a7b48a9bed6c006bc7fa0dbb8;hpb=f3f19d1131025b68d29a11273b627c83d748e7ea;p=libsigrok.git diff --git a/src/hardware/chronovu-la/protocol.c b/src/hardware/chronovu-la/protocol.c index 7dc4f6bc..da772f5b 100644 --- a/src/hardware/chronovu-la/protocol.c +++ b/src/hardware/chronovu-la/protocol.c @@ -14,16 +14,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * along with this program; if not, see . */ +#include #include "protocol.h" SR_PRIV const struct cv_profile cv_profiles[] = { { CHRONOVU_LA8, "LA8", "ChronoVu LA8", 8, SR_MHZ(100), 2, 0.8388608 }, { CHRONOVU_LA16, "LA16", "ChronoVu LA16", 16, SR_MHZ(200), 4, 0.042 }, - { 0, NULL, NULL, 0, 0, 0, 0.0 }, + ALL_ZERO }; /* LA8: channels are numbered 0-7. LA16: channels are numbered 0-15. */ @@ -300,6 +300,11 @@ SR_PRIV int cv_convert_trigger(const struct sr_dev_inst *sdi) || match->match == SR_TRIGGER_RISING) devc->trigger_pattern |= channel_bit; + /* LA8 and LA16 support state triggering. */ + if (match->match == SR_TRIGGER_ONE + || match->match == SR_TRIGGER_ZERO) + devc->trigger_mask |= channel_bit; + /* LA16 (but not LA8) supports edge triggering. */ if ((devc->prof->model == CHRONOVU_LA16)) { if (match->match == SR_TRIGGER_RISING @@ -400,16 +405,19 @@ SR_PRIV int cv_read_block(struct dev_context *devc) return SR_OK; } -SR_PRIV void cv_send_block_to_session_bus(struct dev_context *devc, int block) +SR_PRIV void cv_send_block_to_session_bus(const struct sr_dev_inst *sdi, int block) { int i, idx; uint8_t sample, expected_sample, tmp8; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; int trigger_point; /* Relative trigger point (in this block). */ + struct dev_context *devc; /* Note: Caller ensures devc/devc->ftdic != NULL and block > 0. */ + devc = sdi->priv; + /* TODO: Implement/test proper trigger support for the LA16. */ /* Check if we can find the trigger condition in this block. */ @@ -457,7 +465,7 @@ SR_PRIV void cv_send_block_to_session_bus(struct dev_context *devc, int block) logic.length = BS; logic.unitsize = devc->prof->num_channels / 8; logic.data = devc->final_buf + (block * BS); - sr_session_send(devc->cb_data, &packet); + sr_session_send(sdi, &packet); return; } @@ -480,15 +488,13 @@ SR_PRIV void cv_send_block_to_session_bus(struct dev_context *devc, int block) logic.length = trigger_point; logic.unitsize = devc->prof->num_channels / 8; logic.data = devc->final_buf + (block * BS); - sr_session_send(devc->cb_data, &packet); + sr_session_send(sdi, &packet); } /* Send the SR_DF_TRIGGER packet to the session bus. */ sr_spew("Sending SR_DF_TRIGGER packet, sample = %d.", (block * BS) + trigger_point); - packet.type = SR_DF_TRIGGER; - packet.payload = NULL; - sr_session_send(devc->cb_data, &packet); + std_session_send_df_trigger(sdi); /* If at least one sample is located after the trigger... */ if (trigger_point < (BS - 1)) { @@ -501,6 +507,6 @@ SR_PRIV void cv_send_block_to_session_bus(struct dev_context *devc, int block) logic.length = BS - trigger_point; logic.unitsize = devc->prof->num_channels / 8; logic.data = devc->final_buf + (block * BS) + trigger_point; - sr_session_send(devc->cb_data, &packet); + sr_session_send(sdi, &packet); } }