/* * libdvbca - interface onto raw CA devices * * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef LIBDVBCA_H #define LIBDVBCA_H 1 #ifdef __cplusplus extern "C" { #endif #include /** * The types of CA interface we support. */ #define DVBCA_INTERFACE_LINK 0 #define DVBCA_INTERFACE_HLCI 1 /** * States a CAM in a slot can be in. */ #define DVBCA_CAMSTATE_MISSING 0 #define DVBCA_CAMSTATE_INITIALISING 1 #define DVBCA_CAMSTATE_READY 2 /** * Open a CA device. Multiple CAMs can be accessed through a CA device. * * @param adapter Index of the DVB adapter. * @param cadevice Index of the CA device on that adapter (usually 0). * @return A unix file descriptor on success, or -1 on failure. */ extern int dvbca_open(int adapter, int cadevice); /** * Reset a CAM. * * @param fd File handle opened with dvbca_open. * @param slot Slot where the requested CAM is in. * @return 0 on success, -1 on failure. */ extern int dvbca_reset(int fd, uint8_t slot); /** * Get the interface type of a CAM. * * @param fd File handle opened with dvbca_open. * @param slot Slot where the requested CAM is in. * @return One of the DVBCA_INTERFACE_* values, or -1 on failure. */ extern int dvbca_get_interface_type(int fd, uint8_t slot); /** * Get the state of a CAM. * * @param fd File handle opened with dvbca_open. * @param slot Slot where the requested CAM is in. * @return One of the DVBCA_CAMSTATE_* values, or -1 on failure. */ extern int dvbca_get_cam_state(int fd, uint8_t slot); /** * Write a message to a CAM using a link-layer interface. * * @param fd File handle opened with dvbca_open. * @param slot Slot where the requested CAM is in. * @param connection_id Connection ID of the message. * @param data Data to write. * @param data_length Number of bytes to write. * @return 0 on success, or -1 on failure. */ extern int dvbca_link_write(int fd, uint8_t slot, uint8_t connection_id, uint8_t *data, uint16_t data_length); /** * Read a message from a CAM using a link-layer interface. * * @param fd File handle opened with dvbca_open. * @param slot Slot where the responding CAM is in. * @param connection_id Destination for the connection ID the message came from. * @param data Data that was read. * @param data_length Max number of bytes to read. * @return Number of bytes read on success, or -1 on failure. */ extern int dvbca_link_read(int fd, uint8_t *slot, uint8_t *connection_id, uint8_t *data, uint16_t data_length); // FIXME how do we determine which CAM slot of a CA is meant? /** * Write a message to a CAM using an HLCI interface. * * @param fd File handle opened with dvbca_open. * @param data Data to write. * @param data_length Number of bytes to write. * @return 0 on success, or -1 on failure. */ extern int dvbca_hlci_write(int fd, uint8_t *data, uint16_t data_length); // FIXME how do we determine which CAM slot of a CA is meant? /** * Read a message from a CAM using an HLCI interface. * * @param fd File handle opened with dvbca_open. * @param app_tag Application layer tag giving the message type to read. * @param data Data that was read. * @param data_length Max number of bytes to read. * @return Number of bytes read on success, or -1 on failure. */ extern int dvbca_hlci_read(int fd, uint32_t app_tag, uint8_t *data, uint16_t data_length); #ifdef __cplusplus } #endif #endif // LIBDVBCA_H 2 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include <stdio.h>
#include <usb.h>

void dec_reset(struct usb_device *dev)
{
	char message[] = {0xaa, 0x00, 0xf1, 0x01, 0x00};
	usb_dev_handle *handle = usb_open(dev);

	printf("Device found.\n");

	if (handle) {
		if (!usb_claim_interface(handle, 0)) {
			int result;
			printf("Reseting device.. ");
			result = usb_bulk_write(handle, 3, message,
						sizeof(message), 1000);
			if (result >= 0)
				printf("succeeded.\n");
			else
				printf("failed. (Error code: %d)\n", result);
		} else {
			printf("Couldn't claim interface.\n");
		}
		usb_close(handle);
	}
}

int main()
{
	struct usb_bus *busses;
	struct usb_bus *bus;

	usb_init();
	usb_find_busses();
	usb_find_devices();

	busses = usb_get_busses();

	for (bus = busses; bus; bus = bus->next) {
		struct usb_device *dev;

		for (dev = bus->devices; dev; dev = dev->next) {
			if (dev->descriptor.idVendor == 0x0b48 &&
			    (dev->descriptor.idProduct == 0x1006 ||
			     dev->descriptor.idProduct == 0x1008 ||
			     dev->descriptor.idProduct == 0x1009)) {
				dec_reset(dev);
			}
		}
	}

	return 0;
}