ts-7000
[Top] [All Lists]

[ts-7000] Re: Using I2C interface

To:
Subject: [ts-7000] Re: Using I2C interface
From: "wimpunk" <>
Date: Tue, 13 Mar 2007 13:13:13 -0000
Can I find this code somewhere on the internet? it would be nice if I
don't have to reformat it :-)


wimpunk.

--- In  "john bogus" <> 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  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  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:
     
    

<*> To unsubscribe from this group, send an email to:
    

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
 

<Prev in Thread] Current Thread [Next in Thread>
Admin

Disclaimer: Neither Andrew Taylor nor the University of NSW School of Computer and Engineering take any responsibility for the contents of this archive. It is purely a compilation of material sent by many people to the birding-aus mailing list. It has not been checked for accuracy nor its content verified in any way. If you wish to get material removed from the archive or have other queries about the archive e-mail Andrew Taylor at this address: andrewt@cse.unsw.EDU.AU