repo2/firmware_eclairexl/video_modes.c
972 | markw | #include <stdio.h>
|
|
#include <string.h>
|
|||
#include <stdlib.h>
|
|||
#include <byteswap.h>
|
|||
typedef enum {MODE_NTSC_5994=0,MODE_NTSC_60=1,MODE_PAL_50=2,MODE_PAL_ORIG=3,MODE_NTSC_ORIG=4} video_pll_mode;
|
|||
char const * mode_description[] =
|
|||
{
|
|||
"1440x576 50Hz interlace",
|
|||
"720x576 50Hz",
|
|||
"1280x720 50Hz",
|
|||
"1920x1080 50Hz interlace",
|
|||
"1440x480 59.94Hz interlace",
|
|||
"720x480 59.94Hz",
|
|||
"1280x720 60Hz",
|
|||
"1920x1080 60Hz interlace"
|
|||
};
|
|||
typedef unsigned short uint16_t;
|
|||
uint16_t crtc_registers[] =
|
|||
{
|
|||
/*pal576i*/
|
|||
126, /*h_syncLen*/
|
|||
138, /*h_preActiveLen*/
|
|||
1440, /*h_activeLen*/
|
|||
24, /*h_postActiveLen*/
|
|||
3, /*v_syncLen*/
|
|||
19, /*v_preActiveLen*/
|
|||
288, /*v_activeLen*/
|
|||
2, /*v_postActiveLen*/
|
|||
1, /*v_interlace*/
|
|||
864, /*v_interlaceDelayLen*/
|
|||
21, /*mode */
|
|||
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/*pal576p*/
|
|||
64, /*h_syncLen*/
|
|||
68, /*h_preActiveLen*/
|
|||
720, /*h_activeLen*/
|
|||
12, /*h_postActiveLen*/
|
|||
5, /*v_syncLen*/
|
|||
39, /*v_preActiveLen*/
|
|||
576, /*v_activeLen*/
|
|||
5, /*v_postActiveLen*/
|
|||
0, /*v_interlace*/
|
|||
0, /*v_interlaceDelayLen*/
|
|||
17, /*mode */
|
|||
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/*pal720p*/
|
|||
40, /*h_syncLen*/
|
|||
220, /*h_preActiveLen*/
|
|||
1280, /*h_activeLen*/
|
|||
440, /*h_postActiveLen*/
|
|||
5, /*v_syncLen*/
|
|||
20, /*v_preActiveLen*/
|
|||
720, /*v_activeLen*/
|
|||
5, /*v_postActiveLen*/
|
|||
0, /*v_interlace*/
|
|||
0, /*v_interlaceDelayLen*/
|
|||
19, /*mode */
|
|||
2, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/* pal 1080i */
|
|||
44, /*h_syncLen*/
|
|||
148, /*h_preActiveLen*/
|
|||
1920, /*h_activeLen*/
|
|||
528, /*h_postActiveLen*/
|
|||
5, /*v_syncLen*/
|
|||
15, /*v_preActiveLen*/
|
|||
540, /*v_activeLen*/
|
|||
2, /*v_postActiveLen*/
|
|||
1, /*v_interlace*/
|
|||
1320, /*v_interlaceDelayLen*/
|
|||
20, /*mode*/
|
|||
2, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/*ntsc480i*/
|
|||
124, /*h_syncLen*/
|
|||
114, /*h_preActiveLen*/
|
|||
1440, /*h_activeLen*/
|
|||
38, /*h_postActiveLen*/
|
|||
3, /*v_syncLen*/
|
|||
15, /*v_preActiveLen*/
|
|||
240, /*v_activeLen*/
|
|||
4, /*v_postActiveLen*/
|
|||
1, /*v_interlace*/
|
|||
858, /*v_interlaceDelayLen*/
|
|||
6, /*mode */
|
|||
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/*ntsc480p*/
|
|||
62, /*h_syncLen*/
|
|||
60, /*h_preActiveLen*/
|
|||
720, /*h_activeLen*/
|
|||
16, /*h_postActiveLen*/
|
|||
6, /*v_syncLen*/
|
|||
30, /*v_preActiveLen*/
|
|||
480, /*v_activeLen*/
|
|||
9, /*v_postActiveLen*/
|
|||
0, /*v_interlace*/
|
|||
0, /*v_interlaceDelayLen*/
|
|||
2, /*mode */
|
|||
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/* ntsc720p*/
|
|||
40, /*h_syncLen*/
|
|||
220, /*h_preActiveLen*/
|
|||
1280, /*h_activeLen*/
|
|||
110, /*h_postActiveLen*/
|
|||
5, /*v_syncLen*/
|
|||
20, /*v_preActiveLen*/
|
|||
720, /*v_activeLen*/
|
|||
5, /*v_postActiveLen*/
|
|||
0, /*v_interlace*/
|
|||
0, /*v_interlaceDelayLen*/
|
|||
4, /*mode */
|
|||
2, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
/* ntsc 1080i */
|
|||
44, /*h_syncLen*/
|
|||
148, /*h_preActiveLen*/
|
|||
1920, /*h_activeLen*/
|
|||
88, /*h_postActiveLen*/
|
|||
5, /*v_syncLen*/
|
|||
15, /*v_preActiveLen*/
|
|||
540, /*v_activeLen*/
|
|||
2, /*v_postActiveLen*/
|
|||
1, /*v_interlace*/
|
|||
1100, /*v_interlaceDelayLen*/
|
|||
5, /*mode */
|
|||
2 /*clock select - 27MHz or 74.25MHz - TODO*/
|
|||
};
|
|||
uint16_t scaler_registers[] =
|
|||
{
|
|||
400,400,328,164,328,1, /*pal576i*/
|
|||
1024,1024,1,
|
|||
400,400,328,164,164,2, /*pal576p*/
|
|||
1024,512,2,
|
|||
400,225,700,291,291,2, /*pal720p*/
|
|||
576,426,2,
|
|||
400,300,786,218,436,1, /*pal1080i*/
|
|||
768,568,1,
|
|||
400,400,328,164,328,1, /*ntsc480i*/
|
|||
1024,1024,1,
|
|||
400,400,328,164,164,2, /*ntsc480p*/
|
|||
1024,512,2,
|
|||
400,225,834,291,291,2, /*ntsc720p*/
|
|||
576,358,2,
|
|||
400,300,936,218,436,1, /*ntsc1080i*/
|
|||
768,478,1
|
|||
};
|
|||
video_pll_mode const mode_freqs[] =
|
|||
{
|
|||
MODE_PAL_50,
|
|||
MODE_PAL_50,
|
|||
MODE_PAL_50,
|
|||
MODE_PAL_50,
|
|||
MODE_NTSC_5994,
|
|||
MODE_NTSC_5994,
|
|||
MODE_NTSC_60,
|
|||
MODE_NTSC_60
|
|||
};
|
|||
/* mode layout
|
|||
* 0 :name
|
|||
64 :crtc
|
|||
128:scaler
|
|||
192:freq
|
|||
*/
|
|||
int main(void)
|
|||
{
|
|||
int nummodes = 8;
|
|||
char * buffer = malloc(nummodes*256);
|
|||
memset(buffer,0,nummodes*256);
|
|||
for (int i=0;i!=nummodes*12;++i)
|
|||
crtc_registers[i] = __bswap_16 (crtc_registers[i]);
|
|||
for (int i=0;i!=nummodes*9;++i)
|
|||
scaler_registers[i] = __bswap_16 (scaler_registers[i]);
|
|||
for (int i=0;i!=nummodes;++i)
|
|||
{
|
|||
char * base = buffer+i*256;
|
|||
strcpy(base,mode_description[i]);
|
|||
memcpy(base+64,crtc_registers+(12*i),12*2);
|
|||
memcpy(base+128,scaler_registers+(9*i),9*2);
|
|||
memcpy(base+192,&mode_freqs[i],1);
|
|||
}
|
|||
FILE * f = fopen("video_modes.rom","w");
|
|||
fwrite(buffer,1,nummodes*256,f);
|
|||
fclose(f);
|
|||
return 0;
|
|||
}
|
|||