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

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

?? i2c-algo-biths.c

?? I2C總線LINUX驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* ------------------------------------------------------------------------- *//* i2c-algo-biths.c i2c driver algorithms for bit-shift adapters	     *//* ------------------------------------------------------------------------- *//*   Copyright (C) 1995-2000 Simon G. Vogl     Copyright (C) 2002-2003 Ky鰏ti M鋖kki    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.		     *//* ------------------------------------------------------------------------- *//* $Id: i2c-algo-biths.c,v 1.16 2005/03/11 20:37:33 khali Exp $ */#include <linux/kernel.h>#include <linux/module.h>#include <linux/delay.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/sched.h>#include "i2c.h"#include "i2c-algo-biths.h"/* ----- global defines ----------------------------------------------- *//* If non-zero, adapter code written for original i2c-algo-bit can be used unmodified.  * As this export same symbols, you should either remove i2c-algo-bit.o from depmod * directories, or load this module manually. */#ifndef ALGO_BIT_COMPATIBILITY#define ALGO_BIT_COMPATIBILITY 0#endif#define FATAL_BUS	0#define MODULE_STATUS	1#define FATAL_MSG	2#define FATAL_PROTOCOL	3#define ALL_MSG		4#define ALL_PROTOCOL	5#define BIT_LEVEL	9#define DEB1(x)		if (i2c_debug>=MODULE_STATUS) (x);static void proto_s(char *d, const char *s) { strcat(d, s); }static void proto_x(char *d, const char *x, unsigned char y) { while (*d) d++; sprintf(d, x, y); }#define PROTO_S(x)	if (adap->dstr) proto_s(adap->dstr, x)#define PROTO_B(x)	if ((adap->dstr) && (i2c_debug>=BIT_LEVEL)) proto_s(adap->dstr, x)#define PROTO_X(x,y)	if (adap->dstr) proto_x(adap->dstr, x, y)#define PROTO_MAX_DUMP 1024  // 50 x ".oooooooo [xx] .i[xx]"/* ----- global variables ---------------------------------------------	*//* module parameters: */static int i2c_debug; static int bit_test;	/* see if the line-setting functions work	*//* Bus timing for 50/50 duty cycle :  T_setup + T_hold = T_scllo = T_sclhi *//* Run setscl/setsda with a special flag */#define T_min   0		/* after any SCL SDA change	*/#define T_sclhi _HS_DBL_DT	/* SCL high			*/#define T_scllo	_HS_DBL_DT	/* SCL low 			*/#define T_setup 0		/* SDA change to SCL rise	*/#define T_hold  0		/* SCL fall to SDA change	*/#define _sf(a)		adap->ctrl|=(a)#define _cf(a)		adap->ctrl&=~(a)#define ___setscl(b)	if (b) _sf(_HS_SCL); else _cf(_HS_SCL); i2c_setscl(adap)#define ___setsda(b)	if (b) _sf(_HS_SDA); else _cf(_HS_SDA); i2c_setsda(adap)#define __setdt(x,dt)	if (dt) _sf(dt); x; if (dt) _cf(dt)#define __setscl(b,dt)	__setdt(___setscl(b),dt)#define __setsda(b,dt)	__setdt(___setsda(b),dt)#define __getscl()	i2c_getscl(adap)#define __getsda()	i2c_getsda(adap)#define RETURN_ON_FAILURE(x)		x; if (adap->errors) return#define TRY(x) RETURN_ON_FAILURE(x)#define _setscl(b,dt)	RETURN_ON_FAILURE(__setscl(b,dt))#define _setsda(b,dt)	RETURN_ON_FAILURE(__setsda(b,dt))#define _getscl		__getscl#define _getsda		__getsda#define _sclhi(dt)	_setscl(1,dt)#define _scllo(dt)	_setscl(0,dt)#define _sdahi(dt)	_setsda(1,dt)#define _sdalo(dt)	_setsda(0,dt)/* --- setting states on the bus with the right timing: ---------------	*/static int i2c_sda_set(struct i2c_algo_biths_data *adap, int rdcount){	int sda;	/* allow some rise/fall time */	while ( rdcount-- ) {		sda = adap->getsda(adap->hw_data);		if (adap->ctrl & _HS_SDA) {			if (sda)				return 0;			if (!rdcount) {				adap->errors |= _HS_SDA_ARB;				return -1;			}		} else { /* !(adap->ctrl & _HS_SDA) */			if (!sda)				return 0;			if (!rdcount) {				adap->errors |= _HS_HW_FAIL;				return -1;			}		}	}	return 0;}static void i2c_setsda(struct i2c_algo_biths_data *adap){	adap->setstate(adap); 	adap->setsda(adap->hw_data, adap->hw_state);	if ( !(adap->ctrl & _HS_SDA_FREE) && ! i2c_sda_set(adap, 10)) {		return;	}	adap->set_timer(adap);	adap->run_timer(adap);}static int i2c_getscl(struct i2c_algo_biths_data *adap){	return adap->getscl(adap->hw_data);}static int i2c_getsda(struct i2c_algo_biths_data *adap){	return adap->getsda(adap->hw_data);}/* * Raise scl line, and do check for delays. This is necessary for slower * devices. */static void i2c_setscl(struct i2c_algo_biths_data *adap){#ifndef HW_CANNOT_READ_SCL /* Not all adapters have scl sense line... */	int rdcount = 10;	adap->setstate(adap);	adap->setscl(adap->hw_data, adap->hw_state);	if (adap->ctrl & _HS_SCL) {		unsigned long start;		/* allow some rise time */		while (rdcount && !adap->getscl(adap->hw_data)) rdcount--;		/* else clock synchronisation, give more time */		start = jiffies;		while (!rdcount && !adap->getscl(adap->hw_data)) {			if ( time_after(jiffies, start+adap->timeout) ) {				adap->errors |= _HS_TIMEOUT; /* scl undef */				return;			}#ifdef cond_resched			cond_resched();#else			if (current->need_resched) {				set_current_state(TASK_UNINTERRUPTIBLE);				schedule_timeout(1);			}#endif		}		adap->set_timer(adap);		/* test for SDA arbitration when SCL is high */		if ( !(adap->ctrl & _HS_SDA_FREE) && ! i2c_sda_set(adap, 1)) {			return;		}	} else {		/* allow some fall time */		while (rdcount && adap->getscl(adap->hw_data)) rdcount--;		if ( !rdcount ) {			adap->errors |= _HS_HW_FAIL;			return;		}		adap->set_timer(adap);	}#else	adap->setstate(adap);	adap->setscl(adap->hw_data, adap->hw_state);	adap->set_timer(adap);#endif /* HW_CANNOT_READ_SCL */	adap->run_timer(adap);}/* start, repstart */static void i2c_start(struct i2c_algo_biths_data *adap){	PROTO_S("S");	/* assert: scl, sda undef */	adap->errors = 0;	_sdahi(T_setup);	_sclhi(T_min);	_sdalo(T_min);	_scllo(T_hold);	/* assert: scl, sda low */}static void i2c_stop(struct i2c_algo_biths_data *adap){	PROTO_S(" P");	/* scl undef after error, sda, scl freedom unknown */	adap->ctrl &= ~(_HS_SDA_FREE | _HS_DBL_DT);	if (adap->errors) {		adap->errors = 0;		_scllo(T_hold);	}	/* assert: scl low, sda undef */	_sdalo(T_setup);	_sclhi(T_min);	_sdahi(T_min);	/* assert: scl, sda high */}static void i2c_outbits(struct i2c_algo_biths_data *adap, int i) {	/* assert: scl is low */	PROTO_B(".");	while  (i--) {		PROTO_B("o");		_setsda(adap->shiftreg & 0x80, T_setup);		_sclhi(T_sclhi);		_scllo(T_hold);		adap->shiftreg<<=1;	}	/* assert: scl is low */}static void i2c_inbits(struct i2c_algo_biths_data *adap, int i){	/* assert: scl is low, sda undef */	adap->ctrl |= _HS_SDA_FREE;	PROTO_B(".");	while  (i--) {		PROTO_B("i");		_sdahi(T_setup); 		_sclhi(T_sclhi);			adap->shiftreg<<=1;		if (_getsda())			adap->shiftreg |= 0x01;		_scllo(T_hold);	}	adap->ctrl &= ~_HS_SDA_FREE;	/* assert: scl is low */}static void i2c_outb(struct i2c_algo_biths_data *adap, unsigned short flags,		     char *buf, int *count) {	while (*count) {		adap->shiftreg = *buf;		TRY(i2c_outbits(adap, 8));		PROTO_X(" %02X ", *buf);		buf++;	    		/* read ack: SDA should be pulled down by slave */		TRY(i2c_inbits(adap, 1));	    		if (! (adap->shiftreg & 0x01)) { 			PROTO_S("[A]");		} else if (flags & I2C_M_IGNORE_NAK) {			PROTO_S("[NA]");		} else {			PROTO_S("[NA]");			adap->errors |= _HS_NAK;		}		if (adap->errors) return;		(*count)--;	}}static void i2c_inb(struct i2c_algo_biths_data *adap, unsigned short flags,		    char *buf, int *count) {	while (*count) {		TRY(i2c_inbits(adap, 8));		*buf = adap->shiftreg;		PROTO_X(" [%02X] ", *buf);		buf++;	    		if (! (flags & I2C_M_NO_RD_ACK)) {			if (*count == 1) /* was last */				adap->shiftreg = 0x80;			else				adap->shiftreg = 0x00;			TRY(i2c_outbits(adap,1));			if (*count == 1) {				PROTO_S("NA");			} else {				PROTO_S("A");			}		}		(*count)--;	}}static void debug_protocol(struct i2c_algo_biths_data *adap, int retval){	if (! adap->dstr) return;	if ( ((retval<0) && (i2c_debug>=FATAL_PROTOCOL)) || 	     (i2c_debug>=ALL_PROTOCOL) ) {		printk(KERN_DEBUG "i2c-algo-biths.o: %s: %s\n", adap->name, adap->dstr); 	}	*adap->dstr = 0;}static const char * i2c_strerr(int retval){ 	switch (retval) {	    case 2:		    return "ack";			    case 1:		    return "no ack (ignored)";	    case 0:		    return "not reached";	    case -EREMOTEIO:		    return "no ack";	    case -ETIMEDOUT:		    return "SCL rise timeout";	 	    case -ECOMM:		    return "SDA arbitration";	    case -ENODEV:		    return "SCL/SDA failure";	    default:		    return "unknown";	}}static int errflag(int flags){	if (! flags)		return 2;	if (flags & _HS_HW_FAIL)		return -ENODEV;	if (flags & _HS_SDA_ARB)		return -ECOMM;	if (flags & _HS_TIMEOUT)		return -ETIMEDOUT;	if (flags & _HS_NAK)		return -EREMOTEIO;	return -1;}static void debug_printout(struct i2c_adapter *i2c_adap, int num, int retval){ 	if ( ((retval<0) && (i2c_debug>=FATAL_MSG)) ||	     (i2c_debug>=ALL_MSG) ) {		printk(KERN_ERR "i2c-algo-biths.o: %s: msg #%d %s\n", i2c_adap->name, num, i2c_strerr(retval));	}}/* * Sanity check for the adapter hardware */static int test_bus(struct i2c_algo_biths_data *adap){	int sscl, ssda, gscl, gsda, i=0;	int errors;	int test[][2] = {{1,1}, {0,1}, {1,1}, {1,0}, {1,1}, {-1,-1}}; // SDA, SCL pair

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本伊人精品一区二区三区观看方式| 中文字幕成人av| 成人av在线观| 婷婷综合另类小说色区| 国产精品乱码一区二三区小蝌蚪| 欧美精品日韩综合在线| 99久久精品国产网站| 久久不见久久见中文字幕免费| 亚洲欧美国产毛片在线| 欧美精品一区二区三区久久久| 欧美日韩国产中文| 99久久免费视频.com| 久久国产生活片100| 一区二区高清视频在线观看| 中文在线资源观看网站视频免费不卡| 欧美一区二区三区免费大片| 欧美视频一二三区| 91原创在线视频| 成人a级免费电影| 国产乱码精品一品二品| 麻豆91在线播放| 丝袜美腿亚洲一区| 亚洲精品成人在线| 中文字幕一区二区在线观看| 久久久久久综合| 精品免费99久久| 精品国产一二三区| 欧美电影免费观看高清完整版在| 欧美精品一二三四| 91.麻豆视频| 欧美美女网站色| 在线成人午夜影院| 欧美日韩免费观看一区三区| 欧美丝袜丝nylons| 欧美亚洲国产一区二区三区| 色诱亚洲精品久久久久久| jizzjizzjizz欧美| av在线这里只有精品| 色综合久久久久久久| 欧洲精品中文字幕| 91在线精品一区二区三区| a亚洲天堂av| 91免费看片在线观看| 色综合婷婷久久| 欧美主播一区二区三区美女| 在线观看免费成人| 欧美体内she精高潮| 欧美群妇大交群中文字幕| 欧美疯狂做受xxxx富婆| 宅男噜噜噜66一区二区66| 欧美一区二区三区四区久久| 欧美大片日本大片免费观看| 欧美变态tickle挠乳网站| 国产日韩欧美精品综合| 亚洲日穴在线视频| 亚洲图片有声小说| 蜜臀久久99精品久久久久久9| 老鸭窝一区二区久久精品| 国内精品写真在线观看| 成人综合在线观看| 在线区一区二视频| 日韩三级av在线播放| 久久久精品国产免费观看同学| 国产精品久久久久久久第一福利| 一区二区在线免费| 免费观看在线综合| 成人网在线播放| 91福利社在线观看| 制服丝袜激情欧洲亚洲| 久久久不卡网国产精品一区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久亚洲综合av| 国产精品成人一区二区三区夜夜夜| 一区二区欧美在线观看| 蜜桃精品在线观看| 成人av在线一区二区三区| 亚洲成人www| 一区二区三区成人| 蜜桃免费网站一区二区三区| 成年人网站91| 91精品国产综合久久精品图片| 国产午夜精品理论片a级大结局| 亚洲欧美另类图片小说| 久久精品国产一区二区三| av高清久久久| 日韩精品中文字幕一区| 亚洲欧美日韩久久精品| 久久精品国产999大香线蕉| av亚洲精华国产精华| 欧美电影一区二区| 中文字幕亚洲电影| 久久精品国产久精国产| 91久久精品一区二区| 2022国产精品视频| 午夜天堂影视香蕉久久| av在线播放一区二区三区| 精品捆绑美女sm三区| 亚洲中国最大av网站| 国产精品18久久久久久久久 | 欧美精品一区二区三区一线天视频 | 免费美女久久99| 在线一区二区三区做爰视频网站| 久久网站最新地址| 爽爽淫人综合网网站| 99久免费精品视频在线观看| 日韩天堂在线观看| 亚洲国产成人porn| 91小视频免费观看| 国产欧美日韩卡一| 韩国av一区二区三区| 欧美高清视频不卡网| 一区二区在线看| 91丝袜国产在线播放| 国产女人18水真多18精品一级做| 久久精品99久久久| 欧美羞羞免费网站| 亚洲蜜桃精久久久久久久| 成人av网站在线观看| 久久综合色婷婷| 久久精品99国产精品| 欧美一区欧美二区| 天堂va蜜桃一区二区三区漫画版| 91免费版在线看| 最新国产成人在线观看| 成人妖精视频yjsp地址| 成人午夜激情片| 一本大道av一区二区在线播放| 中文字幕va一区二区三区| 精品一二三四区| 日韩欧美一级二级三级久久久| 亚洲va韩国va欧美va| 欧美性一级生活| 亚洲国产成人av网| 欧美色倩网站大全免费| 亚洲一区二区三区四区在线观看| 在线观看免费成人| 亚洲v中文字幕| 色妹子一区二区| 亚洲一区二区三区四区不卡| 欧美色区777第一页| 午夜不卡av在线| 91麻豆精品91久久久久久清纯 | 天天综合天天综合色| 欧美日韩久久久久久| 亚洲成a人片在线观看中文| 欧美日韩综合色| 视频一区中文字幕国产| 日韩一区二区电影网| 精品一区二区三区不卡| 精品国产一区二区三区不卡 | 国产大陆精品国产| 中文字幕欧美激情一区| jvid福利写真一区二区三区| 亚洲一区二区av电影| 在线综合+亚洲+欧美中文字幕| 另类调教123区 | 中文字幕的久久| 色香蕉成人二区免费| 午夜精品久久久久久久久久| 日韩一本二本av| 国产一区二区91| ...xxx性欧美| 欧美日韩成人在线| 国模少妇一区二区三区| 中文字幕精品三区| 欧洲精品中文字幕| 精品一区二区免费看| 国产精品青草久久| 欧美日韩一区二区三区高清| 久久99在线观看| 亚洲欧洲韩国日本视频| 欧美男同性恋视频网站| 亚洲成人av中文| 99精品一区二区三区| 午夜影院久久久| 精品成人一区二区三区四区| 成人高清视频免费观看| 亚洲一区二区三区视频在线| 精品日韩欧美在线| 99久久99精品久久久久久 | 久久99国内精品| 亚洲免费高清视频在线| 欧美大片在线观看| 日本久久电影网| 国产乱码一区二区三区| 香蕉影视欧美成人| 国产日韩欧美综合一区| 91精品国产欧美一区二区18| 成人激情校园春色| 免费黄网站欧美| 一区二区三区四区在线免费观看| 精品va天堂亚洲国产| 欧美日韩精品专区| 处破女av一区二区| 毛片不卡一区二区| 亚洲国产wwwccc36天堂| 国产精品人成在线观看免费| 日韩精品资源二区在线| 在线视频一区二区免费| 成人精品电影在线观看|