hackers at dino.sk
Thu Mar 16 13:10:46 UTC 2006
On Thursday 16 March 2006 13:06, Artem 'ZaZooBred' Ignatiev wrote:
> > > 2. SAA7146 uses I2C to communicate with tuners, and I know that there
> > > are some I2C-related peaces already in kernel. I would like to reuse
> > > that code, if possible, but can't figure out where to look and how to
> > > link it in.
> > There is some basis for i2c, look in /usr/src/sys/dev/iicbus directory.
> > There are two kinds of i2c controllers - bit banged and full hardware
> > controlled. The former is easily usable, you need just set and query
> > methods implementation (look into iicbb_if.m), even if this has not the
> > full i2c potential, the latter is (at least for me) somewhat hard to
> > understand. I tried to implement such driver with Geode's Access.BUS
> > controller, but so far no luck. And no description, google does not help
> > me either.
> > If SAA7146 uses bit banging interface or can be forced into such mode,
> > you can do it in small amount of time.
> I had looked at both iicbb_if.m and iicbus_if.m.
> SAA has internal logic to handle IIC, so iicbb was of no interest to me.
> As to iicbus_if.m, it way closer to what I want.
i2c subsystem in FreeBSD is somewhat SMBus oriented. Look at iicsmb, smbus and
smb manpages. iicbus class implements just basic primitives.
> It looks like linux is one layer of abstraction higher, so they have
> "send N i2c messages" kind of functions, and in case of these cards,
> logic is like that:
> get array of messages, pack them into dwords, transfer that dwords using
> DMA to card, read that dwords back and decode them into response. All
> START/STOP conditions are handled by SAA chip itself, and I hoped that
> there was something similar in other drivers, so there's no need to
> reinvent the wheel for me.
There is substantial difference - FreeBSD is modularised, linux (and NetBSD
and OpenBSD as well, if I looked there at rught places) somehow makes i2c
drivers monolithic, with code duplicated over all drivers. FreeBSD lacks this
'top-level' i2c-exec function.
> > > 3. Card vendors use different PCI_SUBDEVICE on SAA7146 to indicate
> > > which tuner is (possibly) used. So, I suppose that "bus"-driver shall
> > > provide some way to tuner-driver to get this information. How that can
> > > be done?
> > This is not that easy to understand at first, but bus 'ivars' are
> > intended for this purpose. man device_get_ivars would be first step as it
> > was for me to understand this.
> Yeah, that told me to look into BUS_READ_IVAR(9), and it looks like
> something I can use, so now my question is reformed to ``how can I from
> child driver get the bus device_t''.
Look into bus_if.m - child devices are added using device_add_child. And there
is device_get_parent... Oh, and maybe pcf device is similar to SAA7146 and
may give you an idea on i2c driver implementation...
Please reply only to mailing list. This address is filtered.
More information about the freebsd-hackers