diff options
author | Holger Waechtler <devnull@localhost> | 2003-06-14 20:06:03 +0000 |
---|---|---|
committer | Holger Waechtler <devnull@localhost> | 2003-06-14 20:06:03 +0000 |
commit | 6ab1b6d82dd4695f9640f7a34085057c7ab043c2 (patch) | |
tree | 3e984096b5f8c24cf180f1ba3580bcc2d0f3c73a /linux/drivers/media/dvb/ttpci/ttpci-eeprom.c | |
parent | 07e4c27ee61a298e28ad61b55df67ba81b6a07e2 (diff) | |
download | mediapointer-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.c | 107 |
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; +} + + |