ts-7000
[Top] [All Lists]

Re: [ts-7000] Re: Using I2C interface

To:
Subject: Re: [ts-7000] Re: Using I2C interface
From: Jason Stahls <>
Date: Tue, 13 Mar 2007 11:17:02 -0400
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
Single board computer Hardware Computer running slow
Linux os Single board

Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required)
Change settings via email: =Email Delivery: Digest | m("yahoogroups.com?subject","ts-7000-fullfeatured");=Change Delivery Format: Fully Featured">Switch to Fully Featured
Visit Your Group | Yahoo! Groups Terms of Use | =Unsubscribe

__,_._,___
<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