diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
| commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
| tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/media/dvb/firewire | |
| parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) | |
Diffstat (limited to 'drivers/media/dvb/firewire')
| -rw-r--r-- | drivers/media/dvb/firewire/Kconfig | 19 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/Makefile | 6 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv-avc.c | 1457 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv-ci.c | 258 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv-dvb.c | 245 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv-fe.c | 273 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv-fw.c | 430 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv-rc.c | 196 | ||||
| -rw-r--r-- | drivers/media/dvb/firewire/firedtv.h | 168 |
9 files changed, 3052 insertions, 0 deletions
diff --git a/drivers/media/dvb/firewire/Kconfig b/drivers/media/dvb/firewire/Kconfig new file mode 100644 index 00000000000..f3e9448c395 --- /dev/null +++ b/drivers/media/dvb/firewire/Kconfig | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | config DVB_FIREDTV | ||
| 2 | tristate "FireDTV and FloppyDTV" | ||
| 3 | depends on DVB_CORE && FIREWIRE | ||
| 4 | help | ||
| 5 | Support for DVB receivers from Digital Everywhere | ||
| 6 | which are connected via IEEE 1394 (FireWire). | ||
| 7 | |||
| 8 | These devices don't have an MPEG decoder built in, | ||
| 9 | so you need an external software decoder to watch TV. | ||
| 10 | |||
| 11 | To compile this driver as a module, say M here: | ||
| 12 | the module will be called firedtv. | ||
| 13 | |||
| 14 | if DVB_FIREDTV | ||
| 15 | |||
| 16 | config DVB_FIREDTV_INPUT | ||
| 17 | def_bool INPUT = y || (INPUT = m && DVB_FIREDTV = m) | ||
| 18 | |||
| 19 | endif # DVB_FIREDTV | ||
diff --git a/drivers/media/dvb/firewire/Makefile b/drivers/media/dvb/firewire/Makefile new file mode 100644 index 00000000000..357b3aab186 --- /dev/null +++ b/drivers/media/dvb/firewire/Makefile | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | obj-$(CONFIG_DVB_FIREDTV) += firedtv.o | ||
| 2 | |||
| 3 | firedtv-y := firedtv-avc.o firedtv-ci.o firedtv-dvb.o firedtv-fe.o firedtv-fw.o | ||
| 4 | firedtv-$(CONFIG_DVB_FIREDTV_INPUT) += firedtv-rc.o | ||
| 5 | |||
| 6 | ccflags-y += -Idrivers/media/dvb/dvb-core | ||
diff --git a/drivers/media/dvb/firewire/firedtv-avc.c b/drivers/media/dvb/firewire/firedtv-avc.c new file mode 100644 index 00000000000..489ae824586 --- /dev/null +++ b/drivers/media/dvb/firewire/firedtv-avc.c | |||
| @@ -0,0 +1,1457 @@ | |||
| 1 | /* | ||
| 2 | * FireDTV driver (formerly known as FireSAT) | ||
| 3 | * | ||
| 4 | * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com> | ||
| 5 | * Copyright (C) 2008 Ben Backx <ben@bbackx.com> | ||
| 6 | * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License as | ||
| 10 | * published by the Free Software Foundation; either version 2 of | ||
| 11 | * the License, or (at your option) any later version. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/bug.h> | ||
| 15 | #include <linux/crc32.h> | ||
| 16 | #include <linux/delay.h> | ||
| 17 | #include <linux/device.h> | ||
| 18 | #include <linux/jiffies.h> | ||
| 19 | #include <linux/kernel.h> | ||
| 20 | #include <linux/moduleparam.h> | ||
| 21 | #include <linux/mutex.h> | ||
| 22 | #include <linux/string.h> | ||
| 23 | #include <linux/stringify.h> | ||
| 24 | #include <linux/wait.h> | ||
| 25 | #include <linux/workqueue.h> | ||
| 26 | |||
| 27 | #include <dvb_frontend.h> | ||
| 28 | |||
| 29 | #include "firedtv.h" | ||
| 30 | |||
| 31 | #define FCP_COMMAND_REGISTER 0xfffff0000b00ULL | ||
| 32 | |||
| 33 | #define AVC_CTYPE_CONTROL 0x0 | ||
| 34 | #define AVC_CTYPE_STATUS 0x1 | ||
| 35 | #define AVC_CTYPE_NOTIFY 0x3 | ||
| 36 | |||
| 37 | #define AVC_RESPONSE_ACCEPTED 0x9 | ||
| 38 | #define AVC_RESPONSE_STABLE 0xc | ||
| 39 | #define AVC_RESPONSE_CHANGED 0xd | ||
| 40 | #define AVC_RESPONSE_INTERIM 0xf | ||
| 41 | |||
| 42 | #define AVC_SUBUNIT_TYPE_TUNER (0x05 << 3) | ||
| 43 | #define AVC_SUBUNIT_TYPE_UNIT (0x1f << 3) | ||
| 44 | |||
| 45 | #define AVC_OPCODE_VENDOR 0x00 | ||
| 46 | #define AVC_OPCODE_READ_DESCRIPTOR 0x09 | ||
| 47 | #define AVC_OPCODE_DSIT 0xc8 | ||
| 48 | #define AVC_OPCODE_DSD 0xcb | ||
| 49 | |||
| 50 | #define DESCRIPTOR_TUNER_STATUS 0x80 | ||
| 51 | #define DESCRIPTOR_SUBUNIT_IDENTIFIER 0x00 | ||
| 52 | |||
| 53 | #define SFE_VENDOR_DE_COMPANYID_0 0x00 /* OUI of Digital Everywhere */ | ||
| 54 | #define SFE_VENDOR_DE_COMPANYID_1 0x12 | ||
| 55 | #define SFE_VENDOR_DE_COMPANYID_2 0x87 | ||
| 56 | |||
| 57 | #define SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL 0x0a | ||
| 58 | #define SFE_VENDOR_OPCODE_LNB_CONTROL 0x52 | ||
| 59 | #define SFE_VENDOR_OPCODE_TUNE_QPSK 0x58 /* for DVB-S */ | ||
| 60 | |||
| 61 | #define SFE_VENDOR_OPCODE_GET_FIRMWARE_VERSION 0x00 | ||
| 62 | #define SFE_VENDOR_OPCODE_HOST2CA 0x56 | ||
| 63 | #define SFE_VENDOR_OPCODE_CA2HOST 0x57 | ||
| 64 | #define SFE_VENDOR_OPCODE_CISTATUS 0x59 | ||
| 65 | #define SFE_VENDOR_OPCODE_TUNE_QPSK2 0x60 /* for DVB-S2 */ | ||
| 66 | |||
| 67 | #define SFE_VENDOR_TAG_CA_RESET 0x00 | ||
| 68 | #define SFE_VENDOR_TAG_CA_APPLICATION_INFO 0x01 | ||
| 69 | #define SFE_VENDOR_TAG_CA_PMT 0x02 | ||
| 70 | #define SFE_VENDOR_TAG_CA_DATE_TIME 0x04 | ||
| 71 | #define SFE_VENDOR_TAG_CA_MMI 0x05 | ||
| 72 | #define SFE_VENDOR_TAG_CA_ENTER_MENU 0x07 | ||
| 73 | |||
| 74 | #define EN50221_LIST_MANAGEMENT_ONLY 0x03 | ||
| 75 | #define EN50221_TAG_APP_INFO 0x9f8021 | ||
| 76 | #define EN50221_TAG_CA_INFO 0x9f8031 | ||
| 77 | |||
| 78 | struct avc_command_frame { | ||
| 79 | u8 ctype; | ||
| 80 | u8 subunit; | ||
| 81 | u8 opcode; | ||
| 82 | u8 operand[509]; | ||
| 83 | }; | ||
| 84 | |||
| 85 | struct avc_response_frame { | ||
| 86 | u8 response; | ||
| 87 | u8 subunit; | ||
| 88 | u8 opcode; | ||
| 89 | u8 operand[509]; | ||
| 90 | }; | ||
| 91 | |||
| 92 | #define LAST_OPERAND (509 - 1) | ||
| 93 | |||
| 94 | static inline void clear_operands(struct avc_command_frame *c, int from, int to) | ||
| 95 | { | ||
| 96 | memset(&c->operand[from], 0, to - from + 1); | ||
| 97 | } | ||
| 98 | |||
| 99 | static void pad_operands(struct avc_command_frame *c, int from) | ||
| 100 | { | ||
| 101 | int to = ALIGN(from, 4); | ||
| 102 | |||
| 103 | if (from <= to && to <= LAST_OPERAND) | ||
| 104 | clear_operands(c, from, to); | ||
| 105 | } | ||
| 106 | |||
| 107 | #define AVC_DEBUG_READ_DESCRIPTOR 0x0001 | ||
| 108 | #define AVC_DEBUG_DSIT 0x0002 | ||
| 109 | #define AVC_DEBUG_DSD 0x0004 | ||
| 110 | #define AVC_DEBUG_REGISTER_REMOTE_CONTROL 0x0008 | ||
| 111 | #define AVC_DEBUG_LNB_CONTROL 0x0010 | ||
| 112 | #define AVC_DEBUG_TUNE_QPSK 0x0020 | ||
| 113 | #define AVC_DEBUG_TUNE_QPSK2 0x0040 | ||
| 114 | #define AVC_DEBUG_HOST2CA 0x0080 | ||
| 115 | #define AVC_DEBUG_CA2HOST 0x0100 | ||
| 116 | #define AVC_DEBUG_APPLICATION_PMT 0x4000 | ||
| 117 | #define AVC_DEBUG_FCP_PAYLOADS 0x8000 | ||
| 118 | |||
| 119 | static int avc_debug; | ||
| 120 | module_param_named(debug, avc_debug, int, 0644); | ||
| 121 | MODULE_PARM_DESC(debug, "Verbose logging (none = 0" | ||
| 122 | ", FCP subactions" | ||
| 123 | ": READ DESCRIPTOR = " __stringify(AVC_DEBUG_READ_DESCRIPTOR) | ||
| 124 | ", DSIT = " __stringify(AVC_DEBUG_DSIT) | ||
| 125 | ", REGISTER_REMOTE_CONTROL = " __stringify(AVC_DEBUG_REGISTER_REMOTE_CONTROL) | ||
| 126 | ", LNB CONTROL = " __stringify(AVC_DEBUG_LNB_CONTROL) | ||
| 127 | ", TUNE QPSK = " __stringify(AVC_DEBUG_TUNE_QPSK) | ||
| 128 | ", TUNE QPSK2 = " __stringify(AVC_DEBUG_TUNE_QPSK2) | ||
| 129 | ", HOST2CA = " __stringify(AVC_DEBUG_HOST2CA) | ||
| 130 | ", CA2HOST = " __stringify(AVC_DEBUG_CA2HOST) | ||
| 131 | "; Application sent PMT = " __stringify(AVC_DEBUG_APPLICATION_PMT) | ||
| 132 | ", FCP payloads = " __stringify(AVC_DEBUG_FCP_PAYLOADS) | ||
| 133 | ", or a combination, or all = -1)"); | ||
| 134 | |||
| 135 | /* | ||
| 136 | * This is a workaround since there is no vendor specific command to retrieve | ||
| 137 | * ca_info using AVC. If this parameter is not used, ca_system_id will be | ||
| 138 | * filled with application_manufacturer from ca_app_info. | ||
| 139 | * Digital Everywhere have said that adding ca_info is on their TODO list. | ||
| 140 | */ | ||
| 141 | static unsigned int num_fake_ca_system_ids; | ||
| 142 | static int fake_ca_system_ids[4] = { -1, -1, -1, -1 }; | ||
| 143 | module_param_array(fake_ca_system_ids, int, &num_fake_ca_system_ids, 0644); | ||
| 144 | MODULE_PARM_DESC(fake_ca_system_ids, "If your CAM application manufacturer " | ||
| 145 | "does not have the same ca_system_id as your CAS, you can " | ||
| 146 | "override what ca_system_ids are presented to the " | ||
| 147 | "application by setting this field to an array of ids."); | ||
| 148 | |||
| 149 | static const char *debug_fcp_ctype(unsigned int ctype) | ||
| 150 | { | ||
| 151 | static const char *ctypes[] = { | ||
| 152 | [0x0] = "CONTROL", [0x1] = "STATUS", | ||
| 153 | [0x2] = "SPECIFIC INQUIRY", [0x3] = "NOTIFY", | ||
| 154 | [0x4] = "GENERAL INQUIRY", [0x8] = "NOT IMPLEMENTED", | ||
| 155 | [0x9] = "ACCEPTED", [0xa] = "REJECTED", | ||
| 156 | [0xb] = "IN TRANSITION", [0xc] = "IMPLEMENTED/STABLE", | ||
| 157 | [0xd] = "CHANGED", [0xf] = "INTERIM", | ||
| 158 | }; | ||
| 159 | const char *ret = ctype < ARRAY_SIZE(ctypes) ? ctypes[ctype] : NULL; | ||
| 160 | |||
