http://cerberus.drazof.com/~beta/i2c-ep93xx.c
I've got this working on my TS7200 at work. I also modified the kernel
so that it's a selectable option in make config or make menuconfig.
Jason
wimpunk wrote:
Can I find this code somewhere on the internet? it would be nice if I
don't have to reformat it :-)
wimpunk.
--- In m("yahoogroups.com","ts-7000");">, "john bogus" m("...","bogusemail98230");"><> wrote:
don't know what happened, thought I posted this yesterday...
I have attached the sample code. I was using gpio14/15 for my i2c
bus. change the 6 defines to change it to what you are using.
this uses the i2c-algo-bit driver which in turn uses the i2c-core
driver, so both of these must be built in to the kernel or loaded as
modules.
PS I know the driver use save_flags/cli/restore_flags rather than
the current method of spin_lock_irqsave / spin_unlock_irqrestore.
just never updated it
//-------------------------------------------------------------------
----------
// $RCSfile: i2c-ep93xx.c,v $
// $Revision: 1.1 $
// See End of File for Modification History
//
/// \brief
/// i2c device driver using the gpio ports on a cirrus Ep93xx
device
//-------------------------------------------------------------------
---------
/// derived from i2c-guide.c
/********************************************************************
****************\
Copyright : Copyright (C) 1995-2000 Simon G. Vogl
Copyright 2002 IDERs Incorporated
File Name : i2c-guide.c
Description : this i2c driver uses the GPIO port B pin 0 and pin
1 on the cs89712.
Notes : To change the bit rate, change the structure
i2c_algo_bit_data
: to 10 10 100
Contact :
License : This source code is free software; you can
redistribute it and/or
modify it under the terms of the GNU General
Public License
version 2 as published by the Free Software
Foundation.
\********************************************************************
****************/
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/string.h> /* for 2.0 kernels to get NULL */
#include <asm/errno.h> /* for 2.0 kernels to get ENODEV */
#include <asm/io.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
/* ----- global defines ---------------------------------------------
-- */
#define DEB(x) /* should be reasonable open, close &c.
*/
#define DEB2(x) /* low level debugging - very slow
*/
#define DEBE(x) x /* error messages
*/
#define I2C_SDA_PORT GPIO_PBDR
#define I2C_SDA_DIR GPIO_PBDDR
#define I2C_SDA_MASK 0x80 /* EGPIO14 (port B bit 6)*/
#define I2C_SCL_PORT GPIO_PBDR
#define I2C_SCL_DIR GPIO_PBDDR
#define I2C_SCL_MASK 0x40 /* EGPIO15 (port B bit 7)*/
#ifndef I2C_HW_B_EP93XX
# define I2C_HW_B_EP93XX 0xffff
#endif
/* ----- local functions --------------------------------------------
------- */
//===================================================================
========
/// \brief write SCL pin
//===================================================================
========
static void bit_ep93xx_setscl(void* data, int state)
{
unsigned long flags;
save_flags(flags);
if (state)
{
cli();
outl(inl(I2C_SCL_DIR) & ~I2C_SCL_MASK,
I2C_SCL_DIR); // tristate pin
outl(inl(I2C_SCL_PORT) | I2C_SCL_MASK,
I2C_SCL_PORT); // drive pin
}
else
{
cli();
outl(inl(I2C_SCL_PORT) & ~I2C_SCL_MASK,
I2C_SCL_PORT); // drive pin
outl(inl(I2C_SCL_DIR) | I2C_SCL_MASK,
I2C_SCL_DIR); // enable pin
}
restore_flags(flags);
}
//===================================================================
========
/// \brief write SCL pin
//===================================================================
========
static void bit_ep93xx_setsda(void* data, int state)
{
unsigned long flags;
save_flags(flags);
if (state) {
cli();
outl(inl(I2C_SDA_PORT) | I2C_SDA_MASK,
I2C_SDA_PORT); // drive pin
outl(inl(I2C_SDA_DIR) & ~I2C_SDA_MASK,
I2C_SDA_DIR); // tristate pin
}
else
{
cli();
outl(inl(I2C_SDA_PORT) & ~I2C_SDA_MASK,
I2C_SDA_PORT); // drive pin
outl(inl(I2C_SDA_DIR) | I2C_SDA_MASK,
I2C_SDA_DIR); // enable pin
}
restore_flags(flags);
}
//===================================================================
========
/// \brief read SCL pin
//===================================================================
========
static int bit_ep93xx_getscl(void *data)
{
return ( (inl(I2C_SCL_PORT) & I2C_SCL_MASK) != 0);
}
//===================================================================
========
/// \brief read SDA pin
//===================================================================
========
static int bit_ep93xx_getsda(void *data)
{
return ( (inl(I2C_SDA_PORT) & I2C_SDA_MASK) != 0 );
}
static int bit_ep93xx_reg(struct i2c_client *client)
{
return 0;
}
static int bit_ep93xx_unreg(struct i2c_client *client)
{
return 0;
}
static void bit_ep93xx_inc_use(struct i2c_adapter *adap)
{
#ifdef MODULE
MOD_INC_USE_COUNT;
#endif
}
static void bit_ep93xx_dec_use(struct i2c_adapter *adap)
{
#ifdef MODULE
MOD_DEC_USE_COUNT;
#endif
}
/* ------------------------------------------------------------------
------
* Encapsulate the above functions in the correct operations
structure.
* This is only done when more than one hardware adapter is
supported.
*/
/* last line (us, ms, timout)
* us dominates the bit rate: 10us means: 100Kbit/sec(25 means
40kbps)
* 10ms not known
* 100ms timeout
*/
static struct i2c_algo_bit_data bit_ep93xx_data = {
NULL,
bit_ep93xx_setsda,
bit_ep93xx_setscl,
bit_ep93xx_getsda,
bit_ep93xx_getscl,
/* bit delay us */ 30,
/* byte delay ms (not used?) */ 10 ,
/* bit timeout in jiffies (us) (may be reset by algo)*/ 100,
};
static struct i2c_adapter bit_ep93xx_ops = {
"ep93xx I2C",
I2C_HW_B_EP93XX,
NULL,
&bit_ep93xx_data,
bit_ep93xx_inc_use,
bit_ep93xx_dec_use,
bit_ep93xx_reg,
bit_ep93xx_unreg,
};
//===================================================================
========
//===================================================================
========
static int __init i2c_ep93xx_init(void)
{
printk(KERN_DEBUG"i2c-ep93xx.o: i2c driver init.\n");
// set SCL/SDA to 1 (input)
bit_ep93xx_setscl(NULL, 1);
bit_ep93xx_setsda(NULL, 1);
if(i2c_bit_add_bus(&bit_ep93xx_ops) < 0)
return -ENODEV;
return 0;
}
//===================================================================
========
//===================================================================
========
static void __exit i2c_ep93xx_exit(void)
{
}
EXPORT_NO_SYMBOLS;
MODULE_AUTHOR("msw
MODULE_DESCRIPTION("I2C-Bus routines for EP93xx");
MODULE_LICENSE("GPL");
module_init(i2c_ep93xx_init);
module_exit(i2c_ep93xx_exit);
//-------------------------------------------------------------------
-----------
// Modification History:
// $Log: i2c-ep93xx.c,v $
// Revision 1.1 2006/01/27 02:06:18 msw
// creation
//
//
//-------------------------------------------------------------------
-----------
--- In m("yahoogroups.com","ts-7000");">, linux@ wrote:
Thanks, I was hoping it would be easy. If you have code I can look
at, I would
be very happy to have it. I am just getting ready to get the
board, and trying
to nail down the software requirements for my first application.
Tom
Quoting john bogus <bogusemail98230@>:
--- In m("yahoogroups.com","ts-7000");">, linux@ wrote:
I am considering serial interface options on a TS-7260. I am
looking at some
sensors with SPI and I2C interfaces. I know I can use the SPI
device, but is
there a way to interface to I2C devices? Fewer wires is a plus
in
this application.
Thanks,
Tom
worse case -> you write the adpter driver to use the gpio pins
(a
small task) on the i2c-algo-bit algorithm drivers. This will
use
two gpio pins to bit-bash the i2c tansactions.
see Documentation/i2c/summary in the linux tree for references.
If you need it I can provide some sample code.
------------------------ Yahoo! Groups Sponsor --------------------~-->
Something is new at Yahoo! Groups. Check out the enhanced email design.
http://us.click.yahoo.com/kOt0.A/gOaOAA/yQLSAA/CFFolB/TM
--------------------------------------------------------------------~->
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/ts-7000/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/ts-7000/join
(Yahoo! ID required)
<*> To change settings via email:
m("yahoogroups.com","ts-7000-digest");">
m("yahoogroups.com","ts-7000-fullfeatured");">
<*> To unsubscribe from this group, send an email to:
m("yahoogroups.com","ts-7000-unsubscribe");">
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
__._,_.___
SPONSORED LINKS
__,_._,___
|
|