X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tools%2Fcarlu%2Fsrc%2Fcmd.c;h=56b9f8b7c956d7b79773abddf9efa7fe528c467f;hb=ddaf4f22a3161d7480d73e03adab1d619784757e;hp=a6c9020d3a2b587862e00b6932745e59953b2a73;hpb=e72388a0aa23da8bc8e24a0cbe9d523c5a9ce294;p=carl9170fw.git diff --git a/tools/carlu/src/cmd.c b/tools/carlu/src/cmd.c index a6c9020..56b9f8b 100644 --- a/tools/carlu/src/cmd.c +++ b/tools/carlu/src/cmd.c @@ -40,6 +40,7 @@ #include "debug.h" #include "fwcmd.h" #include "eeprom.h" +#include "cmd.h" int carlu_cmd_echo(struct carlu *ar, const uint32_t message) { @@ -56,17 +57,34 @@ int carlu_cmd_echo(struct carlu *ar, const uint32_t message) return ret; } +struct carl9170_cmd *carlu_cmd_buf(struct carlu *ar, + const enum carl9170_cmd_oids cmd, const unsigned int len) +{ + struct carl9170_cmd *tmp; + + if (len % 4 || (sizeof(struct carl9170_cmd_head) + len > 64)) + return ERR_PTR(-EINVAL); + + tmp = malloc(sizeof(struct carl9170_cmd_head) + len); + if (tmp) { + tmp->hdr.cmd = cmd; + tmp->hdr.len = len; + } + return tmp; +} + int carlu_cmd_reboot(struct carlu *ar) { + struct carl9170_cmd *reboot; int err; - err = carlusb_cmd(ar, CARL9170_CMD_REBOOT, - NULL, 0, NULL, 0); + /* sure, we could put the struct on the stack too. */ + reboot = carlu_cmd_buf(ar, CARL9170_CMD_REBOOT_ASYNC, 0); + if (IS_ERR_OR_NULL(reboot)) + return reboot ? PTR_ERR(reboot) : -ENOMEM; - if (err == -ETIMEDOUT) - return 0; - - return err ? err : -1; + err = carlusb_cmd_async(ar, reboot, true); + return err; } int carlu_cmd_mem_dump(struct carlu *ar, const uint32_t start, @@ -110,6 +128,18 @@ int carlu_cmd_write_mem(struct carlu *ar, const uint32_t addr, return err; } +int carlu_cmd_read_mem(struct carlu *ar, const uint32_t _addr, + uint32_t *val) +{ + int err; + __le32 msg, addr = { cpu_to_le32(_addr) }; + err = carlusb_cmd(ar, CARL9170_CMD_RREG, (void *) &addr, sizeof(addr), + (void *) &msg, sizeof(msg)); + + *val = le32_to_cpu(msg); + return err; +} + int carlu_cmd_read_eeprom(struct carlu *ar) {