altos: Add STM I2C recv and stop funcs
authorKeith Packard <keithp@keithp.com>
Thu, 26 Apr 2012 06:26:57 +0000 (23:26 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 26 Apr 2012 06:26:57 +0000 (23:26 -0700)
Recv doesn't appear to work with more than one byte

Signed-off-by: Keith Packard <keithp@keithp.com>
src/stm/ao_arch_funcs.h
src/stm/ao_i2c_stm.c

index 05bb77843ec2ba9081e7a9b92a17e6b1ce1386c2..3027b337fdb7266b19d104ce6c5b786b55aeac23 100644 (file)
@@ -130,6 +130,9 @@ ao_i2c_get(uint8_t i2c_index);
 uint8_t
 ao_i2c_start(uint8_t i2c_index, uint16_t address);
 
+void
+ao_i2c_stop(uint8_t i2c_index);
+
 void
 ao_i2c_put(uint8_t i2c_index);
 
index 1a0280d3ed5d2d59ba7292e2bb963fcc52ac5d67..0717be98164e0cf820b9c3d2f262bdbf59ae325f 100644 (file)
@@ -134,12 +134,22 @@ ao_i2c_start(uint8_t index, uint16_t addr)
        return ao_i2c_state[index] == I2C_RUNNING;
 }
 
+void
+ao_i2c_stop(uint8_t index)
+{
+       struct stm_i2c  *stm_i2c = ao_i2c_stm_info[index].stm_i2c;
+       
+       ao_i2c_state[index] = I2C_IDLE;
+       stm_i2c->cr1 = AO_STM_I2C_CR1 | (1 << STM_I2C_CR1_STOP);
+}
+
 void
 ao_i2c_send(void *block, uint16_t len, uint8_t index)
 {
        struct stm_i2c  *stm_i2c = ao_i2c_stm_info[index].stm_i2c;
        uint8_t         tx_dma_index = ao_i2c_stm_info[index].tx_dma_index;
 
+       stm_i2c->cr2 &= ~(1 << STM_I2C_CR2_LAST);
        ao_dma_set_transfer(tx_dma_index,
                            &stm_i2c->dr,
                            block,
@@ -161,6 +171,34 @@ ao_i2c_send(void *block, uint16_t len, uint8_t index)
        ao_dma_done_transfer(tx_dma_index);
 }
 
+void
+ao_i2c_recv(void *block, uint16_t len, uint8_t index)
+{
+       struct stm_i2c  *stm_i2c = ao_i2c_stm_info[index].stm_i2c;
+       uint8_t         rx_dma_index = ao_i2c_stm_info[index].rx_dma_index;
+
+       stm_i2c->cr2 |= (1 << STM_I2C_CR2_LAST);
+       ao_dma_set_transfer(rx_dma_index,
+                           &stm_i2c->dr,
+                           block,
+                           len,
+                           (0 << STM_DMA_CCR_MEM2MEM) |
+                           (STM_DMA_CCR_PL_MEDIUM << STM_DMA_CCR_PL) |
+                           (STM_DMA_CCR_MSIZE_8 << STM_DMA_CCR_MSIZE) |
+                           (STM_DMA_CCR_PSIZE_8 << STM_DMA_CCR_PSIZE) |
+                           (1 << STM_DMA_CCR_MINC) |
+                           (0 << STM_DMA_CCR_PINC) |
+                           (0 << STM_DMA_CCR_CIRC) |
+                           (STM_DMA_CCR_DIR_PER_TO_MEM << STM_DMA_CCR_DIR));
+                          
+       ao_dma_start(rx_dma_index);
+       cli();
+       while (!ao_dma_done[rx_dma_index])
+               ao_sleep(&ao_dma_done[rx_dma_index]);
+       sei();
+       ao_dma_done_transfer(rx_dma_index);
+}
+
 void
 ao_i2c_channel_init(uint8_t index)
 {