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

📄 consolex.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -