Revision 971
Added by markw over 5 years ago
| firmware_eclairexl/a800/mainmenu.c | ||
|---|---|---|
| 
     	int tv;
 
   | 
||
| 
     	int scanlines;
 
   | 
||
| 
     	int csync;
 
   | 
||
| 
     #ifdef PLL_SUPPORT
 
   | 
||
| 
     	int resolution;
 
   | 
||
| 
     	int scaler;
 
   | 
||
| 
     #endif
 
   | 
||
| 
     | 
||
| 
     #ifndef NO_FLASH
 
   | 
||
| 
     	int flashid1;
 
   | 
||
| ... | ... | |
| 
     	menuData2->tv = get_tv();
 
   | 
||
| 
     	menuData2->scanlines = get_scanlines();
 
   | 
||
| 
     	menuData2->csync = get_csync();
 
   | 
||
| 
     #ifdef PLL_SUPPORT
 
   | 
||
| 
     	menuData2->resolution = get_resolution();
 
   | 
||
| 
     	menuData2->scaler = get_scaler();
 
   | 
||
| 
     #endif
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void updateMenuDataFlashInfo(struct MenuData * menuData2)
 
   | 
||
| ... | ... | |
| 
     	menuData2->tv = !menuData2->tv;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     #ifdef PLL_SUPPORT
 
   | 
||
| 
     void menuPrintScaler(void * menuData, void * itemData)
 
   | 
||
| 
     {
 
   | 
||
| 
     	struct MenuData * menuData2 = (struct MenuData *)menuData;
 
   | 
||
| 
     	printf("Scaler:");
 
   | 
||
| 
     	if (menuData2->scaler)
 
   | 
||
| 
     		printf("Polyphasic");
 
   | 
||
| 
     	else
 
   | 
||
| 
     		printf("Area");
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void menuScaler(void * menuData, struct joystick_status * joy)
 
   | 
||
| 
     {
 
   | 
||
| 
     	struct MenuData * menuData2 = (struct MenuData *)menuData;
 
   | 
||
| 
     	menuData2->scaler = !menuData2->scaler;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void menuPrintResolution(void * menuData, void * itemData)
 
   | 
||
| 
     {
 
   | 
||
| 
     	struct MenuData * menuData2 = (struct MenuData *)menuData;
 
   | 
||
| 
     | 
||
| 
     	readFlash(romstart+0x30000,2048,SCRATCH_MEM);
 
   | 
||
| 
     	uint8_t * addr = SCRATCH_MEM;
 
   | 
||
| 
     	int mode = menuData2->resolution;
 
   | 
||
| 
     	if (menuData2->tv == TV_NTSC)
 
   | 
||
| 
     		mode = mode+4;
 
   | 
||
| 
     	addr = addr + (mode<<8);
 
   | 
||
| 
     | 
||
| 
     	printf("Resolution:%s", addr); /*get_resolution(menuData2->resolution));*/
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void menuResolution(void * menuData, struct joystick_status * joy)
 
   | 
||
| 
     {
 
   | 
||
| 
     	struct MenuData * menuData2 = (struct MenuData *)menuData;
 
   | 
||
| 
     	menuData2->resolution = menuData2->resolution + joy->x_;
 
   | 
||
| 
     	if (menuData2->resolution > 3)
 
   | 
||
| 
     		menuData2->resolution = 3;
 
   | 
||
| 
     	if (menuData2->resolution < 0)
 
   | 
||
| 
     		menuData2->resolution = 0;
 
   | 
||
| 
     }
 
   | 
||
| 
     #endif
 
   | 
||
| 
     | 
||
| 
     void menuApplyVideo(void * menuData, struct joystick_status * joy)
 
   | 
||
| 
     {
 
   | 
||
| 
     	struct MenuData * menuData2 = (struct MenuData *)menuData;
 
   | 
||
| ... | ... | |
| 
     	set_scanlines(menuData2->scanlines);
 
   | 
||
| 
     	set_csync(menuData2->csync);
 
   | 
||
| 
     #ifdef PLL_SUPPORT
 
   | 
||
| 
     	set_pll(get_tv()==TV_PAL, get_video()>=VIDEO_HDMI && get_video()<VIDEO_COMPOSITE);
 
   | 
||
| 
     	set_resolution(menuData2->resolution);
 
   | 
||
| 
     	set_scaler(menuData2->scaler);
 
   | 
||
| 
     	if (get_video()>=VIDEO_HDMI && get_video()<VIDEO_COMPOSITE)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		int mode = menuData2->resolution;
 
   | 
||
| 
     		if (get_tv()==TV_NTSC)
 
   | 
||
| 
     			mode = mode+4;
 
   | 
||
| 
     | 
||
| 
     		set_scaler_mode(mode);
 
   | 
||
| 
     	}
 
   | 
||
| 
     	else
 
   | 
||
| 
     	{
 
   | 
||
| 
     		if (get_tv()==TV_PAL)
 
   | 
||
| 
     			set_pll(MODE_PAL_ORIG);
 
   | 
||
| 
     		else
 
   | 
||
| 
     			set_pll(MODE_NTSC_ORIG);
 
   | 
||
| 
     | 
||
| 
     	}
 
   | 
||
| 
     #endif
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| ... | ... | |
| 
     		{&menuPrintTVStandard,0,&menuTVStandard,MENU_FLAG_FIRE},
 
   | 
||
| 
     		{&menuPrintScanlines,0,&menuScanlines,MENU_FLAG_FIRE},
 
   | 
||
| 
     		{&menuPrintCompositeSync,0,&menuCompositeSync,MENU_FLAG_FIRE},
 
   | 
||
| 
     #ifdef PLL_SUPPORT
 
   | 
||
| 
     		{&menuPrintScaler,0,&menuScaler,MENU_FLAG_FIRE},
 
   | 
||
| 
     		{&menuPrintResolution,0,&menuResolution,MENU_FLAG_MOVE},
 
   | 
||
| 
     #endif
 
   | 
||
| 
     		{0,"Apply video",&menuApplyVideo,MENU_FLAG_FIRE},
 
   | 
||
| 
     		{0,0,0,0}, //blank line
 
   | 
||
| 
     #endif
 
   | 
||
| firmware_eclairexl/clkgen/pll2.c | ||
|---|---|---|
| 
     #include "pll2.h"
 
   | 
||
| 
     #include "Si5351A-RevB-Registers.h"
 
   | 
||
| 
     #include "regs.h"
 
   | 
||
| 
     #include "pll.h"
 
   | 
||
| 
     #include "integer.h"
 
   | 
||
| 
     #include "spibase.h"
 
   | 
||
| 
     | 
||
| 
     void set_pll2()
 
   | 
||
| 
     {
 
   | 
||
| ... | ... | |
| 
     	}
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void program_i2c_lh(unsigned int slave, int reg, uint8_t l, uint8_t h)
 
   | 
||
| 
     {
 
   | 
||
| 
     	unsigned int write = 0x0;
 
   | 
||
| 
     	*zpu_i2c_0 = (slave<<9) | write<<8 | 0xf0 | reg;  // write addr (blocks until accepted)
 
   | 
||
| 
     	*zpu_i2c_0 = (slave<<9) | write<<8 | l; // write data (blocks until accepted)
 
   | 
||
| 
     	*zpu_i2c_0 = (slave<<9) | write<<8 | h; // write data (blocks until accepted)
 
   | 
||
| 
     | 
||
| 
     	while ((*zpu_i2c_0)&0x100); // wait until busy not asserted
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void read16(uint16_t const * addr, uint8_t * l, uint8_t * h)
 
   | 
||
| 
     {
 
   | 
||
| 
     	uint8_t const * addr8 = (uint8_t const *)addr;
 
   | 
||
| 
     	*l = addr8[1];
 
   | 
||
| 
     	*h = addr8[0];
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void program_i2c_videomode(unsigned int slave, uint16_t const * regs, unsigned int from, unsigned int noRegs)
 
   | 
||
| 
     {
 
   | 
||
| 
     	int i;
 
   | 
||
| 
     	for (i=from;i!=noRegs;++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		uint8_t l,h;
 
   | 
||
| 
     		read16(regs+i,&l,&h);
 
   | 
||
| 
     | 
||
| 
     		program_i2c_lh(slave, i, l, h);
 
   | 
||
| 
     	}
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void set_crtc(uint16_t const * crtc_regs)
 
   | 
||
| 
     {
 
   | 
||
| 
     	program_i2c_lh(2,12,0,0); // disable576p
 
   | 
||
| 
     | 
||
| 
     | 
||
| 
     	uint8_t l,h;
 
   | 
||
| 
     	read16(crtc_regs+11,&l,&h);
 
   | 
||
| 
     | 
||
| 
     	program_i2c_lh(2,11,l,h); // set the clock!
 
   | 
||
| 
     	program_i2c_lh(2,11,l,h); // set the clock again (looks like this transaction is lost after a clock change)
 
   | 
||
| 
     | 
||
| 
     	program_i2c_videomode(2,crtc_regs,0,10);
 
   | 
||
| 
     	//program_i2c_lh(2,10,crtc_regs[10]); // set scaler and mode*/
 
   | 
||
| 
     	int scal = get_scaler();
 
   | 
||
| 
     	read16(crtc_regs+10,&l,&h);
 
   | 
||
| 
     	program_i2c_lh(2,10,l,scal); // set scaler and mode*/
 
   | 
||
| 
     	program_i2c_lh(2,12,1,0); // enable
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void set_scale(uint16_t const * scale_regs)
 
   | 
||
| 
     {
 
   | 
||
| 
     	program_i2c_videomode(1,scale_regs,0,6);
 
   | 
||
| 
     	program_i2c_videomode(3,scale_regs+6,0,3);
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void set_scaler_mode(int mode)
 
   | 
||
| 
     {
 
   | 
||
| 
     	readFlash(romstart+0x30000,2048,SCRATCH_MEM);
 
   | 
||
| 
     	uint8_t * addr = SCRATCH_MEM;
 
   | 
||
| 
     	addr = addr + (mode<<8);
 
   | 
||
| 
     | 
||
| 
     	set_pll((video_pll_mode)*(addr+192));
 
   | 
||
| 
     	set_crtc(addr+64);
 
   | 
||
| 
     	set_scale(addr+128);
 
   | 
||
| 
     /* mode layout
 
   | 
||
| 
      * 0  :name
 
   | 
||
| 
        64 :crtc
 
   | 
||
| 
        128:scaler
 
   | 
||
| 
        192:freq
 
   | 
||
| 
      */
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| firmware_eclairexl/clkgen/pll2.h | ||
|---|---|---|
| 
     | 
||
| 
     void set_pll2();
 
   | 
||
| 
     | 
||
| 
     void set_scaler(int type);
 
   | 
||
| 
     | 
||
| 
     void set_scaler_mode(int modeno);
 
   | 
||
| 
     /*
 
   | 
||
| 
      * 0-3 PAL,4-7 NTSC
 
   | 
||
| 
      * 0=1400x576i
 
   | 
||
| 
      * 1=720x576p
 
   | 
||
| 
      * 2=1280x720p
 
   | 
||
| 
      * 3=1920x1080i
 
   | 
||
| 
      * etc
 
   | 
||
| 
      * Note that 720 and 1280 are <100% horiz scaling, so skip every other pixel
 
   | 
||
| 
      */
 
   | 
||
| 
     | 
||
| 
     #endif
 
   | 
||
| 
     | 
||
| firmware_eclairexl/main.h | ||
|---|---|---|
| 
     #include "joystick.h"
 
   | 
||
| 
     #include "freeze.h"
 
   | 
||
| 
     #include "vidi2c.h"
 
   | 
||
| 
     #include "pll.h"
 
   | 
||
| 
     | 
||
| 
     #include "simpledir.h"
 
   | 
||
| 
     #include "simplefile.h"
 
   | 
||
| ... | ... | |
| 
     BIT_REG(,0x07,28,turbo_drive,zpu_out1) 
 
   | 
||
| 
     BIT_REG(,0x01,31,turbo_6502_vblank_only,zpu_out1) 
 
   | 
||
| 
     | 
||
| 
     BIT_REG(,0x07,0,video,zpu_out6)
 
   | 
||
| 
     BIT_REG(,0x07,0,video,zpu_out6) // 4 bits,3 used... what to do...
 
   | 
||
| 
     BIT_REG(,0x01,4,tv,zpu_out6)
 
   | 
||
| 
     BIT_REG(,0x01,5,scanlines,zpu_out6)
 
   | 
||
| 
     BIT_REG(,0x01,6,csync,zpu_out6)
 
   | 
||
| 
     BIT_REG(,0x07,7,resolution,zpu_out6)
 
   | 
||
| 
     BIT_REG(,0x07,10,scaler,zpu_out6) // 3 bits to allow multiple polyphasic filters
 
   | 
||
| 
     | 
||
| 
     #ifdef DEBUG_SUPPORT
 
   | 
||
| 
     BIT_REG(,0xffff,0,debug_addr,zpu_out7)
 
   | 
||
| ... | ... | |
| 
     	*zpu_out6 = settings[1];
 
   | 
||
| 
     | 
||
| 
     #ifdef PLL_SUPPORT
 
   | 
||
| 
     	set_pll(get_tv()==TV_PAL, get_video()>=VIDEO_HDMI && get_video()<VIDEO_COMPOSITE);
 
   | 
||
| 
     	if (get_video()>=VIDEO_HDMI && get_video()<VIDEO_COMPOSITE)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		int mode = get_resolution();
 
   | 
||
| 
                     if (get_tv()==TV_NTSC)
 
   | 
||
| 
                             mode = mode+4;
 
   | 
||
| 
     | 
||
| 
                     set_scaler_mode(mode);
 
   | 
||
| 
     	}
 
   | 
||
| 
     	else
 
   | 
||
| 
     	{
 
   | 
||
| 
     		if (get_tv()==TV_PAL)
 
   | 
||
| 
     			set_pll(MODE_PAL_ORIG);
 
   | 
||
| 
     		else
 
   | 
||
| 
     			set_pll(MODE_NTSC_ORIG);
 
   | 
||
| 
     	}
 
   | 
||
| 
     #endif
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| firmware_eclairexl/pll/pll.c | ||
|---|---|---|
| 
     	*pll_go = 1;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void set_pll(int pal, int hdmi)
 
   | 
||
| 
     | 
||
| 
     void set_pll(video_pll_mode mode)
 
   | 
||
| 
     {
 
   | 
||
| 
     	switch (pal<<1 | hdmi)
 
   | 
||
| 
     	switch (mode)
 
   | 
||
| 
     	{
 
   | 
||
| 
     	case 0:
 
   | 
||
| 
     	case MODE_NTSC_ORIG:
 
   | 
||
| 
     		//ntsc_svideo
 
   | 
||
| 
     		setVideoPLL(0x909,0x404,0x40404,0x80808,0xc1010,0x2,0x7,0x53c7fe31);
 
   | 
||
| 
     		break;
 
   | 
||
| 
     | 
||
| 
     	case 1:
 
   | 
||
| 
     	case MODE_NTSC_5994:
 
   | 
||
| 
     		//ntsc_5994
 
   | 
||
| 
     		//5994! Should be 2700000/525/858 (60/1001) 
 
   | 
||
| 
     		//setVideoPLL(0x20f0e,0x20706,0x60706,0x80d0d,0xc1a1a,0x2,0x7,0xca571058);
 
   | 
||
| 
     		//RAM fails!M=29?? Too high FVCO? setVideoPLL(0x20f0e,0x20706,0x60706,0x80d0d,0xc1a1a,0x2,0x7,0xca590425);
 
   | 
||
| 
     		setVideoPLL(0xa0a,0x20504,0x60504,0x80909,0xc1212,0x2,0x7,0x9fc77906);
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 2:
 
   | 
||
| 
     | 
||
| 
     	case MODE_NTSC_60:
 
   | 
||
| 
     		// ntsc_6000 (for 720p)
 
   | 
||
| 
     		setVideoPLL(0xa0a,0x20504,0x60504,0x80909,0xc1212,0x2,0x7,0xA50F18A2);
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case MODE_PAL_ORIG:
 
   | 
||
| 
     		//pal_svideo
 
   | 
||
| 
     		//RAM fails!!M=29?? Too high FVCO? setVideoPLL(0x20f0e,0x20706,0x60706,0x80d0d,0xc1a1a,0x2,0x7,0x829a43e4);
 
   | 
||
| 
     		//Works, but less accurate setVideoPLL(0x20504,0x202,0x40202,0x80404,0xc0808,0x2,0x7,0x147e3bf0);
 
   | 
||
| 
     		setVideoPLL(0xa0a,0x20504,0x60504,0x80909,0xc1212,0x2,0x7,0x6e1c079e);
 
   | 
||
| 
     		break;
 
   | 
||
| 
     | 
||
| 
     	case 3:
 
   | 
||
| 
     	case MODE_PAL_50:
 
   | 
||
| 
     		//pal_50
 
   | 
||
| 
     		setVideoPLL(0x20605,0x20302,0x60302,0x80505,0xc0a0a,0x3,0x8,0x61bb05fb);
 
   | 
||
| 
     		break;
 
   | 
||
| firmware_eclairexl/pll/pll.h | ||
|---|---|---|
| 
     #ifndef PLL_H
 
   | 
||
| 
     #define PLL_H
 
   | 
||
| 
     | 
||
| 
     void set_pll(int pal, int hdmi);
 
   | 
||
| 
     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;
 
   | 
||
| 
     void set_pll(video_pll_mode mode);
 
   | 
||
| 
     | 
||
| 
     #endif
 
   | 
||
| 
     | 
||
Add support for 480i/576i,720p and 1080i