drivers/vdebug: add support for DAP level interface
[fw/openocd] / src / jtag / drivers / at91rm9200.c
index 3bba368fab6f5335027493146421fa29bbe7cd82..cc61e9a2231c45dce98902a6d52a7a92b4853de4 100644 (file)
@@ -1,21 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
 /***************************************************************************
  *   Copyright (C) 2006 by Anders Larsen                                   *
  *   al@alarsen.net                                                        *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -79,7 +66,7 @@
 #define P31    (1 << 31)
 
 struct device_t {
-       char *name;
+       const char *name;
        int TDO_PIO;    /* PIO holding TDO */
        uint32_t TDO_MASK;      /* TDO bitmask */
        int TRST_PIO;   /* PIO holding TRST */
@@ -94,7 +81,7 @@ struct device_t {
        uint32_t SRST_MASK;     /* SRST bitmask */
 };
 
-static struct device_t devices[] = {
+static const struct device_t devices[] = {
        { "rea_ecr", PIOD, P27, PIOA, NC, PIOD, P23, PIOD, P24, PIOD, P26, PIOC, P5 },
        { .name = NULL },
 };
@@ -104,34 +91,31 @@ static char *at91rm9200_device;
 
 /* interface variables
  */
-static struct device_t *device;
+static const struct device_t *device;
 static int dev_mem_fd;
 static void *sys_controller;
 static uint32_t *pio_base;
 
 /* low level command set
  */
-static int at91rm9200_read(void);
-static void at91rm9200_write(int tck, int tms, int tdi);
-static void at91rm9200_reset(int trst, int srst);
+static bb_value_t at91rm9200_read(void);
+static int at91rm9200_write(int tck, int tms, int tdi);
 
-static int at91rm9200_speed(int speed);
 static int at91rm9200_init(void);
 static int at91rm9200_quit(void);
 
 static struct bitbang_interface at91rm9200_bitbang = {
        .read = at91rm9200_read,
        .write = at91rm9200_write,
-       .reset = at91rm9200_reset,
        .blink = 0
 };
 
-static int at91rm9200_read(void)
+static bb_value_t at91rm9200_read(void)
 {
-       return (pio_base[device->TDO_PIO + PIO_PDSR] & device->TDO_MASK) != 0;
+       return (pio_base[device->TDO_PIO + PIO_PDSR] & device->TDO_MASK) ? BB_HIGH : BB_LOW;
 }
 
-static void at91rm9200_write(int tck, int tms, int tdi)
+static int at91rm9200_write(int tck, int tms, int tdi)
 {
        if (tck)
                pio_base[device->TCK_PIO + PIO_SODR] = device->TCK_MASK;
@@ -147,10 +131,12 @@ static void at91rm9200_write(int tck, int tms, int tdi)
                pio_base[device->TDI_PIO + PIO_SODR] = device->TDI_MASK;
        else
                pio_base[device->TDI_PIO + PIO_CODR] = device->TDI_MASK;
+
+       return ERROR_OK;
 }
 
 /* (1) assert or (0) deassert reset lines */
-static void at91rm9200_reset(int trst, int srst)
+static int at91rm9200_reset(int trst, int srst)
 {
        if (trst == 0)
                pio_base[device->TRST_PIO + PIO_SODR] = device->TRST_MASK;
@@ -161,10 +147,6 @@ static void at91rm9200_reset(int trst, int srst)
                pio_base[device->SRST_PIO + PIO_SODR] = device->SRST_MASK;
        else if (srst == 1)
                pio_base[device->SRST_PIO + PIO_CODR] = device->SRST_MASK;
-}
-
-static int at91rm9200_speed(int speed)
-{
 
        return ERROR_OK;
 }
@@ -188,27 +170,35 @@ static const struct command_registration at91rm9200_command_handlers[] = {
                .name = "at91rm9200_device",
                .handler = &at91rm9200_handle_device_command,
                .mode = COMMAND_CONFIG,
-               .help = "query armjtagew info",
+               .help = "Set at91rm9200 device [default \"rea_ecr\"]",
+               .usage = "<device>",
        },
        COMMAND_REGISTRATION_DONE
 };
 
-struct jtag_interface at91rm9200_interface = {
-       .name = "at91rm9200",
+static struct jtag_interface at91rm9200_interface = {
        .execute_queue = bitbang_execute_queue,
-       .speed = at91rm9200_speed,
+};
+
+struct adapter_driver at91rm9200_adapter_driver = {
+       .name = "at91rm9200",
+       .transports = jtag_only,
        .commands = at91rm9200_command_handlers,
+
        .init = at91rm9200_init,
        .quit = at91rm9200_quit,
+       .reset = at91rm9200_reset,
+
+       .jtag_ops = &at91rm9200_interface,
 };
 
 static int at91rm9200_init(void)
 {
-       struct device_t *cur_device;
+       const struct device_t *cur_device;
 
        cur_device = devices;
 
-       if (at91rm9200_device == NULL || at91rm9200_device[0] == 0) {
+       if (!at91rm9200_device || at91rm9200_device[0] == 0) {
                at91rm9200_device = "rea_ecr";
                LOG_WARNING("No at91rm9200 device specified, using default 'rea_ecr'");
        }
@@ -230,14 +220,14 @@ static int at91rm9200_init(void)
 
        dev_mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
        if (dev_mem_fd < 0) {
-               perror("open");
+               LOG_ERROR("open: %s", strerror(errno));
                return ERROR_JTAG_INIT_FAILED;
        }
 
        sys_controller = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
                                MAP_SHARED, dev_mem_fd, AT91C_BASE_SYS);
        if (sys_controller == MAP_FAILED) {
-               perror("mmap");
+               LOG_ERROR("mmap: %s", strerror(errno));
                close(dev_mem_fd);
                return ERROR_JTAG_INIT_FAILED;
        }