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

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

?? imagewrite.c

?? 適用於QT2410(研勤)的ARM
?? C
字號:
/* Nand Flash Image Writing Utility *//* (C) 2002, Mizi Research Inc.   Author: Hwang, Chideok <hwang@mizi.co.kr>*/#define _GNU_SOURCE#include <sys/types.h>#include <unistd.h>#include <ctype.h>#include <sys/ioctl.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <asm/types.h>#include <linux/mtd/mtd.h>#define MAX_PART		9#define MAX_RETRY		5#define PARTITION_OFFSET	(~0)#define IS_MTD	1#define IS_BON  0typedef struct {    ulong offset;    ulong size;    ulong flag;    ulong num_bad_block;    unsigned short *bad_blocks;} partition_t;const char part_magic[8] = {'M', 0, 0, 'I', 0, 'Z', 'I', 0};partition_t parts[MAX_PART];int num_part;#define NAND_SECTOR_SIZE	512#define NAND_OOB_SIZE		16int mtd_fd;mtd_info_t meminfo;int is_bad_block(ulong offset);#include "ecc.c"ulongcalc_ecc(char *buf, unsigned char *ecc){    nand_calculate_ecc(buf, ecc);    return 0;}intwrite_oob(char *buf, ulong offset){    int err;    struct mtd_oob_buf oob;    char oob_buf[NAND_OOB_SIZE];    unsigned char ecc[3];    oob.start = offset;    oob.ptr = oob_buf;    oob.length = NAND_OOB_SIZE;    memset(oob_buf, 0xFF, NAND_OOB_SIZE);    calc_ecc(buf, ecc);    memcpy(oob_buf + 8, ecc, 3);    calc_ecc(buf + 256, ecc);    memcpy(oob_buf + 11, ecc, 3);    err = ioctl(mtd_fd, MEMWRITEOOB, &oob);    if (err) {	return 1;    }    return 0;}intwrite_block(ulong offset, char *buf){    int i;    if (is_bad_block(offset)) return 1;    for(i=0; i < (meminfo.erasesize/NAND_SECTOR_SIZE); i++) {	if (pwrite(mtd_fd, buf, NAND_SECTOR_SIZE, offset) != NAND_SECTOR_SIZE)	  return 1;	if (write_oob(buf, offset)) return 1;	offset += NAND_SECTOR_SIZE;	buf += NAND_SECTOR_SIZE;    }    return 0;}intwrite_image(ulong offset, int fd, long size){    int bad_block_nr = 0;    /* NAND_SECTOR_SIZE*32 > meminfo.erasesize */    char buf[NAND_SECTOR_SIZE*32];    ulong block;    unsigned short *bad;    int i;    printf("size = %ld\n", size);    if (offset % meminfo.erasesize) {	printf("bad alignment \n");	return -1;    }    for(i=0;i<num_part;i++) {	if (parts[i].offset >= offset) break;    }    if (i == num_part) i = num_part - 1;    if (offset + size > parts[i].offset + parts[i].size) {	printf("image is too big for this partition\n");	return -1;    }    block = (offset - parts[i].offset) / meminfo.erasesize;    bad = parts[i].bad_blocks;    if (bad) {	while(*bad++ <= block) block++;    }    offset = parts[i].offset + block * meminfo.erasesize;    read(fd, buf, meminfo.erasesize);    while(size > 0) {	if (write_block(offset, buf) == 0) {	    size -= meminfo.erasesize;	    if (size > 0)	      read(fd, buf, meminfo.erasesize);	} else {	    int k;	    int block_nr = (offset - parts[i].offset)/ meminfo.erasesize;	    for(k=0;k<parts[i].num_bad_block;k++) {		if (block_nr == parts[i].bad_blocks[k]) break;	    }	    if (k == parts[i].num_bad_block) {		printf("**** warning: new bad block in %d\n", block_nr);		exit(1);	    }	    bad_block_nr++;	}	offset += meminfo.erasesize;    }    printf("bad_block = %d\n", bad_block_nr);    return 0;}ulongread_size(char *s){    ulong size = 0;    while(isdigit(*s))  {	size = size * 10 + *s - '0';	s++;	}    if (*s == 'M' || *s == 'm') size *= 1024*1024;    else if (*s == 'K' || *s == 'k') size *= 1024;    else if (*s) {	printf("hmm bad size %s\n", s);    }    return size;}ulongread_flag(char *s){    ulong flag = 0;        while ( *s && *s != ':' )	s++;    if (*s == 0) 	return IS_BON;    s++;    if (*s == 'm' || *s == 'M')	flag |= IS_MTD;    return flag;}char *parse_filename(char *filename, ulong *offset){    char *delim;    delim = strchr(filename, ':');    if (delim == NULL) {	*offset = 0;    } else {	*delim++ = 0;	*offset = 0;	while(isdigit(*delim)) {	    *offset = *offset * 10 + *delim - '0';		delim++;	}	if (*delim == 'M' || *delim == 'm') *offset *= 1024*1024;	else if (*delim == 'K' || *delim == 'k') *offset *= 1024;	else if (*delim) {	    printf("hmm bad file offset %s\n", filename);	}    }    return filename;}voidmark_bad(ulong offset){    char oobbuf[NAND_OOB_SIZE];    struct mtd_oob_buf oob;    oob.start = offset;    oob.length = NAND_OOB_SIZE;    oob.ptr = oobbuf;    memset(oobbuf, 0xff, NAND_OOB_SIZE);    oobbuf[5] = 0;    ioctl(mtd_fd, MEMWRITEOOB, &oob);}intread_partition(void){    int i, k;    struct mtd_oob_buf oob;    unsigned char oobbuf[NAND_OOB_SIZE];    char buf[NAND_SECTOR_SIZE];    unsigned int *s;    ulong offset = PARTITION_OFFSET;    int retry = MAX_RETRY;    if (offset > meminfo.size - meminfo.erasesize) 	offset = meminfo.size - meminfo.erasesize;    while(retry-- > 0) {	oob.start = offset;	oob.length = NAND_OOB_SIZE;	oob.ptr = oobbuf;	if (ioctl(mtd_fd, MEMREADOOB, &oob) || oobbuf[5] != 0xFF) {	    offset -= meminfo.erasesize;	    continue;	}	if (pread(mtd_fd, buf, NAND_SECTOR_SIZE, offset) != NAND_SECTOR_SIZE) {	    offset -= meminfo.erasesize;	    continue;	}	if (strncmp(buf, part_magic, 8) != 0) {	    return -1;	}	break;    }    if (retry <= 0) return -1;    s = (unsigned int *)(buf+8);    num_part = *s++;    for(i=0;i<num_part;i++) {	parts[i].offset = *s++;	parts[i].size = *s++;	parts[i].flag = *s++;    }    for(i=0;i<num_part;i++) {	parts[i].num_bad_block = *s++;	if (parts[i].num_bad_block) {	    parts[i].bad_blocks = malloc(parts[i].num_bad_block * sizeof(unsigned int));	    for(k=0;k<parts[i].num_bad_block;k++) {		parts[i].bad_blocks[k] = *s++;	    }	} else {		parts[i].bad_blocks = 0;	}    }    return 0;}intwrite_partition(ulong offset){    unsigned char oobbuf[NAND_OOB_SIZE];    char buf[NAND_SECTOR_SIZE];    erase_info_t erase;    unsigned int *s;    struct mtd_oob_buf oob;    int i, k;    oob.start = offset;    oob.length = NAND_OOB_SIZE;    oob.ptr = oobbuf;    if (ioctl(mtd_fd, MEMREADOOB, &oob) || oobbuf[5] != 0xFF) return -1;    if (pread(mtd_fd, buf, NAND_SECTOR_SIZE, offset) != NAND_SECTOR_SIZE) {	printf("read error: mark bad: offset = %lX\n", offset);	mark_bad(offset);	return -1;    }    erase.start = offset;    erase.length = meminfo.erasesize;    if (ioctl(mtd_fd, MEMERASE, &erase) < 0) {	printf("erase error: mark bad: offset = %lX\n", offset);	mark_bad(offset);	return -1;    }    memcpy(buf, part_magic, 8);    s = (unsigned int *)(buf+8);    *s++ = num_part;    for(i=0;i<num_part;i++) {	*s++ = parts[i].offset;	*s++ = parts[i].size;	*s++ = parts[i].flag;    }    for(i=0;i<num_part;i++) {	*s++ = parts[i].num_bad_block;	for(k=0;k<parts[i].num_bad_block;k++) {	    *s++ = parts[i].bad_blocks[k];		printf("k = %d block = %d\n", k, parts[i].bad_blocks[k]);	}    }        if (pwrite(mtd_fd, buf, NAND_SECTOR_SIZE, offset) != NAND_SECTOR_SIZE) {	printf("write error: offset = %lu\n", offset);	mark_bad(offset);	return -1;    }    return 0;}intis_bad_block(ulong offset){    unsigned char oobbuf[NAND_OOB_SIZE];    char buf[NAND_SECTOR_SIZE];    struct mtd_oob_buf oob;    erase_info_t erase;    erase.start = offset;    erase.length = meminfo.erasesize;    if (ioctl(mtd_fd, MEMERASE, &erase) < 0) return 1;    oob.start = offset;    oob.length = NAND_OOB_SIZE;    oob.ptr = oobbuf;    if (ioctl(mtd_fd, MEMREADOOB, &oob) || oobbuf[5] != 0xFF) return -1;    if (pread(mtd_fd, buf, NAND_SECTOR_SIZE, offset) != NAND_SECTOR_SIZE) {      printf("read error\n");      mark_bad(offset);      return -1;    }    return 0;}voidcheck_bad_block(void){    int i;    unsigned short bad_block[1024];    for(i=0;i<num_part;i++) {	ulong offset = parts[i].offset;	ulong end = (i + 1 < num_part) ? parts[i+1].offset : meminfo.size;	int num_bad = 0;	int bad;	printf("part = %d end = %ld\n", i, end);	while (offset < end) {	    bad = is_bad_block(offset);	    if (bad) {		bad_block[num_bad] = (offset - parts[i].offset) / meminfo.erasesize;		num_bad++;		printf("%lX: is bad\n", offset);	    }	    offset += meminfo.erasesize;	}	parts[i].num_bad_block = num_bad;#if 0 // ???? - bushi	parts[i].flag = 0;#endif	if (num_bad) {	    parts[i].bad_blocks = malloc(num_bad * sizeof(unsigned short));	    memcpy(parts[i].bad_blocks, bad_block, num_bad * 2);	}	parts[i].size = end - parts[i].offset - num_bad * meminfo.erasesize;    }    parts[num_part - 1].size -= meminfo.erasesize;}intwrite_partition_table(void){    int i, k;    ulong offset = PARTITION_OFFSET;    int retry = MAX_RETRY;    if (offset > meminfo.size - meminfo.erasesize)        offset = meminfo.size - meminfo.erasesize;    while(retry-- > 0) {	if (write_partition(offset) == 0) break;	offset -= meminfo.erasesize;    }    if (retry == 0) {	printf("too many bad block in this flash\n");	return -1;    }    for(i=0;i<num_part;i++) {	printf("part%d:\n", i);	printf("\toffset = %ld\n", parts[i].offset);	printf("\tsize = %ld\n", parts[i].size);	printf("\tbad_block = %ld\n", parts[i].num_bad_block);	for(k=0;k<parts[i].num_bad_block;k++) {	    printf(" %d\n", parts[i].bad_blocks[k]);	}    }    return 0;}/* imagewrite -part 0 128K 1M;    imagewrite vivi:0*/intmain(int argc, char *argv[]){    int fd;    char *fname;    ulong offset, size;    int i;    mtd_fd = open(argv[1], O_RDWR);    if (mtd_fd < 0) {	printf("try to open %s:", argv[1]);	perror("");	return 1;    }    if (ioctl(mtd_fd, MEMGETINFO, &meminfo)) {	perror("MEMGETINFO");	return 1;    }    if ((meminfo.oobsize != NAND_OOB_SIZE) || 	(meminfo.oobblock != NAND_SECTOR_SIZE)) {	printf("hmm, oob size is ....\n");	return 1;    }    printf("meminfo size = %d\n", meminfo.size);    if (strcmp(argv[2], "-part") == 0) {	int i;	num_part = (argc - 3);	printf("doing partition \n");	for(i=0;i<num_part;i++) {	    parts[i].offset = read_size(argv[3+i]);	    printf("offset = %ld\n", parts[i].offset);	    parts[i].flag = read_flag(argv[3+i]);	    printf("flag = 0x%08lx\n", parts[i].flag);	}	printf("check bad block\n");	check_bad_block();	write_partition_table();	return 0;    }    if (read_partition()) {	printf("invalid partition table info\n");	printf("first write partition!!!\n");	return -1;    }    /* write image */    for(i=2; i<argc;i++) {	struct stat statbuf;	fname = parse_filename(argv[i], &offset);	fd = open(fname, O_RDONLY);	if (fd < 0) {	    printf("cannot open file(%s)\n", fname);	    continue;	}	fstat(fd, &statbuf);	size = statbuf.st_size;	printf("size = %ld\n", size);	write_image(offset, fd, size);    }    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本道免费精品一区二区三区| 精品久久久久久久久久久久包黑料 | 色哟哟一区二区在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲欧美日韩国产一区二区三区 | 国产精选一区二区三区| 日韩二区三区在线观看| 亚洲成在人线在线播放| 亚洲品质自拍视频| 亚洲图片欧美视频| 丝袜亚洲另类欧美综合| 免费观看91视频大全| 国内精品嫩模私拍在线| 国产精品66部| 成人av免费网站| 欧美亚洲一区二区在线观看| 欧美日韩激情一区| 日韩欧美一区二区不卡| 久久蜜桃av一区精品变态类天堂| 26uuu国产电影一区二区| 国产欧美精品一区二区色综合朱莉 | 欧美一区二区在线视频| 久久综合九色综合欧美98| 国产精品久久久久久久久免费樱桃| 日韩毛片在线免费观看| 亚洲一区二区在线观看视频 | 欧美午夜免费电影| 欧美酷刑日本凌虐凌虐| 久久日韩粉嫩一区二区三区| 国产精品久久久久久久岛一牛影视| 亚洲综合久久av| 精品一区二区三区久久| 99久久婷婷国产精品综合| 欧美一区二区三区四区久久| 欧美国产综合一区二区| 天堂久久一区二区三区| 成人精品gif动图一区| 欧美影院一区二区三区| 国产日韩欧美综合在线| 免费在线看成人av| 国产盗摄一区二区三区| 精品婷婷伊人一区三区三| 久久久久久影视| 午夜激情综合网| 91网站视频在线观看| 日韩一区二区三区四区五区六区| 亚洲欧洲www| 国产精品一区二区黑丝| 在线观看日韩精品| 国产精品你懂的| 麻豆成人91精品二区三区| 91免费版pro下载短视频| 欧美大片一区二区| 夜夜精品视频一区二区| 国产精品一区二区在线观看不卡| 在线视频国内自拍亚洲视频| 国产日韩亚洲欧美综合| 看电影不卡的网站| 91麻豆精品91久久久久久清纯| 国产精品欧美精品| 国产在线观看免费一区| 日韩一区二区三区四区五区六区| 亚洲小说欧美激情另类| 色综合视频一区二区三区高清| 久久精品人人做人人爽人人| 久久成人免费网| 91麻豆精品国产自产在线观看一区| 国产精品高清亚洲| 国产91在线观看丝袜| 国产偷国产偷精品高清尤物| 日韩电影免费在线看| 欧美日韩亚洲综合在线| 亚洲精选一二三| 成人av网在线| 亚洲视频一二三| 99久久综合国产精品| 亚洲欧洲日韩综合一区二区| www.日韩精品| 一区二区高清免费观看影视大全| 色狠狠一区二区三区香蕉| 亚洲精品视频在线看| 91福利视频网站| 天天爽夜夜爽夜夜爽精品视频| 欧美日韩一区二区在线观看视频| 亚洲va欧美va天堂v国产综合| 色婷婷久久综合| 亚洲综合男人的天堂| 欧美日韩成人激情| 天堂成人国产精品一区| 欧美日韩精品电影| 九九视频精品免费| 国产丝袜美腿一区二区三区| 成人毛片视频在线观看| 亚洲婷婷在线视频| 欧美日韩夫妻久久| 美国欧美日韩国产在线播放| 中文成人综合网| 日本精品视频一区二区| 性久久久久久久久久久久 | 日本va欧美va瓶| 精品久久久三级丝袜| 国产成人在线免费| 曰韩精品一区二区| 666欧美在线视频| 国产露脸91国语对白| 亚洲猫色日本管| 日韩三级免费观看| 91美女精品福利| 麻豆一区二区在线| 中文字幕 久热精品 视频在线| 日本精品一级二级| 免费国产亚洲视频| 国产精品日日摸夜夜摸av| 91久久香蕉国产日韩欧美9色| 水蜜桃久久夜色精品一区的特点 | 成人一区二区三区| 五月婷婷激情综合| 亚洲欧洲一区二区在线播放| 91麻豆精品国产91久久久资源速度| 国产精品18久久久久久久久| 亚洲图片欧美色图| 国产精品免费av| 日韩久久免费av| 欧美日韩日本视频| 99精品视频在线播放观看| 久久国产精品99久久人人澡| 亚洲综合精品自拍| 国产精品国产三级国产aⅴ入口 | 亚洲免费视频中文字幕| 日韩精品一区在线观看| 欧美日本在线一区| 91免费观看在线| 国产一区二区美女| 视频一区视频二区中文字幕| 亚洲欧美区自拍先锋| 国产日韩欧美精品电影三级在线| 91精品国产色综合久久不卡电影 | 久久99九九99精品| 亚洲v中文字幕| 亚洲一区二区三区爽爽爽爽爽| 国产精品婷婷午夜在线观看| 精品国产免费一区二区三区四区 | 在线免费观看日本欧美| 99久久久国产精品免费蜜臀| 不卡av在线网| 国产一区二区三区四区五区入口| 奇米色一区二区三区四区| 亚洲国产精品人人做人人爽| 亚洲欧美欧美一区二区三区| 国产精品无码永久免费888| 国产亚洲欧美日韩在线一区| 精品久久国产老人久久综合| 7777精品伊人久久久大香线蕉的| 在线看不卡av| 欧美色爱综合网| 欧美色图一区二区三区| 91麻豆文化传媒在线观看| av一区二区不卡| 99久久精品情趣| 99精品在线免费| 色欧美88888久久久久久影院| 日本精品一级二级| 欧美日韩激情在线| 精品精品欲导航| 久久嫩草精品久久久精品一| 久久精品一二三| 中文字幕五月欧美| 亚洲综合无码一区二区| 亚洲成人午夜电影| 美女视频一区在线观看| 国产精品一区二区三区乱码| 成人午夜av电影| 欧美系列亚洲系列| 这里是久久伊人| 久久一区二区视频| 国产精品乱人伦| 亚洲一卡二卡三卡四卡| 久久精品72免费观看| 国产精品一二一区| 99re成人在线| 欧美日韩精品一区二区天天拍小说| 911精品国产一区二区在线| 2014亚洲片线观看视频免费| 自拍偷拍亚洲综合| 男人的天堂久久精品| 成人黄色片在线观看| 在线不卡中文字幕播放| 国产欧美一区二区精品婷婷| 亚洲另类一区二区| 精品一区二区国语对白| 色哟哟国产精品| 日韩免费看网站| 一区二区三区中文在线| 捆绑变态av一区二区三区| 99久久伊人网影院| 欧美一区二区人人喊爽| 中文字幕一区二区三区视频 | www国产精品av| 亚洲福利一二三区| 成人一区二区三区|