o http://thread.gmane.org/gmane.linux.vdr/17095 Updated to apply to em8300 driver version 0.16.2-rc1. --- em8300setup/em8300setup.c~ 2005-10-20 01:15:16.000000000 +0300 +++ em8300setup/em8300setup.c 2007-04-04 03:07:38.000000000 +0300 @@ -114,7 +114,7 @@ char ucode_file[200]; // bad hardcoded value ;-) /* Vars to hold desired setings - init to -1 so we can see which were requested to be set explicitly by the user and which should be left alone */ - int tvmode=-1, aspect=-1, audio=-1, spu=-1, upload=0, display_only=0; + int tvmode=-1, aspect=-1, audio=-1, spu=-1, upload=0, display_only=0, wssmode=-1; char * devs[] = {"/dev/em8300-0","/dev/em8300-1","/dev/em8300-2","/dev/em8300-3"}; @@ -177,12 +177,45 @@ upload=1; printf("Using microcode file %s\n",ucode_file); break; + case 'z': + switch (opt[2]) { + case '0': + wssmode = EM8300_WSS_OFF; + break; + case '1': + wssmode = EM8300_WSS_4_3; + break; + case '2': + wssmode = EM8300_WSS_14_9; + if (opt[3]=='l') wssmode = EM8300_WSS_14_9_LETTERBOX; + if (opt[3]=='t') wssmode = EM8300_WSS_14_9_LETTERBOX_TOP; + break; + case '3': + wssmode = EM8300_WSS_16_9; + if (opt[3]=='l') wssmode = EM8300_WSS_16_9_LETTERBOX; + if (opt[3]=='t') wssmode = EM8300_WSS_16_9_LETTERBOX_TOP; + if (opt[3]=='p') wssmode = EM8300_WSS_16P_9_LETTERBOX; + break; + default: + printf("Unknown option -z%c\n\n",opt[2]);; + exit(1); + } + break; default: printf("Unknown option -%c \n\n",opt[1]); printf("Usage: em8300setup [-q]|[all other options]\n\nWhere options are one of the following (latter options will override previously\nspecified options for the same control):\n\n"); printf(" -p, -p6, -n\tSet display mode to pal, pal60, ntsc\n"); printf(" -a, -d, -3\tSet audio mode to analog, digitalpcm, digital ac3\n"); printf(" -o, -w\tSet aspect ratio to normal[4:3], widescreen[16:9]\n"); + printf(" -z0\t\tSet WSS to disabled\n"); + printf(" -z1\t\tSet WSS to 4:3\n"); + printf(" -z2\t\tSet WSS to 14:9\n"); + printf(" -z2l\t\tSet WSS to 14:9 letterbox\n"); + printf(" -z2t\t\tSet WSS to 14:9 letterbox top\n"); + printf(" -z3\t\tSet WSS to 16:9\n"); + printf(" -z3l\t\tSet WSS to 16:9 letterbox\n"); + printf(" -z3t\t\tSet WSS to 16:9 letterbox top\n"); + printf(" -z3p\t\tSet WSS to >16:9 letterbox\n"); printf(" -S, -s\tSet spu mode On(S), Off(s)\n"); printf(" -f \tSpecify alternate location of microcode\n\t\t(Defaults to " FIRMWARE_DIR "/em8300.bin)\n"); printf(" -q\t\tQuery the current settings for all of the above and\n\t\texit without making any changes\n"); @@ -272,6 +305,12 @@ if(ioctl(DEV, EM8300_IOCTL_SET_ASPECTRATIO, &aspect) == -1) check_errno("Unable to set aspect ratio"); } + if(wssmode!=-1) { + printf("Setting WSS = %i\n",wssmode); + if(ioctl(DEV, EM8300_IOCTL_SET_WSS, &wssmode) == -1) + check_errno("Unable to set wss"); + } + if(audio!=-1) { printf("Setting audio = %i\n",audio); if(ioctl(DEV, EM8300_IOCTL_SET_AUDIOMODE, &audio) == -1) --- include/linux/em8300.h~ 2007-03-17 00:08:39.000000000 +0200 +++ include/linux/em8300.h 2007-04-04 03:07:40.000000000 +0300 @@ -80,6 +80,7 @@ #define EM8300_IOCTL_SCR_SETSPEED _IOW('C',17,unsigned) #define EM8300_IOCTL_FLUSH _IOW('C',18,int) #define EM8300_IOCTL_VBI _IOW('C',19,struct timeval) +#define EM8300_IOCTL_SET_WSS _IOW('C',20,int) #define EM8300_OVERLAY_SIGNAL_ONLY 1 #define EM8300_OVERLAY_SIGNAL_WITH_VGA 2 @@ -97,6 +98,16 @@ #define EM8300_ASPECTRATIO_16_9 1 #define EM8300_ASPECTRATIO_LAST 1 +#define EM8300_WSS_OFF 0 +#define EM8300_WSS_4_3 8 +#define EM8300_WSS_14_9_LETTERBOX 1 +#define EM8300_WSS_14_9_LETTERBOX_TOP 2 +#define EM8300_WSS_16_9_LETTERBOX 11 +#define EM8300_WSS_16_9_LETTERBOX_TOP 4 +#define EM8300_WSS_16P_9_LETTERBOX 13 +#define EM8300_WSS_14_9 14 +#define EM8300_WSS_16_9 7 + #define EM8300_VIDEOMODE_PAL 0 #define EM8300_VIDEOMODE_PAL60 1 #define EM8300_VIDEOMODE_NTSC 2 @@ -486,6 +497,7 @@ int em8300_control_ioctl(struct em8300_s *em, int cmd, unsigned long arg); int em8300_ioctl_setvideomode(struct em8300_s *em, int mode); int em8300_ioctl_setaspectratio(struct em8300_s *em, int ratio); +int em8300_ioctl_setwss(struct em8300_s *em, int wsscode); int em8300_ioctl_getstatus(struct em8300_s *em, char *usermsg); int em8300_ioctl_init(struct em8300_s *em, em8300_microcode_t *useruc); void em8300_ioctl_enable_videoout(struct em8300_s *em, int mode); --- modules/adv717x.c~ 2007-03-09 01:48:00.000000000 +0200 +++ modules/adv717x.c 2007-04-04 03:07:34.000000000 +0300 @@ -218,6 +218,7 @@ int pp_ntsc; int pd_adj_pal; int pd_adj_ntsc; + int wsscode; unsigned char config[32]; int configlen; @@ -430,6 +431,63 @@ /* ADV7170/1 RGB sync: MR42 (register 4, bit 2) */ SET_REG(tmpconfig[ADV7170_REG_MR4], 2, mode_info[data->out_mode].conf.sync_all); + + switch (data->wsscode) { + case 0x08: + /* 4:3 full */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x08; + break; + case 0x01: + /* 14:9 letterbox center */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x01; + break; + case 0x02: + /* 14:9 letterbox top */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x02; + break; + case 0x0b: + /* 16:9 letterbox center */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x0b; + break; + case 0x04: + /* 16:9 letterbox top */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x04; + break; + case 0x0d: + /* >16:9 letterbox center */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x0d; + break; + case 0x0e: + /* 14:9 full */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x0e; + break; + case 0x07: + /* 16:9 full */ + tmpconfig[22] = 0x80; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x07; + break; + default: + tmpconfig[22] = 0x00; + tmpconfig[23] = 0x00; + tmpconfig[24] = 0x00; + break; + } + break; } /* ADV7170/1/5A/6A non-interlace: MR10 (register 1, bit 0) */ @@ -591,6 +649,7 @@ data->out_mode = output_mode_nr[em->card_nr]; if (data->out_mode < 0 || data->out_mode >= MODE_MAX) data->out_mode = 0; + data->wsscode = 0; adv717x_setmode(ENCODER_MODE_PAL60, client); @@ -696,6 +755,42 @@ data->enableoutput = (long int) arg; adv717x_update(client); break; + case ENCODER_CMD_WSS_4_3: + data->wsscode = 8; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_14_9_LETTERBOX: + data->wsscode = 1; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_14_9_LETTERBOX_TOP: + data->wsscode = 2; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_16_9_LETTERBOX: + data->wsscode = 11; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_16_9_LETTERBOX_TOP: + data->wsscode = 4; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_16P_9_LETTERBOX: + data->wsscode = 13; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_14_9: + data->wsscode = 14; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_16_9: + data->wsscode = 7; + adv717x_update(client); + break; + case ENCODER_CMD_WSS_OFF: + data->wsscode = 0; + adv717x_update(client); + break; case ENCODER_CMD_GETCONFIG: { struct em8300_s *em = i2c_get_adapdata(client->adapter); --- modules/em8300_ioctl.c~ 2007-03-03 12:13:25.000000000 +0200 +++ modules/em8300_ioctl.c 2007-04-04 03:07:33.000000000 +0300 @@ -174,6 +174,20 @@ } break; + case _IOC_NR(EM8300_IOCTL_SET_WSS): + em8300_require_ucode(em); + + if (!em->ucodeloaded) { + return -ENOTTY; + } + + if (_IOC_DIR(cmd) & _IOC_WRITE) { + get_user(val, (int *) arg); + em8300_ioctl_setwss(em, val); + } + + break; + case _IOC_NR(EM8300_IOCTL_SET_PLAYMODE): em8300_require_ucode(em); @@ -611,6 +625,52 @@ return 0; } +int em8300_ioctl_setwss(struct em8300_s *em, int wsscode) +{ + int wsscmd; + + switch (wsscode) { + case EM8300_WSS_OFF: + wsscmd = ENCODER_CMD_WSS_OFF; + break; + case EM8300_WSS_4_3: + wsscmd = ENCODER_CMD_WSS_4_3; + break; + case EM8300_WSS_14_9_LETTERBOX: + wsscmd = ENCODER_CMD_WSS_14_9_LETTERBOX; + break; + case EM8300_WSS_14_9_LETTERBOX_TOP: + wsscmd = ENCODER_CMD_WSS_14_9_LETTERBOX_TOP; + break; + case EM8300_WSS_16_9_LETTERBOX: + wsscmd = ENCODER_CMD_WSS_16_9_LETTERBOX; + break; + case EM8300_WSS_16_9_LETTERBOX_TOP: + wsscmd = ENCODER_CMD_WSS_16_9_LETTERBOX_TOP; + break; + case EM8300_WSS_16P_9_LETTERBOX: + wsscmd = ENCODER_CMD_WSS_16P_9_LETTERBOX; + break; + case EM8300_WSS_14_9: + wsscmd = ENCODER_CMD_WSS_14_9; + break; + case EM8300_WSS_16_9: + wsscmd = ENCODER_CMD_WSS_16_9; + break; + default: + return -1; + } + + em8300_dicom_disable(em); + if (em->encoder) { + em->encoder->driver->command(em->encoder, wsscmd, (void *) 0 ); + } + + em8300_dicom_enable(em); + em8300_dicom_update(em); + return 0; +} + int em8300_ioctl_setplaymode(struct em8300_s *em, int mode) { switch (mode) { --- modules/encoder.h~ 2007-03-09 01:48:00.000000000 +0200 +++ modules/encoder.h 2007-04-04 03:07:41.000000000 +0300 @@ -13,6 +13,15 @@ #define ENCODER_CMD_SETMODE 1 #define ENCODER_CMD_ENABLEOUTPUT 2 +#define ENCODER_CMD_WSS_4_3 3 +#define ENCODER_CMD_WSS_14_9_LETTERBOX 4 +#define ENCODER_CMD_WSS_14_9_LETTERBOX_TOP 5 +#define ENCODER_CMD_WSS_16_9_LETTERBOX 6 +#define ENCODER_CMD_WSS_16_9_LETTERBOX_TOP 7 +#define ENCODER_CMD_WSS_16P_9_LETTERBOX 8 +#define ENCODER_CMD_WSS_14_9 9 +#define ENCODER_CMD_WSS_16_9 10 +#define ENCODER_CMD_WSS_OFF 11 #define ENCODER_CMD_GETCONFIG 0xDEADBEEF #endif --- em8300setup/em8300setup.1~ 2005-10-20 01:15:16.000000000 +0300 +++ em8300setup/em8300setup.1 2007-04-04 03:07:30.000000000 +0300 @@ -26,6 +26,33 @@ \fB-o\fR, \fB-w\fR Set aspect ratio to respectively normal (4:3) or wide-screen (16:9). .TP +\fB-z0\fR +Set WSS to disabled. +.TP +\fB-z1\fR +Set WSS to 4:3. +.TP +\fB-z2\fR +Set WSS to 14:9. +.TP +\fB-z2l\fR +Set WSS to 14:9 letterbox. +.TP +\fB-z2t\fR +Set WSS to 14:9 letterbox top. +.TP +\fB-z3\fR +Set WSS to 16:9. +.TP +\fB-z3l\fR +Set WSS to 16:9 letterbox. +.TP +\fB-z3t\fR +Set WSS to 16:9 letterbox top. +.TP +\fB-z3p\fR +Set WSS to >16:9 letterbox. +.TP \fB-S\fR, \fB-s\fR Set sub-pictures respectively on or off. .TP