FreeCalypso > hg > fc-tourmaline
diff src/cs/services/atp/atp_uart.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/services/atp/atp_uart.c Fri Oct 16 06:23:26 2020 +0000 @@ -0,0 +1,266 @@ +/********************************************************************************/ +/* */ +/* File Name: atp_uart.c */ +/* */ +/* Purpose: This file contains the internal functions related to */ +/* the ATP-UART interface and used to utilize a COM port */ +/* under WIN32. */ +/* */ +/* Note: None. */ +/* */ +/* Revision History: */ +/* 10/04/01 Pascal Pompei */ +/* - Create. */ +/* */ +/* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved. */ +/* */ +/********************************************************************************/ +#include "atp/atp_uart_i.h" + + +/********************************************************************************/ +/* */ +/* Function Name: atp_uart_create_com_port */ +/* */ +/* Purpose: This function creates a COM port. */ +/* */ +/* Input Parameters: */ +/* com_port - Contains the COM port number. */ +/* baud_rate - Contains the baud rate (in bits per second). */ +/* */ +/* Output Parameters: None. */ +/* */ +/* Global Parameters: None. */ +/* */ +/* Note: None. */ +/* */ +/* Revision History: */ +/* 02/05/01 David Lamy-Charrier */ +/* - Create. */ +/* */ +/********************************************************************************/ +T_ATP_UART_ERROR_CODES atp_uart_create_com_port (T_ATP_UART_COM_PORT com_port, + T_ATP_UART_BAUD_RATE baud_rate) +{ + /* Declare local variables. */ + DCB control_settings; + COMMTIMEOUTS timeouts = {MAXDWORD, \ + MAXDWORD, \ + 0x0000000A, \ + 0x00000000, \ + 0x00000000}; + +/******************* atp_uart_create_com_port function begins *******************/ + + /* First, update the name associated with the COM port. */ + (gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_name[3] = (char) ('0' + com_port); + + /* Then, create the COM port with the following parameters: */ + /* - Read/Write access, */ + /* - The COM port can not be shared and can not be opened again until the */ + /* handle is closed, */ + /* - The handle can not be inherited, */ + /* - The COM port is just opened (failed if does not exist), */ + /* - No specific file attributes, */ + /* - No template used. */ + (gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle = CreateFile ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_name, + (GENERIC_READ | GENERIC_WRITE), + 0x00000000, + NULL, + OPEN_EXISTING, + 0x00000000, + NULL); + + /* If any error occurred, then abort. */ + if ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle == INVALID_HANDLE_VALUE) + { + return (RV_INVALID_PARAMETER); + } + + /* Otherwise, having created the COM port, get the default setting */ + /* information. However, if any error occurred, then remove the COM port */ + /* and abort. */ + control_settings.DCBlength = sizeof (DCB); + if (GetCommState ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle, \ + &control_settings) == FALSE) + { + (void) atp_uart_remove_com_port (); + return (RV_INVALID_PARAMETER); + } + + /* Define the baud rate, as well as the DCB structure settings. */ + control_settings.BaudRate = baud_rate; + control_settings.fOutxCtsFlow = TRUE; + control_settings.fOutxDsrFlow = FALSE; + control_settings.fDtrControl = DTR_CONTROL_ENABLE; + control_settings.fDsrSensitivity = FALSE; + control_settings.fRtsControl = RTS_CONTROL_HANDSHAKE; + + /* Then, configure the COM port according to the specifications of the DCB */ + /* structure, set the timeout parameters for all read and write operations */ + /* on the COM port and discard all characters from the output and input */ + /* buffers. However, if any error occurred, then remove the COM port and */ + /* abort. */ + if ((SetCommState ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle, \ + &control_settings) == FALSE) || \ + (SetCommTimeouts ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle, \ + &timeouts) == FALSE) || \ + (PurgeComm ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle, \ + (PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT)) == FALSE)) + { + (void) atp_uart_remove_com_port (); + return (RV_INTERNAL_ERR); + } + return (RV_OK); + +} /****************** End of atp_uart_create_com_port function ******************/ + + +/********************************************************************************/ +/* */ +/* Function Name: atp_uart_write_com_port */ +/* */ +/* Purpose: This function writes data on the COM port. */ +/* */ +/* Input Parameters: */ +/* data_buffer_p - Pointer on the data to be written. */ +/* data_size - Contains the total byte count to be written. */ +/* */ +/* Output Parameters: None. */ +/* */ +/* Global Parameters: None. */ +/* */ +/* Note: Buffer de-allocation is outside the scope of this */ +/* function. */ +/* */ +/* Revision History: */ +/* 02/05/01 David Lamy-Charrier */ +/* - Create. */ +/* */ +/********************************************************************************/ +T_ATP_UART_ERROR_CODES atp_uart_write_com_port (UINT8 *data_buffer_p, + UINT32 data_size) +{ + /* Declare a local variable. */ + UINT32 data_size_sent = 0x00000000; + +/******************** atp_uart_write_com_port function begins *******************/ + + /* Attempt writing data. If any error occurred, then abort. */ + if (((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle == INVALID_HANDLE_VALUE) || \ + (WriteFile ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle, \ + data_buffer_p, \ + data_size, \ + (unsigned long *) (&data_size_sent), \ + NULL) == FALSE) || \ + (data_size_sent != data_size)) + { + return (RV_INVALID_PARAMETER); + } + return (RV_OK); + +} /******************* End of atp_uart_write_com_port function ******************/ + + +/********************************************************************************/ +/* */ +/* Function Name: atp_uart_read_com_port */ +/* */ +/* Purpose: This function reads data from the COM port. */ +/* */ +/* Input Parameters: */ +/* data_buffer_p - Pointer on the destination buffer. */ +/* data_size_p - Pointer on the total byte count to be read. */ +/* */ +/* Output Parameters: None. */ +/* data_size_p - Contains the total byte count read. */ +/* */ +/* Global Parameters: None. */ +/* */ +/* Notes: Buffer allocation is outside the scope of this */ +/* function Moreover, this function returns the total */ +/* byte count read, up to the expected value (from */ +/* 0x00000000 to 'data_size_p'). */ +/* */ +/* Revision History: */ +/* 02/05/01 David Lamy-Charrier */ +/* - Create. */ +/* */ +/********************************************************************************/ +T_ATP_UART_ERROR_CODES atp_uart_read_com_port (UINT8 *data_buffer_p, + UINT32 *data_size_p) +{ + /* Declare a local variable. */ + UINT32 data_size_read = 0x00000000; + UINT32 total_data_size_read = 0x00000000; + +/******************** atp_uart_read_com_port function begins ********************/ + + /* First, check whether the COM port is in use and whether the total byte */ + /* count to be read is valid. Otherwise, abort. */ + if (((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle == INVALID_HANDLE_VALUE) || \ + (data_size_p == NULL)) + { + return (RV_INVALID_PARAMETER); + } + + /* Then, attempt reading data, up to the expected value. However, abort if */ + /* no data available from the COM port or if any error occurred. */ + do + { + if (ReadFile ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle, \ + (data_buffer_p + total_data_size_read), \ + (*data_size_p - total_data_size_read), \ + (unsigned long *) (&data_size_read), \ + NULL) == FALSE) + { + return (RV_INVALID_PARAMETER); + } + total_data_size_read += data_size_read; + } + while (data_size_read != 0x00000000); + + /* Update the total byte count read. */ + *data_size_p = total_data_size_read; + return(RV_OK); + +} /******************* End of atp_uart_read_com_port function *******************/ + + +/********************************************************************************/ +/* */ +/* Function Name: atp_uart_remove_com_port */ +/* */ +/* Purpose: This function removes the COM port. */ +/* */ +/* Input Parameters: None. */ +/* */ +/* Output Parameters: None. */ +/* */ +/* Global Parameters: None. */ +/* */ +/* Note: None. */ +/* */ +/* Revision History: */ +/* 02/05/01 David Lamy-Charrier */ +/* - Create. */ +/* */ +/********************************************************************************/ +T_ATP_UART_ERROR_CODES atp_uart_remove_com_port (void) +{ + +/******************* atp_uart_remove_com_port function begins *******************/ + + /* Remove the COM port. If any error occurred, then abort. */ + if (((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle == INVALID_HANDLE_VALUE) || \ + (DeleteFile ((gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_name) == FALSE)) + { + return (RV_INVALID_PARAMETER); + } + + /* Set the default handle assigned to the COM port. */ + (gbl_atp_uart_ctrl_blk_p->conn_ctrl_blk).com_port_handle = INVALID_HANDLE_VALUE; + return (RV_OK); + +} /****************** End of atp_uart_remove_com_port function ******************/ + \ No newline at end of file