Library for typed I2C communication with utilities for working with registers.
Importing the module I2C will typically give you everything you need unless
you need access to low level functionality provided by your backend.
Features
Connections to chips on I2C buses.
An exception type I2CErr.
A module I2C.Raw to perform direct write and read using Storable types.
A module I2C.Register to work with chips that use registers.
Types for binary serialization between host architecture and chip hardware.
Handy utilities through Template Haskell to define chips, registers and
(sub)fields of registers.
Settings to control the code generation by Template Haskell.
An API specification for backend implementations. Currently, there is only
a Linux backend implemented.
{-# LANGUAGE TemplateHaskell #-}
import I2C
$(chip "PCF8575")
testPCF8575 :: IO ()
testPCF8575 = do
chip <- openChip @PCF8575 "/dev/i2c-1" 0x20
forM_ [0..0x00FF] $ \ix -> do
rawwrite @Word16LE chip ix
threadDelay 400000
$(chip "MYCHIP")
$(register8 ''MYCHIP 0x22 "MY8" 0x83)
-- ^ a register of type 'Word8' named MY8 at address 0x22 with default
-- value 0x83. this generates a type 'MY8' and a value
-- 'regMY8 :: Register MYCHIP MY8'
$(field ''MY8 "A_FIELD" "0000***0")
-- ^ MY8 contains a 3 bit (sub)field named A_FIELD. this generates a
-- type 'A_FIELD' with get and set functions over the 'MY8' type.
$(field ''MY8 "A_BIT" "00*00000")
-- ^ MY8 also has a one bit field named A_BIT. this generates a type
-- 'A_BIT' with get and set functions over the 'MY8' type, and
-- additional functions for bit manipulation (bitset, bitclear, bittoggle).
$(register ''MYCHIP 0x33 "MY_A" ''A)
-- ^ a register of type 'A' named MY_A at address 0x33.
-- this generates a value 'regMY_A :: Register MYCHIP A'. the type
-- 'A' must be an instance of 'Storable', and its implementation has to
-- be relative to the chip hardware.