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

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

?? iic_adapter.c

?? u-boot1.3.0的原碼,從配了網(wǎng)絡驅動和FLASH的驅動,并該用ESC竟如
?? C
字號:
/********************************************************************************     Author: Xilinx, Inc.***     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.***     XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A*     COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS*     ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD,*     XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE*     FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING*     ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.*     XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO*     THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY*     WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM*     CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND*     FITNESS FOR A PARTICULAR PURPOSE.***     Xilinx hardware products are not intended for use in life support*     appliances, devices, or systems. Use in such applications is*     expressly prohibited.***     (c) Copyright 2002-2004 Xilinx Inc.*     All rights reserved.***     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.*******************************************************************************/#include <config.h>#include <common.h>#include <environment.h>#include <net.h>#ifdef CFG_ENV_IS_IN_EEPROM#include <i2c.h>#include "xiic_l.h"#define IIC_DELAY     5000static u8 envStep = 0;		/* 0 means crc has not been read */const u8 hex[] = "0123456789ABCDEF"; /* lookup table for ML300 CRC *//************************************************************************ * Use Xilinx provided driver to send data to EEPROM using iic bus. */static voidsend(u32 adr, u8 * data, u32 len){	u8 sendBuf[34];		/* first 2-bit is address and others are data */	u32 pos, wlen;	u32 ret;	wlen = 32;	for (pos = 0; pos < len; pos += 32) {		if ((len - pos) < 32)			wlen = len - pos;		/* Put address and data bits together */		sendBuf[0] = (u8) ((adr + pos) >> 8);		sendBuf[1] = (u8) (adr + pos);		memcpy(&sendBuf[2], &data[pos], wlen);		/* Send to EEPROM through iic bus */		ret = XIic_Send(XPAR_IIC_0_BASEADDR, CFG_I2C_EEPROM_ADDR >> 1,				sendBuf, wlen + 2);		udelay(IIC_DELAY);	}}/************************************************************************ * Use Xilinx provided driver to read data from EEPROM using the iic bus. */static voidreceive(u32 adr, u8 * data, u32 len){	u8 address[2];	u32 ret;	address[0] = (u8) (adr >> 8);	address[1] = (u8) adr;	/* Provide EEPROM address */	ret =	    XIic_Send(XPAR_IIC_0_BASEADDR, CFG_I2C_EEPROM_ADDR >> 1, address,		      2);	/* Receive data from EEPROM */	ret =	    XIic_Recv(XPAR_IIC_0_BASEADDR, CFG_I2C_EEPROM_ADDR >> 1, data, len);}/************************************************************************ * Convert a hexadecimal string to its equivalent integer value. */static u8axtoi(u8 * hexStg){	u8 n;			/* position in string */	u8 m;			/* position in digit[] to shift */	u8 count;		/* loop index */	u8 intValue;		/* integer value of hex string */	u8 digit[2];		/* hold values to convert */	for (n = 0; n < 2; n++) {		if (hexStg[n] == '\0')			break;		if (hexStg[n] > 0x29 && hexStg[n] < 0x40)			digit[n] = hexStg[n] & 0x0f;		else if (hexStg[n] >= 'a' && hexStg[n] <= 'f')			digit[n] = (hexStg[n] & 0x0f) + 9;		else if (hexStg[n] >= 'A' && hexStg[n] <= 'F')			digit[n] = (hexStg[n] & 0x0f) + 9;		else			break;	}	intValue = 0;	count = n;	m = n - 1;	n = 0;	while (n < count) {		intValue = intValue | (digit[n] << (m << 2));		m--;		/* adjust the position to set */		n++;		/* next digit to process */	}	return (intValue);}/************************************************************************ * Convert an integer string to its equivalent value. */static u8atoi(uchar * string){	u8 res = 0;	while (*string >= '0' && *string <= '9') {		res *= 10;		res += *string - '0';		string++;	}	return res;}/************************************************************************ * Key-value pairs are separated by "=" sign. */static voidfindKey(uchar * buffer, int *loc, u8 len){	u32 i;	for (i = 0; i < len; i++)		if (buffer[i] == '=') {			*loc = i;			return;		}	/* return -1 is no "=" sign found */	*loc = -1;}/************************************************************************ * Compute a new ML300 CRC when user calls the saveenv command. * Also update EEPROM with new CRC value. */static u8update_crc(u32 len, uchar * data){	uchar temp[6] = { 'C', '=', 0x00, 0x00, 0x00, 0x00 };	u32 crc;		/* new crc value */	u32 i;	crc = 0;	/* calculate new CRC */	for (i = 0; i < len; i++)		crc += data[i];	/* CRC includes key for check sum */	crc += 'C' + '=';	/* compose new CRC to be updated */	temp[2] = hex[(crc >> 4) & 0xf];	temp[3] = hex[crc & 0xf];	/* check to see if env size exceeded */	if (len + 6 > ENV_SIZE) {		printf("ERROR: not enough space to store CRC on EEPROM");		return 1;	}	memcpy(data + len, temp, 6);	return 0;}/************************************************************************ * Read out ML300 CRC and compare it with a runtime calculated ML300 CRC. * If equal, then pass back a u-boot CRC value, otherwise pass back * junk to indicate CRC error.*/static voidread_crc(uchar * buffer, int len){	u32 addr, n;	u32 crc;		/* runtime crc */	u8 old[2] = { 0xff, 0xff };	/* current CRC in EEPROM */	u8 stop;		/* indication of end of env data */	u8 pre;			/* previous EEPROM data bit */	int i, loc;	addr = CFG_ENV_OFFSET;	/* start from first env address */	n = 0;	pre = 1;	stop = 1;	crc = 0;	/* calculate runtime CRC according to ML300 and read back	   old CRC stored in the EEPROM */	while (n < CFG_ENV_SIZE) {		receive(addr, buffer, len);		/* found two null chars, end of env */		if ((pre || buffer[0]) == 0)			break;		findKey(buffer, &loc, len);		/* found old check sum, read and store old CRC */		if ((loc == 0 && pre == 'C')		    || (loc > 0 && buffer[loc - 1] == 'C'))			receive(addr + loc + 1, old, 2);		pre = buffer[len - 1];		/* calculate runtime ML300 CRC */		crc += buffer[0];		i = 1;		do {			crc += buffer[i];			stop = buffer[i] || buffer[i - 1];			i++;		} while (stop && (i < len));		if (stop == 0)			break;		n += len;		addr += len;	}	/* exclude old CRC from runtime calculation */	crc -= (old[0] + old[1]);	/* match CRC values, send back u-boot CRC */	if ((old[0] == hex[(crc >> 4) & 0xf])	    && (old[1] == hex[crc & 0xf])) {		crc = 0;		n = 0;		addr =		    CFG_ENV_OFFSET - offsetof(env_t, crc) + offsetof(env_t,								     data);		/* calculate u-boot crc */		while (n < ENV_SIZE) {			receive(addr, buffer, len);			crc = crc32(crc, buffer, len);			n += len;			addr += len;		}		memcpy(buffer, &crc, 4);	}}/************************************************************************ * Convert IP address to hexadecimals. */static voidip_ml300(uchar * s, uchar * res){	char temp[2];	u8 i;	res[0] = 0x00;	for (i = 0; i < 4; i++) {		sprintf(temp, "%02x", atoi(s));		s = (uchar *)strchr((char *)s, '.') + 1;		strcat((char *)res, temp);	}}/************************************************************************ * Change 0xff (255), a dummy null char to 0x00. */static voidchange_null(uchar * s){	if (s != NULL) {		change_null((uchar *)strchr((char *)s + 1, 255));		*(strchr((char *)s, 255)) = '\0';	}}/************************************************************************ * Update environment variable name and values to u-boot standard. */voidconvert_env(void){	char *s;		/* pointer to env value */	char temp[20];		/* temp storage for addresses */	/* E -> ethaddr */	s = getenv("E");	if (s != NULL) {		sprintf(temp, "%c%c.%c%c.%c%c.%c%c.%c%c.%c%c",			s[0], s[1],  s[ 2], s[ 3],			s[4], s[5],  s[ 6], s[ 7],			s[8], s[9],  s[10], s[11] );		setenv("ethaddr", temp);		setenv("E", NULL);	}	/* L -> serial# */	s = getenv("L");	if (s != NULL) {		setenv("serial#", s);		setenv("L", NULL);	}	/* I -> ipaddr */	s = getenv("I");	if (s != NULL) {		sprintf(temp, "%d.%d.%d.%d", axtoi((u8 *)s), axtoi((u8 *)(s + 2)),			axtoi((u8 *)(s + 4)), axtoi((u8 *)(s + 6)));		setenv("ipaddr", temp);		setenv("I", NULL);	}	/* S -> serverip */	s = getenv("S");	if (s != NULL) {		sprintf(temp, "%d.%d.%d.%d", axtoi((u8 *)s), axtoi((u8 *)(s + 2)),			axtoi((u8 *)(s + 4)), axtoi((u8 *)(s + 6)));		setenv("serverip", temp);		setenv("S", NULL);	}	/* A -> bootargs */	s = getenv("A");	if (s != NULL) {		setenv("bootargs", s);		setenv("A", NULL);	}	/* F -> bootfile */	s = getenv("F");	if (s != NULL) {		setenv("bootfile", s);		setenv("F", NULL);	}	/* M -> bootcmd */	s = getenv("M");	if (s != NULL) {		setenv("bootcmd", s);		setenv("M", NULL);	}	/* Don't include C (CRC) */	setenv("C", NULL);}/************************************************************************ * Save user modified environment values back to EEPROM. */static voidsave_env(void){	char eprom[ENV_SIZE];	/* buffer to be written back to EEPROM */	char *s, temp[20];	char ff[] = { 0xff, 0x00 };	/* dummy null value */	u32 len;		/* length of env to be written to EEPROM */	eprom[0] = 0x00;	/* ethaddr -> E */	s = getenv("ethaddr");	if (s != NULL) {		strcat(eprom, "E=");		sprintf(temp, "%c%c%c%c%c%c%c%c%c%c%c%c",			*s, *(s + 1), *(s + 3), *(s + 4), *(s + 6), *(s + 7),			*(s + 9), *(s + 10), *(s + 12), *(s + 13), *(s + 15),			*(s + 16));		strcat(eprom, temp);		strcat(eprom, ff);	}	/* serial# -> L */	s = getenv("serial#");	if (s != NULL) {		strcat(eprom, "L=");		strcat(eprom, s);		strcat(eprom, ff);	}	/* ipaddr -> I */	s = getenv("ipaddr");	if (s != NULL) {		strcat(eprom, "I=");		ip_ml300((uchar *)s, (uchar *)temp);		strcat(eprom, temp);		strcat(eprom, ff);	}	/* serverip -> S */	s = getenv("serverip");	if (s != NULL) {		strcat(eprom, "S=");		ip_ml300((uchar *)s, (uchar *)temp);		strcat(eprom, temp);		strcat(eprom, ff);	}	/* bootargs -> A */	s = getenv("bootargs");	if (s != NULL) {		strcat(eprom, "A=");		strcat(eprom, s);		strcat(eprom, ff);	}	/* bootfile -> F */	s = getenv("bootfile");	if (s != NULL) {		strcat(eprom, "F=");		strcat(eprom, s);		strcat(eprom, ff);	}	/* bootcmd -> M */	s = getenv("bootcmd");	if (s != NULL) {		strcat(eprom, "M=");		strcat(eprom, s);		strcat(eprom, ff);	}	len = strlen(eprom);	/* find env length without crc */	change_null((uchar *)eprom);	/* change 0xff to 0x00 */	/* update EEPROM env values if there is enough space */	if (update_crc(len, (uchar *)eprom) == 0)		send(CFG_ENV_OFFSET, (uchar *)eprom, len + 6);}/************************************************************************ * U-boot call for EEPROM read associated activities. */inti2c_read(uchar chip, uint addr, int alen, uchar * buffer, int len){	if (envStep == 0) {		/* first read call is for crc */		read_crc(buffer, len);		++envStep;		return 0;	} else if (envStep == 1) {		/* then read out EEPROM content for runtime u-boot CRC calculation */		receive(addr, buffer, len);		if (addr + len - CFG_ENV_OFFSET == CFG_ENV_SIZE)			/* end of runtime crc read */			++envStep;		return 0;	}	if (len < 2) {		/* when call getenv_r */		receive(addr, buffer, len);	} else if (addr + len < CFG_ENV_OFFSET + CFG_ENV_SIZE) {		/* calling env_relocate(), but don't read out		   crc value from EEPROM */		receive(addr, buffer + 4, len);	} else {		receive(addr, buffer + 4, len - 4);	}	return 0;}/************************************************************************ * U-boot call for EEPROM write acativities. */inti2c_write(uchar chip, uint addr, int alen, uchar * buffer, int len){	/* save env on last page write called by u-boot */	if (addr + len >= CFG_ENV_OFFSET + CFG_ENV_SIZE)		save_env();	return 0;}/************************************************************************ * Dummy function. */inti2c_probe(uchar chip){	return 1;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品午夜在线观看| 亚洲免费视频中文字幕| 一区二区三区中文在线| 国产一区二区女| 欧美视频一区二区在线观看| 一色屋精品亚洲香蕉网站| 93久久精品日日躁夜夜躁欧美| 久久久www免费人成精品| 蜜桃视频在线观看一区二区| 7777精品伊人久久久大香线蕉最新版| 亚洲男人天堂av| 久久久亚洲精品石原莉奈| 欧美日韩亚洲高清一区二区| 琪琪久久久久日韩精品| 欧美va天堂va视频va在线| 日韩二区三区四区| 精品国产乱码久久久久久老虎 | 依依成人精品视频| 91国产丝袜在线播放| 亚洲国产精品久久人人爱蜜臀| 91福利国产精品| 99久久综合99久久综合网站| 一区二区激情小说| 日韩美女啊v在线免费观看| 欧美性受xxxx黑人xyx| 99久久99久久精品免费看蜜桃| 国产夫妻精品视频| 亚洲最快最全在线视频| 亚洲人123区| 国产精品国产精品国产专区不片| 色婷婷av一区二区三区大白胸| 亚洲午夜久久久久久久久电影院 | av电影在线观看一区| 国模大尺度一区二区三区| 中文在线免费一区三区高中清不卡| 99视频精品在线| 成人福利在线看| 日韩精品免费视频人成| 国产午夜精品久久| 欧美日本在线视频| 国产传媒日韩欧美成人| 国产一区二区三区免费看| 激情成人综合网| 国产一区二区在线观看视频| 国产在线一区观看| 国产成人在线影院| 成人黄色电影在线| 色综合久久中文综合久久牛| 不卡影院免费观看| 91蜜桃传媒精品久久久一区二区| 蜜臀av一区二区三区| 久久国产人妖系列| 亚洲国产日产av| 亚洲a一区二区| 自拍偷拍国产精品| 亚洲精品国产一区二区三区四区在线| 亚洲精品成a人| 三级成人在线视频| 国内成人免费视频| 成人黄色国产精品网站大全在线免费观看| 不卡大黄网站免费看| 日本国产一区二区| 欧美电影免费观看高清完整版在线观看| 色综合久久中文综合久久97| 欧美午夜一区二区| 日韩丝袜情趣美女图片| 欧美系列在线观看| 日韩欧美一区二区在线视频| 国产区在线观看成人精品| 精品乱人伦一区二区三区| 久久久久久久久97黄色工厂| 亚洲视频一区二区在线| 日韩精品亚洲专区| 丁香婷婷综合激情五月色| 久久99热99| 99精品偷自拍| 欧美一三区三区四区免费在线看| 欧美亚洲国产一区二区三区va| 91精品国产综合久久精品| 国产亚洲精久久久久久| 一区二区三区精品| 久久国产免费看| 欧美综合亚洲图片综合区| 91蝌蚪porny九色| 日韩欧美一区二区不卡| 国产精品不卡一区二区三区| 日韩av电影免费观看高清完整版在线观看 | 日韩视频一区二区三区在线播放| 久久久91精品国产一区二区三区| 一卡二卡欧美日韩| 国产在线精品一区二区不卡了 | 日韩午夜精品视频| 国产精品久久毛片a| 三级久久三级久久久| 93久久精品日日躁夜夜躁欧美| 日韩欧美中文字幕公布| 一区二区欧美精品| 成人黄色网址在线观看| 欧美不卡一区二区| 亚洲二区在线观看| 91亚洲国产成人精品一区二三 | 欧美日韩视频第一区| 国产三级三级三级精品8ⅰ区| 天天影视网天天综合色在线播放| 亚洲成av人片一区二区三区| 懂色av一区二区在线播放| 91精品国产高清一区二区三区 | 亚洲视频在线一区二区| 国产呦萝稀缺另类资源| 欧美精品丝袜中出| 日韩欧美成人一区二区| 亚洲综合色噜噜狠狠| 日韩中文欧美在线| 日本韩国视频一区二区| 中文字幕一区二区三区蜜月| 国产精品中文字幕日韩精品| 97精品超碰一区二区三区| 久久日韩精品一区二区五区| 中文字幕精品三区| 国产在线国偷精品免费看| 欧美一二三四在线| 丝袜美腿一区二区三区| 欧美日韩国产综合久久| 亚洲一级片在线观看| 91亚洲精品久久久蜜桃| 亚洲天堂成人网| 99国产一区二区三精品乱码| 亚洲国产精品ⅴa在线观看| 精品一区二区三区免费视频| av中文字幕不卡| 久久精品亚洲国产奇米99| 久久精品国产免费| 欧美成人猛片aaaaaaa| 老司机免费视频一区二区三区| 欧美高清hd18日本| 男人的天堂亚洲一区| 欧美日本高清视频在线观看| 亚洲国产欧美日韩另类综合 | 欧美一三区三区四区免费在线看| 天天综合色天天综合色h| 7777精品伊人久久久大香线蕉的| 亚洲不卡在线观看| 91麻豆精品国产91久久久使用方法| 亚洲aaa精品| 日韩三级免费观看| 久久99日本精品| 国产精品天美传媒| av在线一区二区三区| 亚洲天堂免费在线观看视频| 在线观看免费成人| 男女性色大片免费观看一区二区| 日韩精品中午字幕| 国产福利电影一区二区三区| 中文字幕中文字幕在线一区 | 欧美高清性hdvideosex| 久久精品国产一区二区三区免费看| 精品国产乱码久久久久久牛牛| 丰满白嫩尤物一区二区| 成人欧美一区二区三区黑人麻豆 | 国产精品天天看| 91国偷自产一区二区三区观看| 亚洲成av人片在线| 精品国产3级a| 97精品国产97久久久久久久久久久久| 亚洲综合色自拍一区| 精品国产污网站| 99在线精品视频| 秋霞午夜av一区二区三区| 久久亚洲二区三区| 色偷偷久久人人79超碰人人澡| 日本亚洲三级在线| 中文字幕日本不卡| 欧美高清视频www夜色资源网| 国产电影一区在线| 亚洲一区在线观看视频| 欧美精品一区二区不卡| 日本韩国一区二区三区| 国产在线看一区| 一区二区三区自拍| 久久婷婷一区二区三区| 在线观看免费成人| 国产69精品久久777的优势| 亚洲一区二区三区四区在线观看| 精品对白一区国产伦| 在线观看91精品国产入口| 久久99久久久欧美国产| 亚洲综合成人网| 国产日韩v精品一区二区| 欧美人与性动xxxx| 99国产欧美另类久久久精品| 韩国三级电影一区二区| 亚洲成人综合视频| 国产精品伦一区| 精品福利一区二区三区 | 国产精品拍天天在线| 555www色欧美视频| 91视频xxxx| 国产精品1024| 国精产品一区一区三区mba视频| 亚洲一区二区精品视频|