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

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

?? i2c.c

?? u-boot 源代碼
?? C
字號:
/* * TI DaVinci (TMS320DM644x) I2C driver. * * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> * * -------------------------------------------------------- * * See file CREDITS for list of people who contributed to this * project. * * 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., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <common.h>#ifdef CONFIG_DRIVER_DAVINCI_I2C#include <i2c.h>#include <asm/arch/hardware.h>#include <asm/arch/i2c_defs.h>#define CHECK_NACK() \	do {\		if (tmp & (I2C_TIMEOUT | I2C_STAT_NACK)) {\			REG(I2C_CON) = 0;\			return(1);\		}\	} while (0)static int wait_for_bus(void){	int	stat, timeout;	REG(I2C_STAT) = 0xffff;	for (timeout = 0; timeout < 10; timeout++) {		if (!((stat = REG(I2C_STAT)) & I2C_STAT_BB)) {			REG(I2C_STAT) = 0xffff;			return(0);		}		REG(I2C_STAT) = stat;		udelay(50000);	}	REG(I2C_STAT) = 0xffff;	return(1);}static int poll_i2c_irq(int mask){	int	stat, timeout;	for (timeout = 0; timeout < 10; timeout++) {		udelay(1000);		stat = REG(I2C_STAT);		if (stat & mask) {			return(stat);		}	}	REG(I2C_STAT) = 0xffff;	return(stat | I2C_TIMEOUT);}void flush_rx(void){	int	dummy;	while (1) {		if (!(REG(I2C_STAT) & I2C_STAT_RRDY))			break;		dummy = REG(I2C_DRR);		REG(I2C_STAT) = I2C_STAT_RRDY;		udelay(1000);	}}void i2c_init(int speed, int slaveadd){	u_int32_t	div, psc;	if (REG(I2C_CON) & I2C_CON_EN) {		REG(I2C_CON) = 0;		udelay (50000);	}	psc = 2;	div = (CFG_HZ_CLOCK / ((psc + 1) * speed)) - 10;	/* SCLL + SCLH */	REG(I2C_PSC) = psc;			/* 27MHz / (2 + 1) = 9MHz */	REG(I2C_SCLL) = (div * 50) / 100;	/* 50% Duty */	REG(I2C_SCLH) = div - REG(I2C_SCLL);	REG(I2C_OA) = slaveadd;	REG(I2C_CNT) = 0;	/* Interrupts must be enabled or I2C module won't work */	REG(I2C_IE) = I2C_IE_SCD_IE | I2C_IE_XRDY_IE |		I2C_IE_RRDY_IE | I2C_IE_ARDY_IE | I2C_IE_NACK_IE;	/* Now enable I2C controller (get it out of reset) */	REG(I2C_CON) = I2C_CON_EN;	udelay(1000);}int i2c_probe(u_int8_t chip){	int	rc = 1;	if (chip == REG(I2C_OA)) {		return(rc);	}	REG(I2C_CON) = 0;	if (wait_for_bus()) {return(1);}	/* try to read one byte from current (or only) address */	REG(I2C_CNT) = 1;	REG(I2C_SA) = chip;	REG(I2C_CON) = (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP);	udelay (50000);	if (!(REG(I2C_STAT) & I2C_STAT_NACK)) {		rc = 0;		flush_rx();		REG(I2C_STAT) = 0xffff;	} else {		REG(I2C_STAT) = 0xffff;		REG(I2C_CON) |= I2C_CON_STP;		udelay(20000);		if (wait_for_bus()) {return(1);}	}	flush_rx();	REG(I2C_STAT) = 0xffff;	REG(I2C_CNT) = 0;	return(rc);}int i2c_read(u_int8_t chip, u_int32_t addr, int alen, u_int8_t *buf, int len){	u_int32_t	tmp;	int		i;	if ((alen < 0) || (alen > 2)) {		printf("%s(): bogus address length %x\n", __FUNCTION__, alen);		return(1);	}	if (wait_for_bus()) {return(1);}	if (alen != 0) {		/* Start address phase */		tmp = I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX;		REG(I2C_CNT) = alen;		REG(I2C_SA) = chip;		REG(I2C_CON) = tmp;		tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);		CHECK_NACK();		switch (alen) {			case 2:				/* Send address MSByte */				if (tmp & I2C_STAT_XRDY) {					REG(I2C_DXR) = (addr >> 8) & 0xff;				} else {					REG(I2C_CON) = 0;					return(1);				}				tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);				CHECK_NACK();				/* No break, fall through */			case 1:				/* Send address LSByte */				if (tmp & I2C_STAT_XRDY) {					REG(I2C_DXR) = addr & 0xff;				} else {					REG(I2C_CON) = 0;					return(1);				}				tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK | I2C_STAT_ARDY);				CHECK_NACK();				if (!(tmp & I2C_STAT_ARDY)) {					REG(I2C_CON) = 0;					return(1);				}		}	}	/* Address phase is over, now read 'len' bytes and stop */	tmp = I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP;	REG(I2C_CNT) = len & 0xffff;	REG(I2C_SA) = chip;	REG(I2C_CON) = tmp;	for (i = 0; i < len; i++) {		tmp = poll_i2c_irq(I2C_STAT_RRDY | I2C_STAT_NACK | I2C_STAT_ROVR);		CHECK_NACK();		if (tmp & I2C_STAT_RRDY) {			buf[i] = REG(I2C_DRR);		} else {			REG(I2C_CON) = 0;			return(1);		}	}	tmp = poll_i2c_irq(I2C_STAT_SCD | I2C_STAT_NACK);	CHECK_NACK();	if (!(tmp & I2C_STAT_SCD)) {		REG(I2C_CON) = 0;		return(1);	}	flush_rx();	REG(I2C_STAT) = 0xffff;	REG(I2C_CNT) = 0;	REG(I2C_CON) = 0;	return(0);}int i2c_write(u_int8_t chip, u_int32_t addr, int alen, u_int8_t *buf, int len){	u_int32_t	tmp;	int		i;	if ((alen < 0) || (alen > 2)) {		printf("%s(): bogus address length %x\n", __FUNCTION__, alen);		return(1);	}	if (len < 0) {		printf("%s(): bogus length %x\n", __FUNCTION__, len);		return(1);	}	if (wait_for_bus()) {return(1);}	/* Start address phase */	tmp = I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX | I2C_CON_STP;	REG(I2C_CNT) = (alen == 0) ? len & 0xffff : (len & 0xffff) + alen;	REG(I2C_SA) = chip;	REG(I2C_CON) = tmp;	switch (alen) {		case 2:			/* Send address MSByte */			tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);			CHECK_NACK();			if (tmp & I2C_STAT_XRDY) {				REG(I2C_DXR) = (addr >> 8) & 0xff;			} else {				REG(I2C_CON) = 0;				return(1);			}			/* No break, fall through */		case 1:			/* Send address LSByte */			tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);			CHECK_NACK();			if (tmp & I2C_STAT_XRDY) {				REG(I2C_DXR) = addr & 0xff;			} else {				REG(I2C_CON) = 0;				return(1);			}	}	for (i = 0; i < len; i++) {		tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);		CHECK_NACK();		if (tmp & I2C_STAT_XRDY) {			REG(I2C_DXR) = buf[i];		} else {			return(1);		}	}	tmp = poll_i2c_irq(I2C_STAT_SCD | I2C_STAT_NACK);	CHECK_NACK();	if (!(tmp & I2C_STAT_SCD)) {		REG(I2C_CON) = 0;		return(1);	}	flush_rx();	REG(I2C_STAT) = 0xffff;	REG(I2C_CNT) = 0;	REG(I2C_CON) = 0;	return(0);}u_int8_t i2c_reg_read(u_int8_t chip, u_int8_t reg){	u_int8_t	tmp;	i2c_read(chip, reg, 1, &tmp, 1);	return(tmp);}void i2c_reg_write(u_int8_t chip, u_int8_t reg, u_int8_t val){	u_int8_t	tmp;	i2c_write(chip, reg, 1, &tmp, 1);}#endif /* CONFIG_DRIVER_DAVINCI_I2C */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久久搜平片 | 午夜久久久久久| av资源站一区| 国产精品久久久久一区二区三区| 国产精品18久久久久久久久久久久 | 日韩高清电影一区| 日韩欧美123| 午夜久久电影网| 日韩视频一区二区| 国产精品一区久久久久| 国产精品沙发午睡系列990531| 99久久精品国产精品久久| 亚洲乱码日产精品bd| 欧美日韩免费不卡视频一区二区三区| 性久久久久久久久| 亚洲精品一区在线观看| 成人av在线观| 亚洲成人一区在线| 精品久久久影院| 国产精品一区二区在线看| 日韩伦理电影网| 91麻豆精品91久久久久久清纯| 精品一区二区日韩| 最新不卡av在线| 欧美一级理论片| 成人美女视频在线观看| 午夜激情一区二区| 欧美国产一区二区在线观看 | 久久精品国产亚洲a| 国产精品午夜在线| 欧美日韩激情一区二区| 国产宾馆实践打屁股91| 亚洲免费大片在线观看| 精品国产乱码久久久久久影片| 99精品国产99久久久久久白柏| 天天综合网天天综合色| 国产欧美日韩卡一| 91精品欧美久久久久久动漫 | 成人免费一区二区三区视频 | 日韩欧美国产一区二区三区 | 欧美午夜电影一区| 国产精品一区二区你懂的| 亚洲高清视频在线| 中文子幕无线码一区tr| 欧美一区二区成人| 色婷婷精品久久二区二区蜜臀av | 日韩制服丝袜av| 国产精品的网站| 精品国产网站在线观看| 欧美精品777| 一本久久a久久精品亚洲| 国产一区二区三区免费在线观看| 亚洲mv在线观看| 亚洲免费观看高清在线观看| 国产视频一区二区在线| 日韩欧美中文字幕公布| 欧美日韩成人综合| 在线观看免费成人| 色视频一区二区| 99精品久久久久久| 菠萝蜜视频在线观看一区| 极品少妇xxxx精品少妇| 日韩不卡在线观看日韩不卡视频| 一区二区三区视频在线看| 国产精品久久夜| 国产欧美精品一区| 久久久久久日产精品| 2020国产精品自拍| 精品国产一区久久| 日韩欧美一区二区视频| 欧美日韩一二区| 欧美在线观看一区二区| 色欧美乱欧美15图片| 日本乱码高清不卡字幕| 在线免费观看日韩欧美| 欧美自拍丝袜亚洲| 欧美日韩综合在线免费观看| 欧洲国产伦久久久久久久| 色狠狠一区二区三区香蕉| 一本在线高清不卡dvd| 91视频观看视频| 一本大道综合伊人精品热热| 91美女福利视频| 日本韩国欧美一区二区三区| av在线这里只有精品| www.欧美.com| 91麻豆自制传媒国产之光| 在线观看亚洲精品| 欧美美女一区二区在线观看| 91精品国产全国免费观看 | 在线视频一区二区免费| 欧美性猛片xxxx免费看久爱| 欧美精品乱码久久久久久| 欧美一区二区三区白人| 精品国产乱码久久久久久图片| 精品久久久久久久一区二区蜜臀| 久久在线免费观看| 亚洲国产精品av| 亚洲激情成人在线| 日本欧美肥老太交大片| 国产一区二区毛片| 99精品欧美一区二区三区综合在线| 在线视频一区二区免费| 日韩一级片网站| 中文字幕欧美日韩一区| 伊人开心综合网| 美女视频一区二区| 不卡的电影网站| 91麻豆精品国产91| 中文字幕成人在线观看| 亚洲欧美福利一区二区| 日韩专区欧美专区| 成人高清av在线| 欧美日韩国产高清一区二区三区 | 国产成人精品免费视频网站| 9i看片成人免费高清| 欧美日韩国产一二三| 国产午夜亚洲精品午夜鲁丝片| 亚洲另类春色校园小说| 欧美aaa在线| 国产精品一区2区| 91精品福利视频| 精品成人一区二区三区四区| 亚洲视频一区在线观看| 男男成人高潮片免费网站| 97精品久久久久中文字幕| 欧美一区二区在线观看| 最近中文字幕一区二区三区| 激情综合色综合久久综合| 色婷婷综合久久久| 国产亚洲一区二区在线观看| 亚洲国产婷婷综合在线精品| 丁香婷婷综合激情五月色| 欧美人妇做爰xxxⅹ性高电影 | 精品亚洲porn| 欧美写真视频网站| 国产精品区一区二区三| 精品一区二区三区在线观看国产| 一本久道久久综合中文字幕| 久久精品亚洲一区二区三区浴池| 五月婷婷综合在线| 色婷婷亚洲综合| 国产精品久久一级| 国产一区二区不卡老阿姨| 欧美精品久久天天躁| 亚洲少妇中出一区| 国产精品1区2区| 欧美va在线播放| 视频一区中文字幕国产| 99久久精品99国产精品 | 亚洲日韩欧美一区二区在线| 国模一区二区三区白浆| 欧美一级生活片| 首页国产丝袜综合| 欧美日韩成人综合| 亚洲一区二区在线播放相泽| 色婷婷av一区二区三区大白胸| 中文成人av在线| 顶级嫩模精品视频在线看| 国产人成一区二区三区影院| 狠狠狠色丁香婷婷综合久久五月| 欧美一区欧美二区| 美女尤物国产一区| 精品少妇一区二区三区视频免付费 | 三级在线观看一区二区| 欧美亚洲日本一区| 午夜影院在线观看欧美| 538在线一区二区精品国产| 亚洲一区二区三区免费视频| 欧美亚洲国产怡红院影院| 亚洲一区二区三区激情| 欧美视频精品在线观看| 亚洲电影一级黄| 欧美男人的天堂一二区| 天天av天天翘天天综合网 | 2020日本不卡一区二区视频| 国产综合久久久久久鬼色| 欧美精品一区视频| 成人丝袜18视频在线观看| 亚洲天堂a在线| 欧美三级日本三级少妇99| 亚洲成人av一区二区| 91精品国产欧美一区二区18| 精品一区二区三区影院在线午夜 | 国产精品视频一二三| 91在线小视频| 亚洲第一福利一区| 日韩一级大片在线| 国产成人激情av| 亚洲人成人一区二区在线观看 | 亚洲国产欧美日韩另类综合| 欧美日韩国产免费| 蜜臀av国产精品久久久久| 久久精子c满五个校花| av在线这里只有精品| 亚洲电影一区二区三区| 欧美一二三区精品| 岛国一区二区在线观看| 亚洲图片一区二区| 日韩一级片在线播放|