stlink: add support for rw-misc commands
[fw/openocd] / src / jtag / drivers / parport.c
index 103b99106e743ec2dd9fe02f29e07dec0bc5ec17..d50d306d3234b7b11aa95db87a316b45bc2acc71 100644 (file)
@@ -16,9 +16,7 @@
  *   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.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -60,7 +58,7 @@
 /* parallel port cable description
  */
 struct cable {
-       char *name;
+       const char *name;
        uint8_t TDO_MASK;       /* status port bit containing current TDO value */
        uint8_t TRST_MASK;      /* data port bit for TRST */
        uint8_t TMS_MASK;       /* data port bit for TMS */
@@ -74,7 +72,7 @@ struct cable {
        uint8_t LED_MASK;       /* data port bit for LED */
 };
 
-static struct cable cables[] = {
+static const struct cable cables[] = {
        /* name                         tdo   trst  tms   tck   tdi   srst  o_inv i_inv init  exit  led */
        { "wiggler",                    0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x80, 0x00 },
        { "wiggler2",                   0x80, 0x10, 0x02, 0x04, 0x08, 0x01, 0x01, 0x80, 0x80, 0x00, 0x20 },
@@ -95,6 +93,7 @@ static struct cable cables[] = {
        SOFT TDI - Target SRST
 */
        { "altium",                     0x10, 0x20, 0x04, 0x02, 0x01, 0x80, 0x00, 0x00, 0x10, 0x00, 0x08 },
+       { "aspo",                       0x10, 0x01, 0x04, 0x08, 0x02, 0x10, 0x17, 0x00, 0x17, 0x17, 0x00 },
        { NULL,                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 };
 
@@ -107,7 +106,7 @@ static int wait_states;
 
 /* interface variables
  */
-static struct cable *cable;
+static const struct cable *cable;
 static uint8_t dataport_value;
 
 #if PARPORT_USE_PPDEV == 1
@@ -117,7 +116,7 @@ static unsigned long dataport;
 static unsigned long statusport;
 #endif
 
-static int parport_read(void)
+static bb_value_t parport_read(void)
 {
        int data = 0;
 
@@ -128,9 +127,9 @@ static int parport_read(void)
 #endif
 
        if ((data ^ cable->INPUT_INVERT) & cable->TDO_MASK)
-               return 1;
+               return BB_HIGH;
        else
-               return 0;
+               return BB_LOW;
 }
 
 static inline void parport_write_data(void)
@@ -149,7 +148,7 @@ static inline void parport_write_data(void)
 #endif
 }
 
-static void parport_write(int tck, int tms, int tdi)
+static int parport_write(int tck, int tms, int tdi)
 {
        int i = wait_states + 1;
 
@@ -170,10 +169,12 @@ static void parport_write(int tck, int tms, int tdi)
 
        while (i-- > 0)
                parport_write_data();
+
+       return ERROR_OK;
 }
 
 /* (1) assert or (0) deassert reset lines */
-static void parport_reset(int trst, int srst)
+static int parport_reset(int trst, int srst)
 {
        LOG_DEBUG("trst: %i, srst: %i", trst, srst);
 
@@ -188,10 +189,12 @@ static void parport_reset(int trst, int srst)
                dataport_value &= ~cable->SRST_MASK;
 
        parport_write_data();
+
+       return ERROR_OK;
 }
 
 /* turn LED on parport adapter on (1) or off (0) */
-static void parport_led(int on)
+static int parport_led(int on)
 {
        if (on)
                dataport_value |= cable->LED_MASK;
@@ -199,6 +202,8 @@ static void parport_led(int on)
                dataport_value &= ~cable->LED_MASK;
 
        parport_write_data();
+
+       return ERROR_OK;
 }
 
 static int parport_speed(int speed)
@@ -232,7 +237,7 @@ static int parport_get_giveio_access(void)
        HANDLE h;
        OSVERSIONINFO version;
 
-       version.dwOSVersionInfoSize = sizeof version;
+       version.dwOSVersionInfoSize = sizeof(version);
        if (!GetVersionEx(&version)) {
                errno = EINVAL;
                return -1;
@@ -255,20 +260,19 @@ static int parport_get_giveio_access(void)
 static struct bitbang_interface parport_bitbang = {
                .read = &parport_read,
                .write = &parport_write,
-               .reset = &parport_reset,
                .blink = &parport_led,
        };
 
 static int parport_init(void)
 {
-       struct cable *cur_cable;
+       const struct cable *cur_cable;
 #if PARPORT_USE_PPDEV == 1
        char buffer[256];
 #endif
 
        cur_cable = cables;
 
-       if (parport_cable == NULL) {
+       if (!parport_cable) {
                parport_cable = strdup("wiggler");
                LOG_WARNING("No parport cable specified, using default 'wiggler'");
        }
@@ -366,9 +370,12 @@ static int parport_init(void)
 
 #endif /* PARPORT_USE_PPDEV */
 
-       parport_reset(0, 0);
-       parport_write(0, 0, 0);
-       parport_led(1);
+       if (parport_reset(0, 0) != ERROR_OK)
+               return ERROR_FAIL;
+       if (parport_write(0, 0, 0) != ERROR_OK)
+               return ERROR_FAIL;
+       if (parport_led(1) != ERROR_OK)
+               return ERROR_FAIL;
 
        bitbang_interface = &parport_bitbang;
 
@@ -377,17 +384,16 @@ static int parport_init(void)
 
 static int parport_quit(void)
 {
-       parport_led(0);
+       if (parport_led(0) != ERROR_OK)
+               return ERROR_FAIL;
 
        if (parport_exit) {
                dataport_value = cable->PORT_EXIT;
                parport_write_data();
        }
 
-       if (parport_cable) {
-               free(parport_cable);
-               parport_cable = NULL;
-       }
+       free(parport_cable);
+       parport_cable = NULL;
 
        return ERROR_OK;
 }
@@ -404,7 +410,7 @@ COMMAND_HANDLER(parport_handle_parport_port_command)
                }
        }
 
-       command_print(CMD_CTX, "parport port = 0x%" PRIx16 "", parport_port);
+       command_print(CMD, "parport port = 0x%" PRIx16 "", parport_port);
 
        return ERROR_OK;
 }
@@ -442,7 +448,7 @@ COMMAND_HANDLER(parport_handle_parport_toggling_time_command)
                uint32_t ns;
                int retval = parse_u32(CMD_ARGV[0], &ns);
 
-               if (ERROR_OK != retval)
+               if (retval != ERROR_OK)
                        return retval;
 
                if (ns == 0) {
@@ -461,15 +467,15 @@ COMMAND_HANDLER(parport_handle_parport_toggling_time_command)
                }
        }
 
-       command_print(CMD_CTX, "parport toggling time = %" PRIu32 " ns",
+       command_print(CMD, "parport toggling time = %" PRIu32 " ns",
                        parport_toggling_time_ns);
 
        return ERROR_OK;
 }
 
-static const struct command_registration parport_command_handlers[] = {
+static const struct command_registration parport_subcommand_handlers[] = {
        {
-               .name = "parport_port",
+               .name = "port",
                .handler = parport_handle_parport_port_command,
                .mode = COMMAND_CONFIG,
                .help = "Display the address of the I/O port (e.g. 0x378) "
@@ -478,7 +484,7 @@ static const struct command_registration parport_command_handlers[] = {
                .usage = "[port_number]",
        },
        {
-               .name = "parport_cable",
+               .name = "cable",
                .handler = parport_handle_parport_cable_command,
                .mode = COMMAND_CONFIG,
                .help = "Set the layout of the parallel port cable "
@@ -487,7 +493,7 @@ static const struct command_registration parport_command_handlers[] = {
                .usage = "[layout]",
        },
        {
-               .name = "parport_write_on_exit",
+               .name = "write_on_exit",
                .handler = parport_handle_write_on_exit_command,
                .mode = COMMAND_CONFIG,
                .help = "Configure the parallel driver to write "
@@ -495,7 +501,7 @@ static const struct command_registration parport_command_handlers[] = {
                .usage = "('on'|'off')",
        },
        {
-               .name = "parport_toggling_time",
+               .name = "toggling_time",
                .handler = parport_handle_parport_toggling_time_command,
                .mode = COMMAND_CONFIG,
                .help = "Displays or assigns how many nanoseconds it "
@@ -505,15 +511,33 @@ static const struct command_registration parport_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct jtag_interface parport_interface = {
-       .name = "parport",
+static const struct command_registration parport_command_handlers[] = {
+       {
+               .name = "parport",
+               .mode = COMMAND_ANY,
+               .help = "perform parport management",
+               .chain = parport_subcommand_handlers,
+               .usage = "",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+static struct jtag_interface parport_interface = {
        .supported = DEBUG_CAP_TMS_SEQ,
+       .execute_queue = bitbang_execute_queue,
+};
+
+struct adapter_driver parport_adapter_driver = {
+       .name = "parport",
+       .transports = jtag_only,
        .commands = parport_command_handlers,
 
        .init = parport_init,
        .quit = parport_quit,
+       .reset = parport_reset,
+       .speed = parport_speed,
        .khz = parport_khz,
        .speed_div = parport_speed_div,
-       .speed = parport_speed,
-       .execute_queue = bitbang_execute_queue,
+
+       .jtag_ops = &parport_interface,
 };