@@ -50,8 +50,8 @@ struct mipi_dsi_renesas_ra_config {
50
50
struct mipi_dsi_renesas_ra_data {
51
51
mipi_dsi_instance_ctrl_t mipi_dsi_ctrl ;
52
52
mipi_dsi_cfg_t mipi_dsi_cfg ;
53
- volatile bool message_sent ;
54
- volatile bool fatal_error ;
53
+ struct k_sem in_transmission ;
54
+ atomic_t status ;
55
55
};
56
56
57
57
void mipi_dsi_seq0 (void );
@@ -70,20 +70,9 @@ void mipi_dsi_callback(mipi_dsi_callback_args_t *p_args)
70
70
const struct device * dev = (struct device * )p_args -> p_context ;
71
71
struct mipi_dsi_renesas_ra_data * data = dev -> data ;
72
72
73
- switch (p_args -> event ) {
74
- case MIPI_DSI_EVENT_SEQUENCE_0 : {
75
- if (MIPI_DSI_SEQUENCE_STATUS_DESCRIPTORS_FINISHED == p_args -> tx_status ) {
76
- data -> message_sent = true;
77
- }
78
- break ;
79
- }
80
- case MIPI_DSI_EVENT_FATAL : {
81
- data -> fatal_error = true;
82
- break ;
83
- }
84
- default : {
85
- break ;
86
- }
73
+ if (p_args -> event == MIPI_DSI_EVENT_SEQUENCE_0 ) {
74
+ atomic_set (& data -> status , p_args -> tx_status );
75
+ k_sem_give (& data -> in_transmission );
87
76
}
88
77
}
89
78
@@ -98,6 +87,12 @@ static int mipi_dsi_renesas_ra_attach(const struct device *dev, uint8_t channel,
98
87
LOG_ERR ("DSI host supports video mode only!" );
99
88
return - ENOTSUP ;
100
89
}
90
+
91
+ if (channel == 0 && (mdev -> mode_flags & MIPI_DSI_MODE_LPM ) == 0 ) {
92
+ LOG_ERR ("This channel support LP mode transfer only" );
93
+ return - ENOTSUP ;
94
+ }
95
+
101
96
cfg .virtual_channel_id = channel ;
102
97
cfg .num_lanes = mdev -> data_lanes ;
103
98
if (mdev -> pixfmt == MIPI_DSI_PIXFMT_RGB888 ) {
@@ -130,53 +125,104 @@ static int mipi_dsi_renesas_ra_attach(const struct device *dev, uint8_t channel,
130
125
return 0 ;
131
126
}
132
127
133
- static ssize_t mipi_dsi_renesas_ra_transfer (const struct device * dev , uint8_t channel ,
134
- struct mipi_dsi_msg * msg )
128
+ #define MIPI_DSI_SEQUENCE_STATUS_ERROR \
129
+ (MIPI_DSI_SEQUENCE_STATUS_DESCRIPTOR_ABORT | MIPI_DSI_SEQUENCE_STATUS_SIZE_ERROR | \
130
+ MIPI_DSI_SEQUENCE_STATUS_TX_INTERNAL_BUS_ERROR | \
131
+ MIPI_DSI_SEQUENCE_STATUS_RX_FATAL_ERROR | MIPI_DSI_SEQUENCE_STATUS_RX_FAIL | \
132
+ MIPI_DSI_SEQUENCE_STATUS_RX_PACKET_DATA_FAIL | \
133
+ MIPI_DSI_SEQUENCE_STATUS_RX_CORRECTABLE_ERROR | \
134
+ MIPI_DSI_SEQUENCE_STATUS_RX_ACK_AND_ERROR)
135
+
136
+ static ssize_t mipi_dsi_renesas_ra_dcs_write (const struct device * dev , uint8_t channel ,
137
+ struct mipi_dsi_msg * msg )
135
138
{
136
139
struct mipi_dsi_renesas_ra_data * data = dev -> data ;
137
- ssize_t len ;
138
- int ret ;
139
- uint8_t combined_tx_buffer [msg -> tx_len + 1 ];
140
+ uint8_t payload [msg -> tx_len + 1 ];
141
+ mipi_dsi_cmd_t fsp_msg = {.channel = channel ,
142
+ .cmd_id = msg -> type ,
143
+ .p_tx_buffer = payload ,
144
+ .tx_len = msg -> tx_len + 1 ,
145
+ .flags = (msg -> flags & MIPI_DSI_MSG_USE_LPM ) != 0
146
+ ? MIPI_DSI_CMD_FLAG_LOW_POWER
147
+ : 0 };
140
148
141
- combined_tx_buffer [0 ] = msg -> cmd ;
142
- memcpy (& combined_tx_buffer [1 ], msg -> tx_buf , msg -> tx_len );
149
+ payload [0 ] = msg -> cmd ;
150
+ memcpy (& payload [1 ], msg -> tx_buf , msg -> tx_len );
143
151
144
- mipi_dsi_cmd_t fsp_msg = {
145
- .channel = channel ,
146
- .cmd_id = msg -> type ,
147
- .flags = MIPI_DSI_CMD_FLAG_LOW_POWER ,
148
- .tx_len = msg -> tx_len + 1 ,
149
- .p_tx_buffer = combined_tx_buffer ,
150
- };
151
- data -> message_sent = false;
152
- data -> fatal_error = false;
152
+ atomic_clear (& data -> status );
153
+ k_sem_reset (& data -> in_transmission );
153
154
154
- switch (msg -> type ) {
155
- case MIPI_DSI_DCS_READ :
156
- LOG_ERR ("DCS Read not yet implemented or used" );
155
+ if (R_MIPI_DSI_Command (& data -> mipi_dsi_ctrl , & fsp_msg ) != FSP_SUCCESS ) {
156
+ LOG_ERR ("DSI write fail" );
157
+ return - EIO ;
158
+ }
159
+
160
+ k_sem_take (& data -> in_transmission , K_FOREVER );
161
+
162
+ if ((data -> status & MIPI_DSI_SEQUENCE_STATUS_ERROR ) != MIPI_DSI_SEQUENCE_STATUS_NONE ) {
163
+ return - EIO ;
164
+ }
165
+
166
+ return (ssize_t )msg -> tx_len ;
167
+ }
168
+
169
+ static ssize_t mipi_dsi_renesas_ra_generic_write (const struct device * dev , uint8_t channel ,
170
+ struct mipi_dsi_msg * msg )
171
+ {
172
+ struct mipi_dsi_renesas_ra_data * data = dev -> data ;
173
+ mipi_dsi_cmd_t fsp_msg = {.channel = channel ,
174
+ .cmd_id = msg -> type ,
175
+ .p_tx_buffer = msg -> tx_buf ,
176
+ .tx_len = msg -> tx_len ,
177
+ .flags = (msg -> flags & MIPI_DSI_MSG_USE_LPM ) != 0
178
+ ? MIPI_DSI_CMD_FLAG_LOW_POWER
179
+ : 0 };
180
+
181
+ atomic_clear (& data -> status );
182
+ k_sem_reset (& data -> in_transmission );
183
+
184
+ if (R_MIPI_DSI_Command (& data -> mipi_dsi_ctrl , & fsp_msg ) != FSP_SUCCESS ) {
185
+ LOG_ERR ("DSI write fail" );
186
+ return - EIO ;
187
+ }
188
+
189
+ k_sem_take (& data -> in_transmission , K_FOREVER );
190
+
191
+ if ((data -> status & MIPI_DSI_SEQUENCE_STATUS_ERROR ) != MIPI_DSI_SEQUENCE_STATUS_NONE ) {
192
+ return - EIO ;
193
+ }
194
+
195
+ return (ssize_t )msg -> tx_len ;
196
+ }
197
+
198
+ static ssize_t mipi_dsi_renesas_ra_transfer (const struct device * dev , uint8_t channel ,
199
+ struct mipi_dsi_msg * msg )
200
+ {
201
+ if (channel == 0 && (msg -> flags & MIPI_DSI_MSG_USE_LPM ) == 0 ) {
202
+ LOG_ERR ("This channel support LP mode transfer only" );
157
203
return - ENOTSUP ;
204
+ }
205
+
206
+ switch (msg -> type ) {
158
207
case MIPI_DSI_DCS_SHORT_WRITE :
208
+ __fallthrough ;
159
209
case MIPI_DSI_DCS_SHORT_WRITE_PARAM :
210
+ __fallthrough ;
160
211
case MIPI_DSI_DCS_LONG_WRITE :
161
- ret = R_MIPI_DSI_Command (& data -> mipi_dsi_ctrl , & fsp_msg );
162
- if (ret ) {
163
- LOG_ERR ("DSI write fail: err: (%d)" , ret );
164
- return - EIO ;
165
- }
166
- while (!(data -> message_sent )) {
167
- if (data -> fatal_error ) {
168
- LOG_ERR ("fatal error" );
169
- return - EIO ;
170
- }
171
- }
172
- len = msg -> tx_len ;
173
- break ;
212
+ return mipi_dsi_renesas_ra_dcs_write (dev , channel , msg );
213
+ case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM :
214
+ __fallthrough ;
215
+ case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM :
216
+ __fallthrough ;
217
+ case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM :
218
+ __fallthrough ;
219
+ case MIPI_DSI_GENERIC_LONG_WRITE :
220
+ return mipi_dsi_renesas_ra_generic_write (dev , channel , msg );
174
221
default :
175
- LOG_ERR ("Unsupported message type (%d)" , msg -> type );
176
222
return - ENOTSUP ;
177
223
}
178
224
179
- return len ;
225
+ return 0 ;
180
226
}
181
227
182
228
static DEVICE_API (mipi_dsi , mipi_dsi_api ) = {
@@ -202,6 +248,8 @@ static int mipi_dsi_renesas_ra_init(const struct device *dev)
202
248
return ret ;
203
249
}
204
250
251
+ k_sem_init (& data -> in_transmission , 0 , 1 );
252
+
205
253
config -> irq_configure ();
206
254
data -> mipi_dsi_cfg .p_context = dev ;
207
255
0 commit comments