<commit_before>/* -*- tab-width:8 -*- */

/*
 Copyright (C)  2011 <NAME> <<EMAIL>>
 Use of this source code is governed by a BSD-style
 license that can be found in the LICENSE file.
*/

#include <getopt.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>

#include <stlink-common.h>

#include "gdb-remote.h"

#define DEFAULT_LOGGING_LEVEL 100
#define DEFAULT_GDB_LISTEN_PORT 4242

#define STRINGIFY_inner(name) #name
#define STRINGIFY(name) STRINGIFY_inner(name)

#define FLASH_BASE 0x08000000
#define FLASH_PAGE (sl->flash_pgsz)
#define FLASH_PAGE_MASK (~((1 << 10) - 1))
#define FLASH_SIZE (FLASH_PAGE * 128)

static const char hex[] = "0123456789abcdef";

static const char* current_memory_map = NULL;

/*
 * Chip IDs are explained in the appropriate programming manual for the
 * DBGMCU_IDCODE register (0xE0042000)
 */

#define CORE_M3_R1 0x1BA00477
#define CORE_M3_R2 0x4BA00477
#define CORE_M4_R0 0x2BA01477

typedef struct _st_state_t {
    // things from command line, bleh
    int stlink_version;
    // "/dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTE531X6-if00-port0" is only 58 chars
    char devicename[100];
    int logging_level;
	int listen_port;
} st_state_t;


int serve(stlink_t *sl, int port);
char* make_memory_map(stlink_t *sl);


int parse_options(int argc, char** argv, st_state_t *st) {
    static struct option long_options[] = {
        {"help", no_argument, NULL, 'h'},
        {"verbose", optional_argument, NULL, 'v'},
        {"device", required_argument, NULL, 'd'},
        {"stlink_version", required_argument, NULL, 's'},
        {"stlinkv1", no_argument, NULL, '1'},
		{"listen_port", required_argument, NULL, 'p'},
        {0, 0, 0, 0},
    };
	const char * help_str = "%s - usage:\n\n"
	"  -h, --help\t\tPrint this help\n"
	"  -vXX, --verbose=XX\tspecify a specific verbosity level (0..99)\n"
	"  -v, --verbose\tspecify generally verbose logging\n"
	"  -d <device>, --device=/dev/stlink2_1\n"
	"\t\t\tWhere is your stlink device connected?\n"
	"  -s X, --stlink_version=X\n"
	"\t\t\tChoose what version of stlink to use, (defaults to 2)\n"
	"  -1, --stlinkv1\tForce stlink version 1\n"
	"  -p 4242, --listen_port=1234\n"
	"\t\t\tSet the gdb server listen port. "
	"(default port: " STRINGIFY(DEFAULT_GDB_LISTEN_PORT) ")\n"
	;


    int option_index = 0;
    int c;
    int q;
    while ((c = getopt_long(argc, argv, "hv::d:s:1p:", long_options, &option_index)) != -1) {
        switch (c) {
        case 0:
            printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n");
            printf("option %s", long_options[option_index].name);
            if (optarg) {
                printf(" with arg %s", optarg);
            }
            printf("\n");
            break;
        case 'h':
            printf(help_str, argv[0]);
            exit(EXIT_SUCCESS);
            break;
        case 'v':
            if (optarg) {
                st->logging_level = atoi(optarg);
            } else {
                st->logging_level = DEFAULT_LOGGING_LEVEL;
            }
            break;
        case 'd':
            if (strlen(optarg) > sizeof (st->devicename)) {
                fprintf(stderr, "device name too long: %zd\n", strlen(optarg));
            } else {
                strcpy(st->devicename, optarg);
            }
            break;
		case '1':
			st->stlink_version = 1;
			break;
		case 's':
			sscanf(optarg, "%i", &q);
			if (q < 0 || q > 2) {
				fprintf(stderr, "stlink version %d unknown!\n", q);
				exit(EXIT_FAILURE);
			}
			st->stlink_version = q;
			break;
		case 'p':
			sscanf(optarg, "%i", &q);
			if (q < 0) {
				fprintf(stderr, "Can't use a negative port to listen on: %d\n", q);
				exit(EXIT_FAILURE);
			}
			st->listen_port = q;
			break;
        }
    }

    if (optind < argc) {
        printf("non-option ARGV-elements: ");
        while (optind < argc)
            printf("%s ", argv[optind++]);
        printf("\n");
    }
    return 0;
}


int main(int argc, char** argv) {

	stlink_t *sl = NULL;

	st_state_t state;
	memset(&state, 0, sizeof(state));
	// set defaults...
	state.stlink_version = 2;
	state.logging_level = DEFAULT_LOGGING_LEVEL;
	state.listen_port = DEFAULT_GDB_LISTEN_PORT;
	parse_options(argc, argv, &state);
	switch (state.stlink_version) {
	case 2:
		sl = stlink_open_usb(state.logging_level);
		if(sl == NULL) return 1;
		break;
	case 1:
		sl = stlink_v1_open(state.logging_level);
		if(sl == NULL) return 1;
		break;
    }
    
    // ALLLL of this should move into "stlink_open_xxx"

    if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) {
        if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) {
            stlink_exit_dfu_mode(sl);
        }
        stlink_enter_swd_mode(sl);
    }

	uint32_t chip_id = stlink_chip_id(sl);
	uint32_t core_id = stlink_core_id(sl);

	/* Fix chip_id for F4 */
	if (((chip_id & 0xFFF) == 0x411) && (core_id == CORE_M4_R0)) {<commit_msg>Turn down default logging level.<commit_after>/* -*- tab-width:8 -*- */

/*
 Copyright (C)  2011 <NAME> <<EMAIL>>
 Use of this source code is governed by a BSD-style
 license that can be found in the LICENSE file.
*/

#include <getopt.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>

#include <stlink-common.h>

#include "gdb-remote.h"

#define DEFAULT_LOGGING_LEVEL 50
#define DEFAULT_GDB_LISTEN_PORT 4242

#define STRINGIFY_inner(name) #name
#define STRINGIFY(name) STRINGIFY_inner(name)

#define FLASH_BASE 0x08000000
#define FLASH_PAGE (sl->flash_pgsz)
#define FLASH_PAGE_MASK (~((1 << 10) - 1))
#define FLASH_SIZE (FLASH_PAGE * 128)

static const char hex[] = "0123456789abcdef";

static const char* current_memory_map = NULL;

/*
 * Chip IDs are explained in the appropriate programming manual for the
 * DBGMCU_IDCODE register (0xE0042000)
 */

#define CORE_M3_R1 0x1BA00477
#define CORE_M3_R2 0x4BA00477
#define CORE_M4_R0 0x2BA01477

typedef struct _st_state_t {
    // things from command line, bleh
    int stlink_version;
    // "/dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTE531X6-if00-port0" is only 58 chars
    char devicename[100];
    int logging_level;
	int listen_port;
} st_state_t;


int serve(stlink_t *sl, int port);
char* make_memory_map(stlink_t *sl);


int parse_options(int argc, char** argv, st_state_t *st) {
    static struct option long_options[] = {
        {"help", no_argument, NULL, 'h'},
        {"verbose", optional_argument, NULL, 'v'},
        {"device", required_argument, NULL, 'd'},
        {"stlink_version", required_argument, NULL, 's'},
        {"stlinkv1", no_argument, NULL, '1'},
		{"listen_port", required_argument, NULL, 'p'},
        {0, 0, 0, 0},
    };
	const char * help_str = "%s - usage:\n\n"
	"  -h, --help\t\tPrint this help\n"
	"  -vXX, --verbose=XX\tspecify a specific verbosity level (0..99)\n"
	"  -v, --verbose\tspecify generally verbose logging\n"
	"  -d <device>, --device=/dev/stlink2_1\n"
	"\t\t\tWhere is your stlink device connected?\n"
	"  -s X, --stlink_version=X\n"
	"\t\t\tChoose what version of stlink to use, (defaults to 2)\n"
	"  -1, --stlinkv1\tForce stlink version 1\n"
	"  -p 4242, --listen_port=1234\n"
	"\t\t\tSet the gdb server listen port. "
	"(default port: " STRINGIFY(DEFAULT_GDB_LISTEN_PORT) ")\n"
	;


    int option_index = 0;
    int c;
    int q;
    while ((c = getopt_long(argc, argv, "hv::d:s:1p:", long_options, &option_index)) != -1) {
        switch (c) {
        case 0:
            printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n");
            printf("option %s", long_options[option_index].name);
            if (optarg) {
                printf(" with arg %s", optarg);
            }
            printf("\n");
            break;
        case 'h':
            printf(help_str, argv[0]);
            exit(EXIT_SUCCESS);
            break;
        case 'v':
            if (optarg) {
                st->logging_level = atoi(optarg);
            } else {
                st->logging_level = DEFAULT_LOGGING_LEVEL;
            }
            break;
        case 'd':
            if (strlen(optarg) > sizeof (st->devicename)) {
                fprintf(stderr, "device name too long: %zd\n", strlen(optarg));
            } else {
                strcpy(st->devicename, optarg);
            }
            break;
		case '1':
			st->stlink_version = 1;
			break;
		case 's':
			sscanf(optarg, "%i", &q);
			if (q < 0 || q > 2) {
				fprintf(stderr, "stlink version %d unknown!\n", q);
				exit(EXIT_FAILURE);
			}
			st->stlink_version = q;
			break;
		case 'p':
			sscanf(optarg, "%i", &q);
			if (q < 0) {
				fprintf(stderr, "Can't use a negative port to listen on: %d\n", q);
				exit(EXIT_FAILURE);
			}
			st->listen_port = q;
			break;
        }
    }

    if (optind < argc) {
        printf("non-option ARGV-elements: ");
        while (optind < argc)
            printf("%s ", argv[optind++]);
        printf("\n");
    }
    return 0;
}


int main(int argc, char** argv) {

	stlink_t *sl = NULL;

	st_state_t state;
	memset(&state, 0, sizeof(state));
	// set defaults...
	state.stlink_version = 2;
	state.logging_level = DEFAULT_LOGGING_LEVEL;
	state.listen_port = DEFAULT_GDB_LISTEN_PORT;
	parse_options(argc, argv, &state);
	switch (state.stlink_version) {
	case 2:
		sl = stlink_open_usb(state.logging_level);
		if(sl == NULL) return 1;
		break;
	case 1:
		sl = stlink_v1_open(state.logging_level);
		if(sl == NULL) return 1;
		break;
    }
    
	uint32_t chip_id = sl->chip_id;
	uint32_t core_id = sl->core_id;

	/* Fix chip_id for F4 */
	if (((chip_id & 0xFFF) == 0x411) && (core_id == CORE_M4_R0)) {
{'fraction_non_alphanumeric': 0.1462747085656361, 'fraction_numerical': 0.02889001520527116, 'mean_word_length': 2.72583081570997, 'pattern_counts': {'":': 0, '<': 45, '<?xml version=': 0, '>': 55, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3587906', 'n_tokens_mistral': 3961, 'n_tokens_neox': 3665, 'n_words': 893}