+ fd = mtd_open(mtd);
+ if(fd < 0) {
+ fprintf(stderr, "Could not open mtd device: %s\n", mtd);
+ return 0;
+ }
+
+ if(ioctl(fd, MEMGETINFO, &mtdInfo)) {
+ fprintf(stderr, "Could not get MTD device info from %s\n", mtd);
+ close(fd);
+ return 0;
+ }
+ mtdsize = mtdInfo.size;
+ erasesize = mtdInfo.erasesize;
+
+ return fd;
+}
+
+int mtd_erase_block(int fd, int offset)
+{
+ struct erase_info_user mtdEraseInfo;
+
+ mtdEraseInfo.start = offset;
+ mtdEraseInfo.length = erasesize;
+ ioctl(fd, MEMUNLOCK, &mtdEraseInfo);
+ if (ioctl (fd, MEMERASE, &mtdEraseInfo) < 0) {
+ fprintf(stderr, "Erasing mtd failed.\n");
+ exit(1);
+ }
+}
+
+int mtd_write_buffer(int fd, char *buf, int offset, int length)
+{
+ lseek(fd, offset, SEEK_SET);
+ write(fd, buf, length);
+}
+
+
+#ifdef target_brcm
+static int
+image_check_brcm(int imagefd, const char *mtd)
+{
+ struct trx_header *trx = (struct trx_header *) buf;
+ int fd;
+
+ if (strcmp(mtd, "linux") != 0)
+ return 1;
+