diff --git a/memory/Makefile b/memory/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..5acf059ad88e32dd3f13880565cd1dfa31fed021 --- /dev/null +++ b/memory/Makefile @@ -0,0 +1,81 @@ +# setup +# modified by zerom for WinARM 8/2010 + +COMPILE_OPTS = -mlittle-endian -mthumb -mthumb-interwork +COMPILE_OPTS += -Wall -O2 -fno-common +#COMPILE_OPTS += -Wall -g -fno-common +COMPILE_OPTS += -ffreestanding -nostdlib + +COMPILE_OPTS_M4_FPU = -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mcpu=cortex-m4 +COMPILE_OPTS_M0 = -mfloat-abi=softfp -mcpu=cortex-m0 +COMPILE_OPTS_M0plus = -mfloat-abi=softfp -mcpu=cortex-m0plus +COMPILE_OPTS_M3 = -mfloat-abi=softfp -mcpu=cortex-m3 + +INCLUDE_DIRS = -I./include/ + +TCHAIN_PREFIX=arm-none-eabi- + +CC = $(TCHAIN_PREFIX)gcc +CFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS) + +AR = $(TCHAIN_PREFIX)ar +ARFLAGS = cr + +MEMORY_OUT_M4_FPU = ./lib/memory_m4_fpu.a +MEMORY_OUT_M0 = ./lib/memory_m0.a +MEMORY_OUT_M0plus = ./lib/memory_m0plus.a +MEMORY_OUT_M3 = ./lib/memory_m3.a + +SRC_DIR=./src/ +SRC=$(wildcard $(SRC_DIR)*.c) + +MEMORY_M4_FPU_OBJ_DIR=build/m4_fpu/ +MEMORY_M4_FPU_OBJS_TMP = $(notdir $(SRC:.c=.o)) +MEMORY_M4_FPU_OBJS = $(patsubst %,$(MEMORY_M4_FPU_OBJ_DIR)%,$(MEMORY_M4_FPU_OBJS_TMP)) + +MEMORY_M0_OBJ_DIR=build/m0/ +MEMORY_M0_OBJS_TMP = $(notdir $(SRC:.c=.o)) +MEMORY_M0_OBJS = $(patsubst %,$(MEMORY_M0_OBJ_DIR)%,$(MEMORY_M0_OBJS_TMP)) + +MEMORY_M0plus_OBJ_DIR=build/m0plus/ +MEMORY_M0plus_OBJS_TMP = $(notdir $(SRC:.c=.o)) +MEMORY_M0plus_OBJS = $(patsubst %,$(MEMORY_M0plus_OBJ_DIR)%,$(MEMORY_M0plus_OBJS_TMP)) + +MEMORY_M3_OBJ_DIR=build/m3/ +MEMORY_M3_OBJS_TMP = $(notdir $(SRC:.c=.o)) +MEMORY_M3_OBJS = $(patsubst %,$(MEMORY_M3_OBJ_DIR)%,$(MEMORY_M3_OBJS_TMP)) + +all: $(MEMORY_OUT_M4_FPU) $(MEMORY_OUT_M0) $(MEMORY_OUT_M0plus) $(MEMORY_OUT_M3) +$(MEMORY_M4_FPU_OBJ_DIR)%.o: $(SRC_DIR)%.c + $(CC) -c $(CFLAGS) $(COMPILE_OPTS_M4_FPU) -o $@ $< +$(MEMORY_M0_OBJ_DIR)%.o: $(SRC_DIR)%.c + $(CC) -c $(CFLAGS) $(COMPILE_OPTS_M0) -o $@ $< +$(MEMORY_M0plus_OBJ_DIR)%.o: $(SRC_DIR)%.c + $(CC) -c $(CFLAGS) $(COMPILE_OPTS_M0plus) -o $@ $< +$(MEMORY_M3_OBJ_DIR)%.o: $(SRC_DIR)%.c + $(CC) -c $(CFLAGS) $(COMPILE_OPTS_M3) -o $@ $< +mkdir_build: + mkdir -p build/m4_fpu + mkdir -p build/m0 + mkdir -p build/m0plus + mkdir -p build/m3 +$(MEMORY_OUT_M4_FPU): mkdir_build $(MEMORY_M4_FPU_OBJS) + mkdir -p lib + $(AR) $(ARFLAGS) $@ $(MEMORY_M4_FPU_OBJS) +$(MEMORY_OUT_M0): mkdir_build $(MEMORY_M0_OBJS) + mkdir -p lib + $(AR) $(ARFLAGS) $@ $(MEMORY_M0_OBJS) +$(MEMORY_OUT_M0plus): mkdir_build $(MEMORY_M0plus_OBJS) + mkdir -p lib + $(AR) $(ARFLAGS) $@ $(MEMORY_M0plus_OBJS) +$(MEMORY_OUT_M3): mkdir_build $(MEMORY_M3_OBJS) + mkdir -p lib + $(AR) $(ARFLAGS) $@ $(MEMORY_M3_OBJS) + +clean: + rm -f $(MEMORY_M4_FPU_OBJS) + rm -f $(MEMORY_M0_OBJS) + rm -f $(MEMORY_M0plus_OBJS) + rm -f $(MEMORY_M3_OBJS) + rm -rf lib + rm -rf build diff --git a/memory/include/mem_module.h b/memory/include/mem_module.h new file mode 100644 index 0000000000000000000000000000000000000000..f11445d7b8c5691470d420bccb24ba09ddb8180a --- /dev/null +++ b/memory/include/mem_module.h @@ -0,0 +1,26 @@ +#ifndef _MEM_MODULE_H +#define _MEM_MODULE_H + +#define MAX_NUM_SEGMENTS 4 + +typedef struct +{ + unsigned short int start_address; + unsigned short int length; +}TMemSegment; + +typedef struct +{ + unsigned char num_ram_segments; + TMemSegment ram_segments[MAX_NUM_SEGMENTS]; + unsigned char num_eeprom_segments; + TMemSegment eeprom_segments[MAX_NUM_SEGMENTS]; + void (*write_cmd)(unsigned short int address,unsigned short int length,unsigned char *data); + void (*read_cmd)(unsigned short int address,unsigned short int length,unsigned char *data); +}TMemModule; + +void mem_module_init(TMemModule *module); +void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length); +void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length); + +#endif diff --git a/memory/include/memory.h b/memory/include/memory.h new file mode 100644 index 0000000000000000000000000000000000000000..6bfa88711d742bc6be3cd4b0da8fffec17c819ec --- /dev/null +++ b/memory/include/memory.h @@ -0,0 +1,24 @@ +#ifndef _MEMORY_H +#define _MEMORY_H + +#include "mem_module.h" + +#define MAX_NUM_MEM_MODULES 16 +#define EEPROM_SIZE 256 +#define RAM_SIZE 4096 + +typedef struct +{ + unsigned char num_mem_modules; + TMemModule *mem_modules[MAX_NUM_MEM_MODULES]; + unsigned char (*eeprom_write_data)(unsigned short int address,unsigned short int data); + unsigned char (*eeprom_read_data)(unsigned short int address,unsigned short int *data); +}TMemory; + +void mem_init(TMemory *memory); +void mem_initialize_data(TMemory *memory); +void mem_add_module(TMemory *memory, TMemModule *module); +void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data); +void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data); + +#endif diff --git a/memory/src/mem_module.c b/memory/src/mem_module.c new file mode 100644 index 0000000000000000000000000000000000000000..61d875b3d31b1fce7d1ea2773f4ca8c66ac7f471 --- /dev/null +++ b/memory/src/mem_module.c @@ -0,0 +1,39 @@ +#include "mem_module.h" + +void mem_module_init(TMemModule *module) +{ + unsigned char i; + + module->num_ram_segments=0; + module->num_eeprom_segments=0; + for(i=0;i<MAX_NUM_SEGMENTS;i++) + { + module->ram_segments[i].start_address=0x0000; + module->ram_segments[i].length=0x0000; + module->eeprom_segments[i].start_address=0x0000; + module->eeprom_segments[i].length=0x0000; + } + module->write_cmd=0x00000000; + module->read_cmd=0x00000000; +} + +void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length) +{ + if(module->num_ram_segments<MAX_NUM_SEGMENTS-1) + { + module->ram_segments[module->num_ram_segments].start_address=start_address; + module->ram_segments[module->num_ram_segments].length=length; + module->num_ram_segments++; + } +} + +void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length) +{ + if(module->num_eeprom_segments<MAX_NUM_SEGMENTS-1) + { + module->eeprom_segments[module->num_eeprom_segments].start_address=start_address; + module->eeprom_segments[module->num_eeprom_segments].length=length; + module->num_eeprom_segments++; + } +} + diff --git a/memory/src/memory.c b/memory/src/memory.c new file mode 100644 index 0000000000000000000000000000000000000000..359c276c05ae48367d909c25299a735b7e933b7b --- /dev/null +++ b/memory/src/memory.c @@ -0,0 +1,124 @@ +#include "memory.h" +#include "mem_module.h" + +/* private functions */ +unsigned char mem_in_window(unsigned short int mem_start_address,unsigned short int mem_length,unsigned short int start_address,unsigned short int length) +{ + unsigned short int end_mem=mem_start_address+mem_length; + unsigned short int end_address=start_address+length; + + if((mem_start_address>=start_address && mem_start_address<end_address) || + (end_mem>=start_address && end_mem<end_address) || + (start_address>=mem_start_address && start_address<end_mem) || + (end_address>=mem_start_address && end_address<end_mem)) + return 0x01; + else + return 0x00; +} + +/* public functions */ +void mem_init(TMemory *memory) +{ + unsigned char i; + + memory->num_mem_modules=0; + for(i=0;i<MAX_NUM_MEM_MODULES;i++) + memory->mem_modules[i]=0x00000000; + memory->eeprom_write_data=0x00000000; + memory->eeprom_read_data=0x00000000; +} + +void mem_initialize_data(TMemory *memory) +{ + TMemModule *mem_module; + unsigned short data; + unsigned short int i,j; + unsigned char eeprom_data[EEPROM_SIZE]; + + if(memory->eeprom_read_data!=0x00000000) + { + for(i=0;i<EEPROM_SIZE;i++) + { + memory->eeprom_read_data(i,&data); + eeprom_data[i]=data&0x00FF; + } + for(i=0;i<memory->num_mem_modules;i++) + { + mem_module=memory->mem_modules[i]; + for(j=0;j<mem_module->num_eeprom_segments;j++) + { + if(mem_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[i].length,0x0000,EEPROM_SIZE)) + { + if(mem_module->write_cmd!=0x00000000) + mem_module->write_cmd(0x0000,EEPROM_SIZE,eeprom_data); + } + } + } + } +} + +void mem_add_module(TMemory *memory, TMemModule *module) +{ + if(memory->num_mem_modules<MAX_NUM_MEM_MODULES-1) + { + memory->mem_modules[memory->num_mem_modules]=module; + memory->num_mem_modules++; + } +} + +void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data) +{ + TMemModule *mem_module; + unsigned char i,j,k; + + for(i=0;i<memory->num_mem_modules;i++) + { + mem_module=memory->mem_modules[i]; + for(j=0;j<mem_module->num_ram_segments;j++) + { + if(mem_in_window(mem_module->ram_segments[j].start_address,mem_module->ram_segments[i].length,start_address,length)) + { + if(mem_module->write_cmd!=0x00000000) + mem_module->write_cmd(start_address,length,data); + } + } + for(j=0;j<mem_module->num_eeprom_segments;j++) + { + if(mem_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[i].length,start_address,length)) + { + if(mem_module->write_cmd!=0x00000000) + mem_module->write_cmd(start_address,length,data); + if(memory->eeprom_write_data!=0x00000000) + for(k=start_address;k<EEPROM_SIZE || k<start_address+length;k++) + memory->eeprom_write_data(k,data[start_address-mem_module->eeprom_segments[j].start_address]); + } + } + } +} + +void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data) +{ + TMemModule *mem_module; + unsigned char i,j; + + for(i=0;i<memory->num_mem_modules;i++) + { + mem_module=memory->mem_modules[i]; + for(j=0;j<mem_module->num_ram_segments;j++) + { + if(mem_in_window(mem_module->ram_segments[j].start_address,mem_module->ram_segments[i].length,start_address,length)) + { + if(mem_module->read_cmd!=0x00000000) + mem_module->read_cmd(start_address,length,data); + } + } + for(j=0;j<mem_module->num_eeprom_segments;j++) + { + if(mem_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[i].length,start_address,length)) + { + if(mem_module->read_cmd!=0x00000000) + mem_module->read_cmd(start_address,length,data); + } + } + } +} diff --git a/memory/test/Makefile b/memory/test/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..4c69e9f649753d404f14bbccfd06b45dda47e302 --- /dev/null +++ b/memory/test/Makefile @@ -0,0 +1,36 @@ +# setup +# modified by zerom for WinARM 8/2010 + +PROJECT_NAME=memory_test +TARGET_FILES=$(wildcard *.c) +TARGET_FILES+=$(wildcard ../src/*.c) +BUILD_PATH=build +BIN_PATH=bin + +INCLUDE_DIRS = -I../include + +CC = gcc + +UTILS_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o)) +UTILS_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(UTILS_OBJS_TMP)) + +OUT_FILE=$(BIN_PATH)/$(PROJECT_NAME) + +all: $(OUT_FILE) + +make_dirs: + mkdir -p $(BUILD_PATH) + mkdir -p $(BIN_PATH) + +$(BUILD_PATH)/%.o: %.c + $(CC) -c -g $(INCLUDE_DIRS) -o $@ $< + +$(BUILD_PATH)/%.o: ../src/%.c + $(CC) -c -g $(INCLUDE_DIRS) -o $@ $< + +$(OUT_FILE): make_dirs $(UTILS_OBJS) + $(CC) -g $(UTILS_OBJS) -lpthread --output $@ + +clean: + -rm -rf $(BUILD_PATH) + -rm -rf $(BIN_PATH) diff --git a/memory/test/memory_test.c b/memory/test/memory_test.c new file mode 100644 index 0000000000000000000000000000000000000000..20d7efc7d142f65a02f2728bc5f8b6ba0721a26a --- /dev/null +++ b/memory/test/memory_test.c @@ -0,0 +1,56 @@ +#include "mem_module.h" +#include "memory.h" + +void module1_init_mem(unsigned char init_eeprom) +{ + +} + +void module1_write_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data) +{ + +} + +void module1_read_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data) +{ + +} + +void module2_init_mem(unsigned char init_eeprom) +{ + +} + +void module2_write_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data) +{ + +} + +void module2_read_cmd(unsigned short int start_address,unsigned short int length,unsigned char *data) +{ + +} + +int main(void) +{ + TMemory memory; + TMemModule module1; + TMemModule module2; + + mem_module_init(&module1); + module1.write_cmd=module1_write_cmd; + module1.read_cmd=module1_read_cmd; + mem_module_init(&module2); + module2.write_cmd=module2_write_cmd; + module2.read_cmd=module2_read_cmd; + mem_init(&memory); + + mem_module_add_ram_segment(&module1,0x0000,0x0005); + mem_module_add_ram_segment(&module1,0x0055,0x000A); + mem_module_add_eeprom_segment(&module1,0x0100,0x0020); + mem_add_module(&memory,&module1); + + mem_module_add_ram_segment(&module2,0x0200,0x0005); + mem_module_add_eeprom_segment(&module2,0x0180,0x0020); + mem_add_module(&memory,&module2); +}