i2c-algo-biths uncovered

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



My unfinished thoughts about the unfinished i2c-algo-biths driver.
So to say, in bottom-to-top order.

Create an imaginary RISC machine with registers for control, errors,
timer and a shift register. This is within struct i2c_algo_biths.

To change the state of bus lines, we must program control and timer
register, and start the machine. This is essentially done with macro
definitions _setscl and _setsda,

Actual setting and reading of bus states with requested timing is
in i2c_setscl, i2c_getscl, i2c_setsda and i2c_getsda.
If timeout, bus lockup or SDA arbitration occurs, a respective error
flag is set and machine may enter recovery routine (Stop's) or idle bus
after SDA arbitration.

Four functions are then implemented:

i2c_start : pulse Start
i2c_stop  : pulse Stop
i2c_outbits : clock number of bits out of shift register
i2c_inbits : clock number of bits into shift register

Two more functions to transfer byte and acknowledge, using i2c_outbits
and i2c_inbits above:

i2c_outb : output 8, input 1 bit  -- "master transmit"
i2c_inb : input 8, output 1 bit  -- "master receive"

Finally, there is a state machine that calls i2c_{start,outb,inb,stop}
to output an i2c message and do error recovery.

If someone dares to ask, I'll explain about the signal timing and
choices for use of udelay.

-- 
  Ky?sti M?lkki  <kyosti.malkki at welho.com>  +358 50 462 8786



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux