210 lines
4.4 KiB
C
210 lines
4.4 KiB
C
/*
|
|
* Copyright (c) 2016 BayLibre, SAS
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef _STM32LX_I2C_H_
|
|
#define _STM32LX_I2C_H_
|
|
|
|
/* 35.6.1 Control register 1 (I2C_CR1) */
|
|
union __cr1 {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t pe :1 __packed;
|
|
uint32_t txie :1 __packed;
|
|
uint32_t rxie :1 __packed;
|
|
uint32_t addrie :1 __packed;
|
|
uint32_t nackie :1 __packed;
|
|
uint32_t stopie :1 __packed;
|
|
uint32_t tcie :1 __packed;
|
|
uint32_t errie :1 __packed;
|
|
uint32_t dnf :4 __packed;
|
|
uint32_t anfoff :1 __packed;
|
|
uint32_t rsvd__13 :1 __packed;
|
|
uint32_t txdmaen :1 __packed;
|
|
uint32_t rxdmaen :1 __packed;
|
|
uint32_t sbc :1 __packed;
|
|
uint32_t nostretch :1 __packed;
|
|
uint32_t wupen :1 __packed;
|
|
uint32_t gcen :1 __packed;
|
|
uint32_t smbhen :1 __packed;
|
|
uint32_t smbden :1 __packed;
|
|
uint32_t alerten :1 __packed;
|
|
uint32_t pecen :1 __packed;
|
|
uint32_t rsvd__24_31 :8 __packed;
|
|
} bit;
|
|
};
|
|
|
|
/* 35.6.2 Control register 2 (I2C_CR2) */
|
|
union __cr2 {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t sadd :10 __packed;
|
|
uint32_t rd_wrn :1 __packed;
|
|
uint32_t add10 :1 __packed;
|
|
uint32_t head10r :1 __packed;
|
|
uint32_t start :1 __packed;
|
|
uint32_t stop :1 __packed;
|
|
uint32_t nack :1 __packed;
|
|
uint32_t nbytes :8 __packed;
|
|
uint32_t reload :1 __packed;
|
|
uint32_t autoend :1 __packed;
|
|
uint32_t pecbyte :1 __packed;
|
|
uint32_t rsvd__27_31 :5 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __oar1 {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t oa1 :10 __packed;
|
|
uint32_t oa1mode :1 __packed;
|
|
uint32_t rsvd__11_14 :4 __packed;
|
|
uint32_t oa1en :1 __packed;
|
|
uint32_t rsvd__16_31 :16 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __oar2 {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t rsvd__0 :1 __packed;
|
|
uint32_t oa2 :7 __packed;
|
|
uint32_t oa2msk :3 __packed;
|
|
uint32_t rsvd__11_14 :4 __packed;
|
|
uint32_t oa2en :1 __packed;
|
|
uint32_t rsvd__16_31 :16 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __timingr {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t scll :8 __packed;
|
|
uint32_t sclh :8 __packed;
|
|
uint32_t sdadel :4 __packed;
|
|
uint32_t scldel :4 __packed;
|
|
uint32_t rsvd__24_27 :4 __packed;
|
|
uint32_t presc :4 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __timeoutr {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t timeouta :12 __packed;
|
|
uint32_t tidle :1 __packed;
|
|
uint32_t rsvd__13_14 :1 __packed;
|
|
uint32_t timouten :1 __packed;
|
|
uint32_t timeoutb :12 __packed;
|
|
uint32_t rsvd__28_30 :1 __packed;
|
|
uint32_t texten :1 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __isr {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t txe :1 __packed;
|
|
uint32_t txis :1 __packed;
|
|
uint32_t rxne :1 __packed;
|
|
uint32_t addr :1 __packed;
|
|
uint32_t nackf :1 __packed;
|
|
uint32_t stopf :1 __packed;
|
|
uint32_t tc :1 __packed;
|
|
uint32_t tcr :1 __packed;
|
|
uint32_t berr :1 __packed;
|
|
uint32_t arlo :1 __packed;
|
|
uint32_t ovr :1 __packed;
|
|
uint32_t pecerr :1 __packed;
|
|
uint32_t timeout :1 __packed;
|
|
uint32_t alert :1 __packed;
|
|
uint32_t rsvd__14 :1 __packed;
|
|
uint32_t busy :1 __packed;
|
|
uint32_t dir :1 __packed;
|
|
uint32_t addcode :7 __packed;
|
|
uint32_t rsvd__24_31 :8 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __icr {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t rsvd__0_2 :3 __packed;
|
|
uint32_t addr :1 __packed;
|
|
uint32_t nack :1 __packed;
|
|
uint32_t stop :1 __packed;
|
|
uint32_t rsvd__6_7 :2 __packed;
|
|
uint32_t berr :1 __packed;
|
|
uint32_t arlo :1 __packed;
|
|
uint32_t ovr :1 __packed;
|
|
uint32_t pec :1 __packed;
|
|
uint32_t timeout :1 __packed;
|
|
uint32_t alert :1 __packed;
|
|
uint32_t rsvd__14_31 :17 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __pecr {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t pec:8 __packed;
|
|
uint32_t rsvd__9_31 :24 __packed;
|
|
} bit;
|
|
};
|
|
|
|
union __dr {
|
|
uint32_t val;
|
|
struct {
|
|
uint32_t data:8 __packed;
|
|
uint32_t rsvd__9_31 :24 __packed;
|
|
} bit;
|
|
};
|
|
|
|
/* 35.7.12 I2C register map */
|
|
struct i2c_stm32lx {
|
|
union __cr1 cr1;
|
|
union __cr2 cr2;
|
|
union __oar1 oar1;
|
|
union __oar2 oar2;
|
|
union __timingr timingr;
|
|
union __timeoutr timeoutr;
|
|
union __isr isr;
|
|
union __icr icr;
|
|
union __pecr pecr;
|
|
union __dr rxdr;
|
|
uint32_t txdr;
|
|
};
|
|
|
|
typedef void (*irq_config_func_t)(struct device *port);
|
|
|
|
/* device config */
|
|
struct i2c_stm32lx_config {
|
|
void *base;
|
|
irq_config_func_t irq_config_func;
|
|
/* clock subsystem driving this peripheral */
|
|
struct stm32_pclken pclken;
|
|
};
|
|
|
|
/* driver data */
|
|
struct i2c_stm32lx_data {
|
|
/* clock device */
|
|
struct device *clock;
|
|
/* Device config */
|
|
union dev_config dev_config;
|
|
/* ISR Sync */
|
|
struct k_sem device_sync_sem;
|
|
/* Current message data */
|
|
struct {
|
|
struct i2c_msg *msg;
|
|
unsigned int len;
|
|
uint8_t *buf;
|
|
unsigned int is_err;
|
|
unsigned int is_nack;
|
|
unsigned int is_write;
|
|
} current;
|
|
};
|
|
|
|
#endif /* _STM32LX_UART_H_ */
|