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

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

?? iic_adapter.c

?? gumstiz u-boot loader in linux
?? 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 <common.h>#include <environment.h>#include <net.h>#include <configs/ml300.h>#include "xparameters.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一区二区三区免费野_久草精品视频
热久久免费视频| 国产亚洲精品免费| 亚洲精品欧美激情| 日本久久电影网| 亚洲一二三区视频在线观看| 欧美做爰猛烈大尺度电影无法无天| 亚洲人精品午夜| 在线观看国产日韩| 天天综合日日夜夜精品| 欧美一级日韩一级| 极品少妇一区二区三区精品视频| 国产视频在线观看一区二区三区| 不卡的av网站| 亚洲国产欧美在线| 日韩欧美精品在线| 成人禁用看黄a在线| 亚洲高清不卡在线观看| 欧美tk丨vk视频| 成人h精品动漫一区二区三区| 一区二区三区色| 日韩欧美另类在线| 91亚洲精品乱码久久久久久蜜桃| 亚洲成人黄色影院| 久久久精品国产99久久精品芒果| 日韩一卡二卡三卡国产欧美| 国产一区二区伦理| 中文字幕在线一区二区三区| 欧美日韩久久久一区| 国产精品综合一区二区三区| 亚洲男人天堂一区| 欧美电影免费观看高清完整版 | 国产精品1区2区3区在线观看| 中文字幕中文字幕在线一区| 5566中文字幕一区二区电影| 国产盗摄一区二区三区| 亚洲成人7777| 国产日产欧美一区二区三区| 在线不卡中文字幕| eeuss鲁片一区二区三区| 日本大胆欧美人术艺术动态| 亚洲免费高清视频在线| 26uuu欧美| 91精品国产丝袜白色高跟鞋| 94色蜜桃网一区二区三区| 免费看欧美女人艹b| 夜夜操天天操亚洲| 亚洲国产精品ⅴa在线观看| 91精品中文字幕一区二区三区| eeuss鲁片一区二区三区| 国产一区欧美日韩| 麻豆精品视频在线观看| 一区av在线播放| 国产精品另类一区| 久久网这里都是精品| 欧美精品日韩一本| 欧美综合在线视频| 色综合久久88色综合天天6| 国产成人亚洲综合a∨婷婷图片| 美女一区二区三区在线观看| 亚洲一区欧美一区| 亚洲日本一区二区三区| 国产精品九色蝌蚪自拍| 国产亚洲欧洲997久久综合| 日韩一区二区三区在线观看| 欧美三级资源在线| 在线视频国内一区二区| 99久久精品免费看国产| 成人高清免费观看| 国产精品一区一区三区| 蜜桃视频在线观看一区| 免费人成黄页网站在线一区二区| 午夜视黄欧洲亚洲| 亚洲电影第三页| 亚洲国产精品视频| 亚洲在线观看免费视频| 亚洲国产精品欧美一二99| 亚洲国产日韩a在线播放| 亚洲精品国产a久久久久久| 亚洲日本在线天堂| 亚洲一区在线视频| 亚洲香肠在线观看| 日韩成人伦理电影在线观看| 日韩成人午夜精品| 久久精品国产第一区二区三区| 久久国产乱子精品免费女| 韩国欧美国产一区| 国产福利视频一区二区三区| 成人av影视在线观看| 99精品国产91久久久久久| 91在线免费看| 在线亚洲精品福利网址导航| 欧美性大战久久| 日韩免费性生活视频播放| 26uuuu精品一区二区| 中文字幕成人在线观看| 一区二区三区毛片| 日产国产欧美视频一区精品| 九九久久精品视频| 菠萝蜜视频在线观看一区| 欧美性做爰猛烈叫床潮| 日韩久久免费av| 中文字幕高清一区| 亚洲国产成人tv| 久久精品国产免费| 99久久免费视频.com| 欧美理论电影在线| www日韩大片| 一区二区三区鲁丝不卡| 日韩精品视频网| 成人免费视频caoporn| 欧美日韩成人一区| 日本一区二区三区国色天香| 亚洲永久免费av| 国产在线精品一区在线观看麻豆| 成人av在线资源网站| 欧美精品乱码久久久久久| 久久精品亚洲精品国产欧美| 亚洲精品少妇30p| 经典三级视频一区| 欧美三电影在线| 国产日韩精品一区二区浪潮av| 洋洋成人永久网站入口| 久久草av在线| 欧美综合视频在线观看| 久久精品一区蜜桃臀影院| 亚洲成av人片在www色猫咪| 国产成人在线看| 3atv在线一区二区三区| 日韩理论片中文av| 激情都市一区二区| 欧美日高清视频| 国产精品国产自产拍高清av| 麻豆精品新av中文字幕| 欧美日韩一区二区在线观看| 国产精品乱人伦| 国产麻豆精品久久一二三| 欧美欧美欧美欧美| 综合久久综合久久| 国产精品亚洲人在线观看| 欧美丝袜丝交足nylons| 中文乱码免费一区二区| 精品一区二区免费视频| 欧美日韩你懂的| 亚洲美腿欧美偷拍| 成人黄色小视频| 国产清纯白嫩初高生在线观看91 | 成人综合在线视频| 欧美大片免费久久精品三p| 亚洲在线免费播放| 91免费小视频| 国产精品美女久久久久久久久 | 舔着乳尖日韩一区| 色婷婷av一区二区三区软件| 国产精品女人毛片| 国产精品影视在线观看| 日韩精品中文字幕在线一区| 亚欧色一区w666天堂| 欧美视频三区在线播放| 亚洲精品成人悠悠色影视| www..com久久爱| 国产精品私人自拍| 成人性视频免费网站| 国产欧美日韩不卡免费| 国产精品一区二区久久不卡 | 国产欧美日韩在线视频| 精品一区二区在线免费观看| 欧美一区二区三区白人| 免费在线成人网| 精品国产91亚洲一区二区三区婷婷| 日韩二区在线观看| 91精品国产一区二区三区| 久久精品国产亚洲aⅴ| 日韩欧美激情在线| 国产一区二区三区在线观看精品| 久久久www成人免费无遮挡大片| 国产呦精品一区二区三区网站| 久久午夜国产精品| 福利一区在线观看| 亚洲视频一区二区在线| 在线这里只有精品| 亚洲国产一区视频| 欧美一区二区三区日韩视频| 久久国产婷婷国产香蕉| 国产日韩欧美一区二区三区乱码 | 日韩黄色免费电影| 日韩色在线观看| 国产精一区二区三区| 国产精品久久久久久妇女6080| 91一区二区三区在线播放| 性欧美大战久久久久久久久| 精品欧美乱码久久久久久1区2区| 国产精品综合二区| 中文字幕亚洲一区二区va在线| 一本大道av一区二区在线播放| 亚洲一区二区高清| 久久久久久久综合日本| 91蜜桃免费观看视频| 美美哒免费高清在线观看视频一区二区 | 粉嫩aⅴ一区二区三区四区| 亚洲婷婷国产精品电影人久久|