Skip to content
Snippets Groups Projects
Commit 2bc8e25d authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Merge branch 'cherry-pick-0948226f' into 'master'

Added a module to handle the memory interface (both RAM and EEPROM) of dynamixel modules.

See merge request !1
parents ed63a9c9 354a06d1
No related branches found
No related tags found
1 merge request!1Added a module to handle the memory interface (both RAM and EEPROM) of dynamixel modules.
# 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
#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
#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
#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++;
}
}
#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);
}
}
}
}
# 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)
#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);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment