X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tools%2Fcarlu%2Fsrc%2Fcmd.c;h=bb87399bb27d01620a0fb46352dd86d703316e06;hb=12cc2cc355d1dce3d50c78e0f680b3cda0c73dfe;hp=d83c107bdae9353f8395ef975d0e1bcfbea91dfb;hpb=13859edfa20c4b84b575f8e872636fd8cdd81d7f;p=carl9170fw.git diff --git a/tools/carlu/src/cmd.c b/tools/carlu/src/cmd.c index d83c107..bb87399 100644 --- a/tools/carlu/src/cmd.c +++ b/tools/carlu/src/cmd.c @@ -1,9 +1,9 @@ /* - * carl9170user - userspace testing utility for ar9170 devices + * carlu - userspace testing utility for ar9170 devices * * Abstraction Layer for FW/HW command interface * - * Copyright 2009, 2010 Christian Lamparter + * Copyright 2009-2011 Christian Lamparter * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -116,11 +116,40 @@ int carlu_cmd_mem_dump(struct carlu *ar, const uint32_t start, return 0; } +int carlu_cmd_mem_watch(struct carlu *ar, const uint32_t mem, + const unsigned int len, void *_buf) +{ +#define RW 8 /* number of words to read at once */ +#define RB (sizeof(uint32_t) * RW) + uint8_t *buf = _buf; + unsigned int i, j, block; + int err; + __le32 offsets[RW]; + + for (i = 0; i < (len + RB - 1) / RB; i++) { + block = min_t(unsigned int, (len - RB * i) / sizeof(uint32_t), RW); + for (j = 0; j < block; j++) + offsets[j] = cpu_to_le32(mem); + + err = carlusb_cmd(ar, CARL9170_CMD_RREG, + (void *) &offsets, block * sizeof(uint32_t), + (void *) buf + RB * i, RB); + + if (err) + return err; + } + +#undef RW +#undef RB + + return 0; +} + int carlu_cmd_write_mem(struct carlu *ar, const uint32_t addr, const uint32_t val) { int err; - __le32 msg, block[2] = { addr, val }; + __le32 msg, block[2] = { cpu_to_le32(addr), cpu_to_le32(val) }; err = carlusb_cmd(ar, CARL9170_CMD_WREG, (void *) &block, sizeof(block), @@ -128,6 +157,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) {