]> git.sur5r.net Git - openocd/blob - src/flash/ocl/at91sam7x/dcc.c
Pavel Chromy's on chip flash loader
[openocd] / src / flash / ocl / at91sam7x / dcc.c
1 /***************************************************************************\r
2  *   Copyright (C) 2007 by Pavel Chromy                                    *\r
3  *   chromy@asix.cz                                                        *\r
4  *                                                                         *\r
5  *   This program is free software; you can redistribute it and/or modify  *\r
6  *   it under the terms of the GNU General Public License as published by  *\r
7  *   the Free Software Foundation; either version 2 of the License, or     *\r
8  *   (at your option) any later version.                                   *\r
9  *                                                                         *\r
10  *   This program is distributed in the hope that it will be useful,       *\r
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
13  *   GNU General Public License for more details.                          *\r
14  *                                                                         *\r
15  *   You should have received a copy of the GNU General Public License     *\r
16  *   along with this program; if not, write to the                         *\r
17  *   Free Software Foundation, Inc.,                                       *\r
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
19  ***************************************************************************/\r
20 #include "dcc.h"\r
21 \r
22 \r
23 /* debug channel read (debugger->MCU) */\r
24 uint32 dcc_rd(void)\r
25 {\r
26         volatile uint32 dcc_reg;\r
27 \r
28         do {\r
29                 asm volatile ("mrc p14, 0, %0, C0, C0" : "=r" (dcc_reg) : );\r
30         } while ((dcc_reg&1)==0);\r
31 \r
32         asm volatile ("mrc p14, 0, %0, C1, C0" : "=r" (dcc_reg) : );\r
33         return dcc_reg;\r
34 }\r
35 \r
36 \r
37 /* debug channel write (MCU->debugger) */\r
38 int dcc_wr(uint32 data)\r
39 {\r
40         volatile uint32 dcc_reg;\r
41 \r
42         do {\r
43                 asm volatile ("mrc p14, 0, %0, C0, C0" : "=r" (dcc_reg) : );\r
44                 /* operation controled by master, cancel operation\r
45                          upon reception of data for immediate response */\r
46                 if (dcc_reg&1) return -1;\r
47         } while (dcc_reg&2);\r
48 \r
49         asm volatile ("mcr p14, 0, %0, C1, C0" : : "r" (data));\r
50         return 0;\r
51 }\r