diff options
| author | Keith Packard <keithp@keithp.com> | 2012-04-25 23:26:57 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-04-25 23:26:57 -0700 | 
| commit | 0266e08dbf19e2204fb5f758d5d0f944d2afff7d (patch) | |
| tree | bff1d55bfbe6d8ff26f8ca851b332ac3d052e66b | |
| parent | 962476911aaab17fd482593a0e8b95fe47de2f29 (diff) | |
altos: Add STM I2C recv and stop funcs
Recv doesn't appear to work with more than one byte
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | src/stm/ao_arch_funcs.h | 3 | ||||
| -rw-r--r-- | src/stm/ao_i2c_stm.c | 38 | 
2 files changed, 41 insertions, 0 deletions
| diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h index 05bb7784..3027b337 100644 --- a/src/stm/ao_arch_funcs.h +++ b/src/stm/ao_arch_funcs.h @@ -131,6 +131,9 @@ 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);  void diff --git a/src/stm/ao_i2c_stm.c b/src/stm/ao_i2c_stm.c index 1a0280d3..0717be98 100644 --- a/src/stm/ao_i2c_stm.c +++ b/src/stm/ao_i2c_stm.c @@ -135,11 +135,21 @@ ao_i2c_start(uint8_t index, uint16_t addr)  }  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, @@ -162,6 +172,34 @@ ao_i2c_send(void *block, uint16_t len, uint8_t 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)  {  	struct stm_i2c	*stm_i2c = ao_i2c_stm_info[index].stm_i2c; | 
