flash/nor/stm32l4x: Remove redundant error messages
[openocd.git] / src / pld / lattice_bit.c
blob796adce975dec959a05a18fdcc4503c0cf9c70a5
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2022 by Daniel Anselmi *
5 * danselmi@gmx.ch *
6 ***************************************************************************/
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif
11 #include "lattice_bit.h"
12 #include "raw_bit.h"
13 #include "pld.h"
14 #include <helper/system.h>
15 #include <helper/log.h>
16 #include <helper/binarybuffer.h>
18 enum read_bit_state {
19 SEEK_HEADER_START,
20 SEEK_HEADER_END,
21 SEEK_PREAMBLE,
22 SEEK_ID,
23 DONE,
26 static int lattice_read_bit_file(struct lattice_bit_file *bit_file, const char *filename, enum lattice_family_e family)
28 int retval = cpld_read_raw_bit_file(&bit_file->raw_bit, filename);
29 if (retval != ERROR_OK)
30 return retval;
32 bit_file->part = NULL;
33 bit_file->has_id = false;
34 enum read_bit_state state = SEEK_HEADER_START;
35 for (size_t pos = 1; pos < bit_file->raw_bit.length && state != DONE; ++pos) {
36 switch (state) {
37 case SEEK_HEADER_START:
38 if (bit_file->raw_bit.data[pos] == 0 && bit_file->raw_bit.data[pos - 1] == 0xff)
39 state = SEEK_HEADER_END;
40 break;
41 case SEEK_HEADER_END:
42 if (pos + 6 < bit_file->raw_bit.length &&
43 strncmp((const char *)(bit_file->raw_bit.data + pos), "Part: ", 6) == 0) {
44 bit_file->part = (const char *)bit_file->raw_bit.data + pos + 6;
45 LOG_INFO("part found: %s\n", bit_file->part);
46 } else if (bit_file->raw_bit.data[pos] == 0xff && bit_file->raw_bit.data[pos - 1] == 0) {
47 bit_file->offset = pos;
48 state = (family != LATTICE_ECP2 && family != LATTICE_ECP3) ? SEEK_PREAMBLE : DONE;
50 break;
51 case SEEK_PREAMBLE:
52 if (pos >= 4) {
53 uint32_t preamble = be_to_h_u32(bit_file->raw_bit.data + pos - 3);
54 switch (preamble) {
55 case 0xffffbdb3:
56 state = SEEK_ID;
57 break;
58 case 0xffffbfb3:
59 case 0xffffbeb3:
60 state = DONE;
61 break;
64 break;
65 case SEEK_ID:
66 if (pos + 7 < bit_file->raw_bit.length && bit_file->raw_bit.data[pos] == 0xe2) {
67 bit_file->idcode = be_to_h_u32(&bit_file->raw_bit.data[pos + 4]);
68 bit_file->has_id = true;
69 state = DONE;
71 break;
72 default:
73 break;
77 if (state != DONE) {
78 LOG_ERROR("parsing bitstream failed");
79 return ERROR_PLD_FILE_LOAD_FAILED;
82 for (size_t i = bit_file->offset; i < bit_file->raw_bit.length; i++)
83 bit_file->raw_bit.data[i] = flip_u32(bit_file->raw_bit.data[i], 8);
85 return ERROR_OK;
88 int lattice_read_file(struct lattice_bit_file *bit_file, const char *filename, enum lattice_family_e family)
90 if (!filename || !bit_file)
91 return ERROR_COMMAND_SYNTAX_ERROR;
93 /* check if binary .bin or ascii .bit/.hex */
94 const char *file_suffix_pos = strrchr(filename, '.');
95 if (!file_suffix_pos) {
96 LOG_ERROR("Unable to detect filename suffix");
97 return ERROR_PLD_FILE_LOAD_FAILED;
100 if (strcasecmp(file_suffix_pos, ".bit") == 0)
101 return lattice_read_bit_file(bit_file, filename, family);
103 LOG_ERROR("Filetype not supported");
104 return ERROR_PLD_FILE_LOAD_FAILED;