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

Merge branch 'dynamixel_manager' of...

Merge branch 'dynamixel_manager' of https://gitlab.iri.upc.edu/humanoides/stm32_libraries into dynamixel_manager
parents cccefe2b 3f6d9017
No related branches found
No related tags found
1 merge request!6Dynamixel manager
......@@ -3,6 +3,7 @@
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
......
......@@ -2,8 +2,8 @@
# 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 += -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
......
......@@ -20,7 +20,7 @@ typedef struct
}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);
unsigned char mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
unsigned char mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
#endif
......@@ -4,20 +4,20 @@
#include "mem_module.h"
#define MAX_NUM_MEM_MODULES 16
#define EEPROM_SIZE 256
#define RAM_SIZE 4096
#define EEPROM_SIZE 32
#define RAM_SIZE 256
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);
unsigned short int (*eeprom_write_data)(unsigned short int address,unsigned short int data);
unsigned short int (*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);
unsigned char 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);
......
#include "mem_module.h"
extern 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);
void mem_module_init(TMemModule *module)
{
unsigned char i;
......@@ -17,23 +19,59 @@ void mem_module_init(TMemModule *module)
module->read_cmd=0x00000000;
}
void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
unsigned char mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
{
TMemSegment *current_segment;
unsigned char current_seg;
if(module->num_ram_segments<MAX_NUM_SEGMENTS-1)
{
for(current_seg=0;current_seg<module->num_ram_segments;current_seg++)
{
current_segment=&module->ram_segments[current_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
return 0x00;
}
for(current_seg=0;current_seg<module->num_eeprom_segments;current_seg++)
{
current_segment=&module->eeprom_segments[current_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
return 0x00;
}
module->ram_segments[module->num_ram_segments].start_address=start_address;
module->ram_segments[module->num_ram_segments].length=length;
module->num_ram_segments++;
return 0x01;
}
else
return 0x00;
}
void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
unsigned char mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
{
TMemSegment *current_segment;
unsigned char current_seg;
if(module->num_eeprom_segments<MAX_NUM_SEGMENTS-1)
{
for(current_seg=0;current_seg<module->num_ram_segments;current_seg++)
{
current_segment=&module->ram_segments[current_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
return 0x00;
}
for(current_seg=0;current_seg<module->num_eeprom_segments;current_seg++)
{
current_segment=&module->eeprom_segments[current_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
return 0x00;
}
module->eeprom_segments[module->num_eeprom_segments].start_address=start_address;
module->eeprom_segments[module->num_eeprom_segments].length=length;
module->num_eeprom_segments++;
return 0x01;
}
else
return 0x00;
}
#include "memory.h"
#include "mem_module.h"
/* private variables */
unsigned char memory_total_eeprom;
unsigned char memory_total_ram;
/* 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;
unsigned short int end_mem=mem_start_address+mem_length-1;
unsigned short int end_address=start_address+length-1;
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))
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;
......@@ -26,6 +30,10 @@ void mem_init(TMemory *memory)
memory->mem_modules[i]=0x00000000;
memory->eeprom_write_data=0x00000000;
memory->eeprom_read_data=0x00000000;
/* initialize internal variables */
memory_total_eeprom=0;
memory_total_ram=0;
}
void mem_initialize_data(TMemory *memory)
......@@ -34,63 +42,160 @@ void mem_initialize_data(TMemory *memory)
unsigned short data;
unsigned short int i,j;
unsigned char eeprom_data[EEPROM_SIZE];
unsigned short int actual_address,actual_length;
if(memory->eeprom_read_data!=0x00000000)
{
for(i=0;i<EEPROM_SIZE;i++)
{
memory->eeprom_read_data(i,&data);
eeprom_data[i]=data&0x00FF;
if(memory->eeprom_read_data(i,&data))
eeprom_data[i]=0x00;
else
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_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[j].length,0x0000,EEPROM_SIZE))
{
if(mem_module->write_cmd!=0x00000000)
mem_module->write_cmd(0x0000,EEPROM_SIZE,eeprom_data);
{
actual_address=mem_module->eeprom_segments[j].start_address;
actual_length=EEPROM_SIZE-mem_module->eeprom_segments[j].start_address;
if((actual_address+actual_length)>(mem_module->eeprom_segments[j].start_address+mem_module->eeprom_segments[j].length))
actual_length-=((actual_address+actual_length)-(mem_module->eeprom_segments[j].start_address+mem_module->eeprom_segments[j].length));
mem_module->write_cmd(actual_address,actual_length,&eeprom_data[actual_address]);
}
}
}
}
}
}
void mem_add_module(TMemory *memory, TMemModule *module)
unsigned char mem_add_module(TMemory *memory, TMemModule *module)
{
TMemModule *current_module;
TMemSegment *current_segment,*new_segment;
unsigned char current_mod,current_seg,new_seg;
if(memory->num_mem_modules<MAX_NUM_MEM_MODULES-1)
{
/* check segments do not intersect */
for(current_mod=0;current_mod<memory->num_mem_modules;current_mod++)
{
current_module=memory->mem_modules[current_mod];
for(current_seg=0;current_seg<current_module->num_ram_segments;current_seg++)
{
current_segment=&current_module->ram_segments[current_seg];
for(new_seg=0;new_seg<module->num_ram_segments;new_seg++)
{
new_segment=&module->ram_segments[new_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
return 0x00;
}
for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++)
{
new_segment=&module->eeprom_segments[new_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
return 0x00;
}
}
for(current_seg=0;current_seg<current_module->num_eeprom_segments;current_seg++)
{
current_segment=&current_module->eeprom_segments[current_seg];
for(new_seg=0;new_seg<module->num_ram_segments;new_seg++)
{
new_segment=&module->ram_segments[new_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
return 0x00;
}
for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++)
{
new_segment=&module->eeprom_segments[new_seg];
if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
return 0x00;
}
}
}
// check available memory
for(new_seg=0;new_seg<module->num_ram_segments;new_seg++)
{
memory_total_ram+=module->ram_segments[new_seg].length;
if(memory_total_ram>RAM_SIZE)
return 0x00;
}
for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++)
{
memory_total_eeprom+=module->eeprom_segments[new_seg].length;
if(memory_total_eeprom>EEPROM_SIZE)
return 0x00;
memory_total_ram+=module->eeprom_segments[new_seg].length;
if(memory_total_ram>RAM_SIZE)
return 0x00;
}
memory->mem_modules[memory->num_mem_modules]=module;
memory->num_mem_modules++;
return 0x01;
}
else
return 0x00;
}
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;
unsigned short int actual_address,actual_length;
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_in_window(mem_module->ram_segments[j].start_address,mem_module->ram_segments[j].length,start_address,length))
{
if(mem_module->write_cmd!=0x00000000)
mem_module->write_cmd(start_address,length,data);
{
if(start_address<mem_module->ram_segments[j].start_address)
{
actual_address=mem_module->ram_segments[j].start_address;
actual_length=length-(mem_module->ram_segments[j].start_address-start_address);
}
else
{
actual_address=start_address;
actual_length=length;
}
if((actual_address+actual_length)>(mem_module->ram_segments[j].start_address+mem_module->ram_segments[j].length))
actual_length-=((actual_address+actual_length)-(mem_module->ram_segments[j].start_address+mem_module->ram_segments[j].length));
mem_module->write_cmd(actual_address,actual_length,&data[actual_address-start_address]);
}
}
}
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_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[j].length,start_address,length))
{
if(start_address<mem_module->eeprom_segments[j].start_address)
{
actual_address=mem_module->eeprom_segments[j].start_address;
actual_length=length-(mem_module->eeprom_segments[j].start_address-start_address);
}
else
{
actual_address=start_address;
actual_length=length;
}
if((actual_address+actual_length)>(mem_module->eeprom_segments[j].start_address+mem_module->eeprom_segments[j].length))
actual_length-=((actual_address+actual_length)-(mem_module->eeprom_segments[j].start_address+mem_module->eeprom_segments[j].length));
if(mem_module->write_cmd!=0x00000000)
mem_module->write_cmd(start_address,length,data);
mem_module->write_cmd(actual_address,actual_length,&data[actual_address-start_address]);
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]);
for(k=actual_address;k<(actual_address+actual_length);k++)
memory->eeprom_write_data(k,data[k-start_address]);
}
}
}
......@@ -100,24 +205,53 @@ void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short
{
TMemModule *mem_module;
unsigned char i,j;
unsigned short int actual_address,actual_length;
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_in_window(mem_module->ram_segments[j].start_address,mem_module->ram_segments[j].length,start_address,length))
{
if(mem_module->read_cmd!=0x00000000)
mem_module->read_cmd(start_address,length,data);
{
if(start_address<mem_module->ram_segments[j].start_address)
{
actual_address=mem_module->ram_segments[j].start_address;
actual_length=length-(mem_module->ram_segments[j].start_address-start_address);
}
else
{
actual_address=start_address;
actual_length=length;
}
if((actual_address+actual_length)>(mem_module->ram_segments[j].start_address+mem_module->ram_segments[j].length))
actual_length-=((actual_address+actual_length)-(mem_module->ram_segments[j].start_address+mem_module->ram_segments[j].length));
mem_module->read_cmd(actual_address,actual_length,&data[actual_address-start_address]);
}
}
}
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_in_window(mem_module->eeprom_segments[j].start_address,mem_module->eeprom_segments[j].length,start_address,length))
{
if(mem_module->read_cmd!=0x00000000)
mem_module->read_cmd(start_address,length,data);
{
if(start_address<mem_module->eeprom_segments[j].start_address)
{
actual_address=mem_module->eeprom_segments[j].start_address;
actual_length=length-(mem_module->eeprom_segments[j].start_address-start_address);
}
else
{
actual_address=start_address;
actual_length=length;
}
if((actual_address+actual_length)>(mem_module->eeprom_segments[j].start_address+mem_module->eeprom_segments[j].length))
actual_length-=((actual_address+actual_length)-(mem_module->eeprom_segments[j].start_address+mem_module->eeprom_segments[j].length));
mem_module->read_cmd(actual_address,actual_length,&data[actual_address-start_address]);
}
}
}
}
......
#include "mem_module.h"
#include "memory.h"
#include <stdio.h>
void module1_init_mem(unsigned char init_eeprom)
{
......@@ -45,12 +46,26 @@ int main(void)
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);
if(!mem_module_add_ram_segment(&module1,0x0000,0x0005))
printf("Impossible to add segment\n");
if(!mem_module_add_ram_segment(&module1,0x0055,0x000A))
printf("Impossible to add segment\n");
if(!mem_module_add_eeprom_segment(&module1,0x0100,0x0020))
printf("Impossible to add segment\n");
if(!mem_add_module(&memory,&module1))
printf("Impossible to add module\n");
if(!mem_module_add_ram_segment(&module2,0x0200,0x0005))
printf("Impossible to add segment\n");
if(!mem_module_add_eeprom_segment(&module2,0x0180,0x0020))
printf("Impossible to add segment\n");
if(!mem_add_module(&memory,&module2))
printf("Impossible to add module\n");
if(!mem_module_add_ram_segment(&module2,0x050,0x000A))
printf("Impossible to add segment\n");
if(!mem_module_add_eeprom_segment(&module2,0x0180,0x0030))
printf("Impossible to add segment\n");
if(!mem_add_module(&memory,&module2))
printf("Impossible to add module\n");
}
......@@ -3,6 +3,7 @@
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
......
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