2018-04-04 17:16:20 +02:00
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*
*/
/** BusVoodoo RS-232 mode (code)
* @ file busvoodoo_rs232 . c
* @ author King Kévin < kingkevin @ cuvoodoo . info >
* @ date 2018
2018-05-01 13:43:56 +02:00
* @ note peripherals used : USART @ ref busvoodoo_rs232_usart
2018-04-04 17:16:20 +02:00
*/
/* standard libraries */
# include <stdint.h> // standard integer types
# include <stdlib.h> // standard utilities
# include <string.h> // string utilities
/* STM32 (including CM3) libraries */
# include <libopencm3/stm32/gpio.h> // general purpose input output library
# include <libopencm3/stm32/rcc.h> // real-time control clock library
# include <libopencm3/stm32/usart.h> // USART utilities
/* own libraries */
# include "global.h" // board definitions
# include "print.h" // printing utilities
# include "menu.h" // menu definitions
# include "busvoodoo_global.h" // BusVoodoo definitions
# include "busvoodoo_oled.h" // OLED utilities
2018-06-17 12:10:54 +02:00
# include "busvoodoo_uart_generic.h" // generic UART mode
2018-04-04 17:16:20 +02:00
# include "busvoodoo_rs232.h" // own definitions
2018-04-04 17:21:51 +02:00
/** @defgroup busvoodoo_rs232_usart USART peripheral used for RS-232 communication, using an RS-232 transceiver
2018-04-04 17:16:20 +02:00
* @ {
*/
# define BUSVOODOO_RS232_USART 2 /**< USART peripheral */
/** @} */
2018-06-17 12:10:54 +02:00
/** RS-232 specific methods that will be called by the generic methods */
static const struct busvoodoo_uart_generic_specific_t busvoodoo_uart_generic_rs232 = {
. usart = USART ( BUSVOODOO_RS232_USART ) ,
. usart_rcc = RCC_USART ( BUSVOODOO_RS232_USART ) ,
. usart_rst = RST_USART ( BUSVOODOO_RS232_USART ) ,
. multidrive = false ,
. tx_port = USART_TX_PORT ( BUSVOODOO_RS232_USART ) ,
. tx_pin = USART_TX_PIN ( BUSVOODOO_RS232_USART ) ,
. tx_rcc = RCC_USART_PORT ( BUSVOODOO_RS232_USART ) ,
. tx_pre = NULL ,
. tx_post = NULL ,
. rx_port = USART_RX_PORT ( BUSVOODOO_RS232_USART ) ,
. rx_pin = USART_RX_PIN ( BUSVOODOO_RS232_USART ) ,
. rx_rcc = RCC_USART_PORT ( BUSVOODOO_RS232_USART ) ,
. rx_pre = NULL ,
. rx_post = NULL ,
. hwflowctl = true ,
. rts_port = USART_RTS_PORT ( BUSVOODOO_RS232_USART ) ,
. rts_pin = USART_RTS_PIN ( BUSVOODOO_RS232_USART ) ,
. rts_rcc = RCC_USART_PORT ( BUSVOODOO_RS232_USART ) ,
. cts_port = USART_CTS_PORT ( BUSVOODOO_RS232_USART ) ,
. cts_pin = USART_CTS_PIN ( BUSVOODOO_RS232_USART ) ,
. cts_rcc = RCC_USART_PORT ( BUSVOODOO_RS232_USART ) ,
} ;
2018-04-04 17:16:20 +02:00
/** setup RS-232 mode
* @ param [ out ] prefix terminal prompt prefix
* @ param [ in ] line terminal prompt line to configure mode
* @ return if setup is complete
*/
static bool busvoodoo_rs232_setup ( char * * prefix , const char * line )
{
bool complete = false ; // is the setup complete
if ( NULL = = line ) { // first call
2018-06-17 12:10:54 +02:00
busvoodoo_uart_generic_configure ( & busvoodoo_uart_generic_rs232 ) ; // provide the RS-232 specific information
}
complete = busvoodoo_uart_generic_setup ( prefix , line ) ; // configure underlying generic UART
if ( complete ) { // generic configuration finished
gpio_clear ( GPIO ( BUSVOODOO_RS232_EN_PORT ) , GPIO ( BUSVOODOO_RS232_EN_PIN ) ) ; // set low to enable RS-232 transceiver receiver
gpio_set_mode ( GPIO ( BUSVOODOO_RS232_EN_PORT ) , GPIO_MODE_OUTPUT_10_MHZ , GPIO_CNF_OUTPUT_PUSHPULL , GPIO ( BUSVOODOO_RS232_EN_PIN ) ) ; // setup RS-232 enable GPIO as output to enable the receiver (pulled high to disable by default)
gpio_set ( GPIO ( BUSVOODOO_RS232_SHDN_PORT ) , GPIO ( BUSVOODOO_RS232_SHDN_PIN ) ) ; // set high to enable RS-232 transceiver transmitter
gpio_set_mode ( GPIO ( BUSVOODOO_RS232_SHDN_PORT ) , GPIO_MODE_OUTPUT_10_MHZ , GPIO_CNF_OUTPUT_PUSHPULL , GPIO ( BUSVOODOO_RS232_SHDN_PIN ) ) ; // setup RS-232 shutdwon GPIO as output to enable the transmitter (pulled low to disable by default)
busvoodoo_led_blue_off ( ) ; // disable blue LED because there is no activity
* prefix = " RS-232 " ; // display mode
busvoodoo_oled_text_left ( * prefix ) ; // set mode title on OLED display
const char * pinout_io [ 10 ] = { " GND " , " 5V " , " 3V3 " , " LV " , NULL , NULL , NULL , NULL , NULL , NULL } ; // RS-232 mode I/O pinout
for ( uint8_t i = 0 ; i < LENGTH ( pinout_io ) & & i < LENGTH ( busvoodoo_global_pinout_io ) ; i + + ) {
busvoodoo_global_pinout_io [ i ] = pinout_io [ i ] ; // set pin names
}
const char * pinout_rscan [ 5 ] = { " HV " , " Rx " , " Tx " , " CTS " , " RTS " } ; // RS-232 mode RS/CAN pinout
for ( uint8_t i = 0 ; i < LENGTH ( pinout_rscan ) & & i < LENGTH ( busvoodoo_global_pinout_rscan ) ; i + + ) {
busvoodoo_global_pinout_rscan [ i ] = pinout_rscan [ i ] ; // set pin names
}
const char * pinout [ 10 ] = { pinout_rscan [ 0 ] , pinout_io [ 0 ] , pinout_rscan [ 1 ] , pinout_io [ 2 ] , pinout_rscan [ 2 ] , pinout_io [ 4 ] , pinout_rscan [ 3 ] , pinout_io [ 6 ] , pinout_rscan [ 4 ] , pinout_io [ 8 ] } ; // pinout to display
busvoodoo_oled_text_pinout ( pinout , false ) ; // set pinout on display
busvoodoo_oled_update ( ) ; // update display to show text and pinout
2018-04-04 17:16:20 +02:00
}
return complete ;
}
/** exit RS-232 mode
*/
static void busvoodoo_rs232_exit ( void )
{
2018-06-17 12:10:54 +02:00
busvoodoo_uart_generic_exit ( ) ; // exiting the underlying generic UART does everything we need
2018-04-04 17:16:20 +02:00
gpio_set ( GPIO ( BUSVOODOO_RS232_EN_PORT ) , GPIO ( BUSVOODOO_RS232_EN_PIN ) ) ; // set high to disable RS-232 transceiver receiver
gpio_clear ( GPIO ( BUSVOODOO_RS232_SHDN_PORT ) , GPIO ( BUSVOODOO_RS232_SHDN_PIN ) ) ; // set low to disable RS-232 transceiver transmitter
}
const struct busvoodoo_mode_t busvoodoo_rs232_mode = {
. name = " rs232 " ,
. description = " Recommended Standard 232 " ,
. full_only = true ,
. setup = & busvoodoo_rs232_setup ,
2018-06-17 12:10:54 +02:00
. commands = busvoodoo_uart_generic_commands ,
. commands_nb = busvoodoo_uart_generic_commands_nb ,
2018-04-04 17:16:20 +02:00
. exit = & busvoodoo_rs232_exit ,
} ;