blob: 5238f10464a60cb1a33a1904249464b9100678f5 [file] [log] [blame]
/*
* PS3 video mode utility.
*
* Copyright (C) 2006 Sony Computer Entertainment Inc.
* Copyright 2006 Sony Corp.
*
* 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 rrogram; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "ps3-av.h"
#define PS3_UTILS_APP_NAME "ps3-video-mode"
#if defined(PACKAGE_VERSION) && defined(PACKAGE_NAME)
#define PS3_UTILS_VERSION PS3_UTILS_APP_NAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n"
#else
#define PS3_UTILS_VERSION ""
#endif
#if defined(PACKAGE_BUGREPORT)
#define PS3_UTILS_BUGREPORT "Send bug reports to " PACKAGE_BUGREPORT ".\n"
#else
#define PS3_UTILS_BUGREPORT ""
#endif
#if defined(DEBUG)
#define DBG(_args...) do {fprintf(stderr, _args);} while(0)
#else
static inline int __attribute__ ((format (printf, 1, 2))) DBG(
__attribute__((unused)) const char *fmt, ...) {return 0;}
#endif
static const char fb_dev[] = "/dev/fb0";
static void print_version(void)
{
printf(PS3_UTILS_VERSION);
}
static void print_usage(void)
{
fprintf(stderr, PS3_UTILS_VERSION);
fprintf(stderr,
"SYNOPSIS\n"
" ps3-video-mode [-m, --mode mode-id] [-r, --rgb] [-f, --full-screen]\n"
" [-g, --full-range] [-d, --dither] [-h, --help]\n"
" [-V, --version]\n"
"OPTIONS\n"
" -m, --mode mode-id\n"
" Set the system video mode to mode-id.\n"
" AUTO Detect Mode:\n"
" 0: auto (480i/576i if not HDMI)\n"
" 60 Hz Broadcast Modes:\n"
" 1: 480i (576 x 384)\n"
" 2: 480p (576 x 384)\n"
" 3: 720p (1124 x 644)\n"
" 4: 1080i (1688 x 964)\n"
" 5: 1080p (1688 x 964)\n"
" 50 Hz Broadcast Modes:\n"
" 6: 576i (576 x 460)\n"
" 7: 576p (576 x 460)\n"
" 8: 720p (1124 x 644)\n"
" 9: 1080i (1688 x 964)\n"
" 10: 1080p (1688 x 964)\n"
" VESA Modes:\n"
" 11: wxga (1280 x 768)\n"
" 12: sxga (1280 x 1024)\n"
" 13: wuxga (1920 x 1200)\n"
" 60 Hz Full Screen Broadcast Modes:\n"
" 129: 480if (720 x 480)\n"
" 130: 480pf (720 x 480)\n"
" 131: 720pf (1280 x 720)\n"
" 132: 1080if (1920 x 1080)\n"
" 133: 1080pf (1920 x 1080)\n"
" 50 Hz Full Screen Broadcast Modes:\n"
" 134: 576if (720 x 576)\n"
" 135: 576pf (720 x 576)\n"
" 136: 720pf (1280 x 720)\n"
" 137: 1080if (1920 x 1080)\n"
" 138: 1080pf (1920 x 1080)\n"
" -r, --rgb\n"
" Use RGB color space mode.\n"
" -f, --full-screen\n"
" Use full screen mode.\n"
" -g, --full-range\n"
" Use full range mode.\n"
" -d, --dither\n"
" Use dither mode.\n"
" -h, --help\n"
" Print a help message.\n"
" -V, --version\n"
" Display the program version number.\n"
"See the ps3-video-mode man page for more detailed information.\n"
);
fprintf(stderr, PS3_UTILS_BUGREPORT);
}
static const struct option long_options[] = {
{"mode", required_argument, NULL, 'm'},
{"rgb", no_argument, NULL, 'r'},
{"full-screen", no_argument, NULL, 'f'},
{"full-range", no_argument, NULL, 'g'},
{"dither", no_argument, NULL, 'd'},
{"hdcp" , no_argument, NULL, 'H'}, /* HDCP OFF, no support on retail PS3 */
{"video" , required_argument, NULL, 'v'}, /* legacy option */
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{ NULL, 0, NULL, 0},
};
static const char short_options[] = "m:rfgdHv:hV";
int main(int argc, char *argv[])
{
int result;
int mode = -1;
int flags = 0;
int fd;
while(1) {
int c = getopt_long(argc, argv, short_options, long_options,
NULL);
if (c == EOF)
break;
switch(c) {
case 'v':
fprintf(stderr, "WARNING: Option -v obsolete, use -m.\n");
/* fall through to 'm' */
case 'm':
mode = atoi(optarg);
break;
case 'r':
flags |= PS3AV_MODE_RGB;
break;
case 'f':
flags |= PS3AV_MODE_FULL;
break;
case 'g':
flags |= PS3AV_MODE_COLOR;
flags |= PS3AV_MODE_WHITE;
break;
case 'd':
flags |= PS3AV_MODE_DITHER;
break;
case 'H':
flags |= PS3AV_MODE_HDCP_OFF;
break;
case 'V':
print_version();
exit(0);
case 'h':
default:
print_usage();
exit(0);
}
}
fd = open(fb_dev, O_RDWR);
if (fd < 0) {
DBG("%s:%d: open failed.\n", __func__, __LINE__);
perror(fb_dev);
exit(1);
}
if (mode < 0 && flags) {
DBG("%s:%d: flags without mode.\n", __func__, __LINE__);
print_usage();
exit(1);
}
if (mode < 0) {
result = ioctl(fd, PS3FB_IOCTL_GETMODE, (unsigned long)&mode);
if (result < 0) {
close(fd);
perror("PS3FB_IOCTL_GETMODE failed");
exit(1);
}
printf("%d\n", mode);
} else {
mode |= flags;
result = ioctl(fd, PS3FB_IOCTL_SETMODE, (unsigned long)&mode);
if (result < 0) {
close(fd);
perror("PS3FB_IOCTL_SETMODE failed");
exit(1);
}
printf("video mode:%d\n", mode);
}
close(fd);
return 0;
}