#include <stdio.h>
#include <string.h>
#include <stddef.h>
-#include "log.h"
#include "types.h"
#include "flash.h"
-#include "target.h"
#include "membuf.h"
#include "at91sam3.h"
#include "time_support.h"
// so we can find the chip we belong to
struct sam3_chip *pChip;
// so we can find the orginal bank pointer
- flash_bank_t *pBank;
+ struct flash_bank *pBank;
unsigned bank_number;
uint32_t controller_address;
uint32_t base_address;
// this is "initialized" from the global const structure
struct sam3_chip_details details;
- target_t *target;
+ struct target *target;
struct sam3_cfg cfg;
struct membuf *mbuf;
static struct sam3_chip *all_sam3_chips;
static struct sam3_chip *
-get_current_sam3(struct command_context_s *cmd_ctx)
+get_current_sam3(struct command_context *cmd_ctx)
{
- target_t *t;
+ struct target *t;
static struct sam3_chip *p;
t = get_current_target(cmd_ctx);
static void
sam3_explain_mckr(struct sam3_chip *pChip)
{
- uint32_t css, pres,fin;
- int pdiv;
- const char *cp;
+ uint32_t css, pres, fin = 0;
+ int pdiv = 0;
+ const char *cp = NULL;
css = sam3_reg_fieldname(pChip, "CSS", pChip->cfg.PMC_MCKR, 0, 2);
switch (css & 3) {
#if 0
static struct sam3_chip *
-target2sam3(target_t *pTarget)
+target2sam3(struct target *pTarget)
{
struct sam3_chip *pChip;
static struct sam3_bank_private *
-get_sam3_bank_private(flash_bank_t *bank)
+get_sam3_bank_private(struct flash_bank *bank)
{
return (struct sam3_bank_private *)(bank->driver_priv);
}
static int
-sam3_erase_check(struct flash_bank_s *bank)
+sam3_erase_check(struct flash_bank *bank)
{
int x;
}
static int
-sam3_protect_check(struct flash_bank_s *bank)
+sam3_protect_check(struct flash_bank *bank)
{
int r;
- uint32_t v;
+ uint32_t v=0;
unsigned x;
struct sam3_bank_private *pPrivate;
return ERROR_OK;
}
-static int
-sam3_flash_bank_command(struct command_context_s *cmd_ctx,
- char *cmd,
- char **args,
- int argc,
- struct flash_bank_s *bank)
+FLASH_BANK_COMMAND_HANDLER(sam3_flash_bank_command)
{
struct sam3_chip *pChip;
const struct sam3_chip_details *pDetails;
struct sam3_chip *pChip;
void *vp;
- flash_bank_t *saved_banks[SAM3_MAX_FLASH_BANKS];
+ struct flash_bank *saved_banks[SAM3_MAX_FLASH_BANKS];
unsigned x;
const char *cp;
static int
-_sam3_probe(struct flash_bank_s *bank, int noise)
+_sam3_probe(struct flash_bank *bank, int noise)
{
unsigned x;
int r;
}
static int
-sam3_probe(struct flash_bank_s *bank)
+sam3_probe(struct flash_bank *bank)
{
return _sam3_probe(bank, 1);
}
static int
-sam3_auto_probe(struct flash_bank_s *bank)
+sam3_auto_probe(struct flash_bank *bank)
{
return _sam3_probe(bank, 0);
}
static int
-sam3_erase(struct flash_bank_s *bank, int first, int last)
+sam3_erase(struct flash_bank *bank, int first, int last)
{
struct sam3_bank_private *pPrivate;
int r;
}
static int
-sam3_protect(struct flash_bank_s *bank, int set, int first, int last)
+sam3_protect(struct flash_bank *bank, int set, int first, int last)
{
struct sam3_bank_private *pPrivate;
int r;
static int
-sam3_info(flash_bank_t *bank, char *buf, int buf_size)
+sam3_info(struct flash_bank *bank, char *buf, int buf_size)
{
if (bank->target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted");
static int
-sam3_write(struct flash_bank_s *bank,
+sam3_write(struct flash_bank *bank,
uint8_t *buffer,
uint32_t offset,
uint32_t count)
return r;
}
-static int
-sam3_handle_info_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc)
+COMMAND_HANDLER(sam3_handle_info_command)
{
struct sam3_chip *pChip;
void *vp;
unsigned x;
int r;
- pChip = get_current_sam3(cmd_ctx);
+ pChip = get_current_sam3(CMD_CTX);
if (!pChip) {
return ERROR_OK;
}
if (pChip->details.bank[0].pBank == NULL) {
x = 0;
need_define:
- command_print(cmd_ctx,
+ command_print(CMD_CTX,
"Please define bank %d via command: flash bank %s ... ",
x,
at91sam3_flash.name);
// print results
cp = membuf_strtok(pChip->mbuf, "\n", &vp);
while (cp) {
- command_print(cmd_ctx,"%s", cp);
+ command_print(CMD_CTX,"%s", cp);
cp = membuf_strtok(NULL, "\n", &vp);
}
return ERROR_OK;
}
-static int
-sam3_handle_gpnvm_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc)
+COMMAND_HANDLER(sam3_handle_gpnvm_command)
{
unsigned x,v;
- uint32_t v32;
int r,who;
struct sam3_chip *pChip;
- pChip = get_current_sam3(cmd_ctx);
+ pChip = get_current_sam3(CMD_CTX);
if (!pChip) {
return ERROR_OK;
}
if (pChip->details.bank[0].pBank == NULL) {
- command_print(cmd_ctx, "Bank0 must be defined first via: flash bank %s ...",
+ command_print(CMD_CTX, "Bank0 must be defined first via: flash bank %s ...",
at91sam3_flash.name);
return ERROR_FAIL;
}
}
- switch (argc) {
+ switch (CMD_ARGC) {
default:
- command_print(cmd_ctx,"Too many parameters\n");
+ command_print(CMD_CTX,"Too many parameters\n");
return ERROR_COMMAND_SYNTAX_ERROR;
break;
case 0:
who = -1;
break;
case 2:
- if ((0 == strcmp(argv[0], "show")) && (0 == strcmp(argv[1], "all"))) {
+ if ((0 == strcmp(CMD_ARGV[0], "show")) && (0 == strcmp(CMD_ARGV[1], "all"))) {
who = -1;
} else {
- r = parse_u32(argv[1], &v32);
- if (r != ERROR_OK) {
- command_print(cmd_ctx, "Not a number: %s", argv[1]);
- return r;
- }
+ uint32_t v32;
+ COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], v32);
who = v32;
}
break;
}
- if (0 == strcmp("show", argv[0])) {
+ if (0 == strcmp("show", CMD_ARGV[0])) {
if (who == -1) {
showall:
r = ERROR_OK;
if (r != ERROR_OK) {
break;
}
- command_print(cmd_ctx, "sam3-gpnvm%u: %u", x, v);
+ command_print(CMD_CTX, "sam3-gpnvm%u: %u", x, v);
}
return r;
}
if ((who >= 0) && (((unsigned)(who)) < pChip->details.n_gpnvms)) {
r = FLASHD_GetGPNVM(&(pChip->details.bank[0]), who, &v);
- command_print(cmd_ctx, "sam3-gpnvm%u: %u", who, v);
+ command_print(CMD_CTX, "sam3-gpnvm%u: %u", who, v);
return r;
} else {
- command_print(cmd_ctx, "sam3-gpnvm invalid GPNVM: %u", who);
+ command_print(CMD_CTX, "sam3-gpnvm invalid GPNVM: %u", who);
return ERROR_COMMAND_SYNTAX_ERROR;
}
}
if (who == -1) {
- command_print(cmd_ctx, "Missing GPNVM number");
+ command_print(CMD_CTX, "Missing GPNVM number");
return ERROR_COMMAND_SYNTAX_ERROR;
}
- if (0 == strcmp("set", argv[0])) {
+ if (0 == strcmp("set", CMD_ARGV[0])) {
r = FLASHD_SetGPNVM(&(pChip->details.bank[0]), who);
- } else if ((0 == strcmp("clr", argv[0])) ||
- (0 == strcmp("clear", argv[0]))) { // quietly accept both
+ } else if ((0 == strcmp("clr", CMD_ARGV[0])) ||
+ (0 == strcmp("clear", CMD_ARGV[0]))) { // quietly accept both
r = FLASHD_ClrGPNVM(&(pChip->details.bank[0]), who);
} else {
- command_print(cmd_ctx, "Unkown command: %s", argv[0]);
+ command_print(CMD_CTX, "Unkown command: %s", CMD_ARGV[0]);
r = ERROR_COMMAND_SYNTAX_ERROR;
}
return r;
}
-static int
-sam3_handle_slowclk_command(struct command_context_s *cmd_ctx, char *cmd, char **argv, int argc)
+COMMAND_HANDLER(sam3_handle_slowclk_command)
{
- uint32_t v;
- int r;
-
struct sam3_chip *pChip;
- pChip = get_current_sam3(cmd_ctx);
+ pChip = get_current_sam3(CMD_CTX);
if (!pChip) {
return ERROR_OK;
}
- switch (argc) {
+ switch (CMD_ARGC) {
case 0:
// show
break;
case 1:
+ {
// set
- r = parse_u32(argv[0], &v);
+ uint32_t v;
+ COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], v);
if (v > 200000) {
// absurd slow clock of 200Khz?
- command_print(cmd_ctx,"Absurd/illegal slow clock freq: %d\n", (int)(v));
+ command_print(CMD_CTX,"Absurd/illegal slow clock freq: %d\n", (int)(v));
return ERROR_COMMAND_SYNTAX_ERROR;
}
pChip->cfg.slow_freq = v;
break;
-
+ }
default:
// error
- command_print(cmd_ctx,"Too many parameters");
+ command_print(CMD_CTX,"Too many parameters");
return ERROR_COMMAND_SYNTAX_ERROR;
break;
}
- command_print(cmd_ctx, "Slowclk freq: %d.%03dkhz",
+ command_print(CMD_CTX, "Slowclk freq: %d.%03dkhz",
(int)(pChip->cfg.slow_freq/ 1000),
(int)(pChip->cfg.slow_freq% 1000));
return ERROR_OK;
}
+static const struct command_registration at91sam3_exec_command_handlers[] = {
+ {
+ .name = "gpnvm",
+ .handler = &sam3_handle_gpnvm_command,
+ .mode = COMMAND_EXEC,
+ .usage = "[(set|clear) [<bit_id>]]",
+ .help = "Without arguments, shows the gpnvm register; "
+ "otherwise, sets or clear the specified bit.",
+ },
+ {
+ .name = "info",
+ .handler = &sam3_handle_info_command,
+ .mode = COMMAND_EXEC,
+ .help = "print information about the current sam3 chip",
+ },
+ {
+ .name = "slowclk",
+ .handler = &sam3_handle_slowclk_command,
+ .mode = COMMAND_EXEC,
+ .usage = "<value>",
+ .help = "set the slowclock frequency (default 32768hz)",
+ },
+ COMMAND_REGISTRATION_DONE
+};
+static const struct command_registration at91sam3_command_handlers[] = {
+ {
+ .name = "at91sam3",
+ .mode = COMMAND_ANY,
+ .help = "at91sam3 flash command group",
+ .chain = at91sam3_exec_command_handlers,
+ },
+ COMMAND_REGISTRATION_DONE
+};
-static int sam3_registered;
-static int
-sam3_register_commands(struct command_context_s *cmd_ctx)
+static int sam3_register_commands(struct command_context *cmd_ctx)
{
- command_t *pCmd;
-
- // only register once
- if (!sam3_registered) {
- sam3_registered++;
-
- pCmd = register_command(cmd_ctx, NULL, "at91sam3", NULL, COMMAND_ANY, NULL);
- register_command(cmd_ctx, pCmd,
- "gpnvm",
- sam3_handle_gpnvm_command,
- COMMAND_EXEC,
- "at91sam3 gpnvm [action [<BIT>], by default 'show', otherwise set | clear BIT");
- register_command(cmd_ctx, pCmd,
- "info",
- sam3_handle_info_command,
- COMMAND_EXEC,
- "at91sam3 info - print information about the current sam3 chip");
- register_command(cmd_ctx, pCmd,
- "slowclk",
- sam3_handle_slowclk_command,
- COMMAND_EXEC,
- "at91sam3 slowclk [VALUE] set the slowclock frequency (default 32768hz)");
- }
- return ERROR_OK;
+ return register_commands(cmd_ctx, NULL, at91sam3_command_handlers);
}
-
-flash_driver_t at91sam3_flash =
-{
- .name = "at91sam3",
- .register_commands = sam3_register_commands,
-
- .flash_bank_command = sam3_flash_bank_command,
- .erase = sam3_erase,
- .protect = sam3_protect,
- .write = sam3_write,
- .probe = sam3_probe,
- .auto_probe = sam3_auto_probe,
- .erase_check = sam3_erase_check,
- .protect_check = sam3_protect_check,
- .info = sam3_info
-};
+struct flash_driver at91sam3_flash = {
+ .name = "at91sam3",
+ .register_commands = &sam3_register_commands,
+ .flash_bank_command = &sam3_flash_bank_command,
+ .erase = &sam3_erase,
+ .protect = &sam3_protect,
+ .write = &sam3_write,
+ .probe = &sam3_probe,
+ .auto_probe = &sam3_auto_probe,
+ .erase_check = &sam3_erase_check,
+ .protect_check = &sam3_protect_check,
+ .info = &sam3_info,
+ };