fea88f6a129c3af814350fae32e06759534552a2
[fw/openocd] / contrib / loaders / flash / at91sam7x / dcc.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 "dcc.h"
8
9
10 /* debug channel read (debugger->MCU) */
11 uint32 dcc_rd(void)
12 {
13         volatile uint32 dcc_reg;
14
15         do {
16                 asm volatile ("mrc p14, 0, %0, C0, C0" : "=r" (dcc_reg) :);
17         } while ((dcc_reg&1) == 0);
18
19         asm volatile ("mrc p14, 0, %0, C1, C0" : "=r" (dcc_reg) :);
20         return dcc_reg;
21 }
22
23
24 /* debug channel write (MCU->debugger) */
25 int dcc_wr(uint32 data)
26 {
27         volatile uint32 dcc_reg;
28
29         do {
30                 asm volatile ("mrc p14, 0, %0, C0, C0" : "=r" (dcc_reg) :);
31                 /* operation controlled by master, cancel operation
32                          upon reception of data for immediate response */
33                 if (dcc_reg&1) return -1;
34         } while (dcc_reg&2);
35
36         asm volatile ("mcr p14, 0, %0, C1, C0" : : "r" (data));
37         return 0;
38 }