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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ppc440gx_i2c.c

?? u-boot1.3.0的原碼,從配了網(wǎng)絡(luò)驅(qū)動和FLASH的驅(qū)動,并該用ESC竟如
?? C
字號:
/* *  Copyright (C) 2005 Sandburst Corporation * * 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 *//* * Ported from cpu/ppc4xx/i2c.c by AS HARNOIS by * Travis B. Sawyer * Sandburst Corporation. */#include <common.h>#include <ppc4xx.h>#include <4xx_i2c.h>#include <i2c.h>#include <command.h>#include "ppc440gx_i2c.h"#ifdef CONFIG_I2C_BUS1#define IIC_OK		0#define IIC_NOK		1#define IIC_NOK_LA	2		/* Lost arbitration */#define IIC_NOK_ICT	3		/* Incomplete transfer */#define IIC_NOK_XFRA	4		/* Transfer aborted */#define IIC_NOK_DATA	5		/* No data in buffer */#define IIC_NOK_TOUT	6		/* Transfer timeout */#define IIC_TIMEOUT 1			/* 1 second */#if defined(CFG_I2C_NOPROBES)static uchar i2c_no_probes[] = CFG_I2C_NOPROBES;#endifstatic void _i2c_bus1_reset (void){	int i, status;	/* Reset status register */	/* write 1 in SCMP and IRQA to clear these fields */	out8 (IIC_STS1, 0x0A);	/* write 1 in IRQP IRQD LA ICT XFRA to clear these fields */	out8 (IIC_EXTSTS1, 0x8F);	__asm__ volatile ("eieio");	/*	 * Get current state, reset bus	 * only if no transfers are pending.	 */	i = 10;	do {		/* Get status */		status = in8 (IIC_STS1);		udelay (500);			/* 500us */		i--;	} while ((status & IIC_STS_PT) && (i > 0));	/* Soft reset controller */	status = in8 (IIC_XTCNTLSS1);	out8 (IIC_XTCNTLSS1, (status | IIC_XTCNTLSS_SRST));	__asm__ volatile ("eieio");	/* make sure where in initial state, data hi, clock hi */	out8 (IIC_DIRECTCNTL1, 0xC);	for (i = 0; i < 10; i++) {		if ((in8 (IIC_DIRECTCNTL1) & 0x3) != 0x3) {			/* clock until we get to known state */			out8 (IIC_DIRECTCNTL1, 0x8);	/* clock lo */			udelay (100);		/* 100us */			out8 (IIC_DIRECTCNTL1, 0xC);	/* clock hi */			udelay (100);		/* 100us */		} else {			break;		}	}	/* send start condition */	out8 (IIC_DIRECTCNTL1, 0x4);	udelay (1000);				/* 1ms */	/* send stop condition */	out8 (IIC_DIRECTCNTL1, 0xC);	udelay (1000);				/* 1ms */	/* Unreset controller */	out8 (IIC_XTCNTLSS1, (status & ~IIC_XTCNTLSS_SRST));	udelay (1000);				/* 1ms */}void i2c1_init (int speed, int slaveadd){	sys_info_t sysInfo;	unsigned long freqOPB;	int val, divisor;#ifdef CFG_I2C_INIT_BOARD	/* call board specific i2c bus reset routine before accessing the   */	/* environment, which might be in a chip on that bus. For details   */	/* about this problem see doc/I2C_Edge_Conditions.                  */	i2c_init_board();#endif	/* Handle possible failed I2C state */	/* FIXME: put this into i2c_init_board()? */	_i2c_bus1_reset ();	/* clear lo master address */	out8 (IIC_LMADR1, 0);	/* clear hi master address */	out8 (IIC_HMADR1, 0);	/* clear lo slave address */	out8 (IIC_LSADR1, 0);	/* clear hi slave address */	out8 (IIC_HSADR1, 0);	/* Clock divide Register */	/* get OPB frequency */	get_sys_info (&sysInfo);	freqOPB = sysInfo.freqPLB / sysInfo.pllOpbDiv;	/* set divisor according to freqOPB */	divisor = (freqOPB - 1) / 10000000;	if (divisor == 0)		divisor = 1;	out8 (IIC_CLKDIV1, divisor);	/* no interrupts */	out8 (IIC_INTRMSK1, 0);	/* clear transfer count */	out8 (IIC_XFRCNT1, 0);	/* clear extended control & stat */	/* write 1 in SRC SRS SWC SWS to clear these fields */	out8 (IIC_XTCNTLSS1, 0xF0);	/* Mode Control Register	   Flush Slave/Master data buffer */	out8 (IIC_MDCNTL1, IIC_MDCNTL_FSDB | IIC_MDCNTL_FMDB);	__asm__ volatile ("eieio");	val = in8(IIC_MDCNTL1);	__asm__ volatile ("eieio");	/* Ignore General Call, slave transfers are ignored,	   disable interrupts, exit unknown bus state, enable hold	   SCL	   100kHz normaly or FastMode for 400kHz and above	*/	val |= IIC_MDCNTL_EUBS|IIC_MDCNTL_HSCL;	if( speed >= 400000 ){		val |= IIC_MDCNTL_FSM;	}	out8 (IIC_MDCNTL1, val);	/* clear control reg */	out8 (IIC_CNTL1, 0x00);	__asm__ volatile ("eieio");}/*  This code tries to use the features of the 405GP i2c  controller. It will transfer up to 4 bytes in one pass  on the loop. It only does out8(lbz) to the buffer when it  is possible to do out16(lhz) transfers.  cmd_type is 0 for write 1 for read.  addr_len can take any value from 0-255, it is only limited  by the char, we could make it larger if needed. If it is  0 we skip the address write cycle.  Typical case is a Write of an addr followd by a Read. The  IBM FAQ does not cover this. On the last byte of the write  we don't set the creg CHT bit, and on the first bytes of the  read we set the RPST bit.  It does not support address only transfers, there must be  a data part. If you want to write the address yourself, put  it in the data pointer.  It does not support transfer to/from address 0.  It does not check XFRCNT.*/staticint i2c_transfer1(unsigned char cmd_type,		  unsigned char chip,		  unsigned char addr[],		  unsigned char addr_len,		  unsigned char data[],		  unsigned short data_len ){	unsigned char* ptr;	int reading;	int tran,cnt;	int result;	int status;	int i;	uchar creg;	if( data == 0 || data_len == 0 ){		/*Don't support data transfer of no length or to address 0*/		printf( "i2c_transfer: bad call\n" );		return IIC_NOK;	}	if( addr && addr_len ){		ptr = addr;		cnt = addr_len;		reading = 0;	}else{		ptr = data;		cnt = data_len;		reading = cmd_type;	}	/*Clear Stop Complete Bit*/	out8(IIC_STS1,IIC_STS_SCMP);	/* Check init */	i=10;	do {		/* Get status */		status = in8(IIC_STS1);		__asm__ volatile("eieio");		i--;	} while ((status & IIC_STS_PT) && (i>0));	if (status & IIC_STS_PT) {		result = IIC_NOK_TOUT;		return(result);	}	/*flush the Master/Slave Databuffers*/	out8(IIC_MDCNTL1, ((in8(IIC_MDCNTL1))|IIC_MDCNTL_FMDB|IIC_MDCNTL_FSDB));	/*need to wait 4 OPB clocks? code below should take that long*/	/* 7-bit adressing */	out8(IIC_HMADR1,0);	out8(IIC_LMADR1, chip);	__asm__ volatile("eieio");	tran = 0;	result = IIC_OK;	creg = 0;	while ( tran != cnt && (result == IIC_OK)) {		int  bc,j;		/* Control register =		   Normal transfer, 7-bits adressing, Transfer up to bc bytes, Normal start,		   Transfer is a sequence of transfers		*/		creg |= IIC_CNTL_PT;		bc = (cnt - tran) > 4 ? 4 :			cnt - tran;		creg |= (bc-1)<<4;		/* if the real cmd type is write continue trans*/		if ( (!cmd_type && (ptr == addr)) || ((tran+bc) != cnt) )			creg |= IIC_CNTL_CHT;		if (reading)			creg |= IIC_CNTL_READ;		else {			for(j=0; j<bc; j++) {				/* Set buffer */				out8(IIC_MDBUF1,ptr[tran+j]);				__asm__ volatile("eieio");			}		}		out8(IIC_CNTL1, creg );		__asm__ volatile("eieio");		/* Transfer is in progress		   we have to wait for upto 5 bytes of data		   1 byte chip address+r/w bit then bc bytes		   of data.		   udelay(10) is 1 bit time at 100khz		   Doubled for slop. 20 is too small.		*/		i=2*5*8;		do {			/* Get status */			status = in8(IIC_STS1);			__asm__ volatile("eieio");			udelay (10);			i--;		} while ((status & IIC_STS_PT) && !(status & IIC_STS_ERR)			 && (i>0));		if (status & IIC_STS_ERR) {			result = IIC_NOK;			status = in8 (IIC_EXTSTS1);			/* Lost arbitration? */			if (status & IIC_EXTSTS_LA)				result = IIC_NOK_LA;			/* Incomplete transfer? */			if (status & IIC_EXTSTS_ICT)				result = IIC_NOK_ICT;			/* Transfer aborted? */			if (status & IIC_EXTSTS_XFRA)				result = IIC_NOK_XFRA;		} else if ( status & IIC_STS_PT) {			result = IIC_NOK_TOUT;		}		/* Command is reading => get buffer */		if ((reading) && (result == IIC_OK)) {			/* Are there data in buffer */			if (status & IIC_STS_MDBS) {				/*				  even if we have data we have to wait 4OPB clocks				  for it to hit the front of the FIFO, after that				  we can just read. We should check XFCNT here and				  if the FIFO is full there is no need to wait.				*/				udelay (1);				for(j=0;j<bc;j++) {					ptr[tran+j] = in8(IIC_MDBUF1);					__asm__ volatile("eieio");				}			} else				result = IIC_NOK_DATA;		}		creg = 0;		tran+=bc;		if( ptr == addr && tran == cnt ) {			ptr = data;			cnt = data_len;			tran = 0;			reading = cmd_type;			if( reading )				creg = IIC_CNTL_RPST;		}	}	return (result);}int i2c_probe1 (uchar chip){	uchar buf[1];	buf[0] = 0;	/*	 * What is needed is to send the chip address and verify that the	 * address was <ACK>ed (i.e. there was a chip at that address which	 * drove the data line low).	 */	return(i2c_transfer1 (1, chip << 1, 0,0, buf, 1) != 0);}int i2c_read1 (uchar chip, uint addr, int alen, uchar * buffer, int len){	uchar xaddr[4];	int ret;	if ( alen > 4 ) {		printf ("I2C read: addr len %d not supported\n", alen);		return 1;	}	if ( alen > 0 ) {		xaddr[0] = (addr >> 24) & 0xFF;		xaddr[1] = (addr >> 16) & 0xFF;		xaddr[2] = (addr >> 8) & 0xFF;		xaddr[3] = addr & 0xFF;	}#ifdef CFG_I2C_EEPROM_ADDR_OVERFLOW	/*	 * EEPROM chips that implement "address overflow" are ones	 * like Catalyst 24WC04/08/16 which has 9/10/11 bits of	 * address and the extra bits end up in the "chip address"	 * bit slots. This makes a 24WC08 (1Kbyte) chip look like	 * four 256 byte chips.	 *	 * Note that we consider the length of the address field to	 * still be one byte because the extra address bits are	 * hidden in the chip address.	 */	if( alen > 0 )		chip |= ((addr >> (alen * 8)) & CFG_I2C_EEPROM_ADDR_OVERFLOW);#endif	if( (ret = i2c_transfer1( 1, chip<<1, &xaddr[4-alen], alen, buffer, len )) != 0) {		printf( "I2c read: failed %d\n", ret);		return 1;	}	return 0;}int i2c_write1 (uchar chip, uint addr, int alen, uchar * buffer, int len){	uchar xaddr[4];	if ( alen > 4 ) {		printf ("I2C write: addr len %d not supported\n", alen);		return 1;	}	if ( alen > 0 ) {		xaddr[0] = (addr >> 24) & 0xFF;		xaddr[1] = (addr >> 16) & 0xFF;		xaddr[2] = (addr >> 8) & 0xFF;		xaddr[3] = addr & 0xFF;	}#ifdef CFG_I2C_EEPROM_ADDR_OVERFLOW	/*	 * EEPROM chips that implement "address overflow" are ones	 * like Catalyst 24WC04/08/16 which has 9/10/11 bits of	 * address and the extra bits end up in the "chip address"	 * bit slots. This makes a 24WC08 (1Kbyte) chip look like	 * four 256 byte chips.	 *	 * Note that we consider the length of the address field to	 * still be one byte because the extra address bits are	 * hidden in the chip address.	 */	if( alen > 0 )		chip |= ((addr >> (alen * 8)) & CFG_I2C_EEPROM_ADDR_OVERFLOW);#endif	return (i2c_transfer1( 0, chip<<1, &xaddr[4-alen], alen, buffer, len ) != 0);}/*----------------------------------------------------------------------- * Read a register */uchar i2c_reg_read1(uchar i2c_addr, uchar reg){	uchar buf;	i2c_read1(i2c_addr, reg, 1, &buf, (uchar)1);	return(buf);}/*----------------------------------------------------------------------- * Write a register */void i2c_reg_write1(uchar i2c_addr, uchar reg, uchar val){	i2c_write1(i2c_addr, reg, 1, &val, 1);}int do_i2c1_probe(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int j;#if defined(CFG_I2C_NOPROBES)	int k, skip;#endif	puts ("Valid chip addresses:");	for(j = 0; j < 128; j++) {#if defined(CFG_I2C_NOPROBES)		skip = 0;		for (k = 0; k < sizeof(i2c_no_probes); k++){			if (j == i2c_no_probes[k]){				skip = 1;				break;			}		}		if (skip)			continue;#endif		if(i2c_probe1(j) == 0) {			printf(" %02X", j);		}	}	putc ('\n');#if defined(CFG_I2C_NOPROBES)	puts ("Excluded chip addresses:");	for( k = 0; k < sizeof(i2c_no_probes); k++ )		printf(" %02X", i2c_no_probes[k] );	putc ('\n');#endif	return 0;}U_BOOT_CMD(	iprobe1,	1,	1,	do_i2c1_probe,	"iprobe1  - probe to discover valid I2C chip addresses\n",	"\n    -discover valid I2C chip addresses\n");#endif	/* CONFIG_I2C_BUS1 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产裸体歌舞团一区二区| 亚洲精品视频在线观看免费 | 91精品免费在线| 亚洲午夜激情网页| 欧美一二区视频| 国产一区二区看久久| 日本一二三不卡| 91国偷自产一区二区三区成为亚洲经典 | 国产一区二区三区观看| 久久久久久久久久久久电影| 精品一区在线看| 国产日韩成人精品| 一道本成人在线| 热久久国产精品| 国产拍揄自揄精品视频麻豆| 99久久777色| 亚洲综合免费观看高清在线观看| 欧美一区二区视频在线观看| 国产福利91精品一区| 1000部国产精品成人观看| 欧美视频在线观看一区二区| 九九国产精品视频| 国产精品黄色在线观看| 欧美日韩国产片| 国产大陆a不卡| 亚洲国产一区二区视频| 精品国产一二三区| 一本色道久久综合亚洲91| 日本女优在线视频一区二区| 亚洲国产精品av| 在线播放一区二区三区| 高清国产一区二区三区| 亚洲成人av电影| 国产日韩欧美精品一区| 欧美理论片在线| 成人毛片视频在线观看| 午夜影院久久久| 国产精品二三区| 久久久午夜电影| 911精品国产一区二区在线| 成人中文字幕电影| 蜜臀久久久久久久| 亚洲丝袜美腿综合| 2021中文字幕一区亚洲| 日本二三区不卡| 国产99精品国产| 免费成人av在线播放| 亚洲国产视频一区二区| 欧美国产禁国产网站cc| 日韩精品一区二区三区视频| 欧美三级视频在线观看| 99久久免费国产| 国v精品久久久网| 捆绑紧缚一区二区三区视频| 亚洲一区二区三区不卡国产欧美| 中文字幕的久久| 国产午夜精品一区二区三区四区| 欧美一二三四区在线| 欧美色欧美亚洲另类二区| www.欧美亚洲| 成人免费视频一区| 国产福利一区二区| 精品一区二区免费在线观看| 午夜成人免费电影| 性做久久久久久免费观看| 亚洲欧美日韩国产综合| 国产精品免费av| 国产精品久久夜| 国产精品久久久久久久久免费丝袜 | av中文字幕不卡| 成人黄色小视频在线观看| 国产剧情一区二区| 国产精品一区二区久激情瑜伽| 久久国产尿小便嘘嘘尿| 免费观看成人鲁鲁鲁鲁鲁视频| 日本va欧美va精品发布| 日韩高清一区二区| 奇米色一区二区| 久久www免费人成看片高清| 久久91精品国产91久久小草| 另类小说视频一区二区| 国产一区二区三区在线观看精品| 国内国产精品久久| 国产精品一色哟哟哟| 丰满少妇久久久久久久| 97久久精品人人做人人爽| 一本久久a久久精品亚洲| 日本道色综合久久| 欧美色倩网站大全免费| 欧美一级高清大全免费观看| 精品99999| 国产精品久久久久桃色tv| 最近日韩中文字幕| 亚洲1区2区3区4区| 麻豆中文一区二区| 国产在线一区观看| av在线播放不卡| 欧美体内she精高潮| 欧美一区二区视频在线观看2020 | 91久久一区二区| 宅男在线国产精品| 国产午夜精品美女毛片视频| 亚洲人精品午夜| 奇米综合一区二区三区精品视频| 国产一区二区三区黄视频| 99精品视频一区二区| 欧美伦理电影网| 久久九九久久九九| 一二三四区精品视频| 麻豆国产91在线播放| 成人av综合在线| 欧美一区二区在线免费观看| 久久久91精品国产一区二区精品 | 色婷婷综合久色| 51精品视频一区二区三区| 久久久777精品电影网影网 | 日韩精品综合一本久道在线视频| 久久久久综合网| 亚洲综合一二区| 成人性色生活片免费看爆迷你毛片| 色婷婷亚洲综合| 国产亚洲va综合人人澡精品| 亚洲一级二级三级在线免费观看| 久久国产成人午夜av影院| 日本福利一区二区| 国产亚洲制服色| 日韩av不卡一区二区| 99免费精品在线| 精品国产乱码久久久久久牛牛| 亚洲一区在线观看免费观看电影高清| 国内成+人亚洲+欧美+综合在线| 日本道精品一区二区三区| 国产日本亚洲高清| 日韩成人dvd| 91成人在线精品| 亚洲国产成人在线| 久久国产日韩欧美精品| 欧美日韩精品系列| 中文字幕亚洲精品在线观看| 久久国产三级精品| 这里只有精品电影| 一区二区三区欧美| 成人国产精品免费观看| 精品国产三级a在线观看| 亚洲高清在线精品| 色菇凉天天综合网| 亚洲欧洲色图综合| 成人丝袜高跟foot| 日本一区二区视频在线| 国产做a爰片久久毛片| 日韩一区二区精品在线观看| 亚洲国产一区二区a毛片| 色综合天天性综合| 中文字幕二三区不卡| 国产在线日韩欧美| 精品国产三级a在线观看| 日韩av一区二| 91精品国产日韩91久久久久久| 亚洲影院在线观看| 欧美日韩在线播放三区| 亚洲国产婷婷综合在线精品| 91黄视频在线观看| 亚洲国产精品久久人人爱蜜臀| 色婷婷av一区二区三区之一色屋| 中文字幕免费观看一区| 大白屁股一区二区视频| 欧美激情一区二区三区四区| 国产激情一区二区三区四区| 久久精品视频免费| 国产成人鲁色资源国产91色综 | 中文字幕乱码亚洲精品一区| 懂色av噜噜一区二区三区av| 国产区在线观看成人精品| 国产精品1区2区| 国产精品丝袜久久久久久app| 国产98色在线|日韩| 国产精品美日韩| 一本久久a久久免费精品不卡| 一区二区三区蜜桃| 欧美巨大另类极品videosbest | 亚洲国产精品麻豆| 欧美一区二区视频观看视频| 另类小说欧美激情| 久久精品免视看| 99国产精品国产精品毛片| 亚洲黄色小视频| 欧美浪妇xxxx高跟鞋交| 欧美aⅴ一区二区三区视频| 欧美精品一区二区三区很污很色的| 国产一区二区不卡在线| 欧美激情一区二区三区蜜桃视频| av高清不卡在线| 亚洲一区二区三区在线| 91精品国模一区二区三区| 国产伦精品一区二区三区免费迷| 国产精品乱人伦| 欧美日韩免费在线视频| 久久99久久精品欧美| 国产精品视频九色porn| 欧美日韩精品欧美日韩精品 |