aboutsummaryrefslogtreecommitdiff
path: root/hsm-battery/Hsm/Battery/FFI.hsc
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2025-12-13 22:20:41 +0100
committerPaul Oliver <contact@pauloliver.dev>2025-12-13 22:20:41 +0100
commit10078d83ce910ddfee311964766c5042c38d3763 (patch)
tree0ee519efa9050c9c5731729be72b94bb529bb3af /hsm-battery/Hsm/Battery/FFI.hsc
parent459d2c5630e1296807bbf23fd4360fb4d4f5bbe7 (diff)
Adds battery monitoring service via INA226/I2Cbattery_monitoring
Diffstat (limited to 'hsm-battery/Hsm/Battery/FFI.hsc')
-rw-r--r--hsm-battery/Hsm/Battery/FFI.hsc58
1 files changed, 58 insertions, 0 deletions
diff --git a/hsm-battery/Hsm/Battery/FFI.hsc b/hsm-battery/Hsm/Battery/FFI.hsc
new file mode 100644
index 0000000..3ccb5c1
--- /dev/null
+++ b/hsm-battery/Hsm/Battery/FFI.hsc
@@ -0,0 +1,58 @@
+{-# LANGUAGE CApiFFI #-}
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hsm.Battery.FFI
+ ( I2CMsg (..)
+ , I2CRdWrIoctlData (..)
+ , i2cRdWr
+ , i2cMRd
+ , i2cMNoStart
+ , ioctl
+ )
+where
+
+import Data.Word (Word16, Word32, Word8)
+import Foreign.C.Types (CInt (CInt))
+import Foreign.CStorable (CStorable, cAlignment, cPeek, cPoke, cSizeOf)
+import Foreign.Ptr (Ptr)
+import Foreign.Storable (Storable (..))
+import GHC.Generics (Generic)
+import System.Posix.Types (Fd (Fd))
+
+data I2CMsg = I2CMsg
+ { addr :: Word16
+ , flags :: Word16
+ , len :: Word16
+ , buf :: Ptr Word8
+ }
+ deriving (CStorable, Generic, Show)
+
+instance Storable I2CMsg where
+ sizeOf = cSizeOf
+ alignment = cAlignment
+ poke = cPoke
+ peek = cPeek
+
+data I2CRdWrIoctlData = I2CRdWrIoctlData
+ { msgs :: Ptr I2CMsg
+ , nmsgs :: Word32
+ }
+ deriving (CStorable, Generic, Show)
+
+instance Storable I2CRdWrIoctlData where
+ sizeOf = cSizeOf
+ alignment = cAlignment
+ poke = cPoke
+ peek = cPeek
+
+foreign import capi safe "linux/i2c-dev.h value I2C_RDWR"
+ i2cRdWr :: Int
+
+foreign import capi safe "linux/i2c.h value I2C_M_RD"
+ i2cMRd :: Int
+
+foreign import capi safe "linux/i2c.h value I2C_M_NOSTART"
+ i2cMNoStart :: Int
+
+foreign import capi safe "sys/ioctl.h"
+ ioctl :: Fd -> Int -> Ptr a -> IO Int