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

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

?? i2c-core.c

?? linux下S3C2410的I2C總線的驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
 * ---------------------------------------------------- */int i2c_probe(struct i2c_adapter *adapter,                   struct i2c_client_address_data *address_data,                   i2c_client_found_addr_proc *found_proc){	int addr,i,found,err;	int adap_id = i2c_adapter_id(adapter);	/* Forget it if we can't probe using SMBUS_QUICK */	if (! i2c_check_functionality(adapter,I2C_FUNC_SMBUS_QUICK))		return -1;	for (addr = 0x00; addr <= 0x7f; addr++) {		/* Skip if already in use */		if (i2c_check_addr(adapter,addr))			continue;		/* If it is in one of the force entries, we don't do any detection		   at all */		found = 0;		for (i = 0; !found && (address_data->force[i] != I2C_CLIENT_END); i += 3) {			if (((adap_id == address_data->force[i]) || 			     (address_data->force[i] == ANY_I2C_BUS)) &&			     (addr == address_data->force[i+1])) {				DEB2(printk("i2c-core.o: found force parameter for adapter %d, addr %04x\n",				            adap_id,addr));				if ((err = found_proc(adapter,addr,0,0)))					return err;				found = 1;			}		}		if (found) 			continue;		/* If this address is in one of the ignores, we can forget about		   it right now */		for (i = 0;		     !found && (address_data->ignore[i] != I2C_CLIENT_END);		     i += 2) {			if (((adap_id == address_data->ignore[i]) || 			    ((address_data->ignore[i] == ANY_I2C_BUS))) &&			    (addr == address_data->ignore[i+1])) {				DEB2(printk("i2c-core.o: found ignore parameter for adapter %d, "				     "addr %04x\n", adap_id ,addr));				found = 1;			}		}		for (i = 0;		     !found && (address_data->ignore_range[i] != I2C_CLIENT_END);		     i += 3) {			if (((adap_id == address_data->ignore_range[i]) ||			    ((address_data->ignore_range[i]==ANY_I2C_BUS))) &&			    (addr >= address_data->ignore_range[i+1]) &&			    (addr <= address_data->ignore_range[i+2])) {				DEB2(printk("i2c-core.o: found ignore_range parameter for adapter %d, "				            "addr %04x\n", adap_id,addr));				found = 1;			}		}		if (found) 			continue;		/* Now, we will do a detection, but only if it is in the normal or 		   probe entries */  		for (i = 0;		     !found && (address_data->normal_i2c[i] != I2C_CLIENT_END);		     i += 1) {			if (addr == address_data->normal_i2c[i]) {				found = 1;				DEB2(printk("i2c-core.o: found normal i2c entry for adapter %d, "				            "addr %02x", adap_id,addr));			}		}		for (i = 0;		     !found && (address_data->normal_i2c_range[i] != I2C_CLIENT_END);		     i += 2) {			if ((addr >= address_data->normal_i2c_range[i]) &&			    (addr <= address_data->normal_i2c_range[i+1])) {				found = 1;				DEB2(printk("i2c-core.o: found normal i2c_range entry for adapter %d, "				            "addr %04x\n", adap_id,addr));			}		}		for (i = 0;		     !found && (address_data->probe[i] != I2C_CLIENT_END);		     i += 2) {			if (((adap_id == address_data->probe[i]) ||			    ((address_data->probe[i] == ANY_I2C_BUS))) &&			    (addr == address_data->probe[i+1])) {				found = 1;				DEB2(printk("i2c-core.o: found probe parameter for adapter %d, "				            "addr %04x\n", adap_id,addr));			}		}		for (i = 0;		     !found && (address_data->probe_range[i] != I2C_CLIENT_END);		     i += 3) {			if (((adap_id == address_data->probe_range[i]) ||			   (address_data->probe_range[i] == ANY_I2C_BUS)) &&			   (addr >= address_data->probe_range[i+1]) &&			   (addr <= address_data->probe_range[i+2])) {				found = 1;				DEB2(printk("i2c-core.o: found probe_range parameter for adapter %d, "				            "addr %04x\n", adap_id,addr));			}		}		if (!found) 			continue;		/* OK, so we really should examine this address. First check		   whether there is some client here at all! */		if (i2c_smbus_xfer(adapter,addr,0,0,0,I2C_SMBUS_QUICK,NULL) >= 0)			if ((err = found_proc(adapter,addr,0,-1)))				return err;	}	return 0;}/* * return id number for a specific adapter */int i2c_adapter_id(struct i2c_adapter *adap){	int i;	for (i = 0; i < I2C_ADAP_MAX; i++)		if (adap == adapters[i])			return i;	return -1;}/* The SMBus parts */extern s32 i2c_smbus_write_quick(struct i2c_client * client, u8 value){	return i2c_smbus_xfer(client->adapter,client->addr,client->flags, 	                      value,0,I2C_SMBUS_QUICK,NULL);}extern s32 i2c_smbus_read_byte(struct i2c_client * client){	union i2c_smbus_data data;	if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                   I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, &data))		return -1;	else		return 0x0FF & data.byte;}extern s32 i2c_smbus_write_byte(struct i2c_client * client, u8 value){	return i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                      I2C_SMBUS_WRITE,value, I2C_SMBUS_BYTE,NULL);}extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command){	union i2c_smbus_data data;	if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                   I2C_SMBUS_READ,command, I2C_SMBUS_BYTE_DATA,&data))		return -1;	else		return 0x0FF & data.byte;}extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, u8 command,                                     u8 value){	union i2c_smbus_data data;	data.byte = value;	return i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                      I2C_SMBUS_WRITE,command,	                      I2C_SMBUS_BYTE_DATA,&data);}extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command){	union i2c_smbus_data data;	if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                   I2C_SMBUS_READ,command, I2C_SMBUS_WORD_DATA, &data))		return -1;	else		return 0x0FFFF & data.word;}extern s32 i2c_smbus_write_word_data(struct i2c_client * client,                                     u8 command, u16 value){	union i2c_smbus_data data;	data.word = value;	return i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                      I2C_SMBUS_WRITE,command,	                      I2C_SMBUS_WORD_DATA,&data);}extern s32 i2c_smbus_process_call(struct i2c_client * client,                                  u8 command, u16 value){	union i2c_smbus_data data;	data.word = value;	if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                   I2C_SMBUS_WRITE,command,	                   I2C_SMBUS_PROC_CALL, &data))		return -1;	else		return 0x0FFFF & data.word;}/* Returns the number of read bytes */extern s32 i2c_smbus_read_block_data(struct i2c_client * client,                                     u8 command, u8 *values){	union i2c_smbus_data data;	int i;	if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                   I2C_SMBUS_READ,command,	                   I2C_SMBUS_BLOCK_DATA,&data))		return -1;	else {		for (i = 1; i <= data.block[0]; i++)			values[i-1] = data.block[i];		return data.block[0];	}}extern s32 i2c_smbus_write_block_data(struct i2c_client * client,                                      u8 command, u8 length, u8 *values){	union i2c_smbus_data data;	int i;	if (length > 32)		length = 32;	for (i = 1; i <= length; i++)		data.block[i] = values[i-1];	data.block[0] = length;	return i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                      I2C_SMBUS_WRITE,command,	                      I2C_SMBUS_BLOCK_DATA,&data);}extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client,                                          u8 command, u8 length, u8 *values){	union i2c_smbus_data data;	int i;	if (length > 32)		length = 32;	for (i = 1; i <= length; i++)		data.block[i] = values[i-1];	data.block[0] = length;	return i2c_smbus_xfer(client->adapter,client->addr,client->flags,	                      I2C_SMBUS_WRITE,command,	                      I2C_SMBUS_I2C_BLOCK_DATA,&data);}/* Simulate a SMBus command using the i2c protocol    No checking of parameters is done!  */static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,                                    unsigned short flags,                                   char read_write, u8 command, int size,                                    union i2c_smbus_data * data){	/* So we need to generate a series of msgs. In the case of writing, we	  need to use only one message; when reading, we need two. We initialize	  most things with sane defaults, to keep the code below somewhat	  simpler. */	unsigned char msgbuf0[34];	unsigned char msgbuf1[34];	int num = read_write == I2C_SMBUS_READ?2:1;	struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, 	                          { addr, flags | I2C_M_RD, 0, msgbuf1 }	                        };	int i;	msgbuf0[0] = command;	switch(size) {	case I2C_SMBUS_QUICK:		msg[0].len = 0;		/* Special case: The read/write field is used as data */		msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;		num = 1;		break;	case I2C_SMBUS_BYTE:		if (read_write == I2C_SMBUS_READ) {			/* Special case: only a read! */			msg[0].flags = I2C_M_RD | flags;			num = 1;		}		break;	case I2C_SMBUS_BYTE_DATA:		if (read_write == I2C_SMBUS_READ)			msg[1].len = 1;		else {			msg[0].len = 2;			msgbuf0[1] = data->byte;		}		break;	case I2C_SMBUS_WORD_DATA:		if (read_write == I2C_SMBUS_READ)			msg[1].len = 2;		else {			msg[0].len=3;			msgbuf0[1] = data->word & 0xff;			msgbuf0[2] = (data->word >> 8) & 0xff;		}		break;	case I2C_SMBUS_PROC_CALL:		num = 2; /* Special case */		msg[0].len = 3;		msg[1].len = 2;		msgbuf0[1] = data->word & 0xff;		msgbuf0[2] = (data->word >> 8) & 0xff;		break;	case I2C_SMBUS_BLOCK_DATA:		if (read_write == I2C_SMBUS_READ) {			printk("i2c-core.o: Block read not supported under "			       "I2C emulation!\n");		return -1;		} else {			msg[0].len = data->block[0] + 2;			if (msg[0].len > 34) {				printk("i2c-core.o: smbus_access called with "				       "invalid block write size (%d)\n",				       msg[0].len);				return -1;			}			for (i = 1; i <= msg[0].len; i++)				msgbuf0[i] = data->block[i-1];		}		break;	default:		printk("i2c-core.o: smbus_access called with invalid size (%d)\n",		       size);		return -1;	}	if (i2c_transfer(adapter, msg, num) < 0)		return -1;	if (read_write == I2C_SMBUS_READ)		switch(size) {			case I2C_SMBUS_BYTE:				data->byte = msgbuf0[0];				break;			case I2C_SMBUS_BYTE_DATA:				data->byte = msgbuf1[0];				break;			case I2C_SMBUS_WORD_DATA: 			case I2C_SMBUS_PROC_CALL:				data->word = msgbuf1[0] | (msgbuf1[1] << 8);				break;		}	return 0;}s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags,                   char read_write, u8 command, int size,                    union i2c_smbus_data * data){	s32 res;	flags = flags & I2C_M_TEN;	if (adapter->algo->smbus_xfer) {		I2C_LOCK(adapter);		res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write,		                                command,size,data);		I2C_UNLOCK(adapter);	} else		res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write,	                                      command,size,data);	return res;}/* You should always define `functionality'; the 'else' is just for   backward compatibility. */ u32 i2c_get_functionality (struct i2c_adapter *adap){	if (adap->algo->functionality)		return adap->algo->functionality(adap);	else		return 0xffffffff;}int i2c_check_functionality (struct i2c_adapter *adap, u32 func){	u32 adap_func = i2c_get_functionality (adap);	return (func & adap_func) == func;}static int __init i2c_init(void){	printk(KERN_DEBUG "i2c-core.o: i2c core module\n");	memset(adapters,0,sizeof(adapters));	memset(drivers,0,sizeof(drivers));	adap_count=0;	driver_count=0;	init_MUTEX(&adap_lock);	init_MUTEX(&driver_lock);		i2cproc_init();		return 0;}EXPORT_SYMBOL(i2c_add_adapter);EXPORT_SYMBOL(i2c_del_adapter);EXPORT_SYMBOL(i2c_add_driver);EXPORT_SYMBOL(i2c_del_driver);EXPORT_SYMBOL(i2c_attach_client);EXPORT_SYMBOL(i2c_detach_client);EXPORT_SYMBOL(i2c_inc_use_client);EXPORT_SYMBOL(i2c_dec_use_client);EXPORT_SYMBOL(i2c_get_client);EXPORT_SYMBOL(i2c_use_client);EXPORT_SYMBOL(i2c_release_client);EXPORT_SYMBOL(i2c_check_addr);EXPORT_SYMBOL(i2c_master_send);EXPORT_SYMBOL(i2c_master_recv);EXPORT_SYMBOL(i2c_slave_recv);	//add by threewaterEXPORT_SYMBOL(i2c_control);EXPORT_SYMBOL(i2c_transfer);EXPORT_SYMBOL(i2c_adapter_id);EXPORT_SYMBOL(i2c_probe);EXPORT_SYMBOL(i2c_smbus_xfer);EXPORT_SYMBOL(i2c_smbus_write_quick);EXPORT_SYMBOL(i2c_smbus_read_byte);EXPORT_SYMBOL(i2c_smbus_write_byte);EXPORT_SYMBOL(i2c_smbus_read_byte_data);EXPORT_SYMBOL(i2c_smbus_write_byte_data);EXPORT_SYMBOL(i2c_smbus_read_word_data);EXPORT_SYMBOL(i2c_smbus_write_word_data);EXPORT_SYMBOL(i2c_smbus_process_call);EXPORT_SYMBOL(i2c_smbus_read_block_data);EXPORT_SYMBOL(i2c_smbus_write_block_data);EXPORT_SYMBOL(i2c_get_functionality);EXPORT_SYMBOL(i2c_check_functionality);MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");MODULE_DESCRIPTION("I2C-Bus main module");MODULE_PARM(i2c_debug, "i");MODULE_PARM_DESC(i2c_debug,"debug level");MODULE_LICENSE("GPL");module_init(i2c_init);module_exit(i2cproc_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕一区二区三区在线观看 | 国产成人精品综合在线观看| 制服丝袜国产精品| 天天av天天翘天天综合网| 欧美日韩精品福利| 秋霞电影一区二区| 国产无人区一区二区三区| 国产精品 欧美精品| 亚洲色图.com| 欧美久久久久免费| 精品一区二区三区视频| 国产欧美1区2区3区| 99热精品一区二区| 天天综合色天天综合色h| 欧美videos大乳护士334| jvid福利写真一区二区三区| 亚洲制服丝袜在线| 日韩美女视频一区二区在线观看| 国产盗摄精品一区二区三区在线| 国产精品久久99| 欧美乱熟臀69xxxxxx| 国产一区二区三区在线观看精品| 亚洲日本欧美天堂| 欧美精品一区男女天堂| jlzzjlzz亚洲女人18| 首页国产欧美日韩丝袜| 国产女同性恋一区二区| 在线观看av一区二区| 国产主播一区二区三区| 亚洲夂夂婷婷色拍ww47 | www国产成人| 色菇凉天天综合网| 国产乱人伦偷精品视频不卡| 亚洲美女电影在线| 久久精品人人做| 91精品国产免费久久综合| 国产成人av一区二区三区在线| 亚洲已满18点击进入久久| 久久看人人爽人人| 欧美一区二区网站| 色综合一个色综合亚洲| 国产精品正在播放| 日韩av在线播放中文字幕| 国产精品久久毛片a| 日韩免费视频一区二区| 欧美无乱码久久久免费午夜一区| 国产精品中文字幕日韩精品| 亚洲一区二区欧美日韩| 欧美国产综合色视频| 7777精品伊人久久久大香线蕉完整版 | 午夜欧美视频在线观看 | 一区二区三区在线影院| 久久久不卡网国产精品二区| 日韩欧美中文字幕一区| 欧美三级欧美一级| 91精彩视频在线| 成人avav在线| 国产成人av一区二区| 国产一区二区在线影院| 毛片av一区二区| 午夜成人免费视频| 亚洲午夜久久久久久久久电影院 | 丁香婷婷深情五月亚洲| 激情小说亚洲一区| 久久精品免费观看| 精品一区二区综合| 九九**精品视频免费播放| 天天综合色天天综合色h| 亚洲午夜在线观看视频在线| 亚洲乱码一区二区三区在线观看| 国产精品毛片高清在线完整版| 久久伊人中文字幕| 久久综合久久综合九色| 26uuu精品一区二区在线观看| 日韩欧美的一区二区| 91精品国产aⅴ一区二区| 777奇米成人网| 日韩欧美一二三| 欧美videofree性高清杂交| 日韩免费电影网站| 精品久久久久久久久久久久久久久 | 精品综合免费视频观看| 久久99精品久久久久久| 国产一区不卡在线| 丁香婷婷综合网| 91美女在线观看| 欧美怡红院视频| 91精品婷婷国产综合久久性色| 在线成人午夜影院| 精品国产一区二区三区久久久蜜月| 精品国产麻豆免费人成网站| 久久综合久久综合亚洲| 国产精品久久网站| 夜夜精品浪潮av一区二区三区| 一区二区三区日韩欧美精品| 亚洲成av人影院在线观看网| 蜜桃av一区二区三区电影| 91成人免费在线视频| 国产亚洲福利社区一区| 国产欧美日韩在线视频| 日韩精品成人一区二区三区| 国产精品一区二区三区网站| 日韩一区二区免费电影| 日韩免费观看高清完整版| 欧美日韩国产一二三| ●精品国产综合乱码久久久久| 亚洲免费电影在线| 免费欧美日韩国产三级电影| 国产高清不卡二三区| 在线亚洲精品福利网址导航| 日韩精品中文字幕在线不卡尤物| 久久久国产精品不卡| 亚洲精品高清在线观看| 秋霞av亚洲一区二区三| 成人app软件下载大全免费| 欧美四级电影网| 国产欧美一区二区精品秋霞影院| 亚洲女人的天堂| 国产一区二区91| 欧美日韩国产精品自在自线| 337p日本欧洲亚洲大胆精品| 中文字幕中文在线不卡住| 蜜臀久久99精品久久久久宅男 | 亚洲欧美日韩一区二区| 国产精品入口麻豆九色| 婷婷六月综合网| 国产成人h网站| 91精品国产综合久久福利软件 | 日韩美女视频一区| 久草中文综合在线| 色综合久久久久久久久| 日韩欧美一级精品久久| 一区二区免费在线| 成人午夜碰碰视频| 91麻豆精品91久久久久久清纯| 国产精品成人免费在线| 久久99精品国产| 欧美巨大另类极品videosbest| 国产精品传媒入口麻豆| 国产一区二区三区免费播放| 欧美一区二区日韩| 亚洲一区二区三区四区在线观看 | 国产suv精品一区二区883| 6080国产精品一区二区| 亚洲欧美福利一区二区| 成人黄色av电影| 久久精品人人做人人爽人人| 久久精品国产网站| 欧美老肥妇做.爰bbww| 亚洲精品一二三| 91亚洲资源网| 中文字幕欧美一| 成人美女在线观看| 国产精品免费丝袜| 国产成人在线影院| 国产亚洲一区字幕| 国产成a人无v码亚洲福利| 精品国产伦一区二区三区免费 | 欧美激情在线一区二区三区| 国产在线看一区| 久久综合资源网| 国产精品1区2区| 精品免费视频一区二区| 韩国v欧美v亚洲v日本v| 久久亚洲欧美国产精品乐播 | eeuss鲁片一区二区三区在线观看| 欧美成人精品3d动漫h| 久久99精品国产.久久久久久 | 午夜不卡在线视频| 91精品在线一区二区| 青草国产精品久久久久久| 日韩精品中文字幕一区二区三区| 狂野欧美性猛交blacked| 精品久久久影院| 粉嫩欧美一区二区三区高清影视 | 亚洲一区在线视频| 2021中文字幕一区亚洲| 精品乱码亚洲一区二区不卡| 成人a区在线观看| 欧美日韩mp4| 中文字幕五月欧美| 色综合色综合色综合| 亚洲精品视频在线观看网站| 欧美性高清videossexo| 日本午夜精品视频在线观看| 日韩精品中文字幕一区| 国产精品一区二区果冻传媒| 国产精品嫩草影院av蜜臀| 色综合天天狠狠| 五月激情六月综合| 久久综合网色—综合色88| 不卡视频一二三| 婷婷久久综合九色综合伊人色| 日韩精品中文字幕在线不卡尤物| 国产精品一区二区男女羞羞无遮挡| 136国产福利精品导航| 欧美久久一二三四区| 国产精品一二三区在线| 亚洲女女做受ⅹxx高潮| 精品日韩在线一区|