videomixer: config system + store video resolution in flash
This commit is contained in:
parent
cfb9074755
commit
14b50dbb0c
|
@ -1,10 +1,13 @@
|
|||
#ifndef __HW_MEM_H
|
||||
#define __HW_MEM_H
|
||||
|
||||
/* TODO: those FLASH_ defines are platform-dependent, generate them from SoC description */
|
||||
#define FLASH_OFFSET_BITSTREAM 0x00000000 /* 1536k */
|
||||
#define FLASH_OFFSET_BIOS 0x00180000 /* 128k */
|
||||
#define FLASH_OFFSET_APP 0x001A0000 /* remaining space */
|
||||
|
||||
#define FLASH_BLOCK_SIZE (128*1024)
|
||||
|
||||
#define SDRAM_BASE 0x40000000
|
||||
|
||||
#define MINIMAC_RX0_BASE 0xb0000000
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
MSCDIR=../..
|
||||
include $(MSCDIR)/software/common.mak
|
||||
|
||||
OBJECTS=isr.o processor.o dvisampler0.o dvisampler1.o edid.o pll.o ci.o main.o
|
||||
OBJECTS=isr.o processor.o dvisampler0.o dvisampler1.o edid.o pll.o ci.o config.o main.o
|
||||
|
||||
all: videomixer.bin videomixer.fbi
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <console.h>
|
||||
#include <generated/csr.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "dvisampler0.h"
|
||||
#include "dvisampler1.h"
|
||||
#include "processor.h"
|
||||
|
@ -46,8 +47,10 @@ void ci_service(void)
|
|||
int m;
|
||||
|
||||
m = c - '0';
|
||||
if(m < PROCESSOR_MODE_COUNT)
|
||||
if(m < PROCESSOR_MODE_COUNT) {
|
||||
config_set(CONFIG_KEY_RESOLUTION, m);
|
||||
processor_start(m);
|
||||
}
|
||||
}
|
||||
switch(c) {
|
||||
case 'l':
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <hw/mem.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#define FLASH_OFFSET_CONFIG (FLASH_OFFSET_APP + FLASH_BLOCK_SIZE)
|
||||
|
||||
static volatile unsigned short *flash_config = (unsigned short *)(0x80000000 | FLASH_OFFSET_CONFIG);
|
||||
|
||||
static void wait_program(void)
|
||||
{
|
||||
while(!(*flash_config & 0x0080)); /* Read status register */
|
||||
*flash_config = 0x0050; /* Clear status register */
|
||||
*flash_config = 0x00ff; /* Go to Read Array mode */
|
||||
}
|
||||
|
||||
static void config_erase_block(void)
|
||||
{
|
||||
*flash_config = 0x0020; /* Setup Erase */
|
||||
*flash_config = 0x00d0; /* Confirm Erase */
|
||||
wait_program();
|
||||
}
|
||||
|
||||
static void config_write(int offset, unsigned short data)
|
||||
{
|
||||
flash_config[offset] = 0x0040; /* Word Program */
|
||||
flash_config[offset] = data;
|
||||
wait_program();
|
||||
}
|
||||
|
||||
static const unsigned char config_defaults[CONFIG_KEY_COUNT] = CONFIG_DEFAULTS;
|
||||
static int config_record_count;
|
||||
static unsigned char config_values[CONFIG_KEY_COUNT];
|
||||
|
||||
static int config_process_record(unsigned char key, unsigned char value)
|
||||
{
|
||||
if(key >= CONFIG_KEY_COUNT)
|
||||
return 0;
|
||||
config_record_count++;
|
||||
config_values[key] = value;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void config_init(void)
|
||||
{
|
||||
volatile unsigned int *flash_config32 = (unsigned int *)flash_config;
|
||||
int i;
|
||||
unsigned int flash_word;
|
||||
|
||||
memcpy(config_values, config_defaults, CONFIG_KEY_COUNT);
|
||||
|
||||
for(i=0;i<FLASH_BLOCK_SIZE/4;i++) {
|
||||
flash_word = flash_config32[i];
|
||||
if(!config_process_record((flash_word >> 24) & 0xff, (flash_word >> 16) & 0xff))
|
||||
break;
|
||||
if(!config_process_record((flash_word >> 8) & 0xff, flash_word & 0xff))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void config_write_all(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
config_erase_block();
|
||||
config_record_count = 0;
|
||||
for(i=0;i<CONFIG_KEY_COUNT;i++) {
|
||||
if(config_values[i] != config_defaults[i]) {
|
||||
config_write(config_record_count, (i << 8) | config_values[i]);
|
||||
config_record_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char config_get(unsigned char key)
|
||||
{
|
||||
return config_values[key];
|
||||
}
|
||||
|
||||
void config_set(unsigned char key, unsigned char value)
|
||||
{
|
||||
if(config_values[key] == value)
|
||||
return;
|
||||
config_values[key] = value;
|
||||
if(config_record_count < FLASH_BLOCK_SIZE/2)
|
||||
config_write(config_record_count++, (key << 8) | value);
|
||||
else
|
||||
config_write_all();
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
enum {
|
||||
CONFIG_KEY_RESOLUTION = 0,
|
||||
CONFIG_KEY_BLEND_USER1,
|
||||
CONFIG_KEY_BLEND_USER2,
|
||||
CONFIG_KEY_BLEND_USER3,
|
||||
CONFIG_KEY_BLEND_USER4,
|
||||
|
||||
CONFIG_KEY_COUNT
|
||||
};
|
||||
|
||||
#define CONFIG_DEFAULTS { 6, 1, 2, 3, 4 }
|
||||
|
||||
void config_init(void);
|
||||
void config_write_all(void);
|
||||
unsigned char config_get(unsigned char key);
|
||||
void config_set(unsigned char key, unsigned char value);
|
||||
|
||||
#endif /* __CONFIG_H */
|
|
@ -8,6 +8,7 @@
|
|||
#include <hw/flags.h>
|
||||
#include <console.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "ci.h"
|
||||
#include "processor.h"
|
||||
|
||||
|
@ -92,8 +93,9 @@ int main(void)
|
|||
|
||||
printf("Mixxeo software rev. %08x built "__DATE__" "__TIME__"\n\n", GIT_ID);
|
||||
|
||||
config_init();
|
||||
time_init();
|
||||
processor_start(6);
|
||||
processor_start(config_get(CONFIG_KEY_RESOLUTION));
|
||||
|
||||
while(1) {
|
||||
processor_service();
|
||||
|
|
Loading…
Reference in New Issue