videomixer: config system + store video resolution in flash

This commit is contained in:
Sebastien Bourdeauducq 2013-11-30 23:07:19 +01:00
parent cfb9074755
commit 14b50dbb0c
6 changed files with 122 additions and 3 deletions

View File

@ -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

View File

@ -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

View File

@ -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':

View File

@ -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();
}

View File

@ -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 */

View File

@ -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();