openocd: fix SPDX tag format for files .c
[fw/openocd] / contrib / loaders / flash / at91sam7x / main.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 /***************************************************************************
4  *   Copyright (C) 2007 by Pavel Chromy                                    *
5  *   chromy@asix.cz                                                        *
6  ***************************************************************************/
7 #include "platform.h"
8
9 #include <flash/nor/ocl.h>
10 #include "dcc.h"
11 #include "samflash.h"
12
13
14 #define BUFSIZE 1024 /* words, i.e. 4 KiB */
15 uint32 buffer[1024];
16
17 void cmd_flash(uint32 cmd)
18 {
19         unsigned int len;
20         uint32 adr;
21         uint32 chksum;
22         unsigned int bi; /* buffer index */
23         unsigned int bi_start; /* receive start mark */
24         unsigned int bi_end; /* receive end mark */
25         unsigned int ofs;
26         int pagenum;
27         int result;
28
29         adr = dcc_rd();
30         len = cmd&0xffff;
31         ofs = adr%flash_page_size;
32         bi_start = ofs/4;
33         bi_end = (ofs + len + 3)/4;
34
35         if (bi_end > BUFSIZE) {
36                 dcc_wr(OCL_BUFF_OVER);
37                 return;
38         }
39
40         chksum = OCL_CHKS_INIT;
41         for (bi = 0; bi < bi_end; bi++) chksum^=buffer[bi]=dcc_rd();
42
43         if (dcc_rd() != chksum) {
44                 dcc_wr(OCL_CHKS_FAIL);
45                 return;
46         }
47
48         /* fill in unused positions with unprogrammed values */
49         for (bi = 0; bi < bi_start; bi++) buffer[bi]=0xffffffff;
50         for (bi = bi_end; bi%flash_page_size; bi++) buffer[bi]=0xffffffff;
51
52         result = 0;
53         pagenum = adr/flash_page_size;
54         for (bi = 0; bi < bi_end; bi += flash_page_size/4) {
55                 result = flash_page_program(buffer + bi, pagenum++);
56                 if (result) break;
57         }
58
59         /* verify written data */
60         if (!result) result = flash_verify(adr, len, ((uint8 *)buffer) + ofs);
61
62         dcc_wr(OCL_CMD_DONE | result);
63 }
64
65
66 int main (void)
67 {
68         uint32 cmd;
69
70         for (;;) {
71                 cmd = dcc_rd();
72                 switch (cmd&OCL_CMD_MASK) {
73                         case OCL_PROBE:
74                                 dcc_wr(OCL_CMD_DONE | flash_init());
75                                 dcc_wr(0x100000); /* base */
76                                 dcc_wr(flash_page_count*flash_page_size); /* size */
77                                 dcc_wr(1); /* num_sectors */
78                                 dcc_wr(4096 | ((unsigned long) flash_page_size << 16)); /* buflen and bufalign */
79                                 break;
80                         case OCL_ERASE_ALL:
81                                 dcc_wr(OCL_CMD_DONE | flash_erase_all());
82                                 break;
83                         case OCL_FLASH_BLOCK:
84                                 cmd_flash(cmd);
85                                 break;
86                         default:
87                                 /* unknown command */
88                                 dcc_wr(OCL_CMD_ERR);
89                                 break;
90                 }
91         }
92
93         return 0; /* we shall never get here, just to suppress compiler warning */
94 }