From 14b50dbb0c78ce0d0393156b3d5d6cb3104bc6c8 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sat, 30 Nov 2013 23:07:19 +0100 Subject: [PATCH] videomixer: config system + store video resolution in flash --- software/include/hw/mem.h | 3 ++ software/videomixer/Makefile | 2 +- software/videomixer/ci.c | 5 +- software/videomixer/config.c | 90 ++++++++++++++++++++++++++++++++++++ software/videomixer/config.h | 21 +++++++++ software/videomixer/main.c | 4 +- 6 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 software/videomixer/config.c create mode 100644 software/videomixer/config.h diff --git a/software/include/hw/mem.h b/software/include/hw/mem.h index 5df28894..0f83563d 100644 --- a/software/include/hw/mem.h +++ b/software/include/hw/mem.h @@ -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 diff --git a/software/videomixer/Makefile b/software/videomixer/Makefile index 8920d60f..b5deb32f 100644 --- a/software/videomixer/Makefile +++ b/software/videomixer/Makefile @@ -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 diff --git a/software/videomixer/ci.c b/software/videomixer/ci.c index 6b0f4304..2f91e380 100644 --- a/software/videomixer/ci.c +++ b/software/videomixer/ci.c @@ -3,6 +3,7 @@ #include #include +#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': diff --git a/software/videomixer/config.c b/software/videomixer/config.c new file mode 100644 index 00000000..4b3d56ed --- /dev/null +++ b/software/videomixer/config.c @@ -0,0 +1,90 @@ +#include +#include +#include + +#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> 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 #include +#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(); -- 2.30.2