11 #include "sysconfig.h" 20 #include "stm32f7xx_hal.h" 21 #include "stm32f769i_discovery.h" 22 #include "stm32f769i_discovery_ts.h" 28 typedef struct st_i2c_data {
31 I2C_HandleTypeDef hi2c;
33 unsigned short seek_addr;
36 static st_i2c_data i2c_prv_data[2];
39 void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
42 GPIO_InitTypeDef GPIO_InitStruct;
43 if(hi2c->Instance==I2C1) {
44 GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
45 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
46 GPIO_InitStruct.Pull = GPIO_PULLUP;
47 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
48 GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
49 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
50 __HAL_RCC_I2C1_CLK_ENABLE();
51 }
else if(hi2c->Instance==I2C4) {
52 GPIO_InitStruct.Pin = GPIO_PIN_7;
53 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
54 GPIO_InitStruct.Pull = GPIO_PULLUP;
55 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
56 GPIO_InitStruct.Alternate = GPIO_AF11_I2C4;
57 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
59 GPIO_InitStruct.Pin = GPIO_PIN_12;
60 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
61 GPIO_InitStruct.Pull = GPIO_PULLUP;
62 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
63 GPIO_InitStruct.Alternate = GPIO_AF4_I2C4;
64 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
65 __HAL_RCC_I2C4_CLK_ENABLE();
73 extern const struct st_device i2c1_device;
74 extern const struct st_device i2c4_device;
76 static void init_i2c(
struct st_device *dev)
79 I2C_HandleTypeDef *hi2c = &(i2c_data->hi2c);
81 __HAL_RCC_GPIOB_CLK_ENABLE();
82 __HAL_RCC_GPIOD_CLK_ENABLE();
84 if(dev == &i2c1_device) {
85 hi2c->Instance = I2C1;
86 }
else if(dev == &i2c4_device) {
87 hi2c->Instance = I2C4;
91 hi2c->Init.Timing = 0x00C0EAFF;
92 hi2c->Init.OwnAddress1 = 0;
93 hi2c->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
94 hi2c->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
95 hi2c->Init.OwnAddress2 = 0;
96 hi2c->Init.OwnAddress2Masks = I2C_OA2_NOMASK;
97 hi2c->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
98 hi2c->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
99 if(HAL_I2C_Init(hi2c) != HAL_OK) {
100 SYSERR_PRINT(
"I2C Initialize error(%s)\n", dev->
name);
103 if(HAL_I2CEx_ConfigAnalogFilter(hi2c, I2C_ANALOGFILTER_ENABLE) != HAL_OK) {
104 SYSERR_PRINT(
"I2C Config error(%s)\n", dev->
name);
109 static int i2c_register(
struct st_device *dev,
char *param)
113 i2c_data->config.speed = 100;
115 i2c_data->config.slave_addr = 0x00;
116 i2c_data->config.mem_addr_size = I2C_MEMADD_SIZE_8BIT;
117 i2c_data->seek_addr = 0;
124 static int i2c_open(
struct st_device *dev)
129 static int i2c_close(
struct st_device *dev)
134 static int i2c_read(
struct st_device *dev,
void *data,
unsigned int size)
137 I2C_HandleTypeDef *hi2c = &(i2c_data->hi2c);
138 unsigned short slave_addr = i2c_data->config.slave_addr;
139 unsigned short i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
140 HAL_StatusTypeDef rtn = 0;
142 DKFPRINTF(0x01,
"size = %ld\n", size);
144 switch(i2c_data->config.mem_addr_size) {
146 i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
149 i2c_memadd_size = I2C_MEMADD_SIZE_16BIT;
155 DKPRINTF(0x01,
"I2C READ ADDRESS %08X\n", (
unsigned int)i2c_data->seek_addr);
157 rtn = HAL_I2C_Mem_Read(hi2c,
165 i2c_data->seek_addr += size;
172 static int i2c_write(
struct st_device *dev,
const void *data,
unsigned int size)
175 I2C_HandleTypeDef *hi2c = &(i2c_data->hi2c);
176 unsigned short slave_addr = i2c_data->config.slave_addr;
177 unsigned short i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
178 HAL_StatusTypeDef rtn = 0;
180 DKFPRINTF(0x01,
"size = %d\n", size);
182 switch(i2c_data->config.mem_addr_size) {
184 i2c_memadd_size = I2C_MEMADD_SIZE_8BIT;
187 i2c_memadd_size = I2C_MEMADD_SIZE_16BIT;
193 DKPRINTF(0x01,
"I2C WRITE ADDRESS %08X\n", (
unsigned int)i2c_data->seek_addr);
195 rtn = HAL_I2C_Mem_Write(hi2c,
199 (
unsigned char *)data, size,
203 i2c_data->seek_addr += size;
210 static int i2c_set_speed(I2C_TypeDef *i2cx,
int speed)
215 static int i2c_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
218 I2C_TypeDef *i2cx = i2c_data->hi2c.Instance;
223 rtn = i2c_set_speed(i2cx, arg);
228 i2c_data->config.slave_addr = arg;
234 DKPRINTF(0x01,
"I2C IOCTL Memory Address Size %dbit\n",
236 i2c_data->config.mem_addr_size = arg;
244 i2c_data->config.speed = conf->
speed;
246 i2c_data->config.slave_addr = conf->
slave_addr;
252 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
260 static int i2c_seek(
struct st_device *dev,
int offset,
int whence)
266 i2c_data->seek_addr = offset;
270 i2c_data->seek_addr += offset;
278 return i2c_data->seek_addr;
281 static int i2c_suspend(
struct st_device *dev)
286 static int i2c_resume(
struct st_device *dev)
295 .explan =
"STM32F7 I2C1 Master",
296 .private_data = (
void *)&i2c_prv_data[0],
297 .register_dev = i2c_register,
298 .
mutex = &i2c_mutex[0],
311 .explan =
"STM32F7 I2C4 Master",
312 .private_data = (
void *)&i2c_prv_data[1],
313 .
mutex = &i2c_mutex[1],
314 .register_dev = i2c_register,
#define IOCMD_I2C_MEMADDRSIZE
Memory Address Size 8bit or 16bit etc
struct st_mutex * mutex
デバイス排他アクセス用MUTEX
void * private_data
ドライバ固有データポインタ
#define IOCMD_I2C_SPEED
com : 通信速度を設定する, arg : 通信速度(bps)
#define I2C_ADDR_MODE_7BIT
I2C 7ビットアドレスモード
#define IOCMD_I2C_SETCONFIG
Device Access configration
#define I2C_MEM_ADDR_SIZE_16BIT
I2Cスレーブデバイスメモリアドレスサイズは16ビット
int suspend(void)
全デバイスを休止状態にする
#define I2C_MEM_ADDR_SIZE_8BIT
I2Cスレーブデバイスメモリアドレスサイズは8ビット
#define IOCMD_I2C_SLAVE_ADDR7
Set Save 7bit Address
#define DEF_DEV_NAME_I2C
標準I2Cコントローラデバイス名
int mem_addr_size
I2Cスレーブデバイスメモリアドレスサイズ
int resume(void)
全デバイスを活性化する
#define SEEK_END
ファイルサイズに加算
char name[MAX_DEVNAMELRN]
デバイス名文字列
unsigned int slave_addr
I2Cスレーブデバイスアドレス