📄 unix_devs.c
字号:
break; default: return -1; } break; case UART_SETPARITY: // 0 (none), 1 (odd) or 2 (even). t.c_cflag &= ~(PARODD | PARENB); switch (lv) { case 0: break; case 1: t.c_cflag |= PARENB | PARODD; break; case 2: t.c_cflag |= PARENB; default: return -1; } break; case UART_SETDATABITS: t.c_cflag &= ~CSIZE; switch (lv) { case 5: t.c_cflag |= CS5; break; case 6: t.c_cflag |= CS6; break; case 7: t.c_cflag |= CS7; break; case 8: t.c_cflag |= CS8; break; default: return -1; } break; case UART_SETSTOPBITS: switch (lv) { case 1: t.c_cflag &= ~CSTOPB; break; case 2: t.c_cflag |= CSTOPB; break; default: return -1; } break; } /* tcdrain fails on mac os x for some unknown reason -- work around */ while (tcdrain( dcb->dcb_fd ) < 0) { // printf("UnixDevIOCTL: tcdrain failed: errno: %d\n\r", errno); errno = 0; usleep(1000); } if (tcsetattr( dcb->dcb_fd , TCSANOW, &t) < 0) { printf("UnixDevIOCTL: tcsetattr failed: errno: %d\n\r", errno); errno = 0; return -1; } return 0; case UART_GETSPEED: case UART_GETFLOWCONTROL: case UART_GETPARITY: case UART_GETDATABITS: case UART_GETSTOPBITS: if ((dcb->dcb_fd <= STDERR_FILENO) || ( dcb->dcb_socket)) { // default answers for sockets / stdio switch (req){ case UART_GETSPEED: *lvp = 9600; return 0; case UART_GETFLOWCONTROL: *lvp = 0; return 0; case UART_GETPARITY: *lvp = 0; return 0; case UART_GETDATABITS: *lvp = 8; return 0; case UART_GETSTOPBITS: *lvp = 1; return 0; } return 0; } if (tcgetattr(dcb->dcb_fd, &t) != 0) return -1; switch (req) { case UART_GETSPEED: *lvp = convertToRealSpeed(cfgetospeed(&t)); break; case UART_GETFLOWCONTROL: if (t.c_cflag & CRTSCTS) *lvp = UART_HS_RTSCTS; else if (t.c_iflag & IXANY) *lvp = UART_HS_SOFT; else *lvp = 0; break; case UART_GETPARITY: if (t.c_cflag & PARENB) { if (t.c_cflag & PARODD) *lvp = 1; else *lvp = 2; } else *lvp = 0; break; case UART_GETDATABITS: switch (t.c_cflag & CSIZE) { case CS5: *lvp = 5; break; case CS6: *lvp = 6; break; case CS7: *lvp = 7; break; case CS8: *lvp = 8; break; default: return -1; } break; case UART_GETSTOPBITS: if (t.c_cflag & CSTOPB) *lvp = 2; else *lvp = 1; break; } return 0;#ifdef UART_SETBLOCKREAD case UART_SETBLOCKREAD: if (lv) dcb->dcb_modeflags |= USART_MF_BLOCKREAD; else dcb->dcb_modeflags &= ~USART_MF_BLOCKREAD; return 0; case UART_GETBLOCKREAD: if ( dcb->dcb_modeflags & USART_MF_BLOCKREAD) *lvp = 1; else *lvp = 0; return 0;#endif case UART_SETCOOKEDMODE: if (*lvp == 0) return 0; else return -1; case UART_GETSTATUS: *lvp = 0; return 0; case UART_SETTXBUFSIZ: case UART_SETRXBUFSIZ: case UART_SETTXBUFHWMARK: case UART_SETRXBUFHWMARK: case UART_SETTXBUFLWMARK: case UART_SETRXBUFLWMARK: case UART_SETSTATUS: return 0; default: return -1; } return -1;}/* ======================= Devices ======================== *//*! * \brief USART0 device control block structure. */static UNIXDCB dcb_usart0 = { 0, /* dcb_modeflags */ 0, /* dcb_statusflags */ 0, /* dcb_rtimeout */ 0, /* dcb_wtimeout */ 0, /* dbc_last_eol */ 0, /* dcb_fd */ 0, /* dcb_rx_rdy *//* xx, dcb_rx_mutex *//* xx, dcb_rx_trigger */};/*! * \brief USART1 device control block structure. */static UNIXDCB dcb_usart1 = { 0, /* dcb_modeflags */ 0, /* dcb_statusflags */ 0, /* dcb_rtimeout */ 0, /* dcb_wtimeout */ 0, /* dbc_last_eol */ 0, /* dcb_fd */ 0, /* dcb_rx_rdy *//* xx, dcb_rx_mutex *//* xx, dcb_rx_trigger */};/*! * \brief USART1 device control block structure. */static UNIXDCB dcb_usart2 = { 0, /* dcb_modeflags */ 0, /* dcb_statusflags */ 0, /* dcb_rtimeout */ 0, /* dcb_wtimeout */ 0, /* dbc_last_eol */ 0, /* dcb_fd */ 0, /* dcb_rx_rdy *//* xx, dcb_rx_mutex *//* xx, dcb_rx_trigger */};/*! * \brief Debug device 0 information structure. */NUTDEVICE devDebug0 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '0', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart0, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief Debug device 1 information structure. */NUTDEVICE devDebug1 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '1', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart1, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief uart device 0 information structure. */NUTDEVICE devUart0 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '0', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart0, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief uart device 1 information structure. */NUTDEVICE devUart1 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '1', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart1, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief uart device 2 information structure. */NUTDEVICE devUart2 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '2', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart2, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief usartavr device 0 information structure. */NUTDEVICE devUsartAvr0 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '0', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart0, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief usartavr device 1 information structure. */NUTDEVICE devUsartAvr1 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '1', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart1, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*! * \brief usartavr device 2 information structure. */NUTDEVICE devUsartAvr2 = { 0, /*!< Pointer to next device. */ {'u', 'a', 'r', 't', '2', 0, 0, 0, 0} , /*!< Unique device name. */ 0, /*!< Type of device. */ 0, /*!< Base address. */ 0, /*!< First interrupt number. */ 0, /*!< Interface control block. */ &dcb_usart2, /*!< Driver control block. */ 0, /*!< Driver initialization routine. */ UnixDevIOCTL, /*!< Driver specific control function. */ UnixDevRead, UnixDevWrite, UnixDevOpen, UnixDevClose, 0};/*@}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -