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