X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/a878cffa75e0ce890f79ccb012775f6b23238e06..c880098b282d3214882535c181f59497747da440:/picoproj.c diff --git a/picoproj.c b/picoproj.c index 197d5da..a5e5075 100644 --- a/picoproj.c +++ b/picoproj.c @@ -22,8 +22,19 @@ #include #include #include +#include +#include +#include +#include #include +#include + +#define AM7x01_VENDOR_ID 0x1de1 +#define AM7x01_PRODUCT_ID 0xc101 + +static libusb_device_handle *dev; + typedef enum { AM7x01_PACKET_TYPE_INIT = 0x01, AM7x01_PACKET_TYPE_IMAGE = 0x02, @@ -130,6 +141,11 @@ static void dump_header(struct header *h) fflush(stdout); } +static inline unsigned int in_80chars(unsigned int i) +{ + return ((i+1) % (80/3)); +} + static void dump_buffer(uint8_t *buffer, unsigned int len) { unsigned int i; @@ -138,14 +154,25 @@ static void dump_buffer(uint8_t *buffer, unsigned int len) return; for (i = 0; i < len; i++) { - printf("%02hhX%c", buffer[i], (i < len - 1) ? ' ' : '\n'); + printf("%02hhX%c", buffer[i], (in_80chars(i) && (i < len - 1)) ? ' ' : '\n'); } fflush(stdout); } static int send_data(uint8_t *buffer, unsigned int len) { + int ret; + int transferred; + dump_buffer(buffer, len); + + ret = libusb_bulk_transfer(dev, 1, buffer, len, &transferred, 0); + if (ret != 0 || (unsigned int)transferred != len) { + fprintf(stderr, "Error: ret: %d\ttransferred: %d (expected %u)\n", + ret, transferred, len); + return ret; + } + return 0; } @@ -216,14 +243,16 @@ static void usage(char *name) int main(int argc, char *argv[]) { int ret; + int exit_code = EXIT_SUCCESS; int opt; char filename[FILENAME_MAX] = {0}; + int image_fd = -1; int format = AM7x01_IMAGE_FORMAT_JPEG; int width = 800; int height = 480; uint8_t *image = NULL; - int size = 59475; + unsigned int size = 59475; while ((opt = getopt(argc, argv, "f:F:W:H:h")) != -1) { switch (opt) { @@ -257,11 +286,74 @@ int main(int argc, char *argv[]) } } + if (filename[0] != '\0') { + struct stat st; + + image_fd = open(filename, O_RDONLY); + if (image_fd < 0) { + perror("open"); + exit_code = EXIT_FAILURE; + goto out; + } + if (fstat(image_fd, &st) < 0) { + perror("fstat"); + exit_code = EXIT_FAILURE; + goto out_close_image_fd; + } + size = st.st_size; + + image = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, image_fd, 0); + if (image == NULL) { + perror("mmap"); + exit_code = EXIT_FAILURE; + goto out_close_image_fd; + } + } + + libusb_init(NULL); + libusb_set_debug(NULL, 3); + + dev = libusb_open_device_with_vid_pid(NULL, + AM7x01_VENDOR_ID, + AM7x01_PRODUCT_ID); + if (dev == NULL) { + errno = ENODEV; + perror("libusb_open_device_with_vid_pid"); + exit_code = EXIT_FAILURE; + goto out_libusb_exit; + } + + libusb_set_configuration(dev, 1); + libusb_claim_interface(dev, 0); + ret = send_image(format, width, height, image, size); if (ret < 0) { perror("send_image"); - exit(EXIT_FAILURE); + exit_code = EXIT_FAILURE; + goto cleanup; + } + + exit_code = EXIT_SUCCESS; + +cleanup: + libusb_close(dev); + +out_libusb_exit: + libusb_exit(NULL); + + if (image != NULL) { + ret = munmap(image, size); + if (ret < 0) + perror("munmap"); + } + +out_close_image_fd: + if (image_fd >= 0) { + ret = close(image_fd); + if (ret < 0) + perror("close"); } - exit(EXIT_SUCCESS); +out: + exit(exit_code); }