📄 ser_test_protocol.inl
字号:
//==========================================================================//// ser_test_protocol.c//// Serial device driver testing protocol////==========================================================================//####COPYRIGHTBEGIN####// // ------------------------------------------- // The contents of this file are subject to the Red Hat eCos Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.redhat.com/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations under // the License. // // The Original Code is eCos - Embedded Configurable Operating System, // released September 30, 1998. // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // //####COPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jskov// Contributors: jskov// Date: 1999-03-17// Description: Protocol implementation used to test eCos serial devices.// Relies on ser_filter to be present on the host side to// respond to test requests.// // To Do:// o Clean up.// o Clean up config change magic.// o Figure out how to handle kernel dependency// : without kernel, no timeout. Without timeout, no filter auto detection.////####DESCRIPTIONEND#####include <pkgconf/system.h>#include <pkgconf/io.h>#include <pkgconf/io_serial.h>#include <cyg/io/io.h>#include <cyg/io/devtab.h>#include <cyg/io/ttyio.h>#include <cyg/infra/diag.h>#include <cyg/infra/cyg_ass.h>#include <cyg/hal/hal_intr.h> // for reclaiming interrup vector#ifdef CYG_HAL_SPARCLITE_SLEB#include <pkgconf/hal_sparclite_sleb.h> // CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT#endif//----------------------------------------------------------------------------// Definition of which device to run tests on on various platforms.#define NA_MSG "No test device specified"#if defined(CYGPKG_HAL_POWERPC_COGENT) \ && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT) \ && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT_SERIAL_B)# define TEST_CRASH_ID "ppccog"# define TEST_SER_DEV CYGDAT_IO_SERIAL_POWERPC_COGENT_SERIAL_B_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY2)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY2_DEV# endif#endif#if defined(CYGPKG_HAL_POWERPC_MBX) \ && defined(CYGPKG_HAL_QUICC) \ && defined(CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC) \ && defined(CYGPKG_IO_SERIAL_POWERPC_QUICC_SMC_SMC1)# define TEST_CRASH_ID "ppcmbx"# define TEST_SER_DEV CYGDAT_IO_SERIAL_POWERPC_QUICC_SMC_SMC1_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY1)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_ARM_PID) \ && defined(CYGPKG_IO_SERIAL_ARM_PID) \ && defined(CYGPKG_IO_SERIAL_ARM_PID_SERIAL0)# define TEST_CRASH_ID "armpid"# define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_PID_SERIAL0_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY0)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV# endif#endif#if defined(CYGPKG_HAL_ARM_AEB) \ && defined(CYGPKG_IO_SERIAL_ARM_AEB) \ && defined(CYGPKG_IO_SERIAL_ARM_AEB_SERIAL1)# define TEST_CRASH_ID "armaeb"# define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_AEB_SERIAL1_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY1)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_ARM_EDB7XXX) \ && defined(CYGPKG_IO_SERIAL_ARM_EDB7XXX) \ && defined(CYGPKG_IO_SERIAL_ARM_EDB7XXX_SERIAL1)# define TEST_CRASH_ID "armedb7xxx"# define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_EDB7XXX_SERIAL1_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY1)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_ARM_CMA230) \ && defined(CYGPKG_IO_SERIAL_ARM_CMA230) \ && defined(CYGPKG_IO_SERIAL_ARM_CMA230_SERIAL_A)# define TEST_CRASH_ID "armcma"# define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_CMA230_SERIAL_A_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY1)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_ARM_EBSA285) && defined(CYGPKG_IO_SERIAL_ARM_EBSA285)# define TEST_CRASH_ID "arm285"# define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_EBSA285_SERIAL_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY1)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_MIPS_TX39_JMR3904) \ && defined(CYGPKG_IO_SERIAL_TX39_JMR3904) \ && defined(CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0)# define TEST_CRASH_ID "tx3jmr"# define TEST_SER_DEV CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL0_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY0)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV# endif#endif#if defined(CYGPKG_HAL_MIPS_VR4300_VRC4373) \ && defined(CYGPKG_IO_SERIAL_MIPS_VRC4373) \ && defined(CYGPKG_IO_SERIAL_MIPS_VRC4373_SERIAL0)# define TEST_CRASH_ID "vrc4373"# define TEST_SER_DEV CYGDAT_IO_SERIAL_MIPS_VRC4373_SERIAL0_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY0)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV# endif#endif#if defined(CYGPKG_HAL_MN10300_AM31_STDEVAL1) \ && defined(CYGPKG_IO_SERIAL_MN10300) \ && defined(CYGPKG_IO_SERIAL_MN10300_SERIAL2)# define TEST_CRASH_ID "am31st"# define TEST_SER_DEV CYGDAT_IO_SERIAL_MN10300_SERIAL2_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY2)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_MN10300_AM33_STB) \ && defined(CYGPKG_IO_SERIAL_MN10300) \ && defined(CYGPKG_IO_SERIAL_MN10300_SERIAL0)# define TEST_CRASH_ID "am33st"# define TEST_SER_DEV CYGDAT_IO_SERIAL_MN10300_SERIAL0_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY0)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV# endif#endif#if defined(CYGPKG_HAL_SPARCLITE_SLEB) \ && defined(CYGPKG_IO_SERIAL_SPARCLITE_SLEB) \ && defined(CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON1)# undef NA_MSG# define NA_MSG "CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT is unset"# if !defined(CYG_HAL_STARTUP_RAM) \ || defined(CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT)# define TEST_CRASH_ID "sparcl"# define TEST_SER_DEV CYGDAT_IO_SERIAL_SPARCLITE_SLEB_CON1_NAME// The interrupt vectors are normally in CygMon's control. Steal them back,// but beware that this results in GDB acknowledge characters showing up in// the serial driver if CygMon is used for hal_diag output.// Set CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT in hal_sparclite_sleb as a workaround.# define SER_OVERRIDE_INT_1 CYGNUM_HAL_INTERRUPT_9# define SER_OVERRIDE_INT_2 CYGNUM_HAL_INTERRUPT_10# if defined(CYGPKG_IO_SERIAL_TTY_TTY0)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV# endif# endif#endif#if defined(CYGPKG_HAL_SH) \ && defined(CYGPKG_IO_SERIAL_SH_EDK7708) \ && defined(CYGPKG_IO_SERIAL_SH_EDK7708_SCI)# define TEST_CRASH_ID "sh7708"# define TEST_SER_DEV CYGDAT_IO_SERIAL_SH_EDK7708_SCI_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY2)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV# endif#endif#if defined(CYGPKG_HAL_I386_PC) \ && defined(CYGPKG_IO_SERIAL_I386_PC) \ && defined(CYGPKG_IO_SERIAL_I386_PC_SERIAL0)# define TEST_CRASH_ID "i386pc"# define TEST_SER_DEV CYGDAT_IO_SERIAL_I386_PC_SERIAL0_NAME# if defined(CYGPKG_IO_SERIAL_TTY_TTY0)# define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV# endif#endif// We can't rely on haldiag for ser_filter detection - it may not define// a working character reading function.#ifndef TEST_SER_DEV# define SER_NOP_TEST# define TTY_NOP_TEST# define TEST_SER_DEV "/dev/null"# define TEST_TTY_DEV "/dev/null"#else# ifndef TEST_TTY_DEV# define TTY_NOP_TEST# define TEST_TTY_DEV "/dev/null"# endif#endif#ifndef TEST_CRASH_ID#define TEST_CRASH_ID "......"#endif//----------------------------------------------------------------------------// Crash types// Eventually this will be moved into a separate header file so a script// can read the definitions and use the output formats/codes to analyze// test results. For now we just keep it here...// FAILCODE:<tttttt:cccc:[optional data, separated by :]!>// tttttt: 6 letter target code// cccc: crash code (16bit hex value)#define TEST_CRASH(__h, __code, __msg, args...) \ CYG_MACRO_START \ int __len = 1; \ /* Try to flush remaining input */ \ cyg_thread_delay(50); \ cyg_io_get_config(__h, CYG_IO_GET_CONFIG_SERIAL_INPUT_FLUSH, \ 0, &__len); \ diag_printf("FAILCODE:<" TEST_CRASH_ID ":%04x:" __code, ## args); \ diag_printf("!>\n"); \ CYG_FAIL(__msg); \ hang(); \ CYG_MACRO_END// Target IO#define TEST_CRASH_IO 0x0000#define TEST_CRASH_IO_READ "%d", 0x0001#define TEST_CRASH_IO_WRITE "%d", 0x0002#define TEST_CRASH_IO_DRAIN "%d", 0x0003#define TEST_CRASH_IO_GET_CFG "%d", 0x0004#define TEST_CRASH_IO_SET_CFG "%d", 0x0005// Target#define TEST_CRASH_CRC 0x0010#define TEST_CRASH_CRC_CHAR "%02x", 0x0011#define TEST_CRASH_CRC_BAD "%08x:%08x", 0x0012#define TEST_CRASH_CRC_HOST "", 0x0013// Protocol errors#define TEST_CRASH_PROT 0x1000#define TEST_CRASH_PROT_BIN_MODE "%d", 0x1080#define TEST_CRASH_PROT_TEXT "%d", 0x1100#define TEST_CRASH_HOST_xx 0xf000#define TEST_CRASH_HOST_TIMEOUT "%d:%d:%d:%d", 0xf000 // command#, read invocation#, expected, actual#define TEST_CRASH_HOST_CRC_BAD "%d:%08x:%08x:%d:%02x:%02x", 0xf010 // command#, expected CRC, actual, index, expected char, actual#define TEST_CRASH_HOST_DUPLEX_BAD "%d:%d:%02x:%02x", 0xf020 // command#, index, expected char, actual//----------------------------------------------------------------------------// The data in buffer and the cmd buffer#define IN_BUFFER_SIZE 1024cyg_uint8 in_buffer[IN_BUFFER_SIZE];cyg_int8 cmd_buffer[128];//----------------------------------------------------------------------------// Some types specific to the testing protocol.typedef enum { MODE_NO_ECHO = 0, MODE_EOP_ECHO, MODE_DUPLEX_ECHO} cyg_mode_t;typedef enum { TEST_RETURN_OK = ENOERR, TEST_RETURN_NA} cyg_test_return_t;typedef struct ser_cfg { cyg_serial_baud_rate_t baud_rate; cyg_serial_word_length_t data_bits; cyg_serial_stop_bits_t stop_bits; cyg_serial_parity_t parity; // etc...} cyg_ser_cfg_t;typedef enum { OPT_SERIAL_DEBUG = 0, OPT_VERBOSE_LEVEL} cyg_option_t;typedef enum { NONE = 0, PROTOCOL_PROGRESS, PROTOCOL_DATA,} cyg_verbosity_level_t;// A few predifined option macros. Use after test_ping().#define TEST_OPTIONS(__handle, __array) \ test_options(__handle, sizeof(__array)/8, __array)#define TEST_HOST_DEBUG(__handle) \ CYG_MACRO_START \ cyg_uint32 __options[] = {OPT_SERIAL_DEBUG, 1}; \ test_options((__handle), sizeof(__options)/8, \ __options); \ CYG_MACRO_END#define TEST_HOST_PROGRESS(__handle) \ CYG_MACRO_START \ cyg_uint32 __options[] = \ {OPT_SERIAL_DEBUG, 1, \ OPT_VERBOSE_LEVEL, PROTOCOL_PROGRESS}; \ test_options((__handle), sizeof(__options)/8, \ __options); \ CYG_MACRO_END#define TEST_HOST_DATA(__handle) \ CYG_MACRO_START \ cyg_uint32 __options[] = \ {OPT_SERIAL_DEBUG, 1, \ OPT_VERBOSE_LEVEL, PROTOCOL_DATA}; \ test_options((__handle), sizeof(__options)/8, \ __options); \ CYG_MACRO_END//----------------------------------------------------------------------------// A few predefined configurations. These must all be valid for any// given target until change_config is behaving correctly.cyg_ser_cfg_t test_configs[] = {#if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && !defined(CYGPKG_HAL_ARM_PID) { CYGNUM_SERIAL_BAUD_9600, CYGNUM_SERIAL_WORD_LENGTH_8, CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE },#endif#if !defined(CYGPKG_HAL_MN10300_AM31) && \ !defined(CYGPKG_HAL_MN10300_AM33) && \ 1 { CYGNUM_SERIAL_BAUD_14400, CYGNUM_SERIAL_WORD_LENGTH_8, CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE },#endif { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE },#if !defined(CYGPKG_HAL_SPARCLITE_SLEB) && \ !defined(CYGPKG_HAL_ARM_AEB) { CYGNUM_SERIAL_BAUD_38400, CYGNUM_SERIAL_WORD_LENGTH_8, CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE },#endif#if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ !defined(CYGPKG_HAL_ARM_AEB) && \ !defined(CYGPKG_HAL_SPARCLITE_SLEB) && \ !defined(CYGPKG_HAL_MN10300_AM33) && \ 1 { CYGNUM_SERIAL_BAUD_57600, CYGNUM_SERIAL_WORD_LENGTH_8, CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE },#endif#if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ !defined(CYGPKG_HAL_ARM_PID) && \ !defined(CYGPKG_HAL_ARM_AEB) && \ !defined(CYGPKG_HAL_MN10300_STDEVAL1) && \ !defined(CYGPKG_HAL_ARM_CMA230) && \ !defined(CYGPKG_HAL_ARM_EDB7XXX) && \ !defined(CYGPKG_HAL_SPARCLITE_SLEB) { CYGNUM_SERIAL_BAUD_115200, CYGNUM_SERIAL_WORD_LENGTH_8,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -