📄 consolex.c
字号:
switch(wr5[port]&0x60){ case 0x60: t->c_cflag |= CS8; break; case 0x20: t->c_cflag |= CS7; break; } /* Parity */ /* wr = ZREAD(port,4);*/ if(wr4[port] & 0x01) t->c_cflag |= PARENB; else t->c_cflag &= ~PARENB; if(wr4[port] & 0x02) t->c_cflag &= ~PARODD; else t->c_cflag |= PARODD; /* Stop bits */ /* wr = ZREAD(port,4);*/ if((wr4[port]&0xc0) == 0xc0) t->c_cflag |= CSTOPB; else t->c_cflag &= ~CSTOPB; return 0;}/*********************************************************************** DEVICE INDEPENDED PART ***********************************************************************/#define LOCAL_ISTRIP 0x0001#define LOCAL_INLCR 0x0002#define LOCAL_IGNCR 0x0004#define LOCAL_ICRNL 0x0008#define LOCAL_IUCLC 0x0010#define LOCAL_OLCUC 0x0020#define LOCAL_ONLCR 0x0040#define LOCAL_OCRNL 0x0080#define LOCAL_ICANON 0x0100#define LOCAL_ECHO 0x0200/* * Device initialize entry point */rtems_device_driver consolex_initialize(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ rtems_status_code status; char devname[16]; int i; SCCInitialize();#ifdef CONSOLEPORT status = rtems_io_register_name("/dev/console",major, (rtems_device_minor_number) CONSOLEPORT); if (status != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred(status);#endif for(i = PORTFROM; i < NPORTS; i++){ /* Register cooked ttys */ sprintf(devname,"/dev/%s%02d",DEVICEPREFIX,i); status = rtems_io_register_name(strdup(devname),major, (rtems_device_minor_number) i); if (status != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred(status); /* Register raw ttys */ sprintf(devname,"/dev/%s%02d",RAWDEVICEPREFIX,i); status = rtems_io_register_name(strdup(devname),major, (rtems_device_minor_number) i+NPORTS); if (status != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred(status); } for(i = 0; i < NPORTS; i++){ opencount[i] = 0; } return RTEMS_SUCCESSFUL;}/* * Open entry point */rtems_device_driver consolex_open(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ rtems_libio_open_close_args_t *openargs = (rtems_libio_open_close_args_t *) arg; if(minor >= NPORTS) minor -= NPORTS; if(minor >= NPORTS) return RTEMS_INVALID_NUMBER; if(opencount[minor]++ == 0){ /* first open */ SCCSetDTR(minor); SCCSetRTS(minor); } openargs->iop->data0 = LOCAL_ICRNL|LOCAL_ONLCR|LOCAL_ICANON|LOCAL_ECHO; return RTEMS_SUCCESSFUL;}/* * Close entry point */rtems_device_driver consolex_close(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ if(minor >= NPORTS) minor -= NPORTS; if(minor >= NPORTS) return RTEMS_INVALID_NUMBER; if(--(opencount[minor]) == 0){ /* closed all */ SCCResetRTS(minor); SCCResetDTR(minor); } return RTEMS_SUCCESSFUL;}/* * read bytes from the serial port. */rtems_device_driver consolex_read_raw(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; char *buffer; int count; if(minor >= NPORTS) return RTEMS_INVALID_NUMBER; buffer = rw_args->buffer; count = rw_args->count; if(rw_args->flags & LIBIO_FLAGS_NO_DELAY){ /* Non blocking read */ while(count){ if(!SCCGetOne(minor,buffer)) break; buffer++; count--; } }else{ /* Blocking read */ while(count){ *buffer = SCCGetOneBlocked(minor); buffer++; count--; } } rw_args->bytes_moved = rw_args->count-count; return count ? RTEMS_UNSATISFIED : RTEMS_SUCCESSFUL;}rtems_device_driver consolex_read(rtems_device_major_number major, rtems_device_minor_number minor, void *arg){ rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; char *buffer; int count; unsigned32 mode; if(minor >= NPORTS) return consolex_read_raw(major,minor-NPORTS,arg); buffer = rw_args->buffer; count = rw_args->count; mode = rw_args->iop->data0; /* Cooked read */ while(count){ if(rw_args->flags & LIBIO_FLAGS_NO_DELAY){ /* Non blocking read */ if(!SCCGetOne(minor,buffer)) break; }else{ /* Blocking read */ *buffer = SCCGetOneBlocked(minor); } if((mode&LOCAL_ICANON) && (*buffer == '\b')){ if(buffer > (char *)(rw_args->buffer)){ buffer--; count++; if(mode&LOCAL_ECHO){ SCCSendOneBlocked(minor,'\b'); SCCSendOneBlocked(minor,' '); SCCSendOneBlocked(minor,'\b'); } } continue; } if((mode&LOCAL_IGNCR) && (*buffer == '\r')) continue; if((mode&LOCAL_INLCR) && (*buffer == '\n')) *buffer = '\r'; if((mode&LOCAL_ICRNL) && (*buffer == '\r')) *buffer = '\n'; if((mode&LOCAL_IUCLC) && isupper((int)*buffer)) *buffer = tolower(*buffer); if(mode&LOCAL_ISTRIP) *buffer &= 0x7f; if(mode&LOCAL_ECHO){ /* Caution: Echo back is blocking output */ SCCSendOneBlocked(minor,*buffer); } if((mode&LOCAL_ICANON) && (*buffer == '\n')){ buffer++; count--; if(count) *buffer = 0; if((mode&LOCAL_ECHO)&&(mode&LOCAL_ONLCR)) SCCSendOneBlocked(minor,'\r'); break; /* finish reading */ } buffer++; count--; } rw_args->bytes_moved = rw_args->count-count; return count ? RTEMS_UNSATISFIED : RTEMS_SUCCESSFUL;}/* * write bytes to the serial port. */rtems_device_driver consolex_write_raw(rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; char *buffer; int count; if(minor >= NPORTS) return RTEMS_INVALID_NUMBER; buffer = rw_args->buffer; count = rw_args->count; if(rw_args->flags & LIBIO_FLAGS_NO_DELAY){ /* Non blocking write */ while(count){ if(!SCCSendOne(minor,*buffer)) break; buffer++; count--; } }else{ /* Blocking write */ while(count){ SCCSendOneBlocked(minor,*buffer); buffer++; count--; } } rw_args->bytes_moved = rw_args->count-count; return count ? RTEMS_UNSATISFIED : RTEMS_SUCCESSFUL;}rtems_device_driver consolex_write(rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; char *buffer; int count; char ch; unsigned32 mode; if(minor >= NPORTS) return consolex_write_raw(major,minor-NPORTS,arg); buffer = rw_args->buffer; count = rw_args->count; mode = rw_args->iop->data0; /* Cooked write */ while(count){ ch = *buffer; if((mode&LOCAL_ONLCR) && (ch == '\n')){ /* Output CRLF */ if(rw_args->flags & LIBIO_FLAGS_NO_DELAY){ /* Non blocking write */ if(!SCCSendOne(minor,'\r')) break; }else{ SCCSendOneBlocked(minor,'\r'); } } if((mode&LOCAL_OCRNL) && (ch == '\r')) ch = '\n'; if((mode&OLCUC) && (islower((int)ch))) ch = toupper(ch); if(rw_args->flags & LIBIO_FLAGS_NO_DELAY){ /* Non blocking write */ if(!SCCSendOne(minor,ch)) break; }else{ SCCSendOneBlocked(minor,ch); } buffer++; count--; } rw_args->bytes_moved = rw_args->count-count; return count ? RTEMS_UNSATISFIED : RTEMS_SUCCESSFUL;}/* * IO Control entry point */rtems_device_driver consolex_control(rtems_device_major_number major, rtems_device_minor_number minor, void * arg){ rtems_libio_ioctl_args_t *ioarg = (rtems_libio_ioctl_args_t *)arg; struct termios *tm = ioarg->buffer; unsigned32 *mode = &(ioarg->iop->data0); if(minor >= NPORTS) minor -= NPORTS; if(minor >= NPORTS) return RTEMS_INVALID_NUMBER; switch(ioarg->command){ case RTEMS_IO_GET_ATTRIBUTES: tm->c_iflag = tm->c_oflag = tm->c_cflag = tm->c_lflag = 0; if(*mode & LOCAL_ISTRIP) tm->c_iflag |= ISTRIP; if(*mode & LOCAL_INLCR) tm->c_iflag |= INLCR; if(*mode & LOCAL_IGNCR) tm->c_iflag |= IGNCR; if(*mode & LOCAL_ICRNL) tm->c_iflag |= ICRNL; if(*mode & LOCAL_IUCLC) tm->c_iflag |= IUCLC; if(*mode & LOCAL_OLCUC) tm->c_oflag |= OLCUC; if(*mode & LOCAL_ONLCR) tm->c_oflag |= ONLCR; if(*mode & LOCAL_OCRNL) tm->c_oflag |= OCRNL; if(*mode & LOCAL_ICANON) tm->c_lflag |= ICANON; if(*mode & LOCAL_ECHO) tm->c_lflag |= ECHO; ioarg->ioctl_return = SCCGetAttributes(minor,tm); break; case RTEMS_IO_SET_ATTRIBUTES: *mode = 0; if(tm->c_iflag & ISTRIP) *mode |= LOCAL_ISTRIP; if(tm->c_iflag & INLCR) *mode |= LOCAL_INLCR; if(tm->c_iflag & IGNCR) *mode |= LOCAL_IGNCR; if(tm->c_iflag & ICRNL) *mode |= LOCAL_ICRNL; if(tm->c_iflag & IUCLC) *mode |= LOCAL_IUCLC; if(tm->c_oflag & OLCUC) *mode |= LOCAL_OLCUC; if(tm->c_oflag & ONLCR) *mode |= LOCAL_ONLCR; if(tm->c_oflag & OCRNL) *mode |= LOCAL_OCRNL; if(tm->c_lflag & ICANON) *mode |= LOCAL_ICANON; if(tm->c_lflag & ECHO) *mode |= LOCAL_ECHO; ioarg->ioctl_return = SCCSetAttributes(minor,tm); break; default: return RTEMS_NOT_DEFINED; } return RTEMS_SUCCESSFUL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -