static int validate_flash_release(struct inode *inode, struct file *file)
{
	struct rtas_validate_flash_t *const args_buf =
		&rtas_validate_flash_data;

	mutex_lock(&rtas_validate_flash_mutex);

	if (args_buf->status == VALIDATE_READY) {
		args_buf->buf_size = VALIDATE_BUF_SIZE;
		validate_flash(args_buf);
	}

	mutex_unlock(&rtas_validate_flash_mutex);
	return 0;
}
Ejemplo n.º 2
0
static int validate_flash_release(struct inode *inode, struct file *file)
{
	struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode);
	struct rtas_validate_flash_t *args_buf;

	args_buf = (struct rtas_validate_flash_t *) dp->data;

	if (args_buf->status == VALIDATE_READY) {
		args_buf->buf_size = VALIDATE_BUF_SIZE;
		validate_flash(args_buf);
	}

	atomic_dec(&dp->count);

	return 0;
}
Ejemplo n.º 3
0
static int validate_flash_release(struct inode *inode, struct file *file)
{
	struct proc_dir_entry *dp = PDE(file_inode(file));
	struct rtas_validate_flash_t *args_buf;

	args_buf = (struct rtas_validate_flash_t *) dp->data;

	if (args_buf->status == VALIDATE_READY) {
		args_buf->buf_size = VALIDATE_BUF_SIZE;
		validate_flash(args_buf);
	}

	/* The matching atomic_inc was in rtas_excl_open() */
	atomic_dec(&dp->count);

	return 0;
}
Ejemplo n.º 4
0
void flash(char *file, unsigned char skip_validation) {
	FILE *fp;
	long flash_length;
	char *flash_data;
	struct mpsse_context *mpsse;

	printf("reading input file..");
	fflush(stdout);

	fp = fopen(file, "r");
	if (!fp) {
		printf("failed!\n");
		fprintf(stderr, "error: could not open '%s'", file);
		exit(1);
	}

	fseek(fp, 0L, SEEK_END);
	flash_length = ftell(fp);

	if (!flash_length) {
		printf("failed!\n");
		fprintf(stderr, "error: file length was 0 bytes\n");
		fclose(fp);
		exit(1);
	}

	if (flash_length > N25Q128A_TOTAL_BYTES) {
		printf("failed!\n");
		fprintf(stderr, "error: file length exceeds flash capacity\n");
		fclose(fp);
		exit(1);
	}

	rewind(fp);

	flash_data = (char *)malloc(flash_length * sizeof(char));

	if (!flash_data) {
		printf("failed!\n");
		fprintf(stderr, "error: could not allocate memory");
		fclose(fp);
		exit(1);
	}

	if (fread(flash_data, 1, flash_length, fp) != flash_length) {
		printf("failed!\n");
		fprintf(stderr, "error: could not read entire file");
		free(flash_data);
		fclose(fp);
		exit(1);
	}

	fclose(fp);

	printf("\n");

	mpsse = initialize_mpsse();

	if (!mpsse)
		exit(1);

	printf("flashing chip..");
	fflush(stdout);

	if (set_spartan_program_b(mpsse, 0) != MPSSE_OK)
		goto program_b_error;
	if (erase_flash(mpsse) != MPSSE_OK)
		goto error;
	if (program_flash(mpsse, flash_data, flash_length) != MPSSE_OK)
		goto error;

	if (!skip_validation) {
		unsigned char matched;
		printf("\nvalidating..");
		fflush(stdout);
		if (validate_flash(mpsse, flash_data, flash_length,
			     &matched) != MPSSE_OK)
			goto error;
		if (!matched) {
			printf("failed!\n");
			fprintf(stderr, "error: flash mismatch\n");
			goto validation_error;
		}
	}

	printf("success!\n");
	if (set_spartan_program_b(mpsse, 1) != MPSSE_OK)
		goto program_b_error_quiet;
	free(flash_data);
	Close(mpsse);
	return;

error:
	printf("failed!\n");
	fprintf(stderr, "mpsse error: %s\n", ErrorString(mpsse));
validation_error:
	if (set_spartan_program_b(mpsse, 1) != MPSSE_OK)
		goto program_b_error_quiet;
	free(flash_data);
	Close(mpsse);
	exit(1);
program_b_error:
	printf("failed!\n");
program_b_error_quiet:
	fprintf(stderr, "error: unable to change PROGRAM_B pin!\n");
	fprintf(stderr, "mpsse error: %s\n", ErrorString(mpsse));
	free(flash_data);
	Close(mpsse);
	exit(1);
}