亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rt_com.c

?? fsmlabs的real time linux的內核
?? C
?? 第 1 頁 / 共 2 頁
字號:
	}    }    return( done );}/** Get first byte from the write buffer. * * @param p  rt_com_struct of the line we are writing to. * @param c  Address to put the char in. * @return   Number of characters we actually got. * * @author Jens Michaelsen, Jochen K黳per * @version 1999/10/01 */static inline int rt_com_irq_get( struct rt_com_struct *p, unsigned char *c ){    struct rt_buf_struct *b = &( p->obuf );    if( b->head != b->tail ) {	*c = b->buf[ b->tail++ ];	b->tail &= ( RT_COM_BUF_SIZ - 1 );	return( 1 );    }    return( 0 );}/** Concatenate a byte to the read buffer. * * @param p   rt_com_struct of the line we are writing to. * @param ch  Byte to put into buffer. * * @author Jens Michaelsen, Jochen K黳per * @version 1999/07/20 */static inline void rt_com_irq_put( struct rt_com_struct *p, unsigned char ch ){    struct rt_buf_struct *b = &( p->ibuf );    b->buf[ b->head++ ] = ch;    b->head &= ( RT_COM_BUF_SIZ - 1 );}/** Registered interrupt handlers. * * These simply call the general interrupt handler for the current * line to do the work. * * @author Jens Michaelsen, Jochen K黳per, Hua Mao * @version 1999/11/11 */#if defined RTLINUX_V1 || defined RTAIstatic void rt_com0_isr( void ){    rt_com_isr( 0 );}static void rt_com1_isr( void ){    rt_com_isr( 1 );}#elsestatic unsigned int rt_com0_isr( unsigned int num, struct pt_regs *r ){    return rt_com_isr( 0, NULL );}static unsigned int rt_com1_isr( unsigned int num, struct pt_regs *r ){    return rt_com_isr( 1, NULL );}#endif/** Real interrupt handler. * * Called by the registered ISRs to do the actual work. * * @param com Port to use corresponding to internal numbering scheme. * * @author Jens Michaelsen, Jochen K黳per, Hua Mao, Renoldi Giuseppe * @version 2000/10/02 */#if defined RTLINUX_V1 || defined RTAIstatic inline void rt_com_isr( unsigned int com )#elseunsigned int rt_com_isr( unsigned int com, struct pt_regs *r )#endif{    struct rt_com_struct *p = &(rt_com_table[com]);    struct rt_buf_struct *b = &(p->ibuf); //!!    unsigned int B = p->port;    unsigned char data, sta;    int buff,t;    char loop = 4;    char toFifo = 16;    int rxd_bytes = 0;    do {	/* get available data from port */	sta = inb( B + RT_COM_LSR );	if( 0x1e & sta)	    p->error = sta & 0x1e;	while( RT_COM_DATA_READY & sta ) {	    data = inb( B + RT_COM_RXB );	    rt_com_irq_put( p, data );	    rxd_bytes = 1;	    sta = inb( B + RT_COM_LSR );	    if( 0x1e & sta )		p->error = sta & 0x1e;	}	/* controls on buffer full and RTS clear on hardware flow control */	buff = rt_com_buff_free( b->head, b->tail );	if (buff < RT_COM_BUF_FULL)	    p->error = RT_COM_BUFFER_FULL;	if ( ( p->mode & 0x02 ) && ( buff < RT_COM_BUF_LOW ) ) {	    p->mcr &= ~0x02;	    outb( p->mcr, p->port+RT_COM_MCR );	}	/* if possible, put data to port */	sta = inb( B + RT_COM_MSR );	if ( ( ( 0x20 & sta )	       && ( ( 0x10 & sta ) || ( 0 == ( p->mode & 0x02 ) ) ) ) || ( p->mode & 0x01 ) ) {	    /* (DSR && (CTS || Mode==no hw flow)) or Mode==no hand shake */            if ( ( sta = inb(B + RT_COM_LSR) ) & 0x20 ) { // if (THRE==1) i.e. transmitter empty	    	if( 0 != ( t = rt_com_irq_get( p, &data ) ) ) { /* if data in output buffer */		    do {			outb( data, B + RT_COM_TXB );		    } while( ( --toFifo > 0 ) && ( 0 != ( t = rt_com_irq_get( p, &data ) ) ) );		}		if( ! t ) {		    /* no more data in output buffer, disable Transmitter Holding Register Empty Interrupt */		    p->ier &= ~0x02;		    outb( p->ier, B + RT_COM_IER );	        }	    }	}      /* check the low nibble of IIR to check if there is another pending interrupt */      /* Note: why is it done at most 4 times ? */    } while( 1 != ( ( inb( B + RT_COM_IIR ) & 0x0f ) ) && ( --loop > 0 ) );    if (rxd_bytes) {	/* We received 1+ bytes. If user requested a callback, invoke it. */	if (p->callback)	    (*(p->callback)) (com);    }#if defined RTLINUX_V1 || defined RTAI    return;#else    rtl_hard_enable_irq( p->irq );    return 0;#endif}/** Setup one port * * Calls from init_module + cleanup_module have baud == 0; in these * cases we only do some cleanup. * * To allocate a port, give usefull setup parameter, to deallocate * give negative baud. * * @param com        Number corresponding to internal port numbering scheme. *                   This is esp. the index of the rt_com_table to use. * @param baud       Data transmission rate to use [Byte/s]. * @param parity     Parity for transmission protocol. *                   (RT_COM_PARITY_EVEN, RT_COM_PARITY_ODD or RT_COM_PARITY_NONE) * @param stopbits   Number of stopbits to use. 1 gives you one stopbit, 2 *                   actually gives really two stopbits for wordlengths of *                   6 - 8 bit, but 1.5 stopbits for a wordlength of 5 bits. * @param wordlength Number of bits per word (5 - 8 bits). * @return           -1 if error, 0 if all right * * @author Jens Michaelsen, Jochen K黳per * @version 1999/07/20 */int rt_com_setup( unsigned int com, int baud, unsigned int parity,		  unsigned int stopbits, unsigned int wordlength ){    if ( com < RT_COM_CNT ) {  //!!	struct rt_com_struct  *p = &( rt_com_table[ com ] );	unsigned int base = p->port, divider, par = parity;	if( 0 == p->used )	    return( -EBUSY );	/* Stop everything, set DLAB */	outb( 0x00, base + RT_COM_IER );	outb( 0x80, base + RT_COM_LCR );	/* clear irq */	inb( base + RT_COM_IIR );	inb( base + RT_COM_LSR );	inb( base + RT_COM_RXB );	inb( base + RT_COM_MSR );	p->error = 0; //!! init. last error code	p->callback = 0;	if( 0 == baud ) {	    /* return */	} else if( 0 > baud ) {	    MOD_DEC_USE_COUNT;	} else {	    MOD_INC_USE_COUNT;	    divider = p->baud_base / baud;	    outb( divider % 256, base + RT_COM_DLL );	    outb( divider / 256, base + RT_COM_DLM );	    /* bits 3,4 + 5 determine parity - clear all other bits */	    par &= 0x38;	    /* set transmission parameters and clear DLAB */	    outb( ( wordlength - 5 ) + ( ( stopbits - 1 ) << 2 ) + par, base + RT_COM_LCR );	    p->mcr = RT_COM_DTR + RT_COM_RTS + RT_COM_Out1 + RT_COM_Out2;	    outb( p->mcr , base + RT_COM_MCR );	    if (p->mode & 0x01) p->ier = 0x05; /* if no hs signals enable only receiver interrupts  */	    else p->ier = 0x0D;                /* else enable receiver and modem interrupts */	    outb( p->ier, base + RT_COM_IER );	    rt_com_enable_fifo( base, RT_COM_FIFO_TRIGGER, 0 );	    p->used |= 0x02; /* mark setup done */	}	return( 0 );    }    return( -ENODEV );}/** Optional callback function. * * If the user supplies a callback function, it is called whenever * characters are received. * * *** NOTE *** The callback function is called in the context of the * interrupt handler! * * @param com	Port to use; corresponding to internal numbering scheme. * @param fn	Callback function (0 = de-register callback function). * @return	Pointer to previously-installed callback function. * * @author James Puttick * @version 2000/02/08 */IRQ_CALLBACK_FN rt_com_set_callback (unsigned int com, IRQ_CALLBACK_FN fn){    struct rt_com_struct *p;    IRQ_CALLBACK_FN	old_fn;    if( com >= RT_COM_CNT )	return( 0 );    p = &( rt_com_table[ com ] );    old_fn = p->callback;    p->callback = fn;    return( old_fn );}/** Port and irq setting for a specified COM. * * This must run in standard Linux context ! * * @param com    Port to use; corresponding to internal numbering scheme. * @param port   port address, if zero, use standard value from rt_com_table, *               if negative, deinitialize. * @param irq    irq address, if zero, use standard value from rt_com_table * @return       0 if all right, -1 if port is used yet, -2 if error on port region request * * @author Roberto Finazzi * @version 1999/10/31 */int rt_com_set_param( unsigned int com, int port, int irq ){    if( com >= RT_COM_CNT ) {	return( -ENODEV );    } else {	struct rt_com_struct *p = &( rt_com_table[ com ] );	if( 0 == p->used ) {	    if( 0 != port )		p->port = port;	    if( 0 != irq )		p->irq = irq;	    if( -EBUSY == check_region( p->port, 8 ) ) {		return( -EBUSY );	    }	    request_region( p->port, 8, "rt_com" );	    rt_com_request_irq( p->irq, p->isr );	    rt_com_setup( com, 0, 0, 0, 0 );	    p->used = 1;	} else {	    if( 0 > port ) {		rt_com_setup( com, 0, 0, 0, 0 );		rt_com_free_irq( p->irq );		release_region( p->port, 8 );		p->used = 0;	    } else {		return( -EBUSY );	    }	}    }    return( 0 );}/** Initialization * * Request port memory and register ISRs, if we cannot get the memory * of all ports, release all already requested ports and return an * error. * * @return Success status, zero on success. * * @author Jochen K黳per, Hua Mao * @version 2000/05/05 */int init_module( void ){    struct rt_com_struct *p;    int errorcode = 0, i, j;    for( i=0; i<RT_COM_CNT; i++ ) {	p = &( rt_com_table[ i ] );	if( p->used > 0 ) {	    if(-EBUSY == check_region( p->port, 8 ) ) {		errorcode = 1;		break;	    }	    request_region( p->port, 8, "rt_com" );	    rt_com_request_irq( p->irq, p->isr );	    rt_com_setup( i, 0, 0, 0, 0 );	}    }    if( 0 == errorcode ) {	printk( KERN_INFO "rt_com: RT-Linux serial port driver (version "		VERSION ") sucessfully loaded.\n"		KERN_INFO "rt_com: Copyright (C) 1997-2000 Jochen K黳per et al.\n" );    } else {	printk( KERN_WARNING "rt_com: cannot request all port regions,\nrt_com: giving up.\n" );	for( j=0; j<i; j++ ) {	    p = &( rt_com_table[ j ] );	    if( 0 < p->used ) {		rt_com_free_irq( p->irq );		release_region( p->port, 8 );	    }	}    }    return( errorcode );}/** Cleanup * * Unregister ISR and releases memory for all ports * * @author Jochen K黳per, Hua Mao * @version 1999/10/01 */void cleanup_module( void ){    struct rt_com_struct *p;    int i;    for( i=0; i<RT_COM_CNT; i++ ) {	p = &( rt_com_table[ i ] );	if( p->used > 0 ) {	    rt_com_free_irq( p->irq );	    rt_com_setup( i, 0, 0, 0, 0 );	    release_region( p->port, 8 );	}    }    printk( KERN_INFO "rt_com unloaded.\n" );    return;}/** * Local Variables: * mode: C * c-file-style: "Stroustrup" * End: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区资源| 99r精品视频| 蜜乳av一区二区三区| 一区二区三区日韩| 综合在线观看色| 国产精品家庭影院| 国产精品大尺度| 亚洲黄一区二区三区| 国产亲近乱来精品视频| 中文字幕精品一区二区精品绿巨人 | 懂色一区二区三区免费观看| 亚洲国产成人高清精品| 国产欧美日本一区二区三区| 久久99精品国产.久久久久久| 午夜精品久久久久久久久久| 亚洲香蕉伊在人在线观| 亚洲伊人色欲综合网| 亚洲欧美韩国综合色| 午夜精品久久久久久久99水蜜桃| 亚洲成人精品一区二区| 美脚の诱脚舐め脚责91| 国产在线不卡视频| 成人一区二区三区视频在线观看| 色偷偷久久一区二区三区| 欧美在线不卡视频| 精品久久久久久久久久久久久久久 | 美国毛片一区二区| 国产成人8x视频一区二区| 色综合网色综合| 91精品国产高清一区二区三区 | 欧美美女一区二区三区| 亚洲精品一区二区三区蜜桃下载| 国产欧美精品一区| 亚洲人成精品久久久久| 国产白丝网站精品污在线入口| 国产精品一区二区果冻传媒| 成人黄色在线看| 欧美日韩免费不卡视频一区二区三区| 精品久久免费看| 开心九九激情九九欧美日韩精美视频电影 | 精品福利一区二区三区| 日韩毛片在线免费观看| 麻豆精品国产传媒mv男同| 成人妖精视频yjsp地址| 欧美一区二区美女| 亚洲精品大片www| 国产成人激情av| 亚洲成a人片综合在线| 中文字幕一区二区三区四区不卡 | 亚洲精品久久嫩草网站秘色| 另类欧美日韩国产在线| 97se亚洲国产综合自在线| 精品免费一区二区三区| 亚洲国产成人tv| 色综合久久久久| 国产午夜精品一区二区三区嫩草 | 91丝袜美腿高跟国产极品老师| 日韩视频一区二区三区| 亚洲一区二区三区四区在线| 精品第一国产综合精品aⅴ| 国产精品免费av| 国内精品国产三级国产a久久 | 精品少妇一区二区| 夜夜操天天操亚洲| 99久久精品免费| 国产精品毛片久久久久久久| 国产精品夜夜爽| 精品国产乱码久久| 五月天丁香久久| 欧美美女直播网站| 午夜影院久久久| 欧美日韩一级二级三级| 亚洲高清免费视频| 欧美日韩国产影片| 五月天国产精品| 91精品国产综合久久久蜜臀粉嫩| 亚洲一区在线视频| 欧美性猛片xxxx免费看久爱| 亚洲亚洲人成综合网络| 欧美精品久久99久久在免费线| 亚洲综合精品久久| 欧美日韩aaaaa| 蜜桃精品视频在线| 日韩精品一区二区三区蜜臀| 国产在线国偷精品免费看| 国产免费观看久久| 91理论电影在线观看| 亚洲一区二区在线观看视频| 欧美在线免费播放| 蜜臀久久久久久久| 久久影视一区二区| 成人精品高清在线| 一区二区三区免费网站| 欧美性大战久久| 免费成人美女在线观看| 久久精品亚洲国产奇米99| 99国产精品国产精品久久| 亚洲素人一区二区| 欧美在线观看18| 国模无码大尺度一区二区三区| 欧美国产禁国产网站cc| 日本道免费精品一区二区三区| 亚洲一区二区三区四区在线免费观看 | 国产色综合一区| 91久久线看在观草草青青| 老司机精品视频一区二区三区| 日本一区二区成人在线| 欧美专区日韩专区| 国产精品夜夜嗨| 性感美女久久精品| 精品国产麻豆免费人成网站| 91麻豆精品在线观看| 三级欧美在线一区| 国产精品传媒在线| 欧美电视剧在线观看完整版| 99精品久久久久久| 国产乱人伦偷精品视频不卡 | 奇米影视在线99精品| 中文字幕av资源一区| 7777精品伊人久久久大香线蕉完整版 | 国产精品久久毛片av大全日韩| 欧美日韩免费高清一区色橹橹| 国产一二精品视频| 午夜视频在线观看一区二区| 国产精品久久网站| 久久婷婷国产综合精品青草| 欧美日韩在线直播| 91女厕偷拍女厕偷拍高清| 精久久久久久久久久久| 亚洲va韩国va欧美va| 中文字幕五月欧美| 欧美一区二区在线视频| 91在线观看高清| 国产v综合v亚洲欧| 国产在线看一区| 免费视频最近日韩| 午夜精品国产更新| 亚洲国产一区视频| 亚洲欧洲国产专区| 国产精品美女一区二区在线观看| 欧美videos大乳护士334| 欧美日韩的一区二区| 欧美专区在线观看一区| 成人av网站在线| 国产成人综合网| 免费av成人在线| 毛片不卡一区二区| 麻豆国产精品777777在线| 奇米888四色在线精品| 亚洲h在线观看| 午夜电影一区二区三区| 亚洲国产中文字幕在线视频综合| 亚洲免费资源在线播放| 一区二区三区国产| 亚洲一区二区三区在线播放| 亚洲一区二区三区四区在线观看| 亚洲自拍偷拍av| 亚洲妇熟xx妇色黄| 日韩av一二三| 国产激情一区二区三区| 奇米色777欧美一区二区| 麻豆专区一区二区三区四区五区| 日本亚洲电影天堂| 美女一区二区在线观看| 奇米精品一区二区三区在线观看| 蜜臀久久99精品久久久画质超高清 | 欧美日韩在线三级| 日韩一级片网址| 久久久国产综合精品女国产盗摄| 欧美激情一区在线观看| 亚洲日本在线a| 日日摸夜夜添夜夜添国产精品| 蜜臀a∨国产成人精品| 国产一区二区成人久久免费影院 | 色婷婷久久久亚洲一区二区三区| 色综合久久久久综合99| 欧美一区二区视频在线观看2022 | 亚洲男人天堂一区| 日日摸夜夜添夜夜添国产精品 | 国产综合色视频| av在线不卡网| 欧美午夜一区二区三区免费大片| 欧美日韩mp4| 国产欧美一区在线| 午夜精品久久久久久久| 国产精品一区二区久激情瑜伽| 99re这里只有精品6| 欧美日韩1234| 国产婷婷色一区二区三区在线| 亚洲欧美日韩一区| 经典三级一区二区| 色婷婷激情综合| 国产日韩在线不卡| 日韩精品一二三四| 成人av先锋影音| 久久影音资源网| 青青草国产成人99久久| 91丨九色porny丨蝌蚪| 精品国产一区二区亚洲人成毛片 | 欧美精品在线一区二区三区|