summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-18 23:28:56 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-18 23:28:56 +0100
commit38ae014e4258811d1612f9e140a35f8f9aa0ddb8 (patch)
tree2894967f48f3744515ad134f362337a3e2f64d82
parent71e9bfa20dd02457e73c2bec85102b6faf527a33 (diff)
downloadmicropython-38ae014e4258811d1612f9e140a35f8f9aa0ddb8.tar.gz
micropython-38ae014e4258811d1612f9e140a35f8f9aa0ddb8.zip
stmhal: Update ADC, DAC and I2C objects to use new buffer protocol.
Main reason for expanding buffer protocol API was to support writes to a buffer in ADC module (see read_timed). With this change you can now create an array of arbitrary type and ADC.read_timed will store into that array in the correct format (byte, int, float). I wonder though if all these changes were really worth it to support just this function. Hopefully this enhanced buffer protocol API (with typecode specified) will be used elsewhere.
-rw-r--r--stmhal/adc.c16
-rw-r--r--stmhal/dac.c4
-rw-r--r--stmhal/i2c.c8
-rw-r--r--stmhal/math.c4
4 files changed, 21 insertions, 11 deletions
diff --git a/stmhal/adc.c b/stmhal/adc.c
index 78f0820d69..be83b03ad7 100644
--- a/stmhal/adc.c
+++ b/stmhal/adc.c
@@ -8,6 +8,7 @@
#include "qstr.h"
#include "obj.h"
#include "runtime.h"
+#include "binary.h"
#include "adc.h"
#include "pin.h"
#include "genhdr/pins.h"
@@ -166,8 +167,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(adc_read_obj, adc_read);
STATIC mp_obj_t adc_read_timed(mp_obj_t self_in, mp_obj_t buf_in, mp_obj_t freq_in) {
pyb_obj_adc_t *self = self_in;
- buffer_info_t bufinfo;
- mp_get_buffer_raise(buf_in, &bufinfo);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_WRITE);
+ int typesize = mp_binary_get_size(bufinfo.typecode);
// Init TIM6 at the required frequency (in Hz)
timer_tim6_init(mp_obj_get_int(freq_in));
@@ -176,13 +178,17 @@ STATIC mp_obj_t adc_read_timed(mp_obj_t self_in, mp_obj_t buf_in, mp_obj_t freq_
HAL_TIM_Base_Start(&TIM6_Handle);
// This uses the timer in polling mode to do the sampling
- // TODO use DMA
- for (uint i = 0; i < bufinfo.len; i++) {
+ // We could use DMA, but then we can't convert the values correctly for the buffer
+ for (uint index = 0; index < bufinfo.len; index++) {
// Wait for the timer to trigger
while (__HAL_TIM_GET_FLAG(&TIM6_Handle, TIM_FLAG_UPDATE) == RESET) {
}
__HAL_TIM_CLEAR_FLAG(&TIM6_Handle, TIM_FLAG_UPDATE);
- ((byte*)bufinfo.buf)[i] = adc_read_channel(&self->handle) >> 4;
+ uint value = adc_read_channel(&self->handle);
+ if (typesize == 1) {
+ value >>= 4;
+ }
+ mp_binary_set_val_array_from_int(bufinfo.typecode, bufinfo.buf, index, value);
}
// Stop timer
diff --git a/stmhal/dac.c b/stmhal/dac.c
index c018a4046a..5b2d17d889 100644
--- a/stmhal/dac.c
+++ b/stmhal/dac.c
@@ -169,8 +169,8 @@ mp_obj_t pyb_dac_dma(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
// set TIM6 to trigger the DAC at the given frequency
TIM6_Config(mp_obj_get_int(args[2]));
- buffer_info_t bufinfo;
- mp_get_buffer_raise(args[1], &bufinfo);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
__DMA1_CLK_ENABLE();
diff --git a/stmhal/i2c.c b/stmhal/i2c.c
index 780d4fb498..4bbfec3ea8 100644
--- a/stmhal/i2c.c
+++ b/stmhal/i2c.c
@@ -163,8 +163,8 @@ STATIC mp_obj_t pyb_i2c_write(mp_obj_t self_in, mp_obj_t i2c_addr_in, mp_obj_t d
uint8_t data[1] = {mp_obj_get_int(data_in)};
status = HAL_I2C_Master_Transmit(self->i2c_handle, i2c_addr, data, 1, 500);
} else {
- buffer_info_t bufinfo;
- mp_get_buffer_raise(data_in, &bufinfo);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
status = HAL_I2C_Master_Transmit(self->i2c_handle, i2c_addr, bufinfo.buf, bufinfo.len, 500);
}
@@ -209,8 +209,8 @@ STATIC mp_obj_t pyb_i2c_mem_write(uint n_args, const mp_obj_t *args) {
uint8_t data[1] = {mp_obj_get_int(args[3])};
status = HAL_I2C_Mem_Write(self->i2c_handle, i2c_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, data, 1, 200);
} else {
- buffer_info_t bufinfo;
- mp_get_buffer_raise(args[3], &bufinfo);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
status = HAL_I2C_Mem_Write(self->i2c_handle, i2c_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, bufinfo.buf, bufinfo.len, 200);
}
diff --git a/stmhal/math.c b/stmhal/math.c
index 75a5aeb2ee..5fb9c4ba16 100644
--- a/stmhal/math.c
+++ b/stmhal/math.c
@@ -20,6 +20,10 @@ typedef union {
};
} double_s_t;
+double __attribute__((pcs("aapcs"))) __aeabi_i2d(int32_t x) {
+ return (float)x;
+}
+
double __attribute__((pcs("aapcs"))) __aeabi_f2d(float x) {
float_s_t fx={0};
double_s_t dx={0};