MIT licensed and maintained by
This version can be pinned in stack with:i2c-bus-0.1.0@sha256:a00be163092c02e1fc93782cd1b25177d325f9d36da269cd3daa13bbc7c81c17,4183

Module documentation for 0.1.0

i2c-bus

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.
  • safe FFI imports so that the calls do not block Haskell concurrency.

Examples

{-# 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.

See tests/GHCI.hs and tests/ssd1306 for more examples.

Example

Changes

CHANGELOG

i2c-bus uses PVP Versioning.

0.1.0 - October 2026

Public release