static void sm_do_capture(struct fpi_ssm *ssm) { struct fp_img_dev *dev = ssm->priv; struct v5s_dev *vdev = dev->priv; fp_dbg(""); vdev->capture_img = fpi_img_new_for_imgdev(dev); vdev->capture_iteration = 0; capture_iterate(ssm); }
static int capture(struct fp_img_dev *dev, gboolean unconditional, struct fp_img **ret) { int i; int r; struct fp_img *img; unsigned char *data; unsigned char *ptr; r = aes_write_regv(dev, init_reqs, G_N_ELEMENTS(init_reqs)); if (r < 0) return r; img = fpi_img_new_for_imgdev(dev); data = g_malloc(DATA_BUFLEN); ptr = data; /* See the timeout explanation in the uru4000 driver for the reasoning * behind this silly loop. */ retry: r = usb_bulk_read(dev->udev, EP_IN, data, DATA_BUFLEN, 1000); if (r == -ETIMEDOUT) goto retry; if (r < 0) { fp_err("data read failed, error %d", r); goto err; } else if (r < DATA_BUFLEN) { fp_err("short data read (%d)", r); r = -EIO; goto err; } for (i = 0; i < NR_SUBARRAYS; i++) { fp_dbg("subarray header byte %02x", *ptr); ptr++; aes_assemble_image(ptr, 96, 16, img->data + (i * 96 * 16)); ptr += SUBARRAY_LEN; } img->flags = FP_IMG_COLORS_INVERTED | FP_IMG_V_FLIPPED | FP_IMG_H_FLIPPED; *ret = img; g_free(data); return 0; err: g_free(data); fp_img_free(img); return r; }