summaryrefslogtreecommitdiff
path: root/avr/cmd_boot.c
diff options
context:
space:
mode:
authorLeo C2014-10-15 23:44:26 +0200
committerLeo C2014-10-15 23:44:26 +0200
commit8f23e84c6a08a384d25582f9cf79c4f5549bc852 (patch)
treed1543d82c228a1fcdfae21d2d88c88d0317a9a63 /avr/cmd_boot.c
parent70c994914510f9db3ff71373cb96f50ee1669446 (diff)
downloadz180-stamp-8f23e84c6a08a384d25582f9cf79c4f5549bc852.zip
Code reorg and cleanup
Diffstat (limited to 'avr/cmd_boot.c')
-rw-r--r--avr/cmd_boot.c449
1 files changed, 1 insertions, 448 deletions
diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c
index 1213365..17ed746 100644
--- a/avr/cmd_boot.c
+++ b/avr/cmd_boot.c
@@ -4,18 +4,11 @@
*/
#include "common.h"
#include <stdlib.h>
-#include <limits.h>
-#include <ctype.h>
-#include <string.h>
-#include <util/delay.h>
#include <avr/pgmspace.h>
#include "command.h"
-#include "getopt-min.h"
-#include "env.h"
#include "z80-if.h"
-#include "pin.h"
-#include "debug.h"
+//#include "debug.h"
/* ugly hack to get Z180 loadfile into flash memory */
#define const const FLASH
@@ -150,443 +143,3 @@ command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
return CMD_RET_SUCCESS;
}
-#if 0
-command_ret_t do_clock(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
-{
- long freq;
- char *endp;
-
- (void) cmdtp; (void) flag;
-
- if (argc == 2) {
- if (toupper(argv[1][0]) == 'L')
- freq = 0;
- else if (toupper(argv[1][0]) == 'H')
- freq = LONG_MAX;
- else {
- freq = strtol(argv[1], &endp, 10);
- switch (*endp) {
- case 'M':
- freq *= 1000;
- case 'K':
- freq *= 1000;
- endp++;
- case '\0':
- if (*endp == '\0')
- break;
- default:
- printf_P(PSTR("invalid value\n"));
- return CMD_RET_USAGE;
- }
-
- if (freq == 0) {
- printf_P(PSTR("CPU clock cannot be 0\n"));
- return CMD_RET_USAGE;
- }
-
-
-/* if (freq > (long) F_CPU / 2) {
- printf_P(PSTR("Max CPU clock freq. is: %luHz\n"), F_CPU/2);
- return CMD_RET_USAGE;
- }
-*/
- }
- if (z80_clock_set(freq) < 0) {
- printf_P(PSTR("Setting CPU clock freq. to %luHz failed.\n"),
- freq);
- }
- }
-
- printf_P(PSTR("CPU clock: %luHz\n"), z80_clock_get());
-
-
- return CMD_RET_SUCCESS;
-}
-
-command_ret_t do_clock2(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
-{
- long value;
- char *endp;
- uint8_t div_flag = 0;
-
- (void) cmdtp; (void) flag;
-
- if (argc >= 2) {
- if (argv[1][0] == '-' && argv[1][1] == 'd') {
- div_flag = 1;
- argc--;
- argv++;
- }
- }
-
- if (argc == 2) {
- if (toupper(argv[1][0]) == 'L')
- value = 0;
- else if (toupper(argv[1][0]) == 'H')
- value = LONG_MAX;
- else {
- value = strtol(argv[1], &endp, 10);
- switch (*endp) {
- case 'M':
- value *= 1000;
- case 'K':
- value *= 1000;
- endp++;
- case '\0':
- if (*endp == '\0')
- break;
- default:
- printf_P(PSTR("invalid value\n"));
- return CMD_RET_USAGE;
- }
-
- if (value == 0) {
- printf_P(PSTR("clk2 cannot be 0\n"));
- return CMD_RET_USAGE;
- }
-
- if (div_flag) {
- if (value > 256*1024L) {
- printf_P(PSTR("Max clk2 divider is: %lu\n"), 256*1024L);
- return CMD_RET_USAGE;
- }
- } else {
- if (value > (long) F_CPU / 2) {
- printf_P(PSTR("Max clk2 freq. is: %luHz\n"), F_CPU/2);
- return CMD_RET_USAGE;
- }
- }
- }
- if (div_flag ? z80_clock2_divset(value) : z80_clock2_set(value) < 0) {
- printf_P(PSTR("Setting clk2 freq. to %luHz failed.\n"),
- value);
- }
- }
-
- printf_P(PSTR("clk2: %luHz\n"), z80_clock2_get());
-
-
- return CMD_RET_SUCCESS;
-}
-#endif
-
-
-static const int namestr = PIN_MAX;
-static char *pin_names[PIN_MAX+1];
-static uint_least8_t pin_names_width;
-
-void pinnames_get(void)
-{
- static const FLASH char delim1[] = {":= "};
- static const FLASH char delim2[] = {", "};
- char *lp;
- char *ptr;
- uint_fast8_t i;
-
- if (pin_names[namestr] != NULL)
- free(pin_names[namestr]);
- memset(pin_names, 0, sizeof(pin_names));
- pin_names_width = 0;
-
- if ((lp = getenv(PSTR(ENV_PINALIAS))) != NULL) {
- pin_names[namestr] = strdup(lp);
- ptr = strtok_P(pin_names[namestr], delim1);
- while (ptr != NULL) {
- if (((i = strtoul(ptr, &lp, 10)) < PIN_MAX) &&
- lp != ptr &&
- (ptr = strtok_P(NULL, delim2)) != NULL ) {
- pin_names[i] = ptr;
- ptr = strtok_P(NULL, delim1);
- }
- }
-
- for (i = 0; i < PIN_MAX; i++)
- if (strlen(pin_names[i]) > pin_names_width)
- pin_names_width = strlen(pin_names[i]);
- }
-}
-
-
-static void print_blanks(uint_fast8_t count)
-{
- while(count--)
- putchar(' ');
-}
-
-static int xstrlen(char *s)
-{
- if (s == NULL)
- return 0;
- else
- return strlen(s);
-}
-
-static const FLASH char * const FLASH pinconf_str[] = {
- FSTR("?"),
- FSTR("Input"),
- FSTR("Pullup"),
- FSTR("Output"),
- FSTR("Clock"),
- };
-
-static const FLASH char * const FLASH pinlevel_str[] = {
- FSTR("Low"),
- FSTR("High"),
- FSTR(""),
- };
-
-int print_pin(int pin, int multi)
-{
- int pinconf;
- const FLASH char *levelp;
- long div;
-
- pinconf = pin_config_get(pin);
- if (pinconf == OUTPUT_TIMER) {
- div = pin_clockdiv_get(pin);
- levelp = pinlevel_str[2];
- } else
- levelp = pinlevel_str[pin_read(pin)];
-
- if (multi) {
- printf_P(PSTR("%3d "), pin);
- if (pin_names_width) {
- printf_P(PSTR("%s "), pin_names[pin]);
- print_blanks(pin_names_width - xstrlen(pin_names[pin]));
- }
- my_puts_P(pinconf_str[pinconf]);
- print_blanks(7 - strlen_P(pinconf_str[pinconf]));
- my_puts_P(levelp);
- print_blanks(5 - strlen_P(levelp));
- if (pinconf == OUTPUT_TIMER)
- printf_P(PSTR("%8ld %8ld"),
- div, F_CPU/div);
- } else {
- printf_P(PSTR("%d: \"%s\", "), pin, pin_names[pin] ? pin_names[pin] : 0);
- my_puts_P(pinconf_str[pinconf]);
- printf_P(PSTR(", "));
- my_puts_P(levelp);
-
- if (pinconf == OUTPUT_TIMER)
- printf_P(PSTR("divide by %ld (%ldHz)"),
- div, F_CPU/div);
- }
- printf_P(PSTR("\n"));
-
- return 0;
-}
-
-int pinarg_insert(int pin, int count, int pinarg[])
-{
- int pos;
-
- if (pin < 0 || pin >= PIN_MAX)
- return -1;
-
- for (pos = 0; pos < count; pos++) {
- if (pin == pinarg[pos])
- return 0;
- if (pin < pinarg[pos])
- break;
- }
- for (int i = count-1; i == pos ; i--)
- pinarg[i+1] = pinarg[i];
- pinarg[pos] = pin;
-
- return 1;
-}
-
-int pinarg_get(char * arg, int pinarg[])
-{
- int count = 0;
- char *endp;
- int pin1, pin2, rc;
-
- while (1) {
- pin1 = (int) strtoul(arg, &endp, 10);
- if (endp != arg && *endp == '-') {
- arg = endp+1;
- pin2 = (int) strtoul(arg, &endp, 10);
- if (pin1 < pin2)
- for (; pin1 < pin2; pin1++)
- if ((rc = pinarg_insert(pin1, count, pinarg)) >= 0)
- count += rc;
- else
- return 0;
- else
- return 0;
- }
- if (endp != arg && pin1 >= 0) {
- if ((*endp == ',' || *endp == '\0') &&
- (rc = pinarg_insert(pin1, count, pinarg)) >= 0) {
- count += rc;
- if (*endp == '\0')
- return count;
- } else
- return 0;
- } else
- return 0;
-
- arg = endp+1;
- }
-}
-
-
-command_ret_t do_pin(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
-{
- char printheader = 1;
- int pinarg[PIN_MAX];
- int pinargc;
-
- (void) cmdtp; (void) flag;
-
- /* reset getopt() */
- optind = 1;
-
- int opt;
- while ((opt = getopt(argc, argv, PSTR("s"))) != -1) {
- switch (opt) {
- case 's':
- printheader = 0;
- break;
- default: /* '?' */
- return CMD_RET_USAGE;
- }
- }
-
- /* remaining arguments */
- argc -= optind;
-
- pinnames_get();
-
- if (argc == 0) {
- /* print cofig of all pins */
- for (pinargc = 0; pinargc < PIN_MAX; pinargc++)
- pinarg[pinargc] = pinargc;
- } else {
- /* get first arg */
- pinargc = pinarg_get(argv[optind++], pinarg);
- if (pinargc == 0)
- return CMD_RET_USAGE;
- else
- argc--;
- }
-
- if (argc == 0) {
- /* no more args, print config */
- if (pinargc == 1)
- print_pin(pinarg[0], 0);
- else {
- if (printheader) {
- if (pin_names_width > 0) {
- if ( strlen("Name") > pin_names_width)
- pin_names_width = strlen("Name");
- char s[pin_names_width+1];
- memset(s, ' ', pin_names_width);
- s[pin_names_width] = '\0';
- strncpy_P(s, PSTR("Name"), 4);
- printf_P(PSTR("Pin %s Config Level Divider Frequency/Hz\n"),s);
- memset(s, '-', pin_names_width);
- printf_P(PSTR("----%s-----------------------------------\n"), s);
- } else
- printf_P(PSTR("Pin Config Level Divider Frequency/Hz\n"
- "--------------------------------------\n"));
- }
- for (int i = 0; i < pinargc; i++)
- print_pin(pinarg[i], 1);
- }
- return CMD_RET_SUCCESS;
- }
-
- /* arguments must be in pairs: pins conf */
- if (argc % 2 != 1)
- return CMD_RET_USAGE;
-
- while (argc > 0) {
- char *endp;
- pinmode_t mode = NONE;
- int level = 0;
- unsigned long value = 0;
- uint8_t hz_flag = 0;
-
- switch (toupper(argv[optind][0])) {
- case 'H':
- level = 1;
- case 'L':
- mode = OUTPUT;
- break;
- case 'P':
- mode = INPUT_PULLUP;
- break;
- case 'I':
- case 'T':
- mode = INPUT;
- break;
-
- default:
- value = strtoul(argv[optind], &endp, 10);
- switch (*endp) {
- case 'M':
- value *= 1000;
- case 'K':
- value *= 1000;
- endp++;
- }
-
- if (*endp && strcmp_P(endp, PSTR("Hz")) == 0) {
- hz_flag = 1;
- endp += 2;
- }
-
- if (*endp != '\0') {
- printf_P(PSTR("invalid parameter: '%s'\n"), argv[optind]);
- return CMD_RET_USAGE;
- }
-
- if (value == 0) {
- printf_P(PSTR("invalid value: %lu \n"));
- return CMD_RET_USAGE;
- }
-
- if (hz_flag) {
- if (value > F_CPU / 2) {
- printf_P(PSTR("Max frequency is: %luHz\n"), F_CPU/2);
- return CMD_RET_USAGE;
- }
- value = F_CPU/value;
- }
- mode = OUTPUT_TIMER;
-
- }
-
- if (mode == NONE)
- return CMD_RET_USAGE;
-
- for (int i = 0; i < pinargc; i++) {
- switch (mode) {
- case OUTPUT:
- pin_write(pinarg[i], level);
- /* fall thru */
- case INPUT:
- case INPUT_PULLUP:
- pin_config(pinarg[i], mode);
- break;
- case OUTPUT_TIMER:
- if (pin_clockdiv_set(pinarg[i], value) < 0) {
- printf_P(PSTR("Setting pin %d to %lu failed.\n"),
- pinarg[i], value);
- }
- break;
- default:
- break;
- }
- }
-
- optind++;
- pinargc = pinarg_get(argv[optind++], pinarg);
- argc -= 2;
- }
-
- return CMD_RET_SUCCESS;
-}
-