@@ -72,6 +72,8 @@ struct mipi_dbi_lcdic_config {
72
72
const struct device * clock_dev ;
73
73
clock_control_subsys_t clock_subsys ;
74
74
bool swap_bytes ;
75
+ uint8_t write_active_min ;
76
+ uint8_t write_inactive_min ;
75
77
};
76
78
77
79
#ifdef CONFIG_MIPI_DBI_NXP_LCDIC_DMA
@@ -249,10 +251,6 @@ static int mipi_dbi_lcdic_configure(const struct device *dev,
249
251
LOG_ERR ("Invalid clock frequency %d" , spi_cfg -> frequency );
250
252
return ret ;
251
253
}
252
- if (!(spi_cfg -> operation & SPI_HALF_DUPLEX )) {
253
- LOG_ERR ("LCDIC only supports half duplex operation" );
254
- return - ENOTSUP ;
255
- }
256
254
if (spi_cfg -> slave != 0 ) {
257
255
/* Only one slave select line */
258
256
return - ENOTSUP ;
@@ -265,13 +263,26 @@ static int mipi_dbi_lcdic_configure(const struct device *dev,
265
263
reg = base -> CTRL ;
266
264
/* Disable LCD module during configuration */
267
265
reg &= ~LCDIC_CTRL_LCDIC_EN_MASK ;
268
- /* Select SPI mode */
269
- reg &= ~LCDIC_CTRL_LCDIC_MD_MASK ;
270
- /* Select 3 or 4 wire mode based on config selection */
271
- if (dbi_config -> mode == MIPI_DBI_MODE_SPI_4WIRE ) {
266
+ if (dbi_config -> mode == MIPI_DBI_MODE_8080_BUS_8_BIT ) {
267
+ /* Enable 8080 Mode */
268
+ reg |= LCDIC_CTRL_LCDIC_MD_MASK ;
269
+ } else if (dbi_config -> mode == MIPI_DBI_MODE_SPI_4WIRE ) {
270
+ /* Select SPI 4 wire mode */
272
271
reg |= LCDIC_CTRL_SPI_MD_MASK ;
272
+ reg &= ~LCDIC_CTRL_LCDIC_MD_MASK ;
273
+ } else if (dbi_config -> mode == MIPI_DBI_MODE_SPI_3WIRE ) {
274
+ /* Select SPI 3 wire mode */
275
+ reg &= ~(LCDIC_CTRL_LCDIC_MD_MASK |
276
+ LCDIC_CTRL_SPI_MD_MASK );
273
277
} else {
274
- reg &= ~LCDIC_CTRL_SPI_MD_MASK ;
278
+ /* Unsupported mode */
279
+ return - ENOTSUP ;
280
+ }
281
+ /* If using SPI mode, validate that half-duplex was requested */
282
+ if ((!(reg & LCDIC_CTRL_LCDIC_MD_MASK )) &&
283
+ (!(spi_cfg -> operation & SPI_HALF_DUPLEX ))) {
284
+ LOG_ERR ("LCDIC only supports half duplex operation" );
285
+ return - ENOTSUP ;
275
286
}
276
287
/* Enable byte swapping if user requested it */
277
288
reg = (reg & ~LCDIC_CTRL_DAT_ENDIAN_MASK ) |
@@ -292,6 +303,15 @@ static int mipi_dbi_lcdic_configure(const struct device *dev,
292
303
LCDIC_SPI_CTRL_CPOL ((spi_cfg -> operation & SPI_MODE_CPOL ) ? 1 : 0 );
293
304
base -> SPI_CTRL = reg ;
294
305
306
+ /*
307
+ * Set 8080 control based on module properties. TRIW and TRAW are
308
+ * set to their reset values
309
+ */
310
+ base -> I8080_CTRL1 = LCDIC_I8080_CTRL1_TRIW (0xf ) |
311
+ LCDIC_I8080_CTRL1_TRAW (0xf ) |
312
+ LCDIC_I8080_CTRL1_TWIW (config -> write_inactive_min ) |
313
+ LCDIC_I8080_CTRL1_TWAW (config -> write_active_min );
314
+
295
315
/* Enable the module */
296
316
base -> CTRL |= LCDIC_CTRL_LCDIC_EN_MASK ;
297
317
mipi_dbi_lcdic_reset_delay ();
@@ -783,6 +803,10 @@ static void mipi_dbi_lcdic_isr(const struct device *dev)
783
803
DT_INST_CLOCKS_CELL(n, name), \
784
804
.irq_config_func = mipi_dbi_lcdic_config_func_##n, \
785
805
.swap_bytes = DT_INST_PROP(n, nxp_swap_bytes), \
806
+ .write_active_min = \
807
+ DT_INST_PROP(n, nxp_write_active_cycles), \
808
+ .write_inactive_min = \
809
+ DT_INST_PROP(n, nxp_write_inactive_cycles), \
786
810
}; \
787
811
static struct mipi_dbi_lcdic_data mipi_dbi_lcdic_data_##n = { \
788
812
LCDIC_DMA_CHANNELS(n) \
0 commit comments