add ofbset (OMAP fbset)
authorGrazvydas Ignotas <notasas@gmail.com>
Mon, 26 Apr 2010 14:03:22 +0000 (17:03 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Mon, 26 Apr 2010 14:03:22 +0000 (17:03 +0300)
Makefile
ofbset.c [new file with mode: 0644]

index be54a6d..f5a8fe4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ CFLAGS += -Wall -O2
 LDFLAGS += -s
 INSTALL ?= bin
 
-BIN = op_runfbapp op_gammatool op_test_inputs
+BIN = op_runfbapp op_gammatool op_test_inputs ofbset
 
 all: $(BIN)
 
@@ -22,5 +22,6 @@ install: $(INSTALL) $(BIN)
        cp op_runfbapp $(INSTALL)/
        cp op_gammatool $(INSTALL)/op_gammatool_bin
        cp op_test_inputs $(INSTALL)/op_test_inputs_bin
+       cp ofbset $(INSTALL)/
        cp scripts/op_gammatool $(INSTALL)/
        cp scripts/op_test_inputs $(INSTALL)/
diff --git a/ofbset.c b/ofbset.c
new file mode 100644 (file)
index 0000000..9d8e39f
--- /dev/null
+++ b/ofbset.c
@@ -0,0 +1,160 @@
+/*
+ * ofbset - fbset for OMAP displays
+ *
+ * Copyright (c) 2010, GraÅžvydas Ignotas
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the organization nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#define __user
+#include "omapfb.h"
+
+#define RET_CHECK(r, msg) \
+       if (ret < 0) { \
+               perror(msg); \
+               return 1; \
+       }
+
+static void usage(void)
+{
+       fprintf(stderr, "usage:\n"
+               "    -h, --help   : this help\n"
+               "    -s, --show   : show current settings\n"
+               "    -fb <device> : framebuffer device (default /dev/fb0)\n"
+               "    -mem <bytes> : memory to reserve for this FB\n"
+               "    -pos <x y>   : overlay position on display\n"
+               "    -size <w h>  : overlay size\n"
+               "    -en <{1,0}>  : enable/disable the overlay\n");
+
+       exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+       struct omapfb_plane_info pi;
+       struct omapfb_mem_info mi;
+       const char *fbname = "/dev/fb0";
+       const char *newmem = NULL;
+       const char *newx = NULL, *newy = NULL;
+       const char *neww = NULL, *newh = NULL;
+       const char *enable = NULL;
+       int old_enable, show = 0, change = 0;
+       int i, ret, fd;
+
+       if (argc < 2)
+               usage();
+
+       for (i = 1; i < argc; i++) {
+               if      (!strcmp(argv[i], "-s"))
+                       show = 1;
+               else if (!strcmp(argv[i], "-fb") && i + 1 < argc)
+                       fbname = argv[++i];
+               else if (!strcmp(argv[i], "-mem") && i + 1 < argc) {
+                       newmem = argv[++i];
+                       change = 1;
+               }
+               else if (!strcmp(argv[i], "-pos") && i + 2 < argc) {
+                       newx = argv[++i];
+                       newy = argv[++i];
+                       change = 1;
+               }
+               else if (!strcmp(argv[i], "-size") && i + 2 < argc) {
+                       neww = argv[++i];
+                       newh = argv[++i];
+                       change = 1;
+               }
+               else if (!strcmp(argv[i], "-en") && i + 1 < argc) {
+                       enable = argv[++i];
+                       change = 1;
+               }
+               else
+                       usage();
+       }
+
+       fd = open(fbname, O_RDWR);
+       if (fd < 0) {
+               fprintf(stderr, "open %s", fbname);
+               perror("");
+               return 1;
+       }
+
+       ret = ioctl(fd, OMAPFB_QUERY_PLANE, &pi);
+       RET_CHECK(ret, "ioctl QUERY_PLANE");
+
+       ret = ioctl(fd, OMAPFB_QUERY_MEM, &mi);
+       RET_CHECK(ret, "ioctl QUERY_MEM");
+
+       if (show) {
+               printf("pos:     %d %d\n", pi.pos_x, pi.pos_y);
+               printf("size:    %d %d\n", pi.out_width, pi.out_height);
+               printf("mem:     %d\n", mi.size);
+               printf("enabled: %s\n", pi.enabled ? "yes" : "no");
+       }
+       if (!change)
+               return 0;
+
+       /* must disable when changing stuff */
+       old_enable = pi.enabled;
+       if (pi.enabled) {
+               pi.enabled = 0;
+               ret = ioctl(fd, OMAPFB_SETUP_PLANE, &pi);
+               RET_CHECK(ret, "ioctl SETUP_PLANE");
+       }
+
+       if (newmem) {
+               mi.size = strtoul(newmem, NULL, 0);
+               ret = ioctl(fd, OMAPFB_SETUP_MEM, &mi);
+               RET_CHECK(ret, "ioctl SETUP_MEM");
+       }
+
+       if (newx && newy) {
+               pi.pos_x = atoi(newx);
+               pi.pos_y = atoi(newy);
+       }
+       if (neww && newh) {
+               pi.out_width = atoi(neww);
+               pi.out_height = atoi(newh);
+       }
+       if (enable)
+               pi.enabled = atoi(enable);
+       else
+               pi.enabled = old_enable;
+
+       ret = ioctl(fd, OMAPFB_SETUP_PLANE, &pi);
+       if (ret < 0) {
+               perror("ioctl SETUP_PLANE");
+               return 1;
+       }
+
+       close(fd);
+       return 0;
+}
+