Subject: Re: i2c 10-bit addressing support
To: Garrett D'Amore <garrett_damore@tadpole.com>
From: Jason Thorpe <thorpej@shagadelic.org>
List: tech-kern
Date: 07/13/2006 17:21:17
On Jul 13, 2006, at 3:42 PM, Garrett D'Amore wrote:

> A while ago I posted this diff.  Posting again.  If nobody responds,
> then I will just drop it on the floor, and it will never get  
> committed.
>
> This adds full addressing (10-bit) support to the i2c bitbang  
> support in
> NetBSD.  I don't have any 10-bit devices, so I cannot test, but it
> doesn't seem to break 7-bit addressing at least:

If it doesn't break anything, just check it in.


>
>
> Index: dev/i2c/i2c_bitbang.c
> ===================================================================
> RCS file: /cvsroot/src/sys/dev/i2c/i2c_bitbang.c,v
> retrieving revision 1.3
> diff -u -r1.3 i2c_bitbang.c
> --- dev/i2c/i2c_bitbang.c       5 Mar 2006 17:33:33 -0000       1.3
> +++ dev/i2c/i2c_bitbang.c       13 Jul 2006 22:39:49 -0000
> @@ -1,4 +1,4 @@
> -/*     $NetBSD: i2c_bitbang.c,v 1.3 2006/03/05 17:33:33 christos  
> Exp $ */
> +/*     $NetBSD: i2c_bitbang.c,v 1.3.8.1 2006/07/13 17:49:22  
> gdamore Exp
> $     *
> /
>
>  /*
>   * Copyright (c) 2003 Wasabi Systems, Inc.
> @@ -88,16 +88,39 @@
>  i2c_bitbang_initiate_xfer(void *v, i2c_addr_t addr, int flags,
>      i2c_bitbang_ops_t ops)
>  {
> -       int i2caddr;
>
> -       /* XXX Only support 7-bit addressing for now. */
> -       if ((addr & 0x78) == 0x78)
> -               return (EINVAL);
> +       if (addr < 0x80) {
> +               uint8_t i2caddr;
>
> -       i2caddr = (addr << 1) | ((flags & I2C_F_READ) ? 1 : 0);
> +               /* disallow the 10-bit address prefix */
> +               if ((addr & 0x78) == 0x78)
> +                       return EINVAL;
> +               i2caddr = (addr << 1) | ((flags & I2C_F_READ) ? 1 :  
> 0);
> +               (void) i2c_bitbang_send_start(v, flags, ops);
> +
> +               return (i2c_bitbang_write_byte(v, i2caddr,
> +                           flags & ~I2C_F_STOP, ops));
> +
> +       } else if (addr < 0x400) {
> +               uint16_t        i2caddr;
> +               int             rv;
> +
> +               i2caddr = (addr << 1) | ((flags & I2C_F_READ) ? 1 :  
> 0) |
> +                   0xf000;
> +
> +               (void) i2c_bitbang_send_start(v, flags, ops);
> +               rv = i2c_bitbang_write_byte(v, i2caddr >> 8,
> +                   flags & ~I2C_F_STOP, ops);
> +               /* did a slave ack the 10-bit prefix? */
> +               if (rv != 0)
> +                       return rv;
> +
> +               /* send the lower 7-bits (+ read/write mode) */
> +               return (i2c_bitbang_write_byte(v, i2caddr & 0xff,
> +                           flags & ~I2C_F_STOP, ops));
>
> -       (void) i2c_bitbang_send_start(v, flags, ops);
> -       return (i2c_bitbang_write_byte(v, i2caddr, flags &  
> ~I2C_F_STOP,
> ops));
> +       } else
> +               return EINVAL;
>  }
>
>  int
>
> -- 
> Garrett D'Amore, Principal Software Engineer
> Tadpole Computer / Computing Technologies Division,
> General Dynamics C4 Systems
> http://www.tadpolecomputer.com/
> Phone: 951 325-2134  Fax: 951 325-2191

-- thorpej