]> sigrok.org Git - libsigrok.git/commitdiff
kingst-la2016: rephrase FPGA bitstream content zero padding
authorGerhard Sittig <redacted>
Sat, 22 Jan 2022 09:04:14 +0000 (10:04 +0100)
committerGerhard Sittig <redacted>
Sun, 6 Feb 2022 17:53:53 +0000 (18:53 +0100)
The upload_fpga_bitstream() routine open codes a magic length for the
padded file content, which is hard to relate to a firmware file size,
and impossible to spot during maintenance. Declare an assumed chunk size
instead and let the resource file handling code path determine the needed
length of zero padding. Drop an unneeded device context member variable.

src/hardware/kingst-la2016/protocol.c
src/hardware/kingst-la2016/protocol.h

index da254d31c96c0a1d028fdb284ba317ca659b1ba0..a0de3be70c0982ea5bc7525a49069dfdc13bab39 100644 (file)
@@ -198,19 +198,18 @@ static int check_fpga_bitstream(const struct sr_dev_inst *sdi)
 static int upload_fpga_bitstream(const struct sr_dev_inst *sdi,
        const char *bitstream_fname)
 {
-       struct dev_context *devc;
        struct drv_context *drvc;
        struct sr_usb_dev_inst *usb;
        struct sr_resource bitstream;
+       uint32_t bitstream_size;
        uint8_t buffer[sizeof(uint32_t)];
        uint8_t *wrptr;
        uint8_t block[4096];
        int len, act_len;
        unsigned int pos;
        int ret;
-       unsigned int zero_pad_to = 0x2c000;
+       unsigned int zero_pad_to;
 
-       devc = sdi->priv;
        drvc = sdi->driver->context;
        usb = sdi->conn;
 
@@ -222,14 +221,18 @@ static int upload_fpga_bitstream(const struct sr_dev_inst *sdi,
                return ret;
        }
 
-       devc->bitstream_size = (uint32_t)bitstream.size;
+       bitstream_size = (uint32_t)bitstream.size;
        wrptr = buffer;
-       write_u32le_inc(&wrptr, devc->bitstream_size);
+       write_u32le_inc(&wrptr, bitstream_size);
        if ((ret = ctrl_out(sdi, CMD_FPGA_INIT, 0x00, 0, buffer, wrptr - buffer)) != SR_OK) {
                sr_err("Cannot initiate FPGA bitstream upload.");
                sr_resource_close(drvc->sr_ctx, &bitstream);
                return ret;
        }
+       zero_pad_to = bitstream_size;
+       zero_pad_to += LA2016_EP2_PADDING - 1;
+       zero_pad_to /= LA2016_EP2_PADDING;
+       zero_pad_to *= LA2016_EP2_PADDING;
 
        pos = 0;
        while (1) {
index 8ea01809e439ccc7aa4743a0af02b9a9897db2c8..6d3cf2641cae298f8ba67af3c70f6e73effc10b7 100644 (file)
 #define RENUM_GONE_DELAY_MS    1800
 #define RENUM_POLL_INTERVAL_MS 200
 
+/*
+ * The device expects some zero padding to follow the content of the
+ * file which contains the FPGA bitstream. Specify the chunk size here.
+ */
+#define LA2016_EP2_PADDING     2048
+
 #define LA2016_THR_VOLTAGE_MIN 0.40
 #define LA2016_THR_VOLTAGE_MAX 4.00
 
@@ -105,8 +111,6 @@ struct dev_context {
        uint16_t cur_channels;
        int num_channels;
 
-       uint32_t bitstream_size;
-
        /* Values derived from user specs. */
        uint64_t pre_trigger_size;