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; }
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; }
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; }
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); }