how to use iic(4)

Ian Smith smithi at
Tue Sep 25 22:15:39 PDT 2007

On Mon, 24 Sep 2007, John-Mark Gurney wrote:
 > Ian Smith wrote this message on Sat, Sep 22, 2007 at 13:16 +1000:
 > > This drew a blank in -questions.  I don't know where else to post it, so
 > > I'm hoping someone here might be able to spare me a clue.
 > You should probably have posted this question to -hackers instead..
 > This is more low level hardware than networking...

Ok, and thanks heaps for your response.  I'll follow -hackers on the web
on this, but really can't deal with any more subscribed lists just now.

I should also confess straight up that C is pretty much read-only for
me, I'm most at home with assembler (though not x86) and other languages
perhaps best not mentioned in polite -hackers company .. best I can
manage in C is a bit of hacking on existing code frameworks and such.

 > > We're building a small board with two AVR Tiny MCUs chatting to each
 > > other over an opto-isolated I2C-compatible bus, hopefully at 400kbps.
 > > 
 > > Hoping to use the iicbb(4) on lpbb(4) parallel port interface to talk
 > > with either of these MCUs for debugging, control and data acquisition.
 > > 
 > > iic(4) says:
 > >  =======
 > >  The iic character device driver provides generic i/o to any iicbus(4)
 > >  instance.  In order to control I2C devices, use /dev/iic? with the fol-
 > >  lowing ioctls:
 > > 
 > >  Ioctl         Description
 > >  I2CSTART      send start condition to the specified device (with 7-bit
 > >                address) on the bus
 > >  I2CSTOP       send stop condition to the bus
 > >  I2CRSTCARD    reset the bus
 > > 
 > >  You may also use read/write routines, then I2C start/stop handshake is
 > >  managed by the iicbus system.
 > >  =======
 > > 
 > > Does the latter statement suggest that ordinary reads from or writes to
 > > /dev/iic? could be performed by redirection of say echo and read from a
 > > script?  Or is the device only accessible by ioctl from eg a C program?
 > No, as you need to select (via I2CSTART) the slave device you are talking
 > w/ before you do a read or a write...

Ah right, then I did indeed misinterpret that last sentence quoted
above, and need to study that code in depth .. I've only skimmed so far.

 > > Secondly, how does /dev/iic? come to exist?  This 5.5-STABLE system
 > > seems to have all the requisite drivers, but there's no /dev/iic*:
 > > paqi% kldstat -v | egrep 'iic|lpbb'
 > >                 29 iicbus/ic
 > >                 30 iicbus/iic
 > >                 31 bktr/iicbb
 > >                 32 lpbb/iicbb
 > >                 33 viapm/iicbb
 > >                 34 pcf/iicbus
 > >                 35 envctrl/iicbus
 > >                 36 iicbb/iicbus
 > >                 37 bti2c/iicbus
 > >                 38 iicbus/iicsmb
 > >                 86 iicsmb/smbus
 > >  12    1 0xc2456000 3000     lpbb.ko
 > >                 247 ppbus/lpbb
 > You need to have a device that connects between your i2c bus hardware
 > and iicbb or iicbus...  I'm not familar w/ lpbb, but I have used
 > /dev/iic? w/ some HD capture card drivers I've written, and they are
 > created when the device driver probes them...  lpbb may need hints to
 > get it to attach, or may need a properly functioning parallel port..

I have the latter, but as you see I kldloaded lbpp; maybe it needs to be
compiled in kernel.  Nothing obvious in device.hints.  I'll do some more
research, now that you've increased my confidence that this should be
doable, and that there's at least one somebody to hassle for details :)

 > > Also, iicbb(4) is said to be a master-only interface.  I can work with
 > > that, but if anyone knows of any iicbus slave-mode code I'm all eyes ..
 > That's even more complicated as you either need specialized hardware
 > that will detect when your i2c address is on the bus, or you need to
 > poll/interrupt on line changes, which could get a bit expensive...

Thought as much.  pcf(4) looked promising, but it's apparently only for
the isa bus, or at least was at the time this was written.

 > I have a command line iic program that I used to help debug my drivers..
 > The tool lets you start and then read/write from the device, and then
 > stop the bus...

Pretty much exactly what I need, sounds like!

 > I haven't committed it yet, because a few other developers want it under
 > tools, and I don't like it there, as no one knows about most of the
 > tools under there...  Maybe if we had a man page that talked about the
 > tools available there it'd be more attractive...

Any chance of a sneak preview, John-Mark?  Promise I won't break it ..

Cheers, Ian

More information about the freebsd-hackers mailing list