Enabled high res DIP switch
Kernel now sets display resolution based on the DIP switches.
This commit is contained in:
parent
9a6af9bbe7
commit
82f6864c8d
Binary file not shown.
|
@ -1 +0,0 @@
|
||||||
,RYOKO/pjw,Ryoko,02.05.2022 19:18,file:///C:/Users/pjw/AppData/Roaming/LibreOffice/4;
|
|
|
@ -321,6 +321,8 @@ short boot_screen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
txt_init_screen(screen);
|
txt_init_screen(screen);
|
||||||
|
txt_set_resolution(0, 0, 0); // Set the resolution based on the DIP switch
|
||||||
|
txt_set_resolution(1, 0, 0); // Set the resolution based on the DIP switch
|
||||||
print(screen, buffer);
|
print(screen, buffer);
|
||||||
|
|
||||||
#if MODEL == MODEL_FOENIX_A2560K
|
#if MODEL == MODEL_FOENIX_A2560K
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
#include "A2560K/vky_chan_a.h"
|
#include "A2560K/vky_chan_a.h"
|
||||||
|
#include "A2560K/vky_chan_b.h"
|
||||||
#include "dev/txt_screen.h"
|
#include "dev/txt_screen.h"
|
||||||
#include "dev/txt_a2560k_a.h"
|
#include "dev/txt_a2560k_a.h"
|
||||||
|
|
||||||
|
@ -153,6 +154,26 @@ short txt_a2560k_a_set_mode(short mode) {
|
||||||
* @return 0 on success, any other number means the resolution is unsupported
|
* @return 0 on success, any other number means the resolution is unsupported
|
||||||
*/
|
*/
|
||||||
short txt_a2560k_a_set_resolution(short width, short height) {
|
short txt_a2560k_a_set_resolution(short width, short height) {
|
||||||
|
|
||||||
|
// If no size specified, set it based on the DIP switch
|
||||||
|
if ((width == 0) || (height == 0)) {
|
||||||
|
if ((*VKY3_B_MCR & VKY3_B_HIRES) == 0) {
|
||||||
|
width = 1024;
|
||||||
|
height = 768;
|
||||||
|
} else {
|
||||||
|
width = 800;
|
||||||
|
height = 600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kick the PLL
|
||||||
|
// If VICKY is generating a 40MHz signal, we need to switch the bit to go to 40MHz before
|
||||||
|
// clearing it to go back to 25MHz.
|
||||||
|
if (*VKY3_A_MCR & VKY3_A_CLK40) {
|
||||||
|
*VKY3_A_MCR |= VKY3_A_1024x768;
|
||||||
|
*VKY3_A_MCR &= ~(VKY3_A_1024x768);
|
||||||
|
}
|
||||||
|
|
||||||
/* Turn off resolution bits */
|
/* Turn off resolution bits */
|
||||||
msr_shadow &= ~(VKY3_A_1024x768);
|
msr_shadow &= ~(VKY3_A_1024x768);
|
||||||
|
|
||||||
|
@ -524,6 +545,14 @@ void txt_a2560k_a_init() {
|
||||||
t_rect region;
|
t_rect region;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// Kick the PLL
|
||||||
|
// If VICKY is generating a 40MHz signal, we need to switch the bit to go to 40MHz before
|
||||||
|
// clearing it to go back to 25MHz.
|
||||||
|
if (*VKY3_A_MCR & VKY3_A_CLK40) {
|
||||||
|
*VKY3_A_MCR |= VKY3_A_1024x768;
|
||||||
|
*VKY3_A_MCR &= ~(VKY3_A_1024x768);
|
||||||
|
}
|
||||||
|
|
||||||
a2560k_a_resolution.width = 0;
|
a2560k_a_resolution.width = 0;
|
||||||
a2560k_a_resolution.height = 0;
|
a2560k_a_resolution.height = 0;
|
||||||
a2560k_a_font_size.width = 0;
|
a2560k_a_font_size.width = 0;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
#include "A2560K/vky_chan_a.h"
|
||||||
#include "A2560K/vky_chan_b.h"
|
#include "A2560K/vky_chan_b.h"
|
||||||
#include "dev/txt_screen.h"
|
#include "dev/txt_screen.h"
|
||||||
#include "dev/txt_a2560k_b.h"
|
#include "dev/txt_a2560k_b.h"
|
||||||
|
@ -166,6 +167,25 @@ short txt_a2560k_b_set_mode(short mode) {
|
||||||
short txt_a2560k_b_set_resolution(short width, short height) {
|
short txt_a2560k_b_set_resolution(short width, short height) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// If no size specified, set it based on the DIP switch
|
||||||
|
if ((width == 0) || (height == 0)) {
|
||||||
|
if ((*VKY3_B_MCR & VKY3_B_HIRES) == 0) {
|
||||||
|
width = 800;
|
||||||
|
height = 600;
|
||||||
|
} else {
|
||||||
|
width = 640;
|
||||||
|
height = 480;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kick the PLL
|
||||||
|
// If VICKY is generating a 40MHz signal, we need to switch the bit to go to 40MHz before
|
||||||
|
// clearing it to go back to 25MHz.
|
||||||
|
if (*VKY3_B_MCR & VKY3_B_CLK40) {
|
||||||
|
*VKY3_B_MCR |= VKY3_B_PLL | VKY3_B_MODE1;
|
||||||
|
*VKY3_B_MCR &= ~(VKY3_B_PLL | VKY3_B_MODE1);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < a2560k_b_caps.resolution_count; i++) {
|
for (i = 0; i < a2560k_b_caps.resolution_count; i++) {
|
||||||
if ((a2560k_b_caps.resolutions[i].width == width) && (a2560k_b_caps.resolutions[i].height == height)) {
|
if ((a2560k_b_caps.resolutions[i].width == width) && (a2560k_b_caps.resolutions[i].height == height)) {
|
||||||
msr_shadow_b &= ~(VKY3_B_DOUBLE | VKY3_B_MODE0 | VKY3_B_MODE1);
|
msr_shadow_b &= ~(VKY3_B_DOUBLE | VKY3_B_MODE0 | VKY3_B_MODE1);
|
||||||
|
@ -180,14 +200,14 @@ short txt_a2560k_b_set_resolution(short width, short height) {
|
||||||
// Use the height to determine the resolution we should set
|
// Use the height to determine the resolution we should set
|
||||||
switch (height) {
|
switch (height) {
|
||||||
case 400: // 640x400 or 320x200 (mode = 11)
|
case 400: // 640x400 or 320x200 (mode = 11)
|
||||||
msr_shadow_b |= VKY3_B_MODE0 | VKY3_B_MODE1;
|
msr_shadow_b |= VKY3_B_MODE0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 480: // 640x480 or 320x240 (mode = 00)
|
case 480: // 640x480 or 320x240 (mode = 00)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 800: // 800x600 or 400x300 (mode = 01)
|
case 600: // 800x600 or 400x300 (mode = 01)
|
||||||
msr_shadow_b |= VKY3_B_MODE0;
|
msr_shadow_b |= VKY3_B_PLL | VKY3_B_MODE1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -202,6 +222,13 @@ short txt_a2560k_b_set_resolution(short width, short height) {
|
||||||
// Recalculate the size of the screen
|
// Recalculate the size of the screen
|
||||||
txt_a2560k_b_set_sizes();
|
txt_a2560k_b_set_sizes();
|
||||||
|
|
||||||
|
// Kick the PLL
|
||||||
|
if (*VKY3_B_MCR & VKY3_B_PLL) {
|
||||||
|
*VKY3_B_MCR &= ~(VKY3_B_PLL | VKY3_B_MODE0 | VKY3_B_MODE1);
|
||||||
|
*VKY3_B_MCR |= (VKY3_B_PLL | VKY3_B_MODE1);
|
||||||
|
}
|
||||||
|
*VKY3_B_MCR &= ~(VKY3_B_PLL | VKY3_B_MODE0 | VKY3_B_MODE1);
|
||||||
|
|
||||||
// Update the register
|
// Update the register
|
||||||
*VKY3_B_MCR = msr_shadow_b;
|
*VKY3_B_MCR = msr_shadow_b;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -546,6 +573,14 @@ void txt_a2560k_b_init() {
|
||||||
t_rect region;
|
t_rect region;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// Kick the PLL
|
||||||
|
// If VICKY is generating a 40MHz signal, we need to switch the bit to go to 40MHz before
|
||||||
|
// clearing it to go back to 25MHz.
|
||||||
|
if (*VKY3_B_MCR & VKY3_B_CLK40) {
|
||||||
|
*VKY3_B_MCR |= VKY3_B_PLL | VKY3_B_MODE1;
|
||||||
|
*VKY3_B_MCR &= ~(VKY3_B_PLL | VKY3_B_MODE1);
|
||||||
|
}
|
||||||
|
|
||||||
a2560k_b_resolution.width = 0;
|
a2560k_b_resolution.width = 0;
|
||||||
a2560k_b_resolution.height = 0;
|
a2560k_b_resolution.height = 0;
|
||||||
a2560k_b_font_size.width = 0;
|
a2560k_b_font_size.width = 0;
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#define VKY3_A_MCR_TEXT 0x00000001 /**< Text mode enable bit */
|
#define VKY3_A_MCR_TEXT 0x00000001 /**< Text mode enable bit */
|
||||||
#define VKY3_A_MCR_SLEEP 0x00040000 /**< Monitor sleep (synch disable) bit */
|
#define VKY3_A_MCR_SLEEP 0x00040000 /**< Monitor sleep (synch disable) bit */
|
||||||
#define VKY3_A_1024x768 0x00000800 /**< Bit to select 1024x768 screen resolution */
|
#define VKY3_A_1024x768 0x00000800 /**< Bit to select 1024x768 screen resolution */
|
||||||
|
#define VKY3_A_HIRES 0x40000000 /**< Bit to indicate on read if hi-res display is requested on the DIP switches */
|
||||||
|
#define VKY3_A_CLK40 0x80000000 /**< Indicate if PLL is 25MHz (0) or 40MHz (1) */
|
||||||
|
|
||||||
/** Border control register for Channel A */
|
/** Border control register for Channel A */
|
||||||
#define VKY3_A_BCR ((volatile unsigned long *)0xFEC40004)
|
#define VKY3_A_BCR ((volatile unsigned long *)0xFEC40004)
|
||||||
|
|
|
@ -19,7 +19,10 @@
|
||||||
#define VKY3_B_MODE0 0x00000100 /**< Video Mode Bit 0 */
|
#define VKY3_B_MODE0 0x00000100 /**< Video Mode Bit 0 */
|
||||||
#define VKY3_B_MODE1 0x00000200 /**< Video Mode Bit 1 */
|
#define VKY3_B_MODE1 0x00000200 /**< Video Mode Bit 1 */
|
||||||
#define VKY3_B_DOUBLE 0x00000400 /**< Pixel Double Enable bit */
|
#define VKY3_B_DOUBLE 0x00000400 /**< Pixel Double Enable bit */
|
||||||
|
#define VKY3_B_HIRES 0x40000000 /**< DIP switch for hires mode */
|
||||||
|
#define VKY3_B_PLL 0x00000800 /**< Controls dot clock */
|
||||||
#define VKY3_B_MCR_SLEEP 0x00040000 /**< Monitor sleep (synch disable) bit */
|
#define VKY3_B_MCR_SLEEP 0x00040000 /**< Monitor sleep (synch disable) bit */
|
||||||
|
#define VKY3_B_CLK40 0x80000000 /**< Indicate if PLL is 25MHz (0) or 40MHz (1) */
|
||||||
|
|
||||||
/** Border control register for Channel B */
|
/** Border control register for Channel B */
|
||||||
#define VKY3_B_BCR ((volatile unsigned long *)0xFEC80004)
|
#define VKY3_B_BCR ((volatile unsigned long *)0xFEC80004)
|
||||||
|
|
18811
src/mapfile
18811
src/mapfile
File diff suppressed because it is too large
Load diff
|
@ -7,6 +7,6 @@
|
||||||
|
|
||||||
#define VER_MAJOR 0
|
#define VER_MAJOR 0
|
||||||
#define VER_MINOR 53
|
#define VER_MINOR 53
|
||||||
#define VER_BUILD 2
|
#define VER_BUILD 4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue