⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ser_test_protocol.inl

📁 eCos1.31版
💻 INL
📖 第 1 页 / 共 3 页
字号:
//==========================================================================////        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 + -