summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--v4l2-apps/util/Makefile6
-rw-r--r--v4l2-apps/util/v4l-board-dbg.c335
-rw-r--r--v4l2-apps/util/v4l2-dbg-bttv.h (renamed from v4l2-apps/util/bttv-dbg.h)2
-rw-r--r--v4l2-apps/util/v4l2-dbg-em28xx.h (renamed from v4l2-apps/util/em28xx-dbg.h)2
-rw-r--r--v4l2-apps/util/v4l2-dbg-saa7134.h (renamed from v4l2-apps/util/saa7134-dbg.h)2
-rw-r--r--v4l2-apps/util/v4l2-dbg.cpp114
-rw-r--r--v4l2-apps/util/v4l2-dbg.h (renamed from v4l2-apps/util/v4l-board-dbg.h)8
7 files changed, 115 insertions, 354 deletions
diff --git a/v4l2-apps/util/Makefile b/v4l2-apps/util/Makefile
index bfd5a72b8..1d562f9e7 100644
--- a/v4l2-apps/util/Makefile
+++ b/v4l2-apps/util/Makefile
@@ -7,7 +7,7 @@ endif
CPPFLAGS += -I../include -D_GNU_SOURCE
LDFLAGS += -lm
-binaries = v4l2-ctl v4l2-dbg ivtv-ctl cx18-ctl v4l-board-dbg
+binaries = v4l2-ctl v4l2-dbg ivtv-ctl cx18-ctl
ifeq ($(prefix),)
prefix = /usr
@@ -32,6 +32,8 @@ qv4l2:
v4l2-dbg: v4l2-dbg.o v4l2-driverids.o v4l2-chipids.o
$(CXX) $^ -o $@
+v4l2-dbg.o: v4l2-dbg.h v4l2-dbg-bttv.h v4l2-dbg-em28xx.h v4l2-dbg-saa7134.h
+
install:
mkdir -p $(prefix)/bin
cp $(binaries) $(prefix)/bin
@@ -57,8 +59,6 @@ keytables:
keytable: keytable.c parse.h keytables
-v4l-board-dbg: v4l-board-dbg.c bttv-dbg.h saa7134-dbg.h em28xx-dbg.h
-
v4l2-driverids.cpp: ../include/linux/i2c-id.h
@echo "struct driverid { const char *name; unsigned id; } driverids[] = {" >$@
@grep I2C_DRIVERID_ $^ | sed -e 's/.*I2C_DRIVERID_\([0-9A-Z_]*\)[^0-9]*\([0-9]*\).*/{ "\1", \2 },/' | tr A-Z a-z >>$@
diff --git a/v4l2-apps/util/v4l-board-dbg.c b/v4l2-apps/util/v4l-board-dbg.c
deleted file mode 100644
index e74c7300e..000000000
--- a/v4l2-apps/util/v4l-board-dbg.c
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- Copyright (C) 2008 Mauro Carvalho Chehab <mchehab@infradead.org>
- 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
- the Free Software Foundation version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <getopt.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <linux/types.h>
-#include <linux/videodev2.h>
-
-#include "bttv-dbg.h"
-#include "saa7134-dbg.h"
-#include "em28xx-dbg.h"
-
-#define ARRAY_SIZE(arr) ((int)(sizeof(arr) / sizeof((arr)[0])))
-
-struct board_list {
- char *name;
- int prefix; /* Register prefix size */
- struct board_regs *regs;
- int regs_size;
- struct board_regs *alt_regs;
- int alt_regs_size;
-};
-
-struct board_list boards[] = {
- [0] = { /* From bttv-dbg.h */
- .name = BTTV_IDENT,
- .prefix = sizeof(BTTV_PREFIX) - 1,
- .regs = bt8xx_regs,
- .regs_size = ARRAY_SIZE(bt8xx_regs),
- .alt_regs = bt8xx_regs_other,
- .alt_regs_size = ARRAY_SIZE(bt8xx_regs_other),
- },
- [1] = { /* From saa7134-dbg.h */
- .name = SAA7134_IDENT,
- .prefix = sizeof(SAA7134_PREFIX) - 1,
- .regs = saa7134_regs,
- .regs_size = ARRAY_SIZE(saa7134_regs),
- .alt_regs = NULL,
- .alt_regs_size = 0,
- },
- [2] = { /* From em28xx-dbg.h */
- .name = EM28XX_IDENT,
- .prefix = sizeof(EM28XX_PREFIX) - 1,
- .regs = em28xx_regs,
- .regs_size = ARRAY_SIZE(em28xx_regs),
- .alt_regs = NULL,
- .alt_regs_size = 0,
- },
-};
-
-static int is_get=0, is_set=0;
-
-static int doioctl(int fd, int request, void *parm, const char *name)
-{
- int retVal;
-
- printf("ioctl %s ", name);
- retVal = ioctl(fd, request, parm);
- if (retVal < 0)
- printf("failed: %s\n", strerror(errno));
- else
- printf("ok\n");
-
- return retVal;
-}
-
-static void usage(void)
-{
- printf("bttv-dbg <args>\n");
-}
-
-enum Option {
- OptGetReg = 'g',
- OptSetReg = 's',
- OptHelp = 'h',
-};
-
-static void print_bin (int val, int size)
-{
- int i, j, v;
-
- printf("(");
- for (i = size-1; i >= 0; i--) {
- v = (val >> (i * 8)) & 0xff;
- for (j = 7; j >= 0; j--) {
- int bit = (v >> j) & 0x1;
- if (bit)
- printf("1");
- else
- printf("0");
- }
- if (i)
- printf(" ");
- else
- printf(")");
- }
-}
-
-int main(int argc, char **argv)
-{
- char *device = strdup("/dev/video0");
- char *reg_set = NULL;
- int ch;
- int i;
- int fd = -1;
- struct v4l2_register reg;
- struct v4l2_capability cap;
- struct board_list *curr_bd;
- int board = 0;
- struct option long_options[] = {
- /* Please keep in alphabetical order of the short option.
- That makes it easier to see which options are still free. */
- {"get-reg", no_argument, 0, OptGetReg},
- {"set-reg", required_argument, 0, OptSetReg},
- {"help", no_argument, 0, OptHelp},
- {0, 0, 0, 0}
- };
-
- /* command args */
- if (argc == 1) {
- usage();
- return 0;
- }
- while (1) {
- int option_index = 0;
-
- ch = getopt_long(argc, argv, "gs:", long_options, &option_index);
- if (ch == -1)
- break;
-
- switch (ch) {
- case OptHelp:
- usage();
- return 0;
- case OptGetReg:
- is_get++;
- break;
- case OptSetReg:
- is_set++;
- reg_set = optarg;
-
- break;
- case '?':
- fprintf(stderr, "Unknown argument `%s'\n",
- argv[optind]);
- usage();
- return 1;
- }
- }
- if (optind < argc) {
- printf("unknown arguments: ");
- while (optind < argc)
- printf("%s ", argv[optind++]);
- printf("\n");
- usage();
- return 1;
- }
-
- fd = open(device, O_RDWR);
- if (fd < 0) {
- fprintf(stderr, "Failed to open %s: %s\n", device,
- strerror(errno));
- exit(1);
- }
- free(device);
-
- if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
- printf("Error while reading capabilities\n");
- exit(2);
- }
-
- for (board = ARRAY_SIZE(boards)-1; board >= 0; board--) {
- if (!strcasecmp((char *)cap.driver, boards[board].name))
- break;
- }
- if (board < 0) {
- printf("This software doesn't support %s yet\n", cap.driver);
- exit(3);
- }
-
- curr_bd = &boards[board];
-
- reg.match_type = V4L2_CHIP_MATCH_HOST;
- reg.match_chip = 0;
-
- if (is_get) {
- for (i = 0; i < curr_bd->regs_size; i++) {
- char name[256];
- reg.reg = curr_bd->regs[i].reg;
- if (ioctl(fd, VIDIOC_DBG_G_REGISTER, &reg) < 0) {
- printf("Error while reading. Maybe you're not root?\n");
- continue;
- }
- sprintf(name, "%s:", curr_bd->regs[i].name);
-
- switch (curr_bd->regs[i].size) {
- case 1:
- printf("%-32s %02llx ", name, reg.val & 0xff);
- break;
- case 2:
- printf("%-32s %04llx ", name, reg.val & 0xffff);
- break;
- case 4:
- printf("%-32s %08llx ", name, reg.val & 0xffffffff);
- break;
- }
- print_bin (reg.val, curr_bd->regs[i].size);
- printf("\n");
- }
- return 0;
- }
-
- if (is_set) {
- char *reg_name;
- int val;
- int r, size;
- unsigned prev;
- struct board_regs *bd_reg;
-
- reg_name = strtok(reg_set, "=:");
- val = strtol(strtok(NULL, "=:"), 0L, 0);
-
- if (!reg_name) {
- printf("set argument is invalid\n");
- return -1;
- }
-
- for (i = curr_bd->regs_size - 1; i >=0 ; i--) {
- if (!strcasecmp(reg_name, curr_bd->regs[i].name)) {
- bd_reg = &curr_bd->regs[i];
- r = bd_reg->reg;
- size = bd_reg->size;
- break;
- }
- }
-
- if (i < 0) {
- for (i = curr_bd->alt_regs_size - 1; i >=0 ; i--) {
- if (!strcasecmp(reg_name, curr_bd->alt_regs[i].name)) {
- bd_reg = &curr_bd->alt_regs[i];
- r = bd_reg->reg;
- size = bd_reg->size;
- break;
- }
- }
- }
-
- if (i < 0) {
- for (i = curr_bd->regs_size - 1; i >=0 ; i--) {
- if (!strcasecmp(reg_name, curr_bd->regs[i].name + curr_bd->prefix)) {
- bd_reg = &curr_bd->regs[i];
- r = bd_reg->reg;
- size = bd_reg->size;
- break;
- }
- }
- }
-
- if (i < 0) {
- for (i = curr_bd->alt_regs_size - 1; i >=0 ; i--) {
- if (!strcasecmp(reg_name, curr_bd->alt_regs[i].name + curr_bd->prefix)) {
- bd_reg = &curr_bd->regs[i];
- r = bd_reg->reg;
- size = bd_reg->size;
- break;
- }
- }
- }
-
- if (i < 0) {
- printf("Register not found\n");
- return -1;
- }
-
- reg.reg = r;
- if (ioctl(fd, VIDIOC_DBG_G_REGISTER, &reg) < 0) {
- printf("Error while reading register 0x%02x\n", r);
- return -1;
- }
- prev = reg.val;
-
- switch (size) {
- case 1:
- reg.val = (reg.val & (~0xff)) | val;
- break;
- case 2:
- reg.val = (reg.val & (~0xffff)) | val;
- break;
- case 4:
- reg.val = val;
- break;
- }
-
- printf("Changing value of register %s(0x%x) from 0x%02x to 0x%02x\n",
- bd_reg->name, r, prev, (unsigned int)reg.val);
-
- prev = reg.val;
-
- if (ioctl(fd, VIDIOC_DBG_S_REGISTER, &reg) < 0) {
- printf("Error while writing\n");
- return -1;
- }
- if (ioctl(fd, VIDIOC_DBG_G_REGISTER, &reg) < 0) {
- printf("Error while reading register 0x%02x\n", r);
- return -1;
- }
- if (reg.val != prev) {
- printf("Value of register %s(0x%x) is now 0x%02x\n",
- bd_reg->name, r, (unsigned int)reg.val);
- }
- }
-
- close(fd);
- exit(0);
-}
diff --git a/v4l2-apps/util/bttv-dbg.h b/v4l2-apps/util/v4l2-dbg-bttv.h
index 02f829773..cf6274284 100644
--- a/v4l2-apps/util/bttv-dbg.h
+++ b/v4l2-apps/util/v4l2-dbg-bttv.h
@@ -14,7 +14,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "v4l-board-dbg.h"
+#include "v4l2-dbg.h"
#define BTTV_IDENT "bttv"
diff --git a/v4l2-apps/util/em28xx-dbg.h b/v4l2-apps/util/v4l2-dbg-em28xx.h
index 3d3600c44..c5117c6e7 100644
--- a/v4l2-apps/util/em28xx-dbg.h
+++ b/v4l2-apps/util/v4l2-dbg-em28xx.h
@@ -14,7 +14,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "v4l-board-dbg.h"
+#include "v4l2-dbg.h"
#define EM28XX_IDENT "em28xx"
diff --git a/v4l2-apps/util/saa7134-dbg.h b/v4l2-apps/util/v4l2-dbg-saa7134.h
index aee29da76..70fd4e068 100644
--- a/v4l2-apps/util/saa7134-dbg.h
+++ b/v4l2-apps/util/v4l2-dbg-saa7134.h
@@ -14,7 +14,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "v4l-board-dbg.h"
+#include "v4l2-dbg.h"
#define SAA7134_IDENT "saa7134"
diff --git a/v4l2-apps/util/v4l2-dbg.cpp b/v4l2-apps/util/v4l2-dbg.cpp
index cdf7c0cbb..e0d6153fe 100644
--- a/v4l2-apps/util/v4l2-dbg.cpp
+++ b/v4l2-apps/util/v4l2-dbg.cpp
@@ -42,6 +42,48 @@
#include <map>
#include <string>
+#include "v4l2-dbg-bttv.h"
+#include "v4l2-dbg-saa7134.h"
+#include "v4l2-dbg-em28xx.h"
+
+#define ARRAY_SIZE(arr) ((int)(sizeof(arr) / sizeof((arr)[0])))
+
+struct board_list {
+ const char *name;
+ int prefix; /* Register prefix size */
+ const struct board_regs *regs;
+ int regs_size;
+ const struct board_regs *alt_regs;
+ int alt_regs_size;
+};
+
+static const struct board_list boards[] = {
+ { /* From bttv-dbg.h */
+ BTTV_IDENT,
+ sizeof(BTTV_PREFIX) - 1,
+ bt8xx_regs,
+ ARRAY_SIZE(bt8xx_regs),
+ bt8xx_regs_other,
+ ARRAY_SIZE(bt8xx_regs_other),
+ },
+ { /* From saa7134-dbg.h */
+ SAA7134_IDENT,
+ sizeof(SAA7134_PREFIX) - 1,
+ saa7134_regs,
+ ARRAY_SIZE(saa7134_regs),
+ NULL,
+ 0,
+ },
+ { /* From em28xx-dbg.h */
+ EM28XX_IDENT,
+ sizeof(EM28XX_PREFIX) - 1,
+ em28xx_regs,
+ ARRAY_SIZE(em28xx_regs),
+ NULL,
+ 0,
+ },
+};
+
struct driverid {
const char *name;
unsigned id;
@@ -78,6 +120,7 @@ enum Option {
OptLogStatus = 128,
OptVerbose,
OptListDriverIDs,
+ OptListSymbols,
OptLast = 256
};
@@ -98,6 +141,7 @@ static struct option long_options[] = {
{"verbose", no_argument, 0, OptVerbose},
{"log-status", no_argument, 0, OptLogStatus},
{"list-driverids", no_argument, 0, OptListDriverIDs},
+ {"list-symbols", no_argument, 0, OptListSymbols},
{"wide", required_argument, 0, OptSetStride},
{0, 0, 0, 0}
};
@@ -129,6 +173,7 @@ static void usage(void)
" Get the chip identifier [VIDIOC_G_CHIP_IDENT]\n"
" -w, --wide=<reg length>\n"
" Sets step between two registers\n"
+ " --list-symbols List the symbolic register names you can use, if any\n"
" --log-status Log the board status in the kernel log [VIDIOC_LOG_STATUS]\n"
" --list-driverids List the known I2C driver IDs for use with the i2cdrv type\n");
exit(0);
@@ -229,6 +274,25 @@ static void print_chip(struct v4l2_chip_ident *chip)
printf("%-10d revision 0x%08x\n", chip->ident, chip->revision);
}
+static unsigned long long parse_reg(const struct board_list *curr_bd, const std::string &reg)
+{
+ if (curr_bd) {
+ for (int i = 0; i < curr_bd->regs_size; i++) {
+ if (!strcasecmp(reg.c_str(), curr_bd->regs[i].name) ||
+ !strcasecmp(reg.c_str(), curr_bd->regs[i].name + curr_bd->prefix)) {
+ return curr_bd->regs[i].reg;
+ }
+ }
+ for (int i = 0; i < curr_bd->alt_regs_size; i++) {
+ if (!strcasecmp(reg.c_str(), curr_bd->alt_regs[i].name) ||
+ !strcasecmp(reg.c_str(), curr_bd->alt_regs[i].name + curr_bd->prefix)) {
+ return curr_bd->alt_regs[i].reg;
+ }
+ }
+ }
+ return strtoull(reg.c_str(), NULL, 0);
+}
+
static const char *binary(unsigned long long val)
{
static char bin[80];
@@ -307,10 +371,13 @@ int main(int argc, char **argv)
struct v4l2_register set_reg;
struct v4l2_register get_reg;
struct v4l2_chip_ident chip_id;
+ const struct board_list *curr_bd = NULL;
char short_options[26 * 2 * 2 + 1];
int idx = 0;
+ std::string reg_min_arg, reg_max_arg;
+ std::string reg_set_arg;
unsigned long long reg_min = 0, reg_max = 0;
- std::vector<unsigned long long> get_regs;
+ std::vector<std::string> get_regs;
int match_type = V4L2_CHIP_MATCH_HOST;
int match_chip = 0;
@@ -375,11 +442,11 @@ int main(int argc, char **argv)
break;
case OptSetRegister:
- set_reg.reg = strtoull(optarg, 0L, 0);
+ reg_set_arg = optarg;
break;
case OptGetRegister:
- get_regs.push_back(strtoull(optarg, 0L, 0));
+ get_regs.push_back(optarg);
break;
case OptSetStride:
@@ -399,18 +466,19 @@ int main(int argc, char **argv)
switch (parse_subopt(&subs, subopts, &value)) {
case 0:
- reg_min = strtoull(value, 0L, 0);
- if (reg_max == 0)
- reg_max = reg_min + 0xff;
+ reg_min_arg = value;
+ //if (reg_max == 0)
+ // reg_max = reg_min + 0xff;
break;
case 1:
- reg_max = strtoull(value, 0L, 0);
+ reg_max_arg = value;
break;
}
}
break;
case OptGetChipIdent:
+ case OptListSymbols:
break;
case ':':
@@ -448,6 +516,13 @@ int main(int argc, char **argv)
printf("%s", cap2s(vcap.capabilities).c_str());
}
+ for (int board = ARRAY_SIZE(boards) - 1; board >= 0; board--) {
+ if (!strcasecmp((char *)vcap.driver, boards[board].name)) {
+ curr_bd = &boards[board];
+ break;
+ }
+ }
+
/* Set options */
if (options[OptSetRegister]) {
@@ -455,6 +530,7 @@ int main(int argc, char **argv)
set_reg.match_chip = match_chip;
if (optind >= argc)
usage();
+ set_reg.reg = parse_reg(curr_bd, reg_set_arg);
while (optind < argc) {
set_reg.val = strtoull(argv[optind++], NULL, 0);
if (doioctl(fd, VIDIOC_DBG_S_REGISTER, &set_reg,
@@ -500,9 +576,9 @@ int main(int argc, char **argv)
get_reg.match_chip = match_chip;
printf("ioctl: VIDIOC_DBG_G_REGISTER\n");
- for (std::vector<unsigned long long>::iterator iter = get_regs.begin();
+ for (std::vector<std::string>::iterator iter = get_regs.begin();
iter != get_regs.end(); ++iter) {
- get_reg.reg = *iter;
+ get_reg.reg = parse_reg(curr_bd, *iter);
if (ioctl(fd, VIDIOC_DBG_G_REGISTER, &get_reg) < 0)
fprintf(stderr, "ioctl: VIDIOC_DBG_G_REGISTER "
"failed for 0x%llx\n", get_reg.reg);
@@ -525,7 +601,12 @@ int main(int argc, char **argv)
}
printf("ioctl: VIDIOC_DBG_G_REGISTER\n");
- if (reg_max != 0) {
+ if (!reg_min_arg.empty()) {
+ reg_min = parse_reg(curr_bd, reg_min_arg);
+ if (reg_max_arg.empty())
+ reg_max = reg_min + 0xff;
+ else
+ reg_max = parse_reg(curr_bd, reg_max_arg);
/* Explicit memory range: just do it */
print_regs(fd, &get_reg, reg_min, reg_max, stride);
goto list_done;
@@ -618,6 +699,19 @@ list_done:
printf("%s\n", driverids[i].name);
}
+ if (options[OptListSymbols]) {
+ if (curr_bd == NULL) {
+ printf("No symbols found for driver %s\n", vcap.driver);
+ }
+ else {
+ printf("Symbols for driver %s:\n", vcap.driver);
+ for (int i = 0; i < curr_bd->regs_size; i++)
+ printf("0x%08x: %s\n", curr_bd->regs[i], curr_bd->regs[i].name);
+ for (int i = 0; i < curr_bd->alt_regs_size; i++)
+ printf("0x%08x: %s\n", curr_bd->alt_regs[i], curr_bd->alt_regs[i].name);
+ }
+ }
+
close(fd);
exit(0);
}
diff --git a/v4l2-apps/util/v4l-board-dbg.h b/v4l2-apps/util/v4l2-dbg.h
index d7e7a9ef3..06ceb0ea2 100644
--- a/v4l2-apps/util/v4l-board-dbg.h
+++ b/v4l2-apps/util/v4l2-dbg.h
@@ -14,11 +14,13 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#ifndef _V4L_BOARD_DBG
-#define _V4L_BOARD_DBG
+#ifndef _V4L2_DBG_H_
+#define _V4L2_DBG_H_
+
struct board_regs {
unsigned int reg;
- char *name;
+ const char *name;
int size;
};
+
#endif