summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c
diff options
context:
space:
mode:
authorHolger Waechtler <devnull@localhost>2003-06-14 20:06:03 +0000
committerHolger Waechtler <devnull@localhost>2003-06-14 20:06:03 +0000
commit6ab1b6d82dd4695f9640f7a34085057c7ab043c2 (patch)
tree3e984096b5f8c24cf180f1ba3580bcc2d0f3c73a /linux/drivers/media/dvb/ttpci/ttpci-eeprom.c
parent07e4c27ee61a298e28ad61b55df67ba81b6a07e2 (diff)
downloadmediapointer-dvb-s2-6ab1b6d82dd4695f9640f7a34085057c7ab043c2.tar.gz
mediapointer-dvb-s2-6ab1b6d82dd4695f9640f7a34085057c7ab043c2.tar.bz2
i2c fixes and build fixes. Must have been brain-amputated yesterday...
Diffstat (limited to 'linux/drivers/media/dvb/ttpci/ttpci-eeprom.c')
-rw-r--r--linux/drivers/media/dvb/ttpci/ttpci-eeprom.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c b/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c
new file mode 100644
index 000000000..aa9c68f0b
--- /dev/null
+++ b/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c
@@ -0,0 +1,107 @@
+/*
+ Retrieve encoded MAC address from ATMEL ttpci_eeprom serial 2-wire EEPROM,
+ decode it and store it in associated adapter net device
+
+ Robert Schlabbach GMX
+ Michael Glaum KVH Industries
+ Holger Waechtler Convergence
+
+ 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <asm/errno.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/string.h>
+
+#include "dvb_i2c.h"
+#include "dvb_functions.h"
+
+#if 0
+#define dprintk(x...) printk(x)
+#else
+#define dprintk(x...)
+#endif
+
+
+static
+int ttpci_eeprom_read_encodedMAC (struct dvb_i2c_bus *i2c, u8 * encodedMAC )
+{
+ int ret;
+ u8 b0 [] = { 0xd4 };
+ struct i2c_msg msg [] = { { addr: 0x50, flags: 0, buf: b0, len: 1 },
+ { addr: 0x50, flags: I2C_M_RD, buf: encodedMAC, len: 6 } };
+
+ dprintk ("%s\n", __FUNCTION__);
+
+ ret = i2c->xfer (i2c, msg, 2);
+
+ if (ret != 2) // Assume EEPROM isn't there
+ return( -ENODEV );
+
+ return 0;
+}
+
+static
+void decodeMAC (u8 *decodedMAC, const u8* encodedMAC)
+{
+ u8 ormask0[3] = { 0x54, 0x7B, 0x9E };
+ u8 ormask1[3] = { 0xD3, 0xF1, 0x23 };
+ u8 low;
+ u8 high;
+ u8 shift;
+ int i;
+
+ decodedMAC[0] = 0x00;
+ decodedMAC[1] = 0xD0;
+ decodedMAC[2] = 0x5C;
+
+ for (i=0; i<3; i++) {
+ low = encodedMAC[ 2*i ] ^ ormask0[i];
+ high = encodedMAC[ 2*i+1 ] ^ ormask1[i];
+ shift = ( high >> 6 ) & 0x3;
+
+ decodedMAC[5-i] = ((high<<8) | low) >> shift;
+ }
+
+}
+
+
+int ttpci_eeprom_parse_mac (struct dvb_i2c_bus *i2c)
+{
+ int ret;
+ u8 encodedMAC[6];
+ u8 decodedMAC[6];
+
+ ret = ttpci_eeprom_read_encodedMAC(i2c, encodedMAC);
+
+ if (ret != 0) { // Will only be -ENODEV
+ dprintk("Couldn't read from EEPROM: not there?\n");
+ return ret;
+ }
+
+ decodeMAC(decodedMAC, encodedMAC);
+ memcpy(i2c->adapter->proposed_mac, decodedMAC, 6);
+
+ dprintk("%s adapter %i has MAC addr = %x:%x:%x:%x:%x:%x\n",
+ i2c->adapter->name, i2c->adapter->num,
+ decodedMAC[0],decodedMAC[1],decodedMAC[2],
+ decodedMAC[3],decodedMAC[4],decodedMAC[5]);
+
+ return 0;
+}
+
+