12
12
#include <errno.h>
13
13
#include <reg/fsmbm.h>
14
14
15
+ #include <zephyr/logging/log.h>
16
+ LOG_MODULE_REGISTER (i2c_ene , CONFIG_I2C_LOG_LEVEL );
17
+
18
+ #include "i2c-priv.h"
19
+
15
20
struct i2c_kb1200_config {
16
21
struct fsmbm_regs * fsmbm ;
22
+ uint32_t clock_freq ;
17
23
const struct pinctrl_dev_config * pcfg ;
18
24
};
19
25
20
26
struct i2c_kb1200_data {
21
- struct k_sem mutex ;
27
+ struct k_sem lock ;
28
+ struct k_sem wait ;
22
29
volatile uint8_t * msg_buf ;
23
30
volatile uint32_t msg_len ;
24
31
volatile uint8_t msg_flags ;
@@ -39,6 +46,7 @@ static void i2c_kb1200_isr(const struct device *dev)
39
46
uint32_t remain = data -> msg_len - data -> index ;
40
47
uint32_t send_bytes =
41
48
remain > FSMBM_BUFFER_SIZE ? FSMBM_BUFFER_SIZE : remain ;
49
+
42
50
memcpy ((void * )& config -> fsmbm -> FSMBMDAT [0 ],
43
51
(void * )& data -> msg_buf [data -> index ], send_bytes );
44
52
data -> index += send_bytes ;
@@ -52,7 +60,7 @@ static void i2c_kb1200_isr(const struct device *dev)
52
60
} else if (config -> fsmbm -> FSMBMPF & FSMBM_COMPLETE_EVENT ) {
53
61
/* complete */
54
62
if (((config -> fsmbm -> FSMBMSTS & FSMBM_STS_MASK ) == FSMBM_SMBUS_BUSY ) &&
55
- ((config -> fsmbm -> FSMBMFRT & ___STOP ) == ___NONE )) {
63
+ ((config -> fsmbm -> FSMBMFRT & FRT_STOP ) == FRT_NONE )) {
56
64
/* while packet finish without STOP, the error message is
57
65
* FSMBM_SMBUS_BUSY
58
66
*/
@@ -61,10 +69,12 @@ static void i2c_kb1200_isr(const struct device *dev)
61
69
data -> err_code = config -> fsmbm -> FSMBMSTS & FSMBM_STS_MASK ;
62
70
}
63
71
data -> state = STATE_COMPLETE ;
72
+ k_sem_give (& data -> wait );
64
73
config -> fsmbm -> FSMBMPF = FSMBM_COMPLETE_EVENT ;
65
74
} else {
66
75
data -> err_code = config -> fsmbm -> FSMBMSTS & FSMBM_STS_MASK ;
67
76
data -> state = STATE_COMPLETE ;
77
+ k_sem_give (& data -> wait );
68
78
}
69
79
} else if (data -> state == STATE_RECEIVING ) {
70
80
uint32_t remain = data -> msg_len - data -> index ;
@@ -89,7 +99,7 @@ static void i2c_kb1200_isr(const struct device *dev)
89
99
} else if (config -> fsmbm -> FSMBMPF & FSMBM_COMPLETE_EVENT ) {
90
100
/* complete */
91
101
if (((config -> fsmbm -> FSMBMSTS & FSMBM_STS_MASK ) == FSMBM_SMBUS_BUSY ) &&
92
- ((config -> fsmbm -> FSMBMFRT & ___STOP ) == ___NONE )) {
102
+ ((config -> fsmbm -> FSMBMFRT & FRT_STOP ) == FRT_NONE )) {
93
103
/* while packet finish without STOP, the error message is
94
104
* FSMBM_SMBUS_BUSY
95
105
*/
@@ -98,28 +108,33 @@ static void i2c_kb1200_isr(const struct device *dev)
98
108
data -> err_code = config -> fsmbm -> FSMBMSTS & FSMBM_STS_MASK ;
99
109
}
100
110
data -> state = STATE_COMPLETE ;
111
+ k_sem_give (& data -> wait );
101
112
config -> fsmbm -> FSMBMPF = FSMBM_COMPLETE_EVENT ;
102
113
} else {
103
114
data -> err_code = config -> fsmbm -> FSMBMSTS & FSMBM_STS_MASK ;
104
115
data -> state = STATE_COMPLETE ;
116
+ k_sem_give (& data -> wait );
105
117
}
106
118
} else if (data -> state == STATE_COMPLETE ) {
107
119
config -> fsmbm -> FSMBMPF = (FSMBM_COMPLETE_EVENT | FSMBM_BLOCK_FINISH_EVENT );
120
+ k_sem_give (& data -> wait );
108
121
}
109
122
}
110
123
111
124
static int i2c_kb1200_poll_write (const struct device * dev , struct i2c_msg msg , uint16_t addr )
112
125
{
113
126
const struct i2c_kb1200_config * config = dev -> config ;
114
127
struct i2c_kb1200_data * data = dev -> data ;
115
- uint8_t send_bytes ;
128
+ uint32_t send_bytes ;
129
+ int ret ;
116
130
131
+ k_sem_reset (& data -> wait );
117
132
if (msg .flags & I2C_MSG_STOP ) {
118
133
/* No CMD, No CNT, No PEC, with STOP*/
119
- config -> fsmbm -> FSMBMFRT = ___STOP ;
134
+ config -> fsmbm -> FSMBMFRT = FRT_STOP ;
120
135
} else {
121
136
/* No CMD, No CNT, No PEC, no STOP*/
122
- config -> fsmbm -> FSMBMFRT = ___NONE ;
137
+ config -> fsmbm -> FSMBMFRT = FRT_NONE ;
123
138
}
124
139
data -> msg_len = msg .len ;
125
140
data -> msg_buf = msg .buf ;
@@ -135,7 +150,7 @@ static int i2c_kb1200_poll_write(const struct device *dev, struct i2c_msg msg, u
135
150
data -> state = STATE_SENDING ;
136
151
137
152
config -> fsmbm -> FSMBMCMD = 0 ;
138
- config -> fsmbm -> FSMBMADR = (addr & ~ BIT ( 0 ) ) | FSMBM_WRITE ;
153
+ config -> fsmbm -> FSMBMADR = (addr << 1 ) | FSMBM_WRITE ;
139
154
config -> fsmbm -> FSMBMPF = (FSMBM_COMPLETE_EVENT | FSMBM_BLOCK_FINISH_EVENT );
140
155
/* If data over bufferSize increase 1 to force continue transmit */
141
156
if (msg .len >= (FSMBM_BUFFER_SIZE + 1 )) {
@@ -145,29 +160,38 @@ static int i2c_kb1200_poll_write(const struct device *dev, struct i2c_msg msg, u
145
160
}
146
161
config -> fsmbm -> FSMBMIE = (FSMBM_COMPLETE_EVENT | FSMBM_BLOCK_FINISH_EVENT );
147
162
config -> fsmbm -> FSMBMPRTC_P = FLEXIBLE_PROTOCOL ;
148
- while (data -> state != STATE_COMPLETE ) {
149
- ;
163
+
164
+ /* Wait until ISR or timeout */
165
+ ret = k_sem_take (& data -> wait , K_MSEC (FSMBM_MAX_TIMEOUT ));
166
+ if (ret == - EAGAIN ) {
167
+ data -> err_code |= FSMBM_SDA_TIMEOUT ;
150
168
}
151
169
data -> state = STATE_IDLE ;
152
- if (data -> err_code != 0 ) {
170
+ if (data -> err_code ) {
153
171
/* reset HW */
154
172
config -> fsmbm -> FSMBMCFG |= FSMBM_HW_RESET ;
155
173
return data -> err_code ;
156
174
}
175
+
157
176
return 0 ;
158
177
}
159
178
160
179
static int i2c_kb1200_poll_read (const struct device * dev , struct i2c_msg msg , uint16_t addr )
161
180
{
162
181
const struct i2c_kb1200_config * config = dev -> config ;
163
182
struct i2c_kb1200_data * data = dev -> data ;
183
+ int ret ;
164
184
185
+ k_sem_reset (& data -> wait );
186
+ if ((msg .flags & I2C_MSG_RESTART ) && !(msg .flags & I2C_MSG_STOP )) {
187
+ LOG_ERR ("ENE i2c format not support." );
188
+ }
165
189
if (msg .flags & I2C_MSG_STOP ) {
166
190
/* No CMD, No CNT, No PEC, with STOP*/
167
- config -> fsmbm -> FSMBMFRT = ___STOP ;
191
+ config -> fsmbm -> FSMBMFRT = FRT_STOP ;
168
192
} else {
169
193
/* No CMD, No CNT, No PEC, no STOP*/
170
- config -> fsmbm -> FSMBMFRT = ___NONE ;
194
+ config -> fsmbm -> FSMBMFRT = FRT_NONE ;
171
195
}
172
196
data -> msg_len = msg .len ;
173
197
data -> msg_buf = msg .buf ;
@@ -178,7 +202,7 @@ static int i2c_kb1200_poll_read(const struct device *dev, struct i2c_msg msg, ui
178
202
data -> state = STATE_RECEIVING ;
179
203
180
204
config -> fsmbm -> FSMBMCMD = 0 ;
181
- config -> fsmbm -> FSMBMADR = (addr & ~ BIT ( 0 ) ) | FSMBM_READ ;
205
+ config -> fsmbm -> FSMBMADR = (addr << 1 ) | FSMBM_READ ;
182
206
config -> fsmbm -> FSMBMPF = (FSMBM_COMPLETE_EVENT | FSMBM_BLOCK_FINISH_EVENT );
183
207
/* If data over bufferSize increase 1 to force continue receive */
184
208
if (msg .len >= (FSMBM_BUFFER_SIZE + 1 )) {
@@ -188,22 +212,28 @@ static int i2c_kb1200_poll_read(const struct device *dev, struct i2c_msg msg, ui
188
212
}
189
213
config -> fsmbm -> FSMBMIE = (FSMBM_COMPLETE_EVENT | FSMBM_BLOCK_FINISH_EVENT );
190
214
config -> fsmbm -> FSMBMPRTC_P = FLEXIBLE_PROTOCOL ;
191
- while (data -> state != STATE_COMPLETE ) {
192
- ;
215
+
216
+ /* Wait until ISR or timeout */
217
+ ret = k_sem_take (& data -> wait , K_MSEC (FSMBM_MAX_TIMEOUT ));
218
+ if (ret == - EAGAIN ) {
219
+ data -> err_code |= FSMBM_SDA_TIMEOUT ;
193
220
}
194
221
data -> state = STATE_IDLE ;
195
- if (data -> err_code != 0 ) {
222
+
223
+ if (data -> err_code ) {
196
224
/* reset HW */
197
225
config -> fsmbm -> FSMBMCFG |= FSMBM_HW_RESET ;
198
226
return data -> err_code ;
199
227
}
228
+
200
229
return 0 ;
201
230
}
202
231
203
232
/* I2C Master api functions */
204
233
static int i2c_kb1200_configure (const struct device * dev , uint32_t dev_config )
205
234
{
206
235
const struct i2c_kb1200_config * config = dev -> config ;
236
+ uint32_t speed ;
207
237
208
238
if (!(dev_config & I2C_MODE_CONTROLLER )) {
209
239
return - ENOTSUP ;
@@ -213,7 +243,7 @@ static int i2c_kb1200_configure(const struct device *dev, uint32_t dev_config)
213
243
return - ENOTSUP ;
214
244
}
215
245
216
- uint32_t speed = I2C_SPEED_GET (dev_config );
246
+ speed = I2C_SPEED_GET (dev_config );
217
247
218
248
switch (speed ) {
219
249
case I2C_SPEED_STANDARD :
@@ -242,7 +272,7 @@ static int i2c_kb1200_get_config(const struct device *dev, uint32_t *dev_config)
242
272
const struct i2c_kb1200_config * config = dev -> config ;
243
273
244
274
if ((config -> fsmbm -> FSMBMCFG & FSMBM_FUNCTION_ENABLE ) == 0x00 ) {
245
- printk ("Cannot find i2c controller on 0x%p!\n " , config -> fsmbm );
275
+ LOG_ERR ("Cannot find i2c controller on 0x%p!" , config -> fsmbm );
246
276
return - EIO ;
247
277
}
248
278
@@ -251,6 +281,8 @@ static int i2c_kb1200_get_config(const struct device *dev, uint32_t *dev_config)
251
281
* dev_config = I2C_MODE_CONTROLLER | I2C_SPEED_SET (I2C_SPEED_STANDARD );
252
282
break ;
253
283
case FSMBM_CLK_400K :
284
+ case FSMBM_CLK_500K :
285
+ case FSMBM_CLK_666K :
254
286
* dev_config = I2C_MODE_CONTROLLER | I2C_SPEED_SET (I2C_SPEED_FAST );
255
287
break ;
256
288
case FSMBM_CLK_1M :
@@ -267,27 +299,27 @@ static int i2c_kb1200_transfer(const struct device *dev, struct i2c_msg *msgs, u
267
299
uint16_t addr )
268
300
{
269
301
struct i2c_kb1200_data * data = dev -> data ;
270
- int ret ;
302
+ int ret = 0 ;
271
303
272
- /* get the mutex */
273
- k_sem_take (& data -> mutex , K_FOREVER );
304
+ /* lock */
305
+ k_sem_take (& data -> lock , K_FOREVER );
274
306
for (int i = 0U ; i < num_msgs ; i ++ ) {
275
307
if ((msgs [i ].flags & I2C_MSG_RW_MASK ) == I2C_MSG_WRITE ) {
276
308
ret = i2c_kb1200_poll_write (dev , msgs [i ], addr );
277
309
if (ret ) {
278
- printk ( "%s Write error: 0x%X\n" , dev -> name , ret ) ;
310
+ ret = - EIO ;
279
311
break ;
280
312
}
281
313
} else {
282
314
ret = i2c_kb1200_poll_read (dev , msgs [i ], addr );
283
315
if (ret ) {
284
- printk ( "%s Read error: 0x%X\n" , dev -> name , ret ) ;
316
+ ret = - EIO ;
285
317
break ;
286
318
}
287
319
}
288
320
}
289
- /* release the mutex */
290
- k_sem_give (& data -> mutex );
321
+ /* release the lock */
322
+ k_sem_give (& data -> lock );
291
323
292
324
return ret ;
293
325
}
@@ -332,14 +364,23 @@ static int i2c_kb1200_init(const struct device *dev)
332
364
int ret ;
333
365
const struct i2c_kb1200_config * config = dev -> config ;
334
366
struct i2c_kb1200_data * data = dev -> data ;
367
+ uint32_t bitrate_cfg ;
335
368
336
369
ret = pinctrl_apply_state (config -> pcfg , PINCTRL_STATE_DEFAULT );
337
370
if (ret != 0 ) {
338
371
return ret ;
339
372
}
340
373
341
- /* init mutex */
342
- k_sem_init (& data -> mutex , 1 , 1 );
374
+ bitrate_cfg = i2c_map_dt_bitrate (config -> clock_freq );
375
+ if (!bitrate_cfg ) {
376
+ return - EINVAL ;
377
+ }
378
+
379
+ i2c_kb1200_configure (dev , bitrate_cfg | I2C_MODE_CONTROLLER );
380
+
381
+ k_sem_init (& data -> wait , 0 , 1 );
382
+ /* init lock */
383
+ k_sem_init (& data -> lock , 1 , 1 );
343
384
kb1200_fsmbm_irq_init ();
344
385
345
386
return 0 ;
@@ -350,10 +391,11 @@ static int i2c_kb1200_init(const struct device *dev)
350
391
static struct i2c_kb1200_data i2c_kb1200_data_##inst; \
351
392
static const struct i2c_kb1200_config i2c_kb1200_config_##inst = { \
352
393
.fsmbm = (struct fsmbm_regs *)DT_INST_REG_ADDR(inst), \
394
+ .clock_freq = DT_INST_PROP(inst, clock_frequency), \
353
395
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \
354
396
}; \
355
397
I2C_DEVICE_DT_INST_DEFINE(inst, &i2c_kb1200_init, NULL, &i2c_kb1200_data_##inst, \
356
- &i2c_kb1200_config_##inst, PRE_KERNEL_1, \
357
- CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &i2c_kb1200_api);
398
+ &i2c_kb1200_config_##inst, PRE_KERNEL_1, \
399
+ CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &i2c_kb1200_api);
358
400
359
401
DT_INST_FOREACH_STATUS_OKAY (I2C_KB1200_DEVICE )
0 commit comments