日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

nand ubi -4 kernel和mtd

發(fā)布時(shí)間:2024/4/14 编程问答 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nand ubi -4 kernel和mtd 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
tiny6410 linux2.6.38

1.nand驅(qū)動(dòng)
nand是作為平臺(tái)設(shè)備,在板子文件mach-mini6410.c調(diào)用,系統(tǒng)啟動(dòng)時(shí)自動(dòng)加載進(jìn)內(nèi)核
static struct platform_device *mini6410_devices[] __initdata = { ... &s3c_device_nand, ... } static void __init mini6410_machine_init(void) { ... #ifdef CONFIG_MTD_NAND_S3C s3c_device_nand.name = "s3c6410-nand";//改s3c2410-nand叫s3c6410-nand #endif ... platform_add_devices(mini6410_devices, ARRAY_SIZE(mini6410_devices)); ... } static struct resource s3c_nand_resource[] = {[0] = {.start = S3C_PA_NAND,.end = S3C_PA_NAND + SZ_1M,.flags = IORESOURCE_MEM,} };struct platform_device s3c_device_nand = {.name = "s3c2410-nand",.id = -1,.num_resources = ARRAY_SIZE(s3c_nand_resource),.resource = s3c_nand_resource, };
搜索內(nèi)核中的s3c6410-nand字符串,在driver/mtd/nand/s3c_nand.c中發(fā)現(xiàn)有一處匹配。可以斷定這里就是nand的平臺(tái)驅(qū)動(dòng)
從make menuconfig中也可以得知,如下
? ?Device Drivers? --->? ?<*> Memory Technology Device (MTD) support? --->[*]?? MTD partitioning support
????????????????????????????????????????????????????????????????????????? <*>?? Direct char device access to MTD devices
????????????????????????????????????????????????????????????????????????? <*>?? Caching block device access to MTD devices
????????????????????????????????????????????????????????????????????????? <*>?? NAND Device Support? ---> ?<*>?? NAND Flash support for S3C SoC?

最后一項(xiàng)對(duì)應(yīng)的就是s3c_nand.c,為6410板子配置的nandflash的驅(qū)動(dòng)。下面是平臺(tái)驅(qū)動(dòng)
s3c_nand.c
static struct platform_driver s3c6410_nand_driver = {.probe = s3c6410_nand_probe,.remove = s3c_nand_remove,.suspend = s3c_nand_suspend,.resume = s3c_nand_resume,.driver = {.name = "s3c6410-nand",.owner = THIS_MODULE,}, };
從probe看起,搜索“見(jiàn)下面“
此函數(shù)主要對(duì)nand_chip結(jié)構(gòu)體chip進(jìn)行填充。nand_chip描述nand芯片。不同型號(hào)的nand,其主要的不同就是nand_chip。
s3c_nand.c
static int s3c6410_nand_probe(struct platform_device *dev) { return s3c_nand_probe(dev, TYPE_S3C6410); } /* s3c_nand_probe** called by device layer when it finds a device matching* one our driver can handled. This code checks to see if* it can allocate all necessary resources then calls the* nand layer to look for devices*/ static int s3c_nand_probe(struct platform_device *pdev, enum s3c_cpu_type cpu_type) { struct s3c2410_platform_nand *plat = pdev->dev.platform_data;struct s3c2410_nand_set *sets;struct nand_chip *nand;struct resource *res;struct mtd_partition *partitions;int nr_partitions;int err = 0;int ret = 0;int nr_sets;int i, j, size;#if defined(CONFIG_MTD_NAND_S3C_HWECC)//硬件eccstruct nand_flash_dev *type = NULL;u_char tmp; #endif/* get the clock source and enable it */s3c_nand.clk = clk_get(&pdev->dev, "nand");if (IS_ERR(s3c_nand.clk)) {dev_err(&pdev->dev, "failed to get clock");err = -ENOENT;goto exit_error;}clk_enable(s3c_nand.clk);/* allocate and map the resource *//* currently we assume we have the one resource */res = pdev->resource;size = res->end - res->start + 1;s3c_nand.area = request_mem_region(res->start, size, pdev->name);if (s3c_nand.area == NULL) {dev_err(&pdev->dev, "cannot reserve register region\n");err = -ENOENT;goto exit_error;}s3c_nand.cpu_type = cpu_type;s3c_nand.device = &pdev->dev;s3c_nand.regs = ioremap(res->start, size);s3c_nand.platform = plat;if (s3c_nand.regs == NULL) {dev_err(&pdev->dev, "cannot reserve register region\n");err = -EIO;goto exit_error;}sets = (plat != NULL) ? plat->sets : NULL;nr_sets = (plat != NULL) ? plat->nr_sets : 1;/* Using partition info from platform data for SLC nand */partitions = sets->partitions;//使用mach-mini6410.c中定義的分區(qū)表給nand分區(qū)(SLC)。如果是MLC,后面會(huì)指定其他分區(qū)表。nr_partitions = sets->nr_partitions;s3c_nand.mtd_count = nr_sets;/* allocate memory for MTD device structure and private data */s3c_mtd = kmalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL);if (!s3c_mtd) {printk("Unable to allocate NAND MTD dev structure.\n");return -ENOMEM;}/* Get pointer to private data */nand = (struct nand_chip *) (&s3c_mtd[1]);/* Initialize structures */memset((char *) s3c_mtd, 0, sizeof(struct mtd_info));memset((char *) nand, 0, sizeof(struct nand_chip));/* Link the private data with the MTD structure */s3c_mtd->priv = nand;for (i = 0; i < sets->nr_chips; i++) {nand->IO_ADDR_R = (char *)(s3c_nand.regs + S3C_NFDATA);nand->IO_ADDR_W = (char *)(s3c_nand.regs + S3C_NFDATA);nand->cmd_ctrl = s3c_nand_hwcontrol;nand->dev_ready = s3c_nand_device_ready; nand->scan_bbt = s3c_nand_scan_bbt;nand->options = 0;nand->badblockbits = 8;#ifdef CONFIG_MACH_MINI6410s3c_nand_ext_finit(nand, s3c_nand.regs); #endif#if defined(CONFIG_MTD_NAND_S3C_CACHEDPROG)nand->options |= NAND_CACHEPRG; #endif#if defined(CONFIG_MTD_NAND_S3C_HWECC)nand->ecc.mode = NAND_ECC_HW;nand->ecc.hwctl = s3c_nand_enable_hwecc;nand->ecc.calculate = s3c_nand_calculate_ecc;nand->ecc.correct = s3c_nand_correct_data;s3c_nand_hwcontrol(0, NAND_CMD_READID, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);s3c_nand_hwcontrol(0, 0x00, NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE);s3c_nand_hwcontrol(0, 0x00, NAND_NCE | NAND_ALE);s3c_nand_hwcontrol(0, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);s3c_nand_device_ready(0);tmp = readb(nand->IO_ADDR_R); /* Maf. ID */tmp = readb(nand->IO_ADDR_R); /* Device ID */for (j = 0; nand_flash_ids[j].name != NULL; j++) {if (tmp == nand_flash_ids[j].id) {type = &nand_flash_ids[j];break;}}if (!type) {printk("Unknown NAND Device.\n");goto exit_error;}nand->cellinfo = readb(nand->IO_ADDR_R); /* the 3rd byte */tmp = readb(nand->IO_ADDR_R); /* the 4th byte */if (!type->pagesize) {if (((nand->cellinfo >> 2) & 0x3) == 0) {//SLCnand_type = S3C_NAND_TYPE_SLC; nand->ecc.size = 512;每次進(jìn)行ecc的數(shù)據(jù)量(以子頁(yè)位單位),bytes per ecc step.每頁(yè)進(jìn)行4次,共計(jì)2KB?nand->ecc.bytes = 4;每次ecc校驗(yàn)字節(jié),ecc bytes per step。每頁(yè)進(jìn)行4次。共計(jì)16字節(jié)if ((1024 << (tmp & 0x3)) > 512) {//對(duì)于1GB SLC而言nand->ecc.read_page = s3c_nand_read_page_1bit;//SLC使用1位ecc ?nand->ecc.write_page = s3c_nand_write_page_1bit;nand->ecc.read_oob = s3c_nand_read_oob_1bit;nand->ecc.write_oob = s3c_nand_write_oob_1bit;nand->ecc.layout = &s3c_nand_oob_64;//1GB SLC的oob大小是64,見(jiàn)下面} else {nand->ecc.layout = &s3c_nand_oob_16;}} else {//MLCnand_type = S3C_NAND_TYPE_MLC;nand->options |= NAND_NO_SUBPAGE_WRITE; /* NOP = 1 if MLC */if (type->id == 0xD5) { #if 0type->chipsize = 2076;nand->chip_shift = 32;nand->pagemask = 0x7ffff; #endifnand->badblockbits = 4;}if ((2048 << (tmp & 3)) < 4096) {nand->ecc.read_page = s3c_nand_read_page_4bit;//MLC使用4位ecc?nand->ecc.write_page = s3c_nand_write_page_4bit;nand->ecc.size = 512;nand->ecc.bytes = 8; /* really 7 bytes */nand->ecc.layout = &s3c_nand_oob_mlc_64;} else { #ifdef CONFIG_MACH_MINI6410partitions = mini6410_nand_part_mlc;//使用s3c_nand.c中定義的分區(qū)表給MLC分區(qū)nr_partitions = ARRAY_SIZE(mini6410_nand_part_mlc);s3c_nand_mlc_probe(nand, s3c_nand.regs); #endif}}} else {nand_type = S3C_NAND_TYPE_SLC;nand->ecc.size = 512;nand->cellinfo = 0;nand->ecc.bytes = 4;nand->ecc.layout = &s3c_nand_oob_16;}printk("S3C NAND Driver is using hardware ECC.\n"); #else//軟件eccnand->ecc.mode = NAND_ECC_SOFT;printk("S3C NAND Driver is using software ECC.\n"); #endifif (nand_scan(s3c_mtd, 1)) {//掃描nand,并初始化s3c_mtd結(jié)構(gòu)體里的一些函數(shù)指針ret = -ENXIO;goto exit_error;}/* Register the partitions */add_mtd_partitions(s3c_mtd, partitions, nr_partitions);//分區(qū),見(jiàn)下面}pr_debug("initialized ok\n");return 0;exit_error:kfree(s3c_mtd);return ret; } s3c_nand.c
/* Nand flash oob definition for SLC 2k page size by jsgood */ static struct nand_ecclayout s3c_nand_oob_64 = { .eccbytes = 16, .eccpos = {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55}, .oobfree = { {.offset = 2, .length = 38}} }; //對(duì)于K9K8G0800B 1GB SLC,頁(yè)大小是2KB, oob是64B,地址認(rèn)為是0-63 ecc字節(jié)數(shù)16(所占地址從40-55,共計(jì)16字節(jié)) oob中空閑字節(jié)數(shù)38(所占地址從2-39) oob中剩余余的0-1和56-63另有用途

nand_scan會(huì)調(diào)用nand_scan_tail函數(shù)掃描nand,并使用nand_base.c中預(yù)定義的一些讀寫nand的函數(shù)來(lái)初始化mtd_info結(jié)構(gòu)體的函數(shù)指針。
這個(gè)mtd_info會(huì)在稍后add_mtd_partitions時(shí)給各個(gè)分區(qū)的mtd_info賦值。
nand_base.c
/*** nand_scan_tail - [NAND Interface] Scan for the NAND device* @mtd: MTD device structure** This is the second phase of the normal nand_scan() function. It* fills out all the uninitialized function pointers with the defaults* and scans for a bad block table if appropriate.*/ int nand_scan_tail(struct mtd_info *mtd) {int i;struct nand_chip *chip = mtd->priv;if (!(chip->options & NAND_OWN_BUFFERS))chip->buffers = kmalloc(sizeof(*chip->buffers), GFP_KERNEL);if (!chip->buffers)return -ENOMEM;/* Set the internal oob buffer location, just after the page data */chip->oob_poi = chip->buffers->databuf + mtd->writesize;/** If no default placement scheme is given, select an appropriate one*/if (!chip->ecc.layout) {switch (mtd->oobsize) {case 8:chip->ecc.layout = &nand_oob_8;break;case 16:chip->ecc.layout = &nand_oob_16;break;case 64:chip->ecc.layout = &nand_oob_64;break;case 128:chip->ecc.layout = &nand_oob_128;break;default:printk(KERN_WARNING "No oob scheme defined for ""oobsize %d\n", mtd->oobsize);BUG();}}if (!chip->write_page)chip->write_page = nand_write_page;/** check ECC mode, default to software if 3byte/512byte hardware ECC is* selected and we have 256 byte pagesize fallback to software ECC*/switch (chip->ecc.mode) {case NAND_ECC_HW_OOB_FIRST:/* Similar to NAND_ECC_HW, but a separate read_page handle */if (!chip->ecc.calculate || !chip->ecc.correct ||!chip->ecc.hwctl) {printk(KERN_WARNING "No ECC functions supplied; ""Hardware ECC not possible\n");BUG();}if (!chip->ecc.read_page)chip->ecc.read_page = nand_read_page_hwecc_oob_first;case NAND_ECC_HW:/* Use standard hwecc read page function ? */if (!chip->ecc.read_page)chip->ecc.read_page = nand_read_page_hwecc;if (!chip->ecc.write_page)chip->ecc.write_page = nand_write_page_hwecc;if (!chip->ecc.read_page_raw)chip->ecc.read_page_raw = nand_read_page_raw;if (!chip->ecc.write_page_raw)chip->ecc.write_page_raw = nand_write_page_raw;if (!chip->ecc.read_oob)chip->ecc.read_oob = nand_read_oob_std;if (!chip->ecc.write_oob)chip->ecc.write_oob = nand_write_oob_std;case NAND_ECC_HW_SYNDROME:if ((!chip->ecc.calculate || !chip->ecc.correct ||!chip->ecc.hwctl) &&(!chip->ecc.read_page ||chip->ecc.read_page == nand_read_page_hwecc ||!chip->ecc.write_page ||chip->ecc.write_page == nand_write_page_hwecc)) {printk(KERN_WARNING "No ECC functions supplied; ""Hardware ECC not possible\n");BUG();}/* Use standard syndrome read/write page function ? */if (!chip->ecc.read_page)chip->ecc.read_page = nand_read_page_syndrome;if (!chip->ecc.write_page)chip->ecc.write_page = nand_write_page_syndrome;if (!chip->ecc.read_page_raw)chip->ecc.read_page_raw = nand_read_page_raw_syndrome;if (!chip->ecc.write_page_raw)chip->ecc.write_page_raw = nand_write_page_raw_syndrome;if (!chip->ecc.read_oob)chip->ecc.read_oob = nand_read_oob_syndrome;if (!chip->ecc.write_oob)chip->ecc.write_oob = nand_write_oob_syndrome;if (mtd->writesize >= chip->ecc.size)break;printk(KERN_WARNING "%d byte HW ECC not possible on ""%d byte page size, fallback to SW ECC\n",chip->ecc.size, mtd->writesize);chip->ecc.mode = NAND_ECC_SOFT;case NAND_ECC_SOFT:chip->ecc.calculate = nand_calculate_ecc;chip->ecc.correct = nand_correct_data;chip->ecc.read_page = nand_read_page_swecc;chip->ecc.read_subpage = nand_read_subpage;chip->ecc.write_page = nand_write_page_swecc;chip->ecc.read_page_raw = nand_read_page_raw;chip->ecc.write_page_raw = nand_write_page_raw;chip->ecc.read_oob = nand_read_oob_std;chip->ecc.write_oob = nand_write_oob_std;if (!chip->ecc.size)chip->ecc.size = 256;chip->ecc.bytes = 3;break;case NAND_ECC_NONE:printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. ""This is not recommended !!\n");chip->ecc.read_page = nand_read_page_raw;chip->ecc.write_page = nand_write_page_raw;chip->ecc.read_oob = nand_read_oob_std;chip->ecc.read_page_raw = nand_read_page_raw;chip->ecc.write_page_raw = nand_write_page_raw;chip->ecc.write_oob = nand_write_oob_std;chip->ecc.size = mtd->writesize;chip->ecc.bytes = 0;break;default:printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n",chip->ecc.mode);BUG();}/** The number of bytes available for a client to place data into* the out of band area*/chip->ecc.layout->oobavail = 0;for (i = 0; chip->ecc.layout->oobfree[i].length&& i < ARRAY_SIZE(chip->ecc.layout->oobfree); i++)chip->ecc.layout->oobavail +=chip->ecc.layout->oobfree[i].length;mtd->oobavail = chip->ecc.layout->oobavail;/** Set the number of read / write steps for one page depending on ECC* mode*/chip->ecc.steps = mtd->writesize / chip->ecc.size;if (chip->ecc.steps * chip->ecc.size != mtd->writesize) {printk(KERN_WARNING "Invalid ecc parameters\n");BUG();}chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;/** Allow subpage writes up to ecc.steps. Not possible for MLC* FLASH.*/if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&!(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {switch (chip->ecc.steps) {case 2:mtd->subpage_sft = 1;break;case 4:case 8:case 16:mtd->subpage_sft = 2;break;}}chip->subpagesize = mtd->writesize >> mtd->subpage_sft;/* Initialize state */chip->state = FL_READY;/* De-select the device */chip->select_chip(mtd, -1);/* Invalidate the pagebuffer reference */chip->pagebuf = -1;/* Fill in remaining MTD driver data */mtd->type = MTD_NANDFLASH;mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :MTD_CAP_NANDFLASH;mtd->erase = nand_erase;mtd->point = NULL;mtd->unpoint = NULL;mtd->read = nand_read;mtd->write = nand_write;mtd->panic_write = panic_nand_write;mtd->read_oob = nand_read_oob;mtd->write_oob = nand_write_oob;mtd->sync = nand_sync;mtd->lock = NULL;mtd->unlock = NULL;mtd->suspend = nand_suspend;mtd->resume = nand_resume;mtd->block_isbad = nand_block_isbad;mtd->block_markbad = nand_block_markbad;mtd->writebufsize = mtd->writesize;/* propagate ecc.layout to mtd_info */mtd->ecclayout = chip->ecc.layout;/* Check, if we should skip the bad block table scan */if (chip->options & NAND_SKIP_BBTSCAN)return 0;/* Build bad block table */return chip->scan_bbt(mtd); }


add_mtd_partitions函數(shù)會(huì)循環(huán)調(diào)用nr_partitions次allocate_partition函數(shù)來(lái)給flash分為nr_partitions個(gè)區(qū)
每個(gè)分區(qū)使用一個(gè)mtd_part描述,而mtd_part中都有一個(gè)mtd_info結(jié)構(gòu)體用于具體描述這個(gè)分區(qū)。此mtd_info中的結(jié)構(gòu)體的函數(shù)指針很多都執(zhí)行master的函數(shù)。而master就是上面執(zhí)行nand_scan_tail時(shí),被初始化的一個(gè)mtd_info結(jié)構(gòu)體。
mtdpart.c
static struct mtd_part *allocate_partition(struct mtd_info *master,const struct mtd_partition *part, int partno,uint64_t cur_offset) {struct mtd_part *slave;char *name;/* allocate the partition structure */slave = kzalloc(sizeof(*slave), GFP_KERNEL);name = kstrdup(part->name, GFP_KERNEL);if (!name || !slave) {printk(KERN_ERR"memory allocation error while creating partitions for \"%s\"\n",master->name);kfree(name);kfree(slave);return ERR_PTR(-ENOMEM);}/* set up the MTD object for this partition */slave->mtd.type = master->type;slave->mtd.flags = master->flags & ~part->mask_flags;slave->mtd.size = part->size;slave->mtd.writesize = master->writesize;slave->mtd.writebufsize = master->writebufsize;slave->mtd.oobsize = master->oobsize;slave->mtd.oobavail = master->oobavail;slave->mtd.subpage_sft = master->subpage_sft;slave->mtd.name = name;slave->mtd.owner = master->owner;slave->mtd.backing_dev_info = master->backing_dev_info;/* NOTE: we don't arrange MTDs as a tree; it'd be error-prone* to have the same data be in two different partitions.*/slave->mtd.dev.parent = master->dev.parent;slave->mtd.read = part_read;slave->mtd.write = part_write;if (master->panic_write)slave->mtd.panic_write = part_panic_write;if (master->point && master->unpoint) {slave->mtd.point = part_point;slave->mtd.unpoint = part_unpoint;}if (master->get_unmapped_area)slave->mtd.get_unmapped_area = part_get_unmapped_area;if (master->read_oob)slave->mtd.read_oob = part_read_oob;if (master->write_oob)slave->mtd.write_oob = part_write_oob;if (master->read_user_prot_reg)slave->mtd.read_user_prot_reg = part_read_user_prot_reg;if (master->read_fact_prot_reg)slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;if (master->write_user_prot_reg)slave->mtd.write_user_prot_reg = part_write_user_prot_reg;if (master->lock_user_prot_reg)slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;if (master->get_user_prot_info)slave->mtd.get_user_prot_info = part_get_user_prot_info;if (master->get_fact_prot_info)slave->mtd.get_fact_prot_info = part_get_fact_prot_info;if (master->sync)slave->mtd.sync = part_sync;if (!partno && !master->dev.class && master->suspend && master->resume) {slave->mtd.suspend = part_suspend;slave->mtd.resume = part_resume;}if (master->writev)slave->mtd.writev = part_writev;if (master->lock)slave->mtd.lock = part_lock;if (master->unlock)slave->mtd.unlock = part_unlock;if (master->is_locked)slave->mtd.is_locked = part_is_locked;if (master->block_isbad)slave->mtd.block_isbad = part_block_isbad;if (master->block_markbad)slave->mtd.block_markbad = part_block_markbad;slave->mtd.erase = part_erase;slave->master = master;slave->offset = part->offset;if (slave->offset == MTDPART_OFS_APPEND)slave->offset = cur_offset;if (slave->offset == MTDPART_OFS_NXTBLK) {slave->offset = cur_offset;if (mtd_mod_by_eb(cur_offset, master) != 0) {/* Round up to next erasesize */slave->offset = (mtd_div_by_eb(cur_offset, master) + 1) * master->erasesize;printk(KERN_NOTICE "Moving partition %d: ""0x%012llx -> 0x%012llx\n", partno,(unsigned long long)cur_offset, (unsigned long long)slave->offset);}}if (slave->mtd.size == MTDPART_SIZ_FULL)slave->mtd.size = master->size - slave->offset;printk(KERN_NOTICE "0x%012llx-0x%012llx : \"%s\"\n", (unsigned long long)slave->offset,(unsigned long long)(slave->offset + slave->mtd.size), slave->mtd.name);/* let's do some sanity checks */if (slave->offset >= master->size) {/* let's register it anyway to preserve ordering */slave->offset = 0;slave->mtd.size = 0;printk(KERN_ERR"mtd: partition \"%s\" is out of reach -- disabled\n",part->name);goto out_register;}if (slave->offset + slave->mtd.size > master->size) {slave->mtd.size = master->size - slave->offset;printk(KERN_WARNING"mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#llx\n",part->name, master->name, (unsigned long long)slave->mtd.size);}if (master->numeraseregions > 1) {/* Deal with variable erase size stuff */int i, max = master->numeraseregions;u64 end = slave->offset + slave->mtd.size;struct mtd_erase_region_info *regions = master->eraseregions;/* Find the first erase regions which is part of this* partition. */for (i = 0; i < max && regions[i].offset <= slave->offset; i++);/* The loop searched for the region _behind_ the first one */if (i > 0)i--;/* Pick biggest erasesize */for (; i < max && regions[i].offset < end; i++) {if (slave->mtd.erasesize < regions[i].erasesize) {slave->mtd.erasesize = regions[i].erasesize;}}BUG_ON(slave->mtd.erasesize == 0);} else {/* Single erase size */slave->mtd.erasesize = master->erasesize;}if ((slave->mtd.flags & MTD_WRITEABLE) &&mtd_mod_by_eb(slave->offset, &slave->mtd)) {/* Doesn't start on a boundary of major erase size *//* FIXME: Let it be writable if it is on a boundary of* _minor_ erase size though */slave->mtd.flags &= ~MTD_WRITEABLE;printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",part->name);}if ((slave->mtd.flags & MTD_WRITEABLE) &&mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) {slave->mtd.flags &= ~MTD_WRITEABLE;printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",part->name);}slave->mtd.ecclayout = master->ecclayout;if (master->block_isbad) {uint64_t offs = 0;while (offs < slave->mtd.size) {if (master->block_isbad(master,offs + slave->offset))slave->mtd.ecc_stats.badblocks++;offs += slave->mtd.erasesize;}}out_register:return slave; }
有個(gè)疑問(wèn)
nand_chip的ecc結(jié)構(gòu)體有很多讀寫函數(shù),ecc結(jié)構(gòu)體的函數(shù)指針在nand_scan_tail中被賦值,比如
/* Use standard hwecc read page function ? */
if (!chip->ecc.read_page)
chip->ecc.read_page = nand_read_page_hwecc;
if (!chip->ecc.write_page)
chip->ecc.write_page = nand_write_page_hwecc;
if (!chip->ecc.read_page_raw)
chip->ecc.read_page_raw = nand_read_page_raw;
if (!chip->ecc.write_page_raw)
chip->ecc.write_page_raw = nand_write_page_raw;
if (!chip->ecc.read_oob)
chip->ecc.read_oob = nand_read_oob_std;
if (!chip->ecc.write_oob)
chip->ecc.write_oob = nand_write_oob_std;
而每個(gè)分區(qū)mtd_part結(jié)構(gòu)體的mtd_info結(jié)構(gòu)體也有很多讀寫函數(shù),函數(shù)指針在allocate_partition中被賦值,比如
slave->mtd.read = part_read;
slave->mtd.write = part_write;


if (master->panic_write)
slave->mtd.panic_write = part_panic_write;


if (master->point && master->unpoint) {
slave->mtd.point = part_point;
slave->mtd.unpoint = part_unpoint;
}


if (master->get_unmapped_area)
slave->mtd.get_unmapped_area = part_get_unmapped_area;
if (master->read_oob)
slave->mtd.read_oob = part_read_oob;
if (master->write_oob)
slave->mtd.write_oob = part_write_oob;
if (master->read_user_prot_reg)
slave->mtd.read_user_prot_reg = part_read_user_prot_reg;
if (master->read_fact_prot_reg)
slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg;
if (master->write_user_prot_reg)
slave->mtd.write_user_prot_reg = part_write_user_prot_reg;
if (master->lock_user_prot_reg)
slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg;
if (master->get_user_prot_info)
slave->mtd.get_user_prot_info = part_get_user_prot_info;
if (master->get_fact_prot_info)
slave->mtd.get_fact_prot_info = part_get_fact_prot_info;
if (master->sync)
slave->mtd.sync = part_sync;
if (!partno && !master->dev.class && master->suspend && master->resume) {
slave->mtd.suspend = part_suspend;
slave->mtd.resume = part_resume;
}
if (master->writev)
slave->mtd.writev = part_writev;
if (master->lock)
slave->mtd.lock = part_lock;
if (master->unlock)
slave->mtd.unlock = part_unlock;
if (master->is_locked)
slave->mtd.is_locked = part_is_locked;
if (master->block_isbad)
slave->mtd.block_isbad = part_block_isbad;
if (master->block_markbad)
slave->mtd.block_markbad = part_block_markbad;
slave->mtd.erase = part_erase;
slave->master = master;
slave->offset = part->offset;


這兩個(gè)結(jié)構(gòu)體的讀寫函數(shù)有啥不同呢?待續(xù)。。。。。


2.內(nèi)核加載ubi


mtdchar.c
mtdblock.c


加載mtd分區(qū)上的文件系統(tǒng)后,執(zhí)行文件系統(tǒng)根目錄的linuxrc(因?yàn)?setenv bootargs console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc)和init
見(jiàn)內(nèi)核源碼init/main.c?init_post()

if (execute_command) {run_init_process(execute_command);//init=/linuxrcprintk(KERN_WARNING "Failed to execute %s. Attempting ""defaults...\n", execute_command);}run_init_process("/sbin/init");run_init_process("/etc/init");run_init_process("/bin/init");run_init_process("/bin/sh");panic("No init found. Try passing init= option to kernel. ""See Linux Documentation/init.txt for guidance.");

http://qiuye.iteye.com/blog/543595

轉(zhuǎn)載于:https://www.cnblogs.com/-song/archive/2012/12/16/3331834.html

總結(jié)

以上是生活随笔為你收集整理的nand ubi -4 kernel和mtd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久影视网| 久久久久久黄色 | 日韩高清不卡在线 | www黄免费 | 国产视频精品免费 | 97视频免费播放 | 欧美激情另类文学 | 国产美女精品视频免费观看 | 99精品视频在线观看免费 | 日韩黄色免费电影 | 国内精品久久影院 | 欧美日韩在线视频一区二区 | 亚洲午夜久久久久久久久 | 久久夜av| 亚洲男人天堂2018 | 伊色综合久久之综合久久 | 欧美极品少妇xxxx | 日本少妇高清做爰视频 | 国产精品美女久久久 | 国产精品久久久久久婷婷天堂 | 特级a毛片 | 国产精品视频专区 | 91在线播放视频 | 国产黄影院色大全免费 | 亚洲电影影音先锋 | 一区二区三区三区在线 | 美女网站视频久久 | 永久免费毛片在线观看 | 免费成人在线视频网站 | 国外调教视频网站 | 一级电影免费在线观看 | 久久久久高清毛片一级 | 91精品久久香蕉国产线看观看 | 国产999精品久久久影片官网 | 激情视频免费在线观看 | 久久久久久久国产精品视频 | 中文字幕亚洲国产 | 97精品国产97久久久久久 | 国产日韩在线观看一区 | av成人免费在线看 | 亚洲污视频| www.国产在线 | 日韩免费福利 | 在线免费观看视频一区二区三区 | 国产女人40精品一区毛片视频 | 在线 日韩 av | 黄色毛片一级片 | 日韩久久精品一区二区三区下载 | 久久视了 | 亚洲蜜桃av | 成人黄色在线 | 精品一区二区在线免费观看 | 狠狠干中文字幕 | 国产在线一区观看 | 一区二区三区高清在线 | 色综合久久五月天 | 国内精品久久久久久中文字幕 | 久久超 | 国产精品福利无圣光在线一区 | 激情五月播播久久久精品 | 久久国产欧美日韩精品 | 色婷婷天天干 | 久草在线在线 | 久久久国产精品免费 | 91专区在线观看 | 天天综合精品 | 亚洲一区二区麻豆 | 欧美日韩久 | 日韩欧美电影在线 | 综合激情伊人 | 国产录像在线观看 | 91亚洲成人| 婷婷 综合 色 | 久久看片 | 色亚洲激情 | av中文字幕在线播放 | av免费看在线 | 这里只有精品视频在线 | 免费看的视频 | 欧美另类高清 videos | 色丁香色婷婷 | 免费在线观看av的网站 | 99久久精品费精品 | 在线精品视频在线观看高清 | 成人免费在线视频 | av丝袜美腿 | 九九在线国产视频 | 日韩一级网站 | 97超碰资源 | 91在线日本 | 五月激情电影 | 中文字幕有码在线观看 | 亚洲电影图片小说 | 亚洲免费成人av电影 | 婷婷色综合色 | 欧美日本啪啪无遮挡网站 | 国产精品久久久免费看 | 国产性天天综合网 | av免费在线观看网站 | 在线视频一区二区 | 2018亚洲男人天堂 | www五月| 精品一二三区视频 | 伊人久久精品久久亚洲一区 | www91在线观看| 成人av网站在线观看 | 日韩在线观看不卡 | 成人免费一级片 | 四虎亚洲精品 | 久久综合久色欧美综合狠狠 | 夜夜高潮夜夜爽国产伦精品 | 久久黄色精品视频 | 免费观看丰满少妇做爰 | 国内精品视频在线播放 | 亚洲国产一二三 | www.99热精品| 国产精品毛片一区视频播 | 麻豆成人小视频 | www五月天婷婷 | 女人18毛片90分钟 | 国产精品一区二区免费看 | 日本h视频在线观看 | 黄色av免费看 | 亚洲一区二区三区在线看 | 久久免费播放 | 超碰成人免费电影 | 欧美视频99| 国产精品21区 | 国产精品 国产精品 | 激情一区二区三区欧美 | 国产一级二级三级视频 | 欧美久久久一区二区三区 | 国产精品久久久久久一区二区 | 狠狠黄| 中文字幕av网站 | 99热最新精品 | 欧美激情另类 | 区一区二区三在线观看 | 91福利视频免费 | 色综合在| 色多多污污在线观看 | 狠狠色狠狠色综合系列 | 久久综合久久伊人 | 日韩在线免费小视频 | 日韩免费播放 | 日韩电影精品 | 成人免费视频视频在线观看 免费 | 玖玖精品视频 | www.狠狠插.com | 亚洲2019精品 | 深爱五月激情五月 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美少妇xx| 日日激情| 色资源在线观看 | 亚洲精品久 | 国产视频91在线 | 99热超碰在线 | 国产精品一区二区免费视频 | 国产成人亚洲在线观看 | 在线观看国产区 | 91中文视频 | 午夜色性片 | 九九热1 | 亚洲精品在线免费观看视频 | 九九99| 果冻av在线 | 国产人免费人成免费视频 | 超碰伊人网 | 国产69精品久久久久久 | 亚洲国产精品久久久久婷婷884 | 韩国av一区二区三区 | 黄色三级在线 | 在线国产一区二区三区 | 久久精品国亚洲 | 精品一区二区在线观看 | 九九久久国产精品 | 亚洲片在线 | 日韩毛片在线一区二区毛片 | 日韩精品亚洲专区在线观看 | 国产精品av免费 | 亚洲资源 | 怡红院成人在线 | 色噜噜噜噜 | 国产第一页精品 | 色播五月婷婷 | 狠狠久久伊人 | 国内精品久久久久久久影视麻豆 | 一本一本久久a久久精品综合妖精 | 婷婷国产在线 | 国产精品视频免费看 | 18做爰免费视频网站 | 欧美成年人在线视频 | 日本激情动作片免费看 | 国产精品成人自产拍在线观看 | 亚洲一二视频 | 久久有精品 | 天天干天天插 | 天天干天天干天天干 | 久久人人爽人人片 | 日韩久久片 | 成人九九视频 | 亚洲综合成人专区片 | 国产综合香蕉五月婷在线 | 啪啪激情网 | 国内精品久久久久久久久久久久 | 色在线网站 | 精品视频久久久久久 | 国内小视频 | 国产精品免费久久久久影院仙踪林 | 国产精品去看片 | 久久er99热精品一区二区 | 国产精品18久久久久久首页狼 | 国产小视频免费在线观看 | 国产精品毛片久久久 | 精品一区精品二区 | 精品999| 国产一级片在线播放 | 午夜久久久久久久 | 最新av观看 | 国产精品久久久久久久免费观看 | 国产欧美在线一区二区三区 | 欧美久久久久久久久久久久久 | 日韩视频一二三区 | 一区二区三区免费网站 | 天天色天天射综合网 | 国产午夜精品在线 | 人人干人人干人人干 | 亚洲撸撸| 51久久夜色精品国产麻豆 | 2022久久国产露脸精品国产 | 日韩另类在线 | 黄色在线观看污 | 99色免费 | 久久 地址 | 99国产精品久久久久久久久久 | 超碰日韩在线 | 色射爱| 久久艹艹 | 国产日韩三级 | 毛片网站免费 | 国产中文字幕在线视频 | 亚洲视频一区二区三区在线观看 | 黄色日本免费 | 91漂亮少妇露脸在线播放 | 欧美成人精品三级在线观看播放 | 久久精品国产一区二区电影 | 色网站视频 | 国产精品男女啪啪 | www日日 | 成人av在线电影 | 99爱这里只有精品 | 91九色视频在线播放 | 四虎在线免费视频 | 午夜精品视频免费在线观看 | 97色在线观看 | 99亚洲视频| 在线成人免费电影 | 日本久久片 | 欧美国产不卡 | 最近的中文字幕大全免费版 | 亚洲精品婷婷 | 久久精品视频在线免费观看 | 狠狠操夜夜操 | 91自拍视频在线 | 麻豆传媒精品 | 久久久久北条麻妃免费看 | 中文字幕的| 亚洲狠狠婷婷 | 久久久91精品国产一区二区精品 | 手机看片1042 | 免费视频三区 | 夜夜操天天 | 最新国产一区二区三区 | 日本中文一区二区 | aaawww| 精品一区 在线 | 99久久99久久精品 | 亚洲精品2区 | 婷婷久久一区 | 天天草综合网 | 国产不卡在线观看 | 欧美午夜一区二区福利视频 | 最新av中文字幕 | 国产精品久久久久久一区二区 | 制服丝袜在线91 | 国产在线最新 | 黄色免费电影网站 | 国产美腿白丝袜足在线av | 中文在线√天堂 | 国产视频999 | 99久久国产免费看 | 欧美福利久久 | 91av视频在线观看免费 | 婷婷丁香自拍 | 天天综合网入口 | 午夜私人影院久久久久 | 国产一级精品在线观看 | 久草在线综合网 | 日本爱爱免费视频 | 国产91免费观看 | 国内久久精品 | 四虎国产精品免费观看视频优播 | 一级黄色片在线免费观看 | 久久精品第一页 | 亚洲精品一区二区三区四区高清 | 色婷婷视频在线 | 五月婷香蕉久色在线看 | 91香蕉国产 | 亚洲每日更新 | 香蕉视频在线视频 | 久影院 | 色综合天天狠狠 | 亚洲天堂网在线观看视频 | 涩涩网站在线观看 | 亚洲免费色 | 在线影院av| 黄色午夜| 中文字幕在线一区二区三区 | 国产视频日本 | 激情五月婷婷激情 | 99色亚洲 | 国产精品欧美日韩在线观看 | 黄免费网站 | 亚洲精品成人 | 中文字幕资源站 | 久久久久久久久久电影 | 国产亚洲一区二区在线观看 | 在线观看国产www | 久久久高清视频 | 久久久久在线 | 午夜视频一区二区三区 | 人人搞人人爽 | 天天操综 | 激情电影影院 | 国产精品网在线观看 | 黄色片视频免费 | 超碰在线最新地址 | 人人玩人人添人人澡超碰 | 国产在线国产 | 午夜av大片| 99视频久久 | 免费国产在线视频 | 91免费在线看片 | 在线中文字母电影观看 | 热久久影视 | 日韩av中文 | 国产精品综合在线观看 | 亚洲国产午夜精品 | 最近中文字幕在线 | 亚州av一区 | 国内精品中文字幕 | 日韩女同一区二区三区在线观看 | 97久久久免费福利网址 | 国产一区高清在线观看 | 深夜免费福利 | 国内揄拍国产精品 | 一区二区三区在线影院 | 中文字幕在线观看日本 | 在线免费观看黄色大片 | 国产在线a免费观看 | 黄色三级网站在线观看 | 国产精品理论视频 | 友田真希av | a天堂中文在线 | 免费看的黄色录像 | 国产成年人av | av一级片 | 国产一区在线视频播放 | 亚洲日本精品视频 | 日本精品va在线观看 | 手机av电影在线观看 | 日本99干网 | 午夜精品久久久久99热app | 国产成人三级在线 | av噜噜噜在线播放 | 久久久久免费视频 | 午夜久久美女 | 91在线公开视频 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 久久精彩免费视频 | 国产在线探花 | 香蕉在线影院 | 伊人婷婷色 | 91视频最新网址 | 天天射成人 | 国产精品久久久久一区二区国产 | 免费看色视频 | 最新中文字幕在线播放 | 成人app在线播放 | 国产午夜精品久久 | av成人免费在线观看 | 日本99干网 | 久草网在线观看 | 亚洲欧美日韩精品一区二区 | 久久久首页 | 国产精品免费观看久久 | 免费观看性生活大片 | 亚洲午夜精品一区二区三区电影院 | 国产中文在线字幕 | 日日干天天爽 | 五月天综合色 | 成人h动漫精品一区二 | 中国美女一级看片 | 激情婷婷综合网 | 欧美午夜a | 久久久精品一区二区三区 | 国产又粗又猛又色又黄网站 | 国产日本在线观看 | 欧美精品999 | 久久久久综合视频 | 97精品国自产拍在线观看 | 亚洲国产精品影院 | 综合影视 | 国产一区二区免费在线观看 | 中文字幕免费观看全部电影 | 一区二区三区中文字幕在线 | 久久久国产精品免费 | 九九99 | 日韩视频精品在线 | 久久精品三 | 国产在线第三页 | 国产在线精品观看 | 国产亚洲午夜高清国产拍精品 | 九九免费在线观看视频 | 国产精品久久久久久久久免费看 | 久久综合导航 | 又黄又爽又湿又无遮挡的在线视频 | 中文字幕二区三区 | 狠狠色噜噜狠狠 | 成年人免费观看在线视频 | 人人爽人人澡人人添人人人人 | 91香蕉亚洲精品 | 天天综合网天天综合色 | 国产二区电影 | 久久永久视频 | 久久精品永久免费 | 国产精品久久久999 国产91九色视频 | 激情五月婷婷丁香 | 国产亚洲在 | 亚洲在线成人精品 | 欧美精品久久久久久 | 欧美一二在线 | 看全黄大色黄大片 | 国产剧情久久 | 精品国产一区二区三区久久久蜜月 | 日韩精品高清不卡 | 6080yy午夜一二三区久久 | 欧美精品v国产精品v日韩精品 | 日韩在线首页 | 国产这里只有精品 | 日韩av中文 | 精品免费一区二区三区 | 久久久久国产一区二区三区四区 | aa级黄色大片 | 成人小视频免费在线观看 | 国产精品99久久久久久久久 | 五月婷婷视频 | 亚洲欧美日本一区二区三区 | 97超碰在 | 亚洲精品视频偷拍 | 日韩在线视频精品 | 91资源在线免费观看 | 欧美精品久久久久久久久久丰满 | 久久精品123 | 国产亚洲免费观看 | 一区二区日韩av | 激情av在线资源 | 成年美女黄网站色大片免费看 | 色狠狠久久av五月综合 | 伊人天天操 | 香蕉视频4aa| 亚洲精品视频免费在线 | 91九色视频在线播放 | 粉嫩av一区二区三区四区五区 | 人人爱天天操 | 91av99| 五月天亚洲综合小说网 | 成人av在线网 | 精品亚洲免费 | 国产精品国产三级国产aⅴ无密码 | 久久久精品视频成人 | 黄色aaa毛片 | 亚洲成av人影院 | 色吊丝在线永久观看最新版本 | 香蕉视频久久久 | 国产精品日韩欧美 | 91自拍视频在线观看 | 99精品国产福利在线观看免费 | 国产综合小视频 | 成人在线观看你懂的 | a级免费观看 | 婷婷丁香花五月天 | 欧美日韩国产综合网 | 亚洲激情 在线 | 精品亚洲免费 | 亚洲欧美国产精品久久久久 | a精品视频 | 狠狠操导航 | 亚洲一区二区精品在线 | 狠狠地操 | 国产精品久久久久久爽爽爽 | 久久久久久久久毛片 | 国产视频久久久 | 亚洲国产中文字幕 | 18做爰免费视频网站 | 亚洲精品一区二区在线观看 | 六月久久婷婷 | 五月天综合激情网 | 99视频这里有精品 | 成人黄色片免费看 | 亚洲精品综合欧美二区变态 | 国产一区二区三区四区在线 | 精品中文字幕视频 | 天天操天天舔天天爽 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产破处在线视频 | 色婷婷激婷婷情综天天 | 国产成本人视频在线观看 | 四虎4hu永久免费 | 久久污视频| 国产在线97 | 亚洲成人一二三 | 欧美 日韩 性 | 国产一区在线视频 | 99c视频高清免费观看 | 亚洲国产精品成人综合 | 在线观看国产一区二区 | 欧美一级在线观看视频 | 亚洲一区精品人人爽人人躁 | 亚洲激色 | 中文字幕在线播放日韩 | 99久高清在线观看视频99精品热在线观看视频 | 成年人在线观看网站 | 波多野结衣在线观看一区二区三区 | 日韩电影在线观看一区二区三区 | 在线国产日韩 | 正在播放日韩 | 成人在线超碰 | 成 人 黄 色 视频 免费观看 | 99视频精品 | 亚洲精品国产精品99久久 | 午夜精品一区二区三区四区 | 在线观看中文字幕 | 看污网站| 黄色片网站av| 国产黄色片一级三级 | 欧美日在线 | 天天舔天天射天天操 | 欧美一级久久久久 | 欧美一级片免费在线观看 | 国产美女视频网站 | 欧美另类交在线观看 | 婷婷在线视频观看 | 热久久这里只有精品 | 久草免费福利在线观看 | 国内久久久久久 | 成人97视频 | 91刺激视频 | 国产亚洲精品无 | 中文字幕亚洲精品在线观看 | 天天se天天cao天天干 | 永久免费的啪啪网站免费观看浪潮 | 人人躁| 成人在线播放av | 五月天电影免费在线观看一区 | 精品网站999www | 国产aaa毛片 | 日韩精品一区二区三区不卡 | 欧美福利片在线观看 | 麻花豆传媒mv在线观看 | 精品一区二区在线观看 | 国产午夜精品一区二区三区在线观看 | 91社区国产高清 | 国产成人精品网站 | 日韩一级片观看 | 国产精品夜夜夜一区二区三区尤 | 美女视频黄的免费的 | 一区二区激情视频 | 亚洲欧洲精品一区二区精品久久久 | 国产精品久久久久9999吃药 | 去干成人网 | 日韩欧三级 | 91麻豆精品国产91久久久无需广告 | 亚洲视频高清 | 手机在线看永久av片免费 | 成人午夜精品 | 亚洲国产精品成人av | 欧美亚洲一区二区在线 | 久久手机视频 | 亚洲综合视频在线 | 97精品久久人人爽人人爽 | 黄色小网站在线观看 | 久久伊人操| 色综合色综合色综合 | 精品综合久久久 | 国产精品一区二区电影 | 国产女人免费看a级丨片 | 日本激情中文字幕 | 日韩欧美在线影院 | 91视频高清免费 | 成年人在线观看 | 久久精品a | 国产小视频免费观看 | 中文字幕国产精品一区二区 | 草免费视频 | 久草视频免费在线播放 | 久久兔费看a级 | 亚洲 欧美 91 | 99精品视频在线观看播放 | 国产无遮挡又黄又爽馒头漫画 | 日韩成人精品在线观看 | 黄网站免费看 | 日韩免费在线观看视频 | 天天爱天天操天天爽 | 狠狠狠综合 | 国产精品久久久久国产精品日日 | 国产精品区在线观看 | 91久久国产综合精品女同国语 | 最近乱久中文字幕 | 狠狠色丁香久久婷婷综 | www.久久婷婷 | 99中文字幕 | 亚洲最新精品 | 国产亚洲精品久久久久久网站 | 亚洲蜜桃在线 | 精品国产一区二区三区在线观看 | 欧美日韩精品综合 | 中文字幕在线国产 | 亚洲午夜不卡 | 伊人丁香| 日韩午夜在线观看 | 久久这里 | 亚洲一区欧美激情 | 日韩中文字幕免费电影 | 正在播放 国产精品 | 天天色成人网 | 91亚洲精品久久久蜜桃 | 日韩欧美在线综合网 | 日韩一级黄色av | 日日操天天操狠狠操 | 亚洲日本va午夜在线影院 | 亚洲码国产日韩欧美高潮在线播放 | www.色国产 | 亚洲精品中文字幕视频 | 91av在线免费视频 | 在线观看久 | 精品亚洲午夜久久久久91 | 日日操网站 | 精品在线视频观看 | 国内成人综合 | 亚洲精品国偷自产在线91正片 | 91麻豆精品91久久久久同性 | 色久网| 啪啪免费观看网站 | av网站大全免费 | 国产精品久久久久久久久久 | 日韩精品中文字幕在线 | 国产精品久久久久久久久久三级 | 久久国产精品免费 | 在线观看成人毛片 | 天天色天天操综合 | 免费在线观看av网站 | 免费观看mv大片高清 | 国产精品短视频 | 国产精品久久久久影院 | 又污又黄的网站 | 99久久精品免费看国产免费软件 | 国产精品一区二区精品视频免费看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日日夜夜天天 | 麻豆久久精品 | 欧美在线久久 | 午夜视频福利 | 亚洲国产精品va在线看黑人 | 97色资源 | 欧美激精品 | 日韩精品字幕 | 成人av教育| 国产不卡在线视频 | 亚洲综合色播 | 99re国产| 免费亚洲视频在线观看 | 亚洲精品小视频 | 成x99人av在线www | 91精品视频免费看 | 香蕉国产91 | 97超碰在线免费观看 | 99视频在线免费观看 | 国产1区2区3区精品美女 | 久久综合桃花 | 香蕉网站在线观看 | 国产在线视频一区二区 | 操久久网| 狠狠色狠狠色综合日日小说 | 片网址| 夜夜操天天干 | 午夜10000| adn—256中文在线观看 | 国产精品第一页在线 | 狠狠亚洲 | 综合网在线视频 | 国产午夜激情视频 | 国产精品久久久久久久久久白浆 | 天天综合天天做天天综合 | 国产一级免费电影 | 亚洲精品久久久久www | 久久精品欧美一区 | 福利视频网址 | 天天鲁天天干天天射 | 欧美人人 | 色干综合| 成年人免费在线观看 | 亚洲国产伊人 | 精品国产诱惑 | 国产精品女人久久久 | 黄色精品在线看 | 日韩一区二区三区免费电影 | 国产乱对白刺激视频在线观看女王 | 精品久久久久久亚洲综合网站 | 婷婷激情综合五月天 | 国产v欧美 | 久久免费视频6 | 久久黄色影视 | 日韩av中文 | 日韩精品一区二区在线视频 | 99精品偷拍视频一区二区三区 | 啪啪午夜免费 | 久久久久久国产精品 | 欧美精品乱码久久久久久 | 中文字幕中文字幕在线中文字幕三区 | 天天玩天天干天天操 | 欧洲亚洲精品 | 国产精品久久久久一区二区三区共 | 中文在线www | 亚洲a色 | 亚洲成人精品影院 | 亚洲国产视频直播 | 九9热这里真品2 | 在线黄频| 精品伊人久久久 | 一区在线观看视频 | 在线探花| 美女在线免费观看视频 | 亚洲视频高清 | 91久久精品日日躁夜夜躁国产 | 91成人在线视频 | 国产成人亚洲在线观看 | 99久久精品国产免费看不卡 | 成人在线视频免费看 | 韩日电影在线免费看 | 精品视频资源站 | 激情丁香综合 | 国产精品地址 | 久久99最新地址 | 婷婷丁香综合 | 人人爽人人爽人人爽 | 五月婷视频 | 精品久久久久亚洲 | 国产精品一区二区av麻豆 | 久久久免费在线观看 | 欧美成人精品欧美一级乱黄 | 92中文资源在线 | 深夜免费福利视频 | 日韩精品中文字幕在线观看 | 中文乱码视频在线观看 | 麻豆超碰 | 久久久色 | 国产大陆亚洲精品国产 | 亚州精品天堂中文字幕 | 亚洲综合五月天 | 久久久精品成人 | 婷婷av综合 | 91中文字幕在线观看 | 亚洲精品乱码久久久久久蜜桃不爽 | 日批视频| 久久久久久欧美二区电影网 | 五月网婷婷 | 日韩高清 一区 | 国产99久久久国产精品 | 91手机电影 | av中文字幕在线观看网站 | 国产精品久久久久久久久毛片 | 91香蕉亚洲精品 | 成人性生活大片 | 九九热在线视频免费观看 | 97av在线视频免费播放 | 久久精品www人人爽人人 | 国产区精品视频 | 亚洲精品一区二区精华 | 99视频国产在线 | 黄色大片网 | 国产99久久久国产精品 | 婷婷综合五月天 | 国产 一区二区三区 在线 | 免费黄色一区 | 成年人视频在线 | 天天操天天操天天操天天操天天操天天操 | 日韩欧美精品在线观看视频 | 天天人人| 久草色在线观看 | 免费观看性生活大片 | 国产在线观看一 | 久久艹欧美 | 欧美久久久久久久久久 | 久草影视在线 | 激情欧美日韩一区二区 | 婷婷精品国产一区二区三区日韩 | 在线亚洲观看 | 欧美国产日韩一区二区三区 | 成年人在线电影 | 亚洲欧美成人网 | 国产成人精品久久亚洲高清不卡 | 久久人人爽人人爽人人 | 在线观看久 | 精品国产综合区久久久久久 | 久久香蕉国产 | 五月激情丁香图片 | 韩日精品在线 | 亚洲综合成人在线 | 国产精品久久久久久久久久久不卡 | 日韩电影久久久 | 日韩欧美一区二区在线 | 中文字幕亚洲在线观看 | 日本中文字幕在线 | 色婷婷成人网 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 不卡精品视频 | 日韩三级视频在线看 | 成人黄色视 | 免费看一级黄色 | 99国产在线视频 | 在线免费观看成人 | 97视频免费观看2区 亚洲视屏 | 精品免费观看视频 | 九九爱免费视频 | 亚洲欧美在线视频免费 | 国产中文字幕在线观看 | 国产婷婷在线观看 | 少妇高潮冒白浆 | 91看片在线看片 | 欧美大片www | 狠狠色丁香婷婷综合视频 | 欧美午夜性生活 | 狠狠狠狠狠色综合 | 狠狠色丁香久久综合网 | 欧美性极品xxxx娇小 | 国产精品二区在线观看 | 色婷婷精品大在线视频 | 国产第一页精品 | 欧美综合在线观看 | 日日草av | 中文国产字幕在线观看 | 成人在线免费视频 | 日日麻批40分钟视频免费观看 | 久久精品系列 | 五月开心网 | 国产高清黄 | 日本99久久| aaa黄色毛片 | 久久香蕉一区 | 99r在线播放| 91久久国产精品 | 久久爱导航 | 超碰公开在线观看 | 国产一区二区三区在线免费观看 | 夜夜躁狠狠燥 | 激情丁香综合五月 | 久久有精品 | 国产精华国产精品 | 国产123区在线观看 国产精品麻豆91 | 久久视频这里只有精品 | 久久久亚洲网站 | 国产一级免费在线 | 在线观看91视频 | 久久avav| 草久久精品 | 一区免费在线 | a在线观看免费视频 | 亚洲视频六区 | 成人资源在线观看 | 久久一二三四 | 国产高清在线免费 | 婷婷在线精品视频 | 四虎在线永久免费观看 | 久久福利小视频 | 成人免费在线网 | 欧美成人精品在线 | av免费观看网址 | 色a资源在线 | 青春草免费视频 | 亚洲精品99久久久久中文字幕 | 日韩精品在线视频免费观看 | 一区二区三区免费在线观看视频 | 欧美精品国产精品 | 欧美一级黄色网 | 久久精品视频国产 | 丰满少妇高潮在线观看 | 91av在线不卡 | 97精品一区 | 97超碰人人澡人人爱 | 深夜免费小视频 | 久久精品视频国产 | 国产资源av | 国产丝袜一区二区三区 | 国产录像在线观看 | 久久久 精品 | 亚洲欧美日韩精品久久久 | 999国产在线| 国产在线色站 | 日韩有码第一页 | 国产美女免费看 | 日韩在线视频网 | 国产精品v a免费视频 | 看片的网址| 久久伊人精品一区二区三区 | 99色在线观看 | 久久久久成人精品免费播放动漫 | 一本之道乱码区 | 一区二区三区在线视频观看58 | 国产精品毛片完整版 | 日韩电影一区二区三区在线观看 | 日本一区二区三区视频在线播放 | 超碰免费av | 成人 国产 在线 | 国产精品原创视频 | 玖玖爱在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 国产女教师精品久久av | 丁香婷婷久久久综合精品国产 | 免费视频成人 | 99在线视频播放 | 欧美福利视频一区 | 精品在线视频一区二区三区 | 毛片网在线观看 | 欧美日韩免费一区 | 国产中文字幕亚洲 | 18国产精品白浆在线观看免费 | 在线视频观看你懂的 | 91久久人澡人人添人人爽欧美 | 五月激情久久久 | 中文字幕日本电影 | 国产精品久久久久9999 | 国产免费亚洲高清 | 国产精品一区二区麻豆 | 日韩欧美精品一区二区三区经典 | 久久久黄色| 黄色特级片 | 日韩欧美网址 | 免费观看91视频大全 | 在线观看国产永久免费视频 | 黄av免费在线观看 | 日韩欧美视频免费观看 | 精品久久久成人 | 青青河边草免费视频 | 五月婷婷色播 | 正在播放 国产精品 | 色黄www小说 | 国产亚洲字幕 | 91麻豆视频| 操操色| 欧美精品中文字幕亚洲专区 | 99久久国产免费,99久久国产免费大片 | 国产最顶级的黄色片在线免费观看 | 婷婷在线免费视频 | 久久这里只有精品1 | 成人一区二区三区在线观看 | 国内小视频在线观看 | 成人精品视频 | 午夜久久电影网 | 高清有码中文字幕 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲精品乱码久久久久久高潮 | 日韩精品中文字幕在线不卡尤物 | 亚洲精品乱码久久久久久久久久 | 亚洲精品综合一二三区在线观看 | 在线观av | 日日日日干 | 精品国偷自产国产一区 | 日韩亚洲在线 | 日p在线观看 | 欧美成人a在线 | 日韩二区在线 | 午夜黄色大片 | 波多野结衣一区 | 美女黄濒| 国产在线观看xxx | 一级成人免费视频 | 亚洲一级免费观看 | 国产精品久久久久久99 | 亚洲一区二区精品3399 | 精品国产一区二区三区久久久久久 | 日韩中文字幕免费视频 | 在线免费黄网站 | 亚洲国产欧美在线人成大黄瓜 | 人人草在线视频 | 九九热在线精品视频 | 福利视频导航网址 |