From ff4a46c278408673ab1dc687e75b880b14916607 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sat, 5 Mar 2016 00:16:12 +0800 Subject: [PATCH] runtime/i2c: make syscalls more ARTIQ-Python-friendly --- artiq/coredevice/exceptions.py | 4 ++++ artiq/runtime/i2c.c | 13 ++++++------- artiq/runtime/i2c.h | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/artiq/coredevice/exceptions.py b/artiq/coredevice/exceptions.py index 05d9d1c29..36314ed1a 100644 --- a/artiq/coredevice/exceptions.py +++ b/artiq/coredevice/exceptions.py @@ -113,3 +113,7 @@ class DDSBatchError(Exception): or when too many commands are batched. """ artiq_builtin = True + +class I2CError(Exception): + """Raised with a I2C transaction fails.""" + artiq_builtin = True diff --git a/artiq/runtime/i2c.c b/artiq/runtime/i2c.c index af8b9bed7..b1cfb733a 100644 --- a/artiq/runtime/i2c.c +++ b/artiq/runtime/i2c.c @@ -1,5 +1,6 @@ #include +#include "artiq_personality.h" #include "rtio.h" #include "i2c.h" @@ -91,7 +92,7 @@ static void i2c_scl_o(int busno, int o) {} #endif -int i2c_init(int busno) +void i2c_init(int busno) { /* Set SCL as output, and high level */ i2c_scl_o(busno, 1); @@ -104,10 +105,8 @@ int i2c_init(int busno) /* Check the I2C bus is ready */ i2c_halfperiod(); i2c_halfperiod(); - if(i2c_sda_i(busno)) - return 1; /* success */ - else - return 0; + if(!i2c_sda_i(busno)) + artiq_raise_from_c("I2CError", "SDA is stuck low") } void i2c_start(int busno) @@ -132,7 +131,7 @@ void i2c_stop(int busno) i2c_halfperiod(); } -int i2c_write(int busno, char b) +int i2c_write(int busno, int b) { int i; @@ -158,7 +157,7 @@ int i2c_write(int busno, char b) return !i2c_sda_i(busno); } -char i2c_read(int busno, int ack) +int i2c_read(int busno, int ack) { int i; char b; diff --git a/artiq/runtime/i2c.h b/artiq/runtime/i2c.h index b30e25706..c7aab6e22 100644 --- a/artiq/runtime/i2c.h +++ b/artiq/runtime/i2c.h @@ -1,10 +1,10 @@ #ifndef __I2C_H #define __I2C_H -int i2c_init(int busno); +void i2c_init(int busno); void i2c_start(int busno); void i2c_stop(int busno); -int i2c_write(int busno, char b); -char i2c_read(int busno, int ack); +int i2c_write(int busno, int b); +int i2c_read(int busno, int ack); #endif