@@ -30,10 +30,14 @@ LOG_MODULE_REGISTER(uart_mcux_lpuart, LOG_LEVEL_ERR);
30
30
31
31
#define PINCTRL_STATE_FLOWCONTROL PINCTRL_STATE_PRIV_START
32
32
33
- #if defined(CONFIG_UART_LINE_CTRL ) && \
34
- defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT ) && \
35
- (FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT )
36
- #define UART_LINE_CTRL_ENABLE
33
+ /* Helper macros */
34
+ #if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT ) && \
35
+ FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT
36
+ #define LPUART_HAS_MODEM 1
37
+ #endif
38
+
39
+ #if defined(FSL_FEATURE_LPUART_HAS_MCR ) && FSL_FEATURE_LPUART_HAS_MCR
40
+ #define LPUART_HAS_MCR 1
37
41
#endif
38
42
39
43
#if defined(CONFIG_UART_ASYNC_API ) && defined(CONFIG_UART_INTERRUPT_DRIVEN )
@@ -970,9 +974,43 @@ static void mcux_lpuart_isr(const struct device *dev)
970
974
}
971
975
#endif /* CONFIG_UART_MCUX_LPUART_ISR_SUPPORT */
972
976
977
+ #if LPUART_HAS_MODEM
978
+ static int mcux_lpuart_config_flowctrl (uint8_t flow_ctrl , lpuart_config_t * uart_config )
979
+ {
980
+ switch (flow_ctrl ) {
981
+ case UART_CFG_FLOW_CTRL_NONE :
982
+ case UART_CFG_FLOW_CTRL_RS485 :
983
+ uart_config -> enableTxCTS = false;
984
+ uart_config -> enableRxRTS = false;
985
+ break ;
986
+
987
+ case UART_CFG_FLOW_CTRL_RTS_CTS :
988
+ uart_config -> enableTxCTS = true;
989
+ uart_config -> enableRxRTS = true;
990
+ break ;
991
+
992
+ default :
993
+ return - ENOTSUP ;
994
+ }
995
+
996
+ return 0 ;
997
+ }
998
+ #else
999
+ static int mcux_lpuart_config_flowctrl (uint8_t flow_ctrl , lpuart_config_t * uart_config )
1000
+ {
1001
+ if (flow_ctrl != UART_CFG_FLOW_CTRL_NONE ) {
1002
+ return - ENOTSUP ;
1003
+ }
1004
+
1005
+ return 0 ;
1006
+ }
1007
+ #endif /* LPUART_HAS_MODEM */
1008
+
973
1009
static int mcux_lpuart_configure_basic (const struct device * dev , const struct uart_config * cfg ,
974
1010
lpuart_config_t * uart_config )
975
1011
{
1012
+ int ret ;
1013
+
976
1014
/* Translate UART API enum to LPUART enum from HAL */
977
1015
switch (cfg -> parity ) {
978
1016
case UART_CFG_PARITY_NONE :
@@ -1016,22 +1054,15 @@ static int mcux_lpuart_configure_basic(const struct device *dev, const struct ua
1016
1054
}
1017
1055
#endif
1018
1056
1019
- #if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT ) && \
1020
- FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT
1021
- switch (cfg -> flow_ctrl ) {
1022
- case UART_CFG_FLOW_CTRL_NONE :
1023
- case UART_CFG_FLOW_CTRL_RS485 :
1024
- uart_config -> enableTxCTS = false;
1025
- uart_config -> enableRxRTS = false;
1026
- break ;
1027
- case UART_CFG_FLOW_CTRL_RTS_CTS :
1028
- uart_config -> enableTxCTS = true;
1029
- uart_config -> enableRxRTS = true;
1030
- break ;
1031
- default :
1057
+ /* Configure for Flow Control option */
1058
+ if (!IS_ENABLED (LPUART_HAS_MCR ) && cfg -> flow_ctrl == UART_CFG_FLOW_CTRL_DTR_DSR ) {
1032
1059
return - ENOTSUP ;
1033
1060
}
1034
- #endif
1061
+
1062
+ ret = mcux_lpuart_config_flowctrl (cfg -> flow_ctrl , uart_config );
1063
+ if (ret ) {
1064
+ return ret ;
1065
+ }
1035
1066
1036
1067
uart_config -> baudRate_Bps = cfg -> baudrate ;
1037
1068
uart_config -> enableRx = true;
@@ -1105,8 +1136,7 @@ static int mcux_lpuart_configure_init(const struct device *dev, const struct uar
1105
1136
1106
1137
LPUART_Init (config -> base , & uart_config , clock_freq );
1107
1138
1108
- #if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT ) && \
1109
- FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT
1139
+ #ifdef LPUART_HAS_MODEM
1110
1140
if (cfg -> flow_ctrl == UART_CFG_FLOW_CTRL_RS485 ) {
1111
1141
/* Set the LPUART into RS485 mode (tx driver enable using RTS) */
1112
1142
config -> base -> MODIR |= LPUART_MODIR_TXRTSE (true);
@@ -1185,10 +1215,15 @@ static int mcux_lpuart_configure(const struct device *dev,
1185
1215
}
1186
1216
#endif /* CONFIG_UART_USE_RUNTIME_CONFIGURE */
1187
1217
1188
- #ifdef UART_LINE_CTRL_ENABLE
1189
- static void mcux_lpuart_line_ctrl_set_rts ( const struct mcux_lpuart_config * config ,
1190
- uint32_t val )
1218
+ #ifdef CONFIG_UART_LINE_CTRL
1219
+ #if LPUART_HAS_MODEM
1220
+ static void mcux_lpuart_line_ctrl_set_rts ( const struct device * dev , uint32_t val )
1191
1221
{
1222
+ const struct mcux_lpuart_config * config = dev -> config ;
1223
+
1224
+ /* Disable Transmitter and Receiver */
1225
+ config -> base -> CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK );
1226
+
1192
1227
if (val >= 1U ) {
1193
1228
/* Reset TXRTS to set RXRTSE bit, this provides high-level on RTS line */
1194
1229
config -> base -> MODIR &= ~(LPUART_MODIR_TXRTSPOL_MASK | LPUART_MODIR_TXRTSE_MASK );
@@ -1199,20 +1234,62 @@ static void mcux_lpuart_line_ctrl_set_rts(const struct mcux_lpuart_config *confi
1199
1234
config -> base -> MODIR |= (LPUART_MODIR_TXRTSPOL_MASK | LPUART_MODIR_TXRTSE_MASK );
1200
1235
}
1201
1236
}
1237
+ #else
1238
+ #define mcux_lpuart_line_ctrl_set_rts (dev , val ) ret = -ENOTSUP
1239
+ #endif /* LPUART_HAS_MODEM */
1240
+
1241
+ #if LPUART_HAS_MCR
1242
+ static void mcux_lpuart_set_dtr (const struct device * dev , uint32_t val )
1243
+ {
1244
+ const struct mcux_lpuart_config * config = dev -> config ;
1245
+
1246
+ if (val >= 1U ) {
1247
+ /* assert DTR_b */
1248
+ config -> base -> MCR &= ~LPUART_MCR_DTR_MASK ;
1249
+ } else {
1250
+ /* deassert DTR_b */
1251
+ config -> base -> MCR |= LPUART_MCR_DTR_MASK ;
1252
+ }
1253
+ }
1254
+ #else
1255
+ #define mcux_lpuart_set_dtr (dev , val ) ret = -ENOTSUP
1256
+ #endif /* LPUART_HAS_MCR */
1202
1257
1203
1258
static int mcux_lpuart_line_ctrl_set (const struct device * dev ,
1204
1259
uint32_t ctrl , uint32_t val )
1205
1260
{
1206
- const struct mcux_lpuart_config * config = dev -> config ;
1207
1261
int ret = 0 ;
1208
1262
1209
1263
switch (ctrl ) {
1210
1264
case UART_LINE_CTRL_RTS :
1211
- /* Disable Transmitter and Receiver */
1212
- config -> base -> CTRL &= ~( LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK ) ;
1265
+ mcux_lpuart_line_ctrl_set_rts ( dev , val );
1266
+ break ;
1213
1267
1214
- mcux_lpuart_line_ctrl_set_rts (config , val );
1268
+ case UART_LINE_CTRL_DTR :
1269
+ mcux_lpuart_set_dtr (dev , val );
1270
+ break ;
1271
+
1272
+ default :
1273
+ ret = - ENOTSUP ;
1274
+ }
1275
+
1276
+ return ret ;
1277
+ }
1215
1278
1279
+ #if LPUART_HAS_MCR
1280
+ static int mcux_lpuart_line_ctrl_get (const struct device * dev ,
1281
+ uint32_t ctrl , uint32_t * val )
1282
+ {
1283
+ const struct mcux_lpuart_config * config = dev -> config ;
1284
+ int ret = 0 ;
1285
+
1286
+ switch (ctrl ) {
1287
+ case UART_LINE_CTRL_DSR :
1288
+ * val = (config -> base -> MSR & LPUART_MSR_DSR_MASK ) >> LPUART_MSR_DSR_SHIFT ;
1289
+ break ;
1290
+
1291
+ case UART_LINE_CTRL_DCD :
1292
+ * val = (config -> base -> MSR & LPUART_MSR_DCD_MASK ) >> LPUART_MSR_DCD_SHIFT ;
1216
1293
break ;
1217
1294
1218
1295
default :
@@ -1221,7 +1298,14 @@ static int mcux_lpuart_line_ctrl_set(const struct device *dev,
1221
1298
1222
1299
return ret ;
1223
1300
}
1224
- #endif /* UART_LINE_CTRL_ENABLE */
1301
+ #else
1302
+ static int mcux_lpuart_line_ctrl_get (const struct device * dev ,
1303
+ uint32_t ctrl , uint32_t * val )
1304
+ {
1305
+ return - ENOTSUP ;
1306
+ }
1307
+ #endif /* LPUART_HAS_MCR */
1308
+ #endif /* CONFIG_UART_LINE_CTRL */
1225
1309
1226
1310
static int mcux_lpuart_init (const struct device * dev )
1227
1311
{
@@ -1301,9 +1385,10 @@ static DEVICE_API(uart, mcux_lpuart_driver_api) = {
1301
1385
.rx_buf_rsp = mcux_lpuart_rx_buf_rsp ,
1302
1386
.rx_disable = mcux_lpuart_rx_disable ,
1303
1387
#endif /* CONFIG_UART_ASYNC_API */
1304
- #ifdef UART_LINE_CTRL_ENABLE
1388
+ #ifdef CONFIG_UART_LINE_CTRL
1305
1389
.line_ctrl_set = mcux_lpuart_line_ctrl_set ,
1306
- #endif /* UART_LINE_CTRL_ENABLE */
1390
+ .line_ctrl_get = mcux_lpuart_line_ctrl_get ,
1391
+ #endif /* CONFIG_UART_LINE_CTRL */
1307
1392
};
1308
1393
1309
1394
0 commit comments