@@ -46,10 +46,11 @@ uint32_t var = MIPI_DBI_SPI_READ_REQUIRED;
46
46
*/
47
47
#define MIPI_DBI_DC_BIT BIT(8)
48
48
49
- static int mipi_dbi_spi_write_helper (const struct device * dev ,
50
- const struct mipi_dbi_config * dbi_config ,
51
- bool cmd_present , uint8_t cmd ,
52
- const uint8_t * data_buf , size_t len )
49
+ static inline int
50
+ mipi_dbi_spi_write_helper_3wire (const struct device * dev ,
51
+ const struct mipi_dbi_config * dbi_config ,
52
+ bool cmd_present , uint8_t cmd ,
53
+ const uint8_t * data_buf , size_t len )
53
54
{
54
55
const struct mipi_dbi_spi_config * config = dev -> config ;
55
56
struct mipi_dbi_spi_data * data = dev -> data ;
@@ -60,70 +61,112 @@ static int mipi_dbi_spi_write_helper(const struct device *dev,
60
61
};
61
62
int ret = 0 ;
62
63
64
+ /*
65
+ * 9 bit word mode must be used, as the command/data bit
66
+ * is stored before the data word.
67
+ */
68
+
69
+ if ((dbi_config -> config .operation & SPI_WORD_SIZE_MASK )
70
+ != SPI_WORD_SET (9 )) {
71
+ return - ENOTSUP ;
72
+ }
73
+ buffer .buf = & data -> spi_byte ;
74
+ buffer .len = 2 ;
75
+
76
+ /* Send command */
77
+ if (cmd_present ) {
78
+ data -> spi_byte = cmd ;
79
+ ret = spi_write (config -> spi_dev , & dbi_config -> config , & buf_set );
80
+ if (ret < 0 ) {
81
+ goto out ;
82
+ }
83
+ }
84
+ /* Write data, byte by byte */
85
+ for (size_t i = 0 ; i < len ; i ++ ) {
86
+ data -> spi_byte = MIPI_DBI_DC_BIT | data_buf [i ];
87
+ ret = spi_write (config -> spi_dev , & dbi_config -> config , & buf_set );
88
+ if (ret < 0 ) {
89
+ goto out ;
90
+ }
91
+ }
92
+ out :
93
+ return ret ;
94
+ }
95
+
96
+ static inline int
97
+ mipi_dbi_spi_write_helper_4wire (const struct device * dev ,
98
+ const struct mipi_dbi_config * dbi_config ,
99
+ bool cmd_present , uint8_t cmd ,
100
+ const uint8_t * data_buf , size_t len )
101
+ {
102
+ const struct mipi_dbi_spi_config * config = dev -> config ;
103
+ struct spi_buf buffer ;
104
+ struct spi_buf_set buf_set = {
105
+ .buffers = & buffer ,
106
+ .count = 1 ,
107
+ };
108
+ int ret = 0 ;
109
+
110
+ /*
111
+ * 4 wire mode is much simpler. We just toggle the
112
+ * command/data GPIO to indicate if we are sending
113
+ * a command or data
114
+ */
115
+
116
+ buffer .buf = & cmd ;
117
+ buffer .len = sizeof (cmd );
118
+
119
+ if (cmd_present ) {
120
+ /* Set CD pin low for command */
121
+ gpio_pin_set_dt (& config -> cmd_data , 0 );
122
+ ret = spi_write (config -> spi_dev , & dbi_config -> config , & buf_set );
123
+ if (ret < 0 ) {
124
+ goto out ;
125
+ }
126
+ }
127
+
128
+ if (len > 0 ) {
129
+ buffer .buf = (void * )data_buf ;
130
+ buffer .len = len ;
131
+
132
+ /* Set CD pin high for data */
133
+ gpio_pin_set_dt (& config -> cmd_data , 1 );
134
+ ret = spi_write (config -> spi_dev , & dbi_config -> config , & buf_set );
135
+ if (ret < 0 ) {
136
+ goto out ;
137
+ }
138
+ }
139
+ out :
140
+ return ret ;
141
+ }
142
+
143
+ static int mipi_dbi_spi_write_helper (const struct device * dev ,
144
+ const struct mipi_dbi_config * dbi_config ,
145
+ bool cmd_present , uint8_t cmd ,
146
+ const uint8_t * data_buf , size_t len )
147
+ {
148
+ struct mipi_dbi_spi_data * data = dev -> data ;
149
+ int ret = 0 ;
150
+
63
151
ret = k_mutex_lock (& data -> lock , K_FOREVER );
64
152
if (ret < 0 ) {
65
153
return ret ;
66
154
}
67
155
68
156
if (dbi_config -> mode == MIPI_DBI_MODE_SPI_3WIRE &&
69
157
IS_ENABLED (CONFIG_MIPI_DBI_SPI_3WIRE )) {
70
- /* 9 bit word mode must be used, as the command/data bit
71
- * is stored before the data word.
72
- */
73
- if ((dbi_config -> config .operation & SPI_WORD_SIZE_MASK )
74
- != SPI_WORD_SET (9 )) {
75
- return - ENOTSUP ;
76
- }
77
- buffer .buf = & data -> spi_byte ;
78
- buffer .len = 2 ;
79
-
80
- /* Send command */
81
- if (cmd_present ) {
82
- data -> spi_byte = cmd ;
83
- ret = spi_write (config -> spi_dev , & dbi_config -> config ,
84
- & buf_set );
85
- if (ret < 0 ) {
86
- goto out ;
87
- }
88
- }
89
- /* Write data, byte by byte */
90
- for (size_t i = 0 ; i < len ; i ++ ) {
91
- data -> spi_byte = MIPI_DBI_DC_BIT | data_buf [i ];
92
- ret = spi_write (config -> spi_dev , & dbi_config -> config ,
93
- & buf_set );
94
- if (ret < 0 ) {
95
- goto out ;
96
- }
158
+ ret = mipi_dbi_spi_write_helper_3wire (dev , dbi_config ,
159
+ cmd_present , cmd ,
160
+ data_buf , len );
161
+ if (ret < 0 ) {
162
+ goto out ;
97
163
}
98
164
} else if (dbi_config -> mode == MIPI_DBI_MODE_SPI_4WIRE ) {
99
- /* 4 wire mode is much simpler. We just toggle the
100
- * command/data GPIO to indicate if we are sending
101
- * a command or data
102
- */
103
- buffer .buf = & cmd ;
104
- buffer .len = sizeof (cmd );
105
-
106
- if (cmd_present ) {
107
- /* Set CD pin low for command */
108
- gpio_pin_set_dt (& config -> cmd_data , 0 );
109
- ret = spi_write (config -> spi_dev , & dbi_config -> config ,
110
- & buf_set );
111
- if (ret < 0 ) {
112
- goto out ;
113
- }
114
- }
115
-
116
- if (len > 0 ) {
117
- buffer .buf = (void * )data_buf ;
118
- buffer .len = len ;
119
-
120
- /* Set CD pin high for data */
121
- gpio_pin_set_dt (& config -> cmd_data , 1 );
122
- ret = spi_write (config -> spi_dev , & dbi_config -> config ,
123
- & buf_set );
124
- if (ret < 0 ) {
125
- goto out ;
126
- }
165
+ ret = mipi_dbi_spi_write_helper_4wire (dev , dbi_config ,
166
+ cmd_present , cmd ,
167
+ data_buf , len );
168
+ if (ret < 0 ) {
169
+ goto out ;
127
170
}
128
171
} else {
129
172
/* Otherwise, unsupported mode */
0 commit comments