X-Git-Url: https://git.ao2.it/libam7xxx.git/blobdiff_plain/90247e36e90bebe6c8b80393d2a037b054808597..2c897cad505d3ba27723dcff7252ff123d90ab53:/src/am7xxx.c diff --git a/src/am7xxx.c b/src/am7xxx.c index 5481075..c039147 100644 --- a/src/am7xxx.c +++ b/src/am7xxx.c @@ -91,6 +91,11 @@ static struct am7xxx_usb_device_descriptor supported_devices[] = { .vendor_id = 0x21e7, .product_id = 0x000e, }, + { + .name = "Philips/Sagemcom PicoPix 2055", + .vendor_id = 0x21e7, + .product_id = 0x0016, + }, }; /* The header size on the wire is known to be always 24 bytes, regardless of @@ -234,7 +239,10 @@ static void debug_dump_header(am7xxx_context *ctx, struct am7xxx_header *h) debug(ctx, "BEGIN\n"); debug(ctx, "packet_type: 0x%08x (%u)\n", h->packet_type, h->packet_type); - debug(ctx, "direction: 0x%02hhx (%hhu)\n", h->direction, h->direction); + debug(ctx, "direction: 0x%02hhx (%hhu) (%s)\n", h->direction, h->direction, + h->direction == AM7XXX_DIRECTION_IN ? "IN" : + h->direction == AM7XXX_DIRECTION_OUT ? "OUT" : + "UNKNOWN"); debug(ctx, "header_data_len: 0x%02hhx (%hhu)\n", h->header_data_len, h->header_data_len); debug(ctx, "unknown2: 0x%02hhx (%hhu)\n", h->unknown2, h->unknown2); debug(ctx, "unknown3: 0x%02hhx (%hhu)\n", h->unknown3, h->unknown3); @@ -378,8 +386,6 @@ static int read_header(am7xxx_device *dev, struct am7xxx_header *h) unserialize_header(dev->buffer, h); - debug_dump_header(dev->ctx, h); - if (h->direction == AM7XXX_DIRECTION_IN) { ret = 0; } else { @@ -388,6 +394,8 @@ static int read_header(am7xxx_device *dev, struct am7xxx_header *h) ret = -EINVAL; } + debug_dump_header(dev->ctx, h); + out: return ret; } @@ -398,7 +406,13 @@ static int send_header(am7xxx_device *dev, struct am7xxx_header *h) debug_dump_header(dev->ctx, h); + /* For symmetry with read_header() we should check here for + * h->direction == AM7XXX_DIRECTION_OUT but we just ensure that in all + * the callers and save some cycles here. + */ + serialize_header(h, dev->buffer); + ret = send_data(dev, dev->buffer, AM7XXX_HEADER_WIRE_SIZE); if (ret < 0) error(dev->ctx, "failed to send data\n"); @@ -445,8 +459,6 @@ static am7xxx_device *add_new_device(am7xxx_context *ctx) return NULL; } - devices_list = &(ctx->devices_list); - new_device = malloc(sizeof(*new_device)); if (new_device == NULL) { fatal("cannot allocate a new device (%s)\n", strerror(errno)); @@ -456,6 +468,8 @@ static am7xxx_device *add_new_device(am7xxx_context *ctx) new_device->ctx = ctx; + devices_list = &(ctx->devices_list); + if (*devices_list == NULL) { *devices_list = new_device; } else { @@ -846,7 +860,7 @@ AM7XXX_PUBLIC int am7xxx_send_image(am7xxx_device *dev, return send_data(dev, image, image_size); } -AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mode) +AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power) { int ret; struct am7xxx_header h = { @@ -857,7 +871,7 @@ AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mo .unknown3 = 0x10, }; - switch(mode) { + switch(power) { case AM7XXX_POWER_OFF: h.header_data.power.bit2 = 0; h.header_data.power.bit1 = 0; @@ -889,7 +903,7 @@ AM7XXX_PUBLIC int am7xxx_set_power_mode(am7xxx_device *dev, am7xxx_power_mode mo break; default: - error(dev->ctx, "Power mode not supported!\n"); + error(dev->ctx, "Unsupported power mode.\n"); return -EINVAL; };