/* am7xxx - communication with AM7xxx based USB Pico Projectors and DPFs
*
- * Copyright (C) 2012 Antonio Ospite <ospite@studenti.unina.it>
+ * Copyright (C) 2012-2014 Antonio Ospite <ao2@ao2.it>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "am7xxx.h"
#include "serialize.h"
+#include "tools.h"
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
static int default_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power);
static int picopix_set_power_mode(am7xxx_device *dev, am7xxx_power_mode power);
static int default_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom);
+static int picopix_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom);
#define DEFAULT_OPS { \
.set_power_mode = default_set_power_mode, \
.interface_number = 0,
.ops = {
.set_power_mode = picopix_set_power_mode,
+ .set_zoom_mode = picopix_set_zoom_mode,
},
},
{
AM7XXX_PACKET_TYPE_PICOPIX_POWER_LOW = 0x15,
AM7XXX_PACKET_TYPE_PICOPIX_POWER_MEDIUM = 0x16,
AM7XXX_PACKET_TYPE_PICOPIX_POWER_HIGH = 0x17,
+ AM7XXX_PACKET_TYPE_PICOPIX_ENABLE_TI = 0x18,
+ AM7XXX_PACKET_TYPE_PICOPIX_DISABLE_TI = 0x19,
} am7xxx_packet_type;
struct am7xxx_generic_header {
return 0;
}
+static int picopix_set_zoom_mode(am7xxx_device *dev, am7xxx_zoom_mode zoom)
+{
+ int ret;
+ am7xxx_packet_type packet_type;
+
+ switch(zoom) {
+ case AM7XXX_ZOOM_ORIGINAL:
+ packet_type = AM7XXX_PACKET_TYPE_PICOPIX_DISABLE_TI;
+ break;
+
+ case AM7XXX_ZOOM_TELE:
+ packet_type = AM7XXX_PACKET_TYPE_PICOPIX_ENABLE_TI;
+ break;
+
+ case AM7XXX_ZOOM_H:
+ case AM7XXX_ZOOM_H_V:
+ case AM7XXX_ZOOM_TEST:
+ default:
+ error(dev->ctx, "Unsupported zoom mode.\n");
+ return -EINVAL;
+ };
+
+ ret = send_command(dev, packet_type);
+ if (ret < 0)
+ return ret;
+
+ /* The Windows drivers wait for 100ms and send the same command again,
+ * probably to overcome a firmware deficiency */
+ ret = msleep(100);
+ if (ret < 0)
+ return ret;
+
+ return send_command(dev, packet_type);
+}
+
/* Public API */
AM7XXX_PUBLIC int am7xxx_init(am7xxx_context **ctx)
am7xxx_device_info *device_info)
{
int ret;
- struct am7xxx_header h = { 0 };
+ struct am7xxx_header h;
if (dev->device_info) {
memcpy(device_info, dev->device_info, sizeof(*device_info));
if (ret < 0)
return ret;
+ memset(&h, 0, sizeof(h));
ret = read_header(dev, &h);
if (ret < 0)
return ret;