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

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

?? cmd_doc.c

?? uboot詳細解讀可用啟動引導LINUX2.6內核
?? C
?? 第 1 頁 / 共 3 頁
字號:
		ofs = ofs >> 8;	} else {		ofs = ofs >> 9;	}	if (numbytes == ADDR_PAGE || numbytes == ADDR_COLUMN_PAGE) {		for (i = 0; i < doc->pageadrlen; i++, ofs = ofs >> 8) {			if (DoC_is_Millennium(doc))				WriteDOC(ofs & 0xff, docptr, CDSNSlowIO);			WriteDOC_(ofs & 0xff, docptr, doc->ioreg);		}	}	DoC_Delay(doc, 2);	/* Needed for some slow flash chips. mf. */	/* FIXME: The SlowIO's for millennium could be replaced by	   a single WritePipeTerm here. mf. */	/* Lower the ALE line */	WriteDOC(xtraflags1 | xtraflags2 | CDSN_CTRL_CE, docptr,		 CDSNControl);	DoC_Delay(doc, 4);	/* Software requirement 11.4.3 for Millennium */	/* Wait for the chip to respond - Software requirement 11.4.1 */	return DoC_WaitReady(doc);}/* Read a buffer from DoC, taking care of Millennium oddities */static void DoC_ReadBuf(struct DiskOnChip *doc, u_char * buf, int len){	volatile int dummy;	int modulus = 0xffff;	unsigned long docptr;	int i;	docptr = doc->virtadr;	if (len <= 0)		return;	if (DoC_is_Millennium(doc)) {		/* Read the data via the internal pipeline through CDSN IO register,		   see Pipelined Read Operations 11.3 */		dummy = ReadDOC(docptr, ReadPipeInit);		/* Millennium should use the LastDataRead register - Pipeline Reads */		len--;		/* This is needed for correctly ECC calculation */		modulus = 0xff;	}	for (i = 0; i < len; i++)		buf[i] = ReadDOC_(docptr, doc->ioreg + (i & modulus));	if (DoC_is_Millennium(doc)) {		buf[i] = ReadDOC(docptr, LastDataRead);	}}/* Write a buffer to DoC, taking care of Millennium oddities */static void DoC_WriteBuf(struct DiskOnChip *doc, const u_char * buf, int len){	unsigned long docptr;	int i;	docptr = doc->virtadr;	if (len <= 0)		return;	for (i = 0; i < len; i++)		WriteDOC_(buf[i], docptr, doc->ioreg + i);	if (DoC_is_Millennium(doc)) {		WriteDOC(0x00, docptr, WritePipeTerm);	}}/* DoC_SelectChip: Select a given flash chip within the current floor */static inline int DoC_SelectChip(struct DiskOnChip *doc, int chip){	unsigned long docptr = doc->virtadr;	/* Software requirement 11.4.4 before writing DeviceSelect */	/* Deassert the CE line to eliminate glitches on the FCE# outputs */	WriteDOC(CDSN_CTRL_WP, docptr, CDSNControl);	DoC_Delay(doc, 4);	/* Software requirement 11.4.3 for Millennium */	/* Select the individual flash chip requested */	WriteDOC(chip, docptr, CDSNDeviceSelect);	DoC_Delay(doc, 4);	/* Reassert the CE line */	WriteDOC(CDSN_CTRL_CE | CDSN_CTRL_FLASH_IO | CDSN_CTRL_WP, docptr,		 CDSNControl);	DoC_Delay(doc, 4);	/* Software requirement 11.4.3 for Millennium */	/* Wait for it to be ready */	return DoC_WaitReady(doc);}/* DoC_SelectFloor: Select a given floor (bank of flash chips) */static inline int DoC_SelectFloor(struct DiskOnChip *doc, int floor){	unsigned long docptr = doc->virtadr;	/* Select the floor (bank) of chips required */	WriteDOC(floor, docptr, FloorSelect);	/* Wait for the chip to be ready */	return DoC_WaitReady(doc);}/* DoC_IdentChip: Identify a given NAND chip given {floor,chip} */static int DoC_IdentChip(struct DiskOnChip *doc, int floor, int chip){	int mfr, id, i;	volatile char dummy;	/* Page in the required floor/chip */	DoC_SelectFloor(doc, floor);	DoC_SelectChip(doc, chip);	/* Reset the chip */	if (DoC_Command(doc, NAND_CMD_RESET, CDSN_CTRL_WP)) {#ifdef DOC_DEBUG		printf("DoC_Command (reset) for %d,%d returned true\n",		       floor, chip);#endif		return 0;	}	/* Read the NAND chip ID: 1. Send ReadID command */	if (DoC_Command(doc, NAND_CMD_READID, CDSN_CTRL_WP)) {#ifdef DOC_DEBUG		printf("DoC_Command (ReadID) for %d,%d returned true\n",		       floor, chip);#endif		return 0;	}	/* Read the NAND chip ID: 2. Send address byte zero */	DoC_Address(doc, ADDR_COLUMN, 0, CDSN_CTRL_WP, 0);	/* Read the manufacturer and device id codes from the device */	/* CDSN Slow IO register see Software Requirement 11.4 item 5. */	dummy = ReadDOC(doc->virtadr, CDSNSlowIO);	DoC_Delay(doc, 2);	mfr = ReadDOC_(doc->virtadr, doc->ioreg);	/* CDSN Slow IO register see Software Requirement 11.4 item 5. */	dummy = ReadDOC(doc->virtadr, CDSNSlowIO);	DoC_Delay(doc, 2);	id = ReadDOC_(doc->virtadr, doc->ioreg);	/* No response - return failure */	if (mfr == 0xff || mfr == 0)		return 0;	/* Check it's the same as the first chip we identified.	 * M-Systems say that any given DiskOnChip device should only	 * contain _one_ type of flash part, although that's not a	 * hardware restriction. */	if (doc->mfr) {		if (doc->mfr == mfr && doc->id == id)			return 1;	/* This is another the same the first */		else			printf("Flash chip at floor %d, chip %d is different:\n",			       floor, chip);	}	/* Print and store the manufacturer and ID codes. */	for (i = 0; nand_flash_ids[i].name != NULL; i++) {		if (mfr == nand_flash_ids[i].manufacture_id &&		    id == nand_flash_ids[i].model_id) {#ifdef DOC_DEBUG			printf("Flash chip found: Manufacturer ID: %2.2X, "			       "Chip ID: %2.2X (%s)\n", mfr, id,			       nand_flash_ids[i].name);#endif			if (!doc->mfr) {				doc->mfr = mfr;				doc->id = id;				doc->chipshift =				    nand_flash_ids[i].chipshift;				doc->page256 = nand_flash_ids[i].page256;				doc->pageadrlen =				    nand_flash_ids[i].pageadrlen;				doc->erasesize =				    nand_flash_ids[i].erasesize;				doc->chips_name =				    nand_flash_ids[i].name;				return 1;			}			return 0;		}	}#ifdef DOC_DEBUG	/* We haven't fully identified the chip. Print as much as we know. */	printf("Unknown flash chip found: %2.2X %2.2X\n",	       id, mfr);#endif	return 0;}/* DoC_ScanChips: Find all NAND chips present in a DiskOnChip, and identify them */static void DoC_ScanChips(struct DiskOnChip *this){	int floor, chip;	int numchips[MAX_FLOORS];	int maxchips = MAX_CHIPS;	int ret = 1;	this->numchips = 0;	this->mfr = 0;	this->id = 0;	if (DoC_is_Millennium(this))		maxchips = MAX_CHIPS_MIL;	/* For each floor, find the number of valid chips it contains */	for (floor = 0; floor < MAX_FLOORS; floor++) {		ret = 1;		numchips[floor] = 0;		for (chip = 0; chip < maxchips && ret != 0; chip++) {			ret = DoC_IdentChip(this, floor, chip);			if (ret) {				numchips[floor]++;				this->numchips++;			}		}	}	/* If there are none at all that we recognise, bail */	if (!this->numchips) {		puts ("No flash chips recognised.\n");		return;	}	/* Allocate an array to hold the information for each chip */	this->chips = malloc(sizeof(struct Nand) * this->numchips);	if (!this->chips) {		puts ("No memory for allocating chip info structures\n");		return;	}	ret = 0;	/* Fill out the chip array with {floor, chipno} for each	 * detected chip in the device. */	for (floor = 0; floor < MAX_FLOORS; floor++) {		for (chip = 0; chip < numchips[floor]; chip++) {			this->chips[ret].floor = floor;			this->chips[ret].chip = chip;			this->chips[ret].curadr = 0;			this->chips[ret].curmode = 0x50;			ret++;		}	}	/* Calculate and print the total size of the device */	this->totlen = this->numchips * (1 << this->chipshift);#ifdef DOC_DEBUG	printf("%d flash chips found. Total DiskOnChip size: %ld MB\n",	       this->numchips, this->totlen >> 20);#endif}/* find_boot_record: Find the NFTL Media Header and its Spare copy which contains the *	various device information of the NFTL partition and Bad Unit Table. Update *	the ReplUnitTable[] table accroding to the Bad Unit Table. ReplUnitTable[] *	is used for management of Erase Unit in other routines in nftl.c and nftlmount.c */static int find_boot_record(struct NFTLrecord *nftl){	struct nftl_uci1 h1;	struct nftl_oob oob;	unsigned int block, boot_record_count = 0;	int retlen;	u8 buf[SECTORSIZE];	struct NFTLMediaHeader *mh = &nftl->MediaHdr;	unsigned int i;	nftl->MediaUnit = BLOCK_NIL;	nftl->SpareMediaUnit = BLOCK_NIL;	/* search for a valid boot record */	for (block = 0; block < nftl->nb_blocks; block++) {		int ret;		/* Check for ANAND header first. Then can whinge if it's found but later		   checks fail */		if ((ret = doc_read_ecc(nftl->mtd, block * nftl->EraseSize, SECTORSIZE,					(size_t *)&retlen, buf, NULL))) {			static int warncount = 5;			if (warncount) {				printf("Block read at 0x%x failed\n", block * nftl->EraseSize);				if (!--warncount)					puts ("Further failures for this block will not be printed\n");			}			continue;		}		if (retlen < 6 || memcmp(buf, "ANAND", 6)) {			/* ANAND\0 not found. Continue */#ifdef PSYCHO_DEBUG			printf("ANAND header not found at 0x%x\n", block * nftl->EraseSize);#endif			continue;		}#ifdef NFTL_DEBUG		printf("ANAND header found at 0x%x\n", block * nftl->EraseSize);#endif		/* To be safer with BIOS, also use erase mark as discriminant */		if ((ret = doc_read_oob(nftl->mtd, block * nftl->EraseSize + SECTORSIZE + 8,				8, (size_t *)&retlen, (uchar *)&h1) < 0)) {#ifdef NFTL_DEBUG			printf("ANAND header found at 0x%x, but OOB data read failed\n",			       block * nftl->EraseSize);#endif			continue;		}		/* OK, we like it. */		if (boot_record_count) {			/* We've already processed one. So we just check if			   this one is the same as the first one we found */			if (memcmp(mh, buf, sizeof(struct NFTLMediaHeader))) {#ifdef NFTL_DEBUG				printf("NFTL Media Headers at 0x%x and 0x%x disagree.\n",				       nftl->MediaUnit * nftl->EraseSize, block * nftl->EraseSize);#endif				/* if (debug) Print both side by side */				return -1;			}			if (boot_record_count == 1)				nftl->SpareMediaUnit = block;			boot_record_count++;			continue;		}		/* This is the first we've seen. Copy the media header structure into place */		memcpy(mh, buf, sizeof(struct NFTLMediaHeader));		/* Do some sanity checks on it */		if (mh->UnitSizeFactor == 0) {#ifdef NFTL_DEBUG			puts ("UnitSizeFactor 0x00 detected.\n"			      "This violates the spec but we think we know what it means...\n");#endif		} else if (mh->UnitSizeFactor != 0xff) {			printf ("Sorry, we don't support UnitSizeFactor "			      "of != 1 yet.\n");			return -1;		}		nftl->nb_boot_blocks = le16_to_cpu(mh->FirstPhysicalEUN);		if ((nftl->nb_boot_blocks + 2) >= nftl->nb_blocks) {			printf ("NFTL Media Header sanity check failed:\n"				"nb_boot_blocks (%d) + 2 > nb_blocks (%d)\n",				nftl->nb_boot_blocks, nftl->nb_blocks);			return -1;		}		nftl->numvunits = le32_to_cpu(mh->FormattedSize) / nftl->EraseSize;		if (nftl->numvunits > (nftl->nb_blocks - nftl->nb_boot_blocks - 2)) {			printf ("NFTL Media Header sanity check failed:\n"				"numvunits (%d) > nb_blocks (%d) - nb_boot_blocks(%d) - 2\n",				nftl->numvunits,				nftl->nb_blocks,				nftl->nb_boot_blocks);			return -1;		}		nftl->nr_sects  = nftl->numvunits * (nftl->EraseSize / SECTORSIZE);		/* If we're not using the last sectors in the device for some reason,		   reduce nb_blocks accordingly so we forget they're there */		nftl->nb_blocks = le16_to_cpu(mh->NumEraseUnits) + le16_to_cpu(mh->FirstPhysicalEUN);		/* read the Bad Erase Unit Table and modify ReplUnitTable[] accordingly */		for (i = 0; i < nftl->nb_blocks; i++) {			if ((i & (SECTORSIZE - 1)) == 0) {				/* read one sector for every SECTORSIZE of blocks */				if ((ret = doc_read_ecc(nftl->mtd, block * nftl->EraseSize +						       i + SECTORSIZE, SECTORSIZE,						       (size_t *)&retlen, buf, (uchar *)&oob)) < 0) {					puts ("Read of bad sector table failed\n");					return -1;				}			}			/* mark the Bad Erase Unit as RESERVED in ReplUnitTable */			if (buf[i & (SECTORSIZE - 1)] != 0xff)				nftl->ReplUnitTable[i] = BLOCK_RESERVED;		}		nftl->MediaUnit = block;		boot_record_count++;	} /* foreach (block) */	return boot_record_count?0:-1;}/* This routine is made available to other mtd code via * inter_module_register.  It must only be accessed through * inter_module_get which will bump the use count of this module.  The * addresses passed back in mtd are valid as long as the use count of * this module is non-zero, i.e. between inter_module_get and * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000. */static void DoC2k_init(struct DiskOnChip* this){	struct NFTLrecord *nftl;	switch (this->ChipID) {	case DOC_ChipID_Doc2k:		this->name = "DiskOnChip 2000";		this->ioreg = DoC_2k_CDSN_IO;		break;	case DOC_ChipID_DocMil:		this->name = "DiskOnChip Millennium";		this->ioreg = DoC_Mil_CDSN_IO;		break;	}#ifdef DOC_DEBUG	printf("%s found at address 0x%lX\n", this->name,	       this->physadr);#endif	this->totlen = 0;	this->numchips = 0;	this->curfloor = -1;	this->curchip = -1;	/* Ident all the chips present. */	DoC_ScanChips(this);	if ((!this->numchips) || (!this->chips))		return;	nftl = &this->nftl;	/* Get physical parameters */	nftl->EraseSize = this->erasesize;	nftl->nb_blocks = this->totlen / this->erasesize;	nftl->mtd = this;	if (find_boot_record(nftl) != 0)		this->nftl_found = 0;	else		this->nftl_found = 1;	printf("%s @ 0x%lX, %ld MB\n", this->name, this->physadr, this->totlen >> 20);}int doc_read_ecc(struct DiskOnChip* this, loff_t from, size_t len,		 size_t * retlen, u_char * buf, u_char * eccbuf){	unsigned long docptr;	struct Nand *mychip;	unsigned char syndrome[6];	volatile char dummy;	int i, len256 = 0, ret=0;	docptr = this->virtadr;	/* Don't allow read past end of device */	if (from >= this->totlen) {		puts ("Out of flash\n");		return DOC_EINVAL;	}	/* Don't allow a single read to cross a 512-byte block boundary */	if (from + len > ((from | 0x1ff) + 1))		len = ((from | 0x1ff) + 1) - from;	/* The ECC will not be calculated correctly if less than 512 is read */	if (len != 0x200 && eccbuf)		printf("ECC needs a full sector read (adr: %lx size %lx)\n",		       (long) from, (long) len);#ifdef PSYCHO_DEBUG	printf("DoC_Read (adr: %lx size %lx)\n", (long) from, (long) len);#endif	/* Find the chip which is to be used and select it */	mychip = &this->chips[shr(from, this->chipshift)];	if (this->curfloor != mychip->floor) {		DoC_SelectFloor(this, mychip->floor);		DoC_SelectChip(this, mychip->chip);	} else if (this->curchip != mychip->chip) {		DoC_SelectChip(this, mychip->chip);	}	this->curfloor = mychip->floor;	this->curchip = mychip->chip;	DoC_Command(this,		    (!this->page256		     && (from & 0x100)) ? NAND_CMD_READ1 : NAND_CMD_READ0,		    CDSN_CTRL_WP);	DoC_Address(this, ADDR_COLUMN_PAGE, from, CDSN_CTRL_WP,		    CDSN_CTRL_ECC_IO);	if (eccbuf) {		/* Prime the ECC engine */		WriteDOC(DOC_ECC_RESET, docptr, ECCConf);		WriteDOC(DOC_ECC_EN, docptr, ECCConf);	} else {		/* disable the ECC engine */		WriteDOC(DOC_ECC_RESET, docptr, ECCConf);		WriteDOC(DOC_ECC_DIS, docptr, ECCConf);	}	/* treat crossing 256-byte sector for 2M x 8bits devices */	if (this->page256 && from + len > (from | 0xff) + 1) {		len256 = (from | 0xff) + 1 - from;		DoC_ReadBuf(this, buf, len256);		DoC_Command(this, NAND_CMD_READ0, CDSN_CTRL_WP);		DoC_Address(this, ADDR_COLUMN_PAGE, from + len256,			    CDSN_CTRL_WP, CDSN_CTRL_ECC_IO);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美电影一区| 日韩高清国产一区在线| 亚洲第一福利一区| 国产一区在线不卡| 在线看国产一区二区| 久久嫩草精品久久久久| 五月婷婷综合网| 91同城在线观看| 久久综合九色综合欧美就去吻 | 亚洲午夜在线视频| 国产精品亚洲第一区在线暖暖韩国 | 欧美一区二区人人喊爽| 亚洲色图视频网站| 国产精品中文欧美| 欧美成人午夜电影| 日韩国产欧美在线播放| 91麻豆免费观看| 欧美国产乱子伦| 国产在线精品一区二区不卡了| 欧美日韩视频专区在线播放| 亚洲欧美在线观看| 国产成人a级片| 久久久精品欧美丰满| 另类综合日韩欧美亚洲| 欧美精品日韩一区| 亚洲图片欧美色图| 欧美亚洲精品一区| 亚洲精品久久7777| 91丨porny丨最新| 亚洲欧美综合在线精品| a在线播放不卡| 中文字幕制服丝袜一区二区三区| 国内精品免费**视频| 日韩欧美卡一卡二| 狠狠色丁香婷婷综合| 久久综合狠狠综合久久激情 | 亚洲精品成人在线| 色偷偷久久一区二区三区| 亚洲欧美一区二区久久| 色一区在线观看| 亚洲综合一区在线| 欧美美女一区二区三区| 热久久久久久久| 精品国产免费视频| 国产一区啦啦啦在线观看| 国产午夜精品理论片a级大结局| 国产电影一区在线| 成人免费视频在线观看| 欧美日韩亚洲综合在线 | 粉嫩欧美一区二区三区高清影视 | www.成人在线| 亚洲美女一区二区三区| 欧美日韩在线亚洲一区蜜芽| 石原莉奈在线亚洲二区| 精品欧美久久久| 成人精品视频一区二区三区尤物| 最新中文字幕一区二区三区| 欧美中文字幕一二三区视频| 日本欧美加勒比视频| 国产性天天综合网| 色婷婷国产精品| 看国产成人h片视频| 国产蜜臀97一区二区三区| 色天天综合久久久久综合片| 日韩国产在线一| 久久久久久免费毛片精品| 99久久精品免费看| 久久99日本精品| 欧美韩国日本一区| 欧美日韩亚洲高清一区二区| 国产精品一区在线观看乱码| 一片黄亚洲嫩模| 久久只精品国产| 欧美日韩一区二区三区视频| 国产麻豆日韩欧美久久| 一区二区三区精品久久久| 精品国产精品网麻豆系列| 色国产精品一区在线观看| 国产美女在线精品| 五月天亚洲精品| 国产精品日韩精品欧美在线| 欧美日本在线看| 99久久精品国产导航| 免费在线一区观看| 伊人开心综合网| 国产日韩欧美麻豆| 日韩一区国产二区欧美三区| gogogo免费视频观看亚洲一| 久久99精品网久久| 亚洲成a天堂v人片| 成人免费在线播放视频| 久久嫩草精品久久久久| 日韩欧美中文字幕精品| 欧亚洲嫩模精品一区三区| 成人性生交大片免费看视频在线| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲九九爱视频| 国产精品初高中害羞小美女文| 日韩欧美一级特黄在线播放| 欧美日韩视频在线观看一区二区三区 | 精品久久久久久亚洲综合网| 日本高清不卡视频| 99久久久久久| 99久久婷婷国产综合精品| 福利一区在线观看| 国产精品538一区二区在线| 捆绑变态av一区二区三区| 丝瓜av网站精品一区二区| 亚洲激情校园春色| 亚洲裸体xxx| 亚洲欧美日韩一区| 国产精品久久久久9999吃药| 国产色一区二区| 国产日韩精品一区二区三区在线| 欧美成人精品3d动漫h| 日韩一区二区三| 欧美一级日韩免费不卡| 欧美精品123区| 欧美一区在线视频| 日韩一卡二卡三卡四卡| 91精品国产手机| 日韩一区二区三区视频| 日韩欧美卡一卡二| 久久亚洲影视婷婷| 国产午夜精品久久| 国产精品福利一区| 玉足女爽爽91| 午夜成人在线视频| 久久福利资源站| 国产成人aaa| 色综合久久六月婷婷中文字幕| 91免费版在线看| 欧美亚洲综合网| 欧美一区二区三区电影| wwwwxxxxx欧美| 国产视频在线观看一区二区三区| 国产精品福利一区二区三区| 亚洲综合在线五月| 美女网站一区二区| 成人看片黄a免费看在线| 色婷婷国产精品久久包臀| 8v天堂国产在线一区二区| 精品国产免费人成电影在线观看四季 | 欧美嫩在线观看| 精品99一区二区三区| 国产精品美女一区二区三区| 亚洲成人av电影| 国产精品综合一区二区| 色琪琪一区二区三区亚洲区| 6080yy午夜一二三区久久| 国产欧美精品在线观看| 一区二区三区不卡视频| 激情五月婷婷综合| 91片在线免费观看| 日韩欧美一区在线观看| 自拍偷拍国产精品| 蜜桃视频一区二区三区在线观看| 国产盗摄视频一区二区三区| 色婷婷一区二区三区四区| 精品国产区一区| 亚洲一级二级在线| 成人性生交大片免费看视频在线 | 国产精品的网站| 久久精品72免费观看| 色婷婷综合激情| 久久久一区二区| 日韩一区精品字幕| 91亚洲男人天堂| 久久精品在这里| 蜜臀久久久久久久| 欧美午夜电影网| 一区精品在线播放| 国产麻豆成人传媒免费观看| 欧美色综合久久| 亚洲人xxxx| 成人精品视频一区二区三区 | 欧美日精品一区视频| 中文字幕在线不卡一区二区三区| 美国欧美日韩国产在线播放| 色诱视频网站一区| 日韩伦理免费电影| 国产91在线观看丝袜| 精品国产伦理网| 蜜臀久久久99精品久久久久久| 欧美亚洲国产怡红院影院| 亚洲视频中文字幕| 国产成人av电影在线观看| 精品久久久三级丝袜| 捆绑紧缚一区二区三区视频 | 老司机免费视频一区二区三区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 精品婷婷伊人一区三区三| 中文字幕一区免费在线观看| 国产成人av电影在线| 国产日韩欧美高清在线| 福利91精品一区二区三区| 久久久久99精品一区| 国产成人99久久亚洲综合精品| 久久久久久电影| 国产精品888|