/* * 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 #include #include #include #include #include #include #include #include #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; }