@@ -157,89 +157,148 @@ static int mipi_dbi_spi_write_display(const struct device *dev,
157
157
158
158
#if MIPI_DBI_SPI_READ_REQUIRED
159
159
160
- static int mipi_dbi_spi_command_read (const struct device * dev ,
161
- const struct mipi_dbi_config * dbi_config ,
162
- uint8_t * cmds , size_t num_cmds ,
163
- uint8_t * response , size_t len )
160
+ static inline int
161
+ mipi_dbi_spi_read_helper_3wire (const struct device * dev ,
162
+ const struct mipi_dbi_config * dbi_config ,
163
+ uint8_t * cmds , size_t num_cmds ,
164
+ uint8_t * response , size_t len )
164
165
{
165
166
const struct mipi_dbi_spi_config * config = dev -> config ;
166
167
struct mipi_dbi_spi_data * data = dev -> data ;
168
+ struct spi_config tmp_config ;
167
169
struct spi_buf buffer ;
168
170
struct spi_buf_set buf_set = {
169
171
.buffers = & buffer ,
170
172
.count = 1 ,
171
173
};
172
174
int ret = 0 ;
173
- struct spi_config tmp_config ;
174
175
175
- ret = k_mutex_lock (& data -> lock , K_FOREVER );
176
- if (ret < 0 ) {
177
- return ret ;
176
+ /*
177
+ * We have to emulate 3 wire mode by packing the data/command
178
+ * bit into the upper bit of the SPI transfer, switch SPI to
179
+ * 9 bit mode, and write the transfer.
180
+ */
181
+
182
+ if ((dbi_config -> config .operation & SPI_WORD_SIZE_MASK )
183
+ != SPI_WORD_SET (9 )) {
184
+ return - ENOTSUP ;
178
185
}
186
+
179
187
memcpy (& tmp_config , & dbi_config -> config , sizeof (tmp_config ));
180
- if (dbi_config -> mode == MIPI_DBI_MODE_SPI_3WIRE &&
181
- IS_ENABLED (CONFIG_MIPI_DBI_SPI_3WIRE )) {
182
- /* We have to emulate 3 wire mode by packing the data/command
183
- * bit into the upper bit of the SPI transfer.
184
- * switch SPI to 9 bit mode, and write the transfer
185
- */
186
- tmp_config .operation &= ~SPI_WORD_SIZE_MASK ;
187
- tmp_config .operation |= SPI_WORD_SET (9 );
188
+ tmp_config .operation &= ~SPI_WORD_SIZE_MASK ;
189
+ tmp_config .operation |= SPI_WORD_SET (9 );
188
190
189
- buffer .buf = & data -> spi_byte ;
190
- buffer .len = 1 ;
191
- /* Send each command */
192
- for (size_t i = 0 ; i < num_cmds ; i ++ ) {
193
- data -> spi_byte = cmds [i ];
194
- ret = spi_write (config -> spi_dev , & tmp_config , & buf_set );
195
- if (ret < 0 ) {
196
- goto out ;
197
- }
191
+ buffer .buf = & data -> spi_byte ;
192
+ buffer .len = 1 ;
193
+
194
+ /* Send each command */
195
+ for (size_t i = 0 ; i < num_cmds ; i ++ ) {
196
+ data -> spi_byte = cmds [i ];
197
+ ret = spi_write (config -> spi_dev , & tmp_config , & buf_set );
198
+ if (ret < 0 ) {
199
+ goto out ;
200
+ }
201
+ }
202
+
203
+ /* Now, we can switch to 8 bit mode, and read data */
204
+ buffer .buf = (void * )response ;
205
+ buffer .len = len ;
206
+ ret = spi_read (config -> spi_dev , & dbi_config -> config , & buf_set );
207
+
208
+ out :
209
+ spi_release (config -> spi_dev , & tmp_config ); /* Really necessary here? */
210
+ return ret ;
211
+ }
212
+
213
+ static inline int
214
+ mipi_dbi_spi_read_helper_4wire (const struct device * dev ,
215
+ const struct mipi_dbi_config * dbi_config ,
216
+ uint8_t * cmds , size_t num_cmds ,
217
+ uint8_t * response , size_t len )
218
+ {
219
+ const struct mipi_dbi_spi_config * config = dev -> config ;
220
+ struct spi_config tmp_config ;
221
+ struct spi_buf buffer ;
222
+ struct spi_buf_set buf_set = {
223
+ .buffers = & buffer ,
224
+ .count = 1 ,
225
+ };
226
+ int ret = 0 ;
227
+
228
+ /*
229
+ * 4 wire mode is much simpler. We just toggle the
230
+ * command/data GPIO to indicate if we are sending
231
+ * a command or data. Note that since some SPI displays
232
+ * require CS to be held low for the entire read sequence,
233
+ * we set SPI_HOLD_ON_CS
234
+ */
235
+
236
+ memcpy (& tmp_config , & dbi_config -> config , sizeof (tmp_config ));
237
+ tmp_config .operation |= SPI_HOLD_ON_CS ;
238
+
239
+ if (num_cmds > 0 ) {
240
+ buffer .buf = cmds ;
241
+ buffer .len = num_cmds ;
242
+
243
+ /* Set CD pin low for command */
244
+ gpio_pin_set_dt (& config -> cmd_data , 0 );
245
+
246
+ ret = spi_write (config -> spi_dev , & tmp_config , & buf_set );
247
+ if (ret < 0 ) {
248
+ goto out ;
198
249
}
199
- /* Now, we can switch to 8 bit mode, and read data */
250
+ }
251
+
252
+ if (len > 0 ) {
200
253
buffer .buf = (void * )response ;
201
254
buffer .len = len ;
202
- ret = spi_read (config -> spi_dev , & dbi_config -> config , & buf_set );
203
- } else if (dbi_config -> mode == MIPI_DBI_MODE_SPI_4WIRE ) {
204
- /* 4 wire mode is much simpler. We just toggle the
205
- * command/data GPIO to indicate if we are sending
206
- * a command or data. Note that since some SPI displays
207
- * require CS to be held low for the entire read sequence,
208
- * we set SPI_HOLD_ON_CS
209
- */
210
- tmp_config .operation |= SPI_HOLD_ON_CS ;
211
255
212
- if (num_cmds > 0 ) {
213
- buffer .buf = cmds ;
214
- buffer .len = num_cmds ;
215
- /* Set CD pin low for command */
216
- gpio_pin_set_dt (& config -> cmd_data , 0 );
256
+ /* Set CD pin high for data */
257
+ gpio_pin_set_dt (& config -> cmd_data , 1 );
217
258
218
- ret = spi_write (config -> spi_dev , & tmp_config ,
219
- & buf_set );
220
- if (ret < 0 ) {
221
- goto out ;
222
- }
259
+ ret = spi_read (config -> spi_dev , & tmp_config , & buf_set );
260
+ if (ret < 0 ) {
261
+ goto out ;
223
262
}
263
+ }
224
264
225
- if (len > 0 ) {
226
- /* Set CD pin high for data */
227
- gpio_pin_set_dt (& config -> cmd_data , 1 );
265
+ out :
266
+ spi_release (config -> spi_dev , & tmp_config );
267
+ return ret ;
268
+ }
228
269
229
- buffer .buf = (void * )response ;
230
- buffer .len = len ;
231
- ret = spi_read (config -> spi_dev , & tmp_config ,
232
- & buf_set );
233
- if (ret < 0 ) {
234
- goto out ;
235
- }
270
+ static int mipi_dbi_spi_command_read (const struct device * dev ,
271
+ const struct mipi_dbi_config * dbi_config ,
272
+ uint8_t * cmds , size_t num_cmds ,
273
+ uint8_t * response , size_t len )
274
+ {
275
+ struct mipi_dbi_spi_data * data = dev -> data ;
276
+ int ret = 0 ;
277
+
278
+ ret = k_mutex_lock (& data -> lock , K_FOREVER );
279
+ if (ret < 0 ) {
280
+ return ret ;
281
+ }
282
+ if (dbi_config -> mode == MIPI_DBI_MODE_SPI_3WIRE &&
283
+ IS_ENABLED (CONFIG_MIPI_DBI_SPI_3WIRE )) {
284
+ ret = mipi_dbi_spi_read_helper_3wire (dev , dbi_config ,
285
+ cmds , num_cmds ,
286
+ response , len );
287
+ if (ret < 0 ) {
288
+ goto out ;
289
+ }
290
+ } else if (dbi_config -> mode == MIPI_DBI_MODE_SPI_4WIRE ) {
291
+ ret = mipi_dbi_spi_read_helper_4wire (dev , dbi_config ,
292
+ cmds , num_cmds ,
293
+ response , len );
294
+ if (ret < 0 ) {
295
+ goto out ;
236
296
}
237
297
} else {
238
298
/* Otherwise, unsupported mode */
239
299
ret = - ENOTSUP ;
240
300
}
241
301
out :
242
- spi_release (config -> spi_dev , & tmp_config );
243
302
k_mutex_unlock (& data -> lock );
244
303
return ret ;
245
304
}
0 commit comments