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

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

?? x1205.c

?? linux2.6.16版本
?? C
?? 第 1 頁 / 共 2 頁
字號:
	s8 atr;	static unsigned char atr_addr[2] = { 0, X1205_REG_ATR };	struct i2c_msg msgs[] = {		{ client->addr, 0, 2, atr_addr },	/* setup read ptr */		{ client->addr, I2C_M_RD, 1, &atr }, 	/* read atr */	};	/* read atr register */	if ((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) {		dev_err(&client->dev, "%s: read error\n", __FUNCTION__);		return -EIO;	}	dev_dbg(&client->dev, "%s: raw atr=%x\n", __FUNCTION__, atr);	/* atr is a two's complement value on 6 bits,	 * perform sign extension. The formula is	 * Catr = (atr * 0.25pF) + 11.00pF.	 */	if (atr & 0x20)		atr |= 0xC0;	dev_dbg(&client->dev, "%s: raw atr=%x (%d)\n", __FUNCTION__, atr, atr);	*trim = (atr * 250) + 11000;	dev_dbg(&client->dev, "%s: real=%d\n", __FUNCTION__, *trim);	return 0;}static int x1205_hctosys(struct i2c_client *client){	int err;	struct rtc_time tm;	struct timespec tv;	err = x1205_command(client, X1205_CMD_GETDATETIME, &tm);	if (err) {		dev_err(&client->dev,			"Unable to set the system clock\n");		return err;	}	/* IMPORTANT: the RTC only stores whole seconds. It is arbitrary	 * whether it stores the most close value or the value with partial	 * seconds truncated. However, it is important that we use it to store	 * the truncated value. This is because otherwise it is necessary,	 * in an rtc sync function, to read both xtime.tv_sec and	 * xtime.tv_nsec. On some processors (i.e. ARM), an atomic read	 * of >32bits is not possible. So storing the most close value would	 * slow down the sync API. So here we have the truncated value and	 * the best guess is to add 0.5s.	 */	tv.tv_nsec = NSEC_PER_SEC >> 1;	/* WARNING: this is not the C library 'mktime' call, it is a built in	 * inline function from include/linux/time.h.  It expects (requires)	 * the month to be in the range 1-12	 */	tv.tv_sec  = mktime(tm.tm_year + 1900, tm.tm_mon + 1,				tm.tm_mday, tm.tm_hour,				tm.tm_min, tm.tm_sec);	do_settimeofday(&tv);	dev_info(&client->dev,		"setting the system clock to %d-%d-%d %d:%d:%d\n",		tm.tm_year + 1900, tm.tm_mon + 1,		tm.tm_mday, tm.tm_hour, tm.tm_min,		tm.tm_sec);	return 0;}struct x1205_limit{	unsigned char reg;	unsigned char mask;	unsigned char min;	unsigned char max;};static int x1205_validate_client(struct i2c_client *client){	int i, xfer;	/* Probe array. We will read the register at the specified	 * address and check if the given bits are zero.	 */	static const unsigned char probe_zero_pattern[] = {		/* register, mask */		X1205_REG_SR,	0x18,		X1205_REG_DTR,	0xF8,		X1205_REG_ATR,	0xC0,		X1205_REG_INT,	0x18,		X1205_REG_0,	0xFF,	};	static const struct x1205_limit probe_limits_pattern[] = {		/* register, mask, min, max */		{ X1205_REG_Y2K,	0xFF,	19,	20	},		{ X1205_REG_DW,		0xFF,	0,	6	},		{ X1205_REG_YR,		0xFF,	0,	99	},		{ X1205_REG_MO,		0xFF,	0,	12	},		{ X1205_REG_DT,		0xFF,	0,	31	},		{ X1205_REG_HR,		0x7F,	0,	23	},		{ X1205_REG_MN,		0xFF,	0,	59	},		{ X1205_REG_SC,		0xFF,	0,	59	},		{ X1205_REG_Y2K1,	0xFF,	19,	20	},		{ X1205_REG_Y2K0,	0xFF,	19,	20	},	};	/* check that registers have bits a 0 where expected */	for (i = 0; i < ARRAY_SIZE(probe_zero_pattern); i += 2) {		unsigned char buf;		unsigned char addr[2] = { 0, probe_zero_pattern[i] };		struct i2c_msg msgs[2] = {			{ client->addr, 0, 2, addr },			{ client->addr, I2C_M_RD, 1, &buf },		};		xfer = i2c_transfer(client->adapter, msgs, 2);		if (xfer != 2) {			dev_err(&client->adapter->dev,				"%s: could not read register %x\n",				__FUNCTION__, addr[1]);			return -EIO;		}		if ((buf & probe_zero_pattern[i+1]) != 0) {			dev_err(&client->adapter->dev,				"%s: register=%02x, zero pattern=%d, value=%x\n",				__FUNCTION__, addr[1], i, buf);			return -ENODEV;		}	}	/* check limits (only registers with bcd values) */	for (i = 0; i < ARRAY_SIZE(probe_limits_pattern); i++) {		unsigned char reg, value;		unsigned char addr[2] = { 0, probe_limits_pattern[i].reg };		struct i2c_msg msgs[2] = {			{ client->addr, 0, 2, addr },			{ client->addr, I2C_M_RD, 1, &reg },		};		xfer = i2c_transfer(client->adapter, msgs, 2);		if (xfer != 2) {			dev_err(&client->adapter->dev,				"%s: could not read register %x\n",				__FUNCTION__, addr[1]);			return -EIO;		}		value = BCD2BIN(reg & probe_limits_pattern[i].mask);		if (value > probe_limits_pattern[i].max ||			value < probe_limits_pattern[i].min) {			dev_dbg(&client->adapter->dev,				"%s: register=%x, lim pattern=%d, value=%d\n",				__FUNCTION__, addr[1], i, value);			return -ENODEV;		}	}	return 0;}static int x1205_attach(struct i2c_adapter *adapter){	dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);	return i2c_probe(adapter, &addr_data, x1205_probe);}int x1205_direct_attach(int adapter_id,	struct i2c_client_address_data *address_data){	int err;	struct i2c_adapter *adapter = i2c_get_adapter(adapter_id);	if (adapter) {		err = i2c_probe(adapter,			address_data, x1205_probe);		i2c_put_adapter(adapter);		return err;	}	return -ENODEV;}static int x1205_probe(struct i2c_adapter *adapter, int address, int kind){	struct i2c_client *client;	struct x1205_data *data;	int err = 0;	dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);	if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {		err = -ENODEV;		goto exit;	}	if (!(data = kzalloc(sizeof(struct x1205_data), GFP_KERNEL))) {		err = -ENOMEM;		goto exit;	}	/* Initialize our structures */	data->epoch = 2000;	client = &data->client;	client->addr = address;	client->driver = &x1205_driver;	client->adapter	= adapter;	strlcpy(client->name, "x1205", I2C_NAME_SIZE);	i2c_set_clientdata(client, data);	/* Verify the chip is really an X1205 */	if (kind < 0) {		if (x1205_validate_client(client) < 0) {			err = -ENODEV;			goto exit_kfree;		}	}	/* Inform the i2c layer */	if ((err = i2c_attach_client(client)))		goto exit_kfree;	list_add(&data->list, &x1205_clients);	dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n");	/* If requested, set the system time */	if (hctosys)		x1205_hctosys(client);	return 0;exit_kfree:	kfree(data);exit:	return err;}static int x1205_detach(struct i2c_client *client){	int err;	struct x1205_data *data = i2c_get_clientdata(client);	dev_dbg(&client->dev, "%s\n", __FUNCTION__);	if ((err = i2c_detach_client(client)))		return err;	list_del(&data->list);	kfree(data);	return 0;}static int x1205_command(struct i2c_client *client, unsigned int cmd,	void *param){	if (param == NULL)		return -EINVAL;	if (!capable(CAP_SYS_TIME))		return -EACCES;	dev_dbg(&client->dev, "%s: cmd=%d\n", __FUNCTION__, cmd);	switch (cmd) {	case X1205_CMD_GETDATETIME:		return x1205_get_datetime(client, param, X1205_CCR_BASE);	case X1205_CMD_SETTIME:		return x1205_set_datetime(client, param, 0,				X1205_CCR_BASE);	case X1205_CMD_SETDATETIME:		return x1205_set_datetime(client, param, 1,				X1205_CCR_BASE);	case X1205_CMD_GETALARM:		return x1205_get_datetime(client, param, X1205_ALM0_BASE);	case X1205_CMD_SETALARM:		return x1205_set_datetime(client, param, 1,				X1205_ALM0_BASE);	case X1205_CMD_GETDTRIM:		return x1205_get_dtrim(client, param);	case X1205_CMD_GETATRIM:		return x1205_get_atrim(client, param);	default:		return -EINVAL;	}}static int __init x1205_init(void){	return i2c_add_driver(&x1205_driver);}static void __exit x1205_exit(void){	i2c_del_driver(&x1205_driver);}MODULE_AUTHOR(	"Karen Spearel <kas11@tampabay.rr.com>, "	"Alessandro Zummo <a.zummo@towertech.it>");MODULE_DESCRIPTION("Xicor X1205 RTC driver");MODULE_LICENSE("GPL");MODULE_VERSION(DRV_VERSION);EXPORT_SYMBOL_GPL(x1205_do_command);EXPORT_SYMBOL_GPL(x1205_direct_attach);module_init(x1205_init);module_exit(x1205_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
东方aⅴ免费观看久久av| 精品国产免费人成电影在线观看四季 | 久久天天做天天爱综合色| 制服丝袜亚洲网站| 欧美一级久久久久久久大片| 欧美日韩另类一区| 欧美日韩高清一区二区| 欧美一区二区三区在线视频| 日韩视频一区在线观看| 日韩久久久精品| 精品99999| 欧美高清在线一区二区| 欧美激情综合五月色丁香小说| 国产精品人成在线观看免费| 国产精品传媒视频| 亚洲激情欧美激情| 亚洲h在线观看| 久久精品国产亚洲a| 国产成人综合在线播放| 成人v精品蜜桃久久一区| 色噜噜狠狠成人中文综合| 欧美日韩成人综合天天影院| 日韩免费高清视频| 日本一区二区不卡视频| 亚洲裸体xxx| 日韩精品一二三四| 国产91露脸合集magnet| 99精品久久只有精品| 欧美日免费三级在线| 欧美电影免费提供在线观看| 国产日韩欧美精品在线| 一区二区三区欧美久久| 日韩中文欧美在线| 国产不卡高清在线观看视频| 色欧美88888久久久久久影院| 3atv一区二区三区| 国产精品美日韩| 亚洲国产日韩综合久久精品| 久久爱www久久做| 色综合一个色综合| 国产欧美一区二区精品性色| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲精品国久久99热| 免费在线观看不卡| 99免费精品在线| 欧美一级淫片007| 中文字幕日韩欧美一区二区三区| 亚洲成av人综合在线观看| 国产高清精品在线| 欧美日韩精品一区二区三区四区 | 欧美丰满少妇xxxxx高潮对白| 欧美成人性福生活免费看| 国产精品美女久久久久久久| 丝袜美腿亚洲色图| jlzzjlzz欧美大全| 日韩一区二区免费电影| 亚洲视频一区在线观看| 精品一区二区在线看| 色综合久久久久网| 国产亚洲欧美色| 日韩精品亚洲专区| 色狠狠综合天天综合综合| 欧美成人官网二区| 亚洲国产综合91精品麻豆| 成人理论电影网| 精品人伦一区二区色婷婷| 亚洲成人午夜影院| 国产99久久久国产精品| 欧美mv日韩mv国产| 亚洲va在线va天堂| 色天使色偷偷av一区二区| 国产欧美日韩一区二区三区在线观看| 日韩va欧美va亚洲va久久| 色综合天天视频在线观看 | 免费亚洲电影在线| 欧美日韩一本到| 亚洲色图在线看| 成人动漫中文字幕| 国产欧美一区二区精品仙草咪| 久久精品国产99国产| 欧美精品久久天天躁| 一区二区高清在线| 色老汉av一区二区三区| ...xxx性欧美| 成人h精品动漫一区二区三区| 久久青草国产手机看片福利盒子| 日本不卡一二三区黄网| 欧美绝品在线观看成人午夜影视| 亚洲激情自拍视频| 91小视频免费观看| 亚洲欧美在线观看| av电影天堂一区二区在线观看| 日本一区二区三区在线观看| 国产精品亚洲专一区二区三区 | 国产亚洲欧洲997久久综合| 精品一区在线看| 精品国产三级a在线观看| 麻豆国产91在线播放| 精品国产髙清在线看国产毛片| 日产欧产美韩系列久久99| 欧美一级艳片视频免费观看| 五月激情丁香一区二区三区| 欧美精选在线播放| 日韩电影一区二区三区四区| 91精品国产免费| 久久精品国产澳门| 2021久久国产精品不只是精品| 国产在线乱码一区二区三区| 久久精品夜夜夜夜久久| 国产曰批免费观看久久久| 国产日产精品1区| 99久久精品一区| 亚洲美女淫视频| 欧美日本在线观看| 久久精品国产亚洲aⅴ| 久久一夜天堂av一区二区三区| 国产在线精品免费av| 欧美激情在线一区二区三区| 不卡视频在线观看| 一区二区三区不卡在线观看| 欧美日本一区二区| 精品亚洲国内自在自线福利| 久久久精品日韩欧美| 91啦中文在线观看| 午夜影视日本亚洲欧洲精品| 日韩亚洲欧美综合| 国产成人av自拍| 一区二区三区在线观看视频| 91精品国产一区二区三区蜜臀 | 99这里只有久久精品视频| 一区二区三区视频在线看| 777xxx欧美| 国产精品1区二区.| 亚洲狠狠丁香婷婷综合久久久| 69堂国产成人免费视频| 精品无人区卡一卡二卡三乱码免费卡| 国产欧美日韩卡一| 在线观看一区二区视频| 奇米色777欧美一区二区| 亚洲国产精品精华液ab| 欧美日韩日日摸| 国产成人在线色| 亚洲国产cao| 欧美—级在线免费片| 欧美日韩一区久久| 从欧美一区二区三区| 亚洲动漫第一页| 久久精品网站免费观看| 欧美视频你懂的| 岛国av在线一区| 蜜臀av一区二区在线免费观看| 国产精品国产三级国产aⅴ中文| 91精品国产综合久久久久久久久久 | 欧美大胆一级视频| 91亚洲男人天堂| 久久国产精品99久久久久久老狼| 综合久久国产九一剧情麻豆| 日韩亚洲欧美在线观看| 91丨九色丨蝌蚪丨老版| 精品一区二区三区免费播放| 一区二区三区视频在线看| 国产三区在线成人av| 欧美日韩成人一区| 91免费精品国自产拍在线不卡| 久久国产欧美日韩精品| 亚洲成人午夜电影| 中文字幕一区二区视频| 欧美成人综合网站| 在线欧美日韩精品| 成人av动漫在线| 国产一区91精品张津瑜| 亚洲成a天堂v人片| 亚洲视频中文字幕| 中文字幕av不卡| 精品日韩在线观看| 欧美军同video69gay| 色av一区二区| 91一区一区三区| www.久久久久久久久| 国产精品一二三四| 国产在线麻豆精品观看| 青青草成人在线观看| 亚洲国产精品久久一线不卡| 亚洲天堂免费在线观看视频| 中文字幕 久热精品 视频在线| 日韩一级欧美一级| 欧美一区三区四区| 欧美猛男男办公室激情| 欧洲精品一区二区| 91免费版在线看| 白白色 亚洲乱淫| 国产91丝袜在线18| 高清国产一区二区| 岛国精品在线播放| 大尺度一区二区| 成人精品鲁一区一区二区| 国产精品正在播放| 国产一区二区精品久久| 国产剧情一区二区三区| 国产精一区二区三区|