diff --git a/memory/include/memory.h b/memory/include/memory.h index 1829fee81dbbb353df3cc2791584e24bde51e00a..e01445f9abe68e5c69b74d720e65f5daf1ab78bf 100644 --- a/memory/include/memory.h +++ b/memory/include/memory.h @@ -15,11 +15,15 @@ typedef struct { unsigned char num_mem_modules; TMemModule *mem_modules[MAX_NUM_MEM_MODULES]; + unsigned char device_id; 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); + unsigned char data[RAM_SIZE]; + unsigned char total_eeprom; + unsigned char total_ram; }TMemory; -void mem_init(TMemory *memory); +void mem_init(TMemory *memory,unsigned char device_id); void mem_initialize_data(TMemory *memory); 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); diff --git a/memory/include/ram.h b/memory/include/ram.h index ecc663695a1d6fa81089cbc8ee53c41889b9e683..1aa611f1bf238e8b1779bccfdccfcd54236d5579 100644 --- a/memory/include/ram.h +++ b/memory/include/ram.h @@ -13,17 +13,15 @@ extern "C" { #define RAM_BAD_BIT -3 #define RAM_BAD_ACCESS -4 -extern unsigned char ram_data[RAM_SIZE]; - unsigned char ram_init(TMemory *memory); -inline void ram_read_byte(unsigned short int address, unsigned char *data); -inline void ram_read_word(unsigned short int address, unsigned short int *data); -unsigned char ram_read_table(unsigned short int address, unsigned short int length,unsigned char *data); -unsigned char ram_set_bit(unsigned short int address, unsigned char bit); -unsigned char ram_clear_bit(unsigned short int address, unsigned char bit); -unsigned char ram_write_byte(unsigned short int address, unsigned char data); -unsigned char ram_write_word(unsigned short int address, unsigned short int data); -unsigned char ram_write_table(unsigned short int address, unsigned short int length,unsigned char *data); +inline void ram_read_byte(TMemory *memory,unsigned short int address, unsigned char *data); +inline void ram_read_word(TMemory *memory,unsigned short int address, unsigned short int *data); +unsigned char ram_read_table(TMemory *memory,unsigned short int address, unsigned short int length,unsigned char *data); +unsigned char ram_set_bit(TMemory *memory,unsigned short int address, unsigned char bit); +unsigned char ram_clear_bit(TMemory *memory,unsigned short int address, unsigned char bit); +unsigned char ram_write_byte(TMemory *memory,unsigned short int address, unsigned char data); +unsigned char ram_write_word(TMemory *memory,unsigned short int address, unsigned short int data); +unsigned char ram_write_table(TMemory *memory,unsigned short int address, unsigned short int length,unsigned char *data); inline unsigned char ram_in_range(unsigned short int reg,unsigned short int address,unsigned short int length); unsigned char ram_in_window(unsigned short int start_reg,unsigned short int reg_length,unsigned short int start_address,unsigned short int address_length); diff --git a/memory/src/memory.c b/memory/src/memory.c index 68fbc806be5d15e471023bd8665b03b89caab7fb..af30fbf36f18d9c31e08b50fa672aa12e2b4cf57 100644 --- a/memory/src/memory.c +++ b/memory/src/memory.c @@ -1,10 +1,6 @@ #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) { @@ -21,7 +17,7 @@ unsigned char mem_in_window(unsigned short int mem_start_address,unsigned short } /* public functions */ -void mem_init(TMemory *memory) +void mem_init(TMemory *memory,unsigned char device_id) { unsigned char i; @@ -30,10 +26,11 @@ void mem_init(TMemory *memory) memory->mem_modules[i]=0x00000000; memory->eeprom_write_data=0x00000000; memory->eeprom_read_data=0x00000000; + memory->device_id=device_id; /* initialize internal variables */ - memory_total_eeprom=0; - memory_total_ram=0; + memory->total_eeprom=0; + memory->total_ram=0; } void mem_initialize_data(TMemory *memory) @@ -48,7 +45,7 @@ void mem_initialize_data(TMemory *memory) { for(i=0;i<EEPROM_SIZE;i++) { - if(memory->eeprom_read_data(i,&data)) + if(memory->eeprom_read_data((memory->device_id<<8)+i,&data)) eeprom_data[i]=0x00; else eeprom_data[i]=data&0x00FF; @@ -122,17 +119,17 @@ unsigned char mem_add_module(TMemory *memory, TMemModule *module) // 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) + 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) + 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) + memory->total_ram+=module->eeprom_segments[new_seg].length; + if(memory->total_ram>RAM_SIZE) return 0x00; } @@ -195,7 +192,7 @@ void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned shor mem_module->write_cmd(mem_module->data,actual_address,actual_length,&data[actual_address-start_address]); if(memory->eeprom_write_data!=0x00000000) for(k=actual_address;k<(actual_address+actual_length);k++) - memory->eeprom_write_data(k,data[k-start_address]); + memory->eeprom_write_data((memory->device_id<<8)+k,data[k-start_address]); } } } diff --git a/memory/src/ram.c b/memory/src/ram.c index 444c73cb126562ff90a9daecb34deadf900cf33a..326ab7fd02830c2506f144983ebadf33558fd864 100644 --- a/memory/src/ram.c +++ b/memory/src/ram.c @@ -1,7 +1,5 @@ #include "ram.h" -unsigned char ram_data[RAM_SIZE]={0}; - unsigned char ram_init(TMemory *memory) { mem_initialize_data(memory); @@ -9,66 +7,66 @@ unsigned char ram_init(TMemory *memory) return 0x01; } -inline void ram_read_byte(unsigned short int address,unsigned char *data) +inline void ram_read_byte(TMemory *memory,unsigned short int address,unsigned char *data) { - (*data)=ram_data[address]; + (*data)=memory->data[address]; } -inline void ram_read_word(unsigned short int address, unsigned short int *data) +inline void ram_read_word(TMemory *memory,unsigned short int address, unsigned short int *data) { - (*data)=ram_data[address]; - (*data)+=ram_data[address+1]*256; + (*data)=memory->data[address]; + (*data)+=memory->data[address+1]*256; } -unsigned char ram_read_table(unsigned short int address, unsigned short int length,unsigned char *data) +unsigned char ram_read_table(TMemory *memory,unsigned short int address, unsigned short int length,unsigned char *data) { unsigned short int i; if((address+length)<=(RAM_SIZE-1)) { for(i=0;i<length;i++) - data[i]=ram_data[address+i]; + data[i]=memory->data[address+i]; return RAM_SUCCESS; } else return RAM_BAD_ADDRESS; } -unsigned char ram_set_bit(unsigned short int address, unsigned char bit) +unsigned char ram_set_bit(TMemory *memory,unsigned short int address, unsigned char bit) { if(bit>=0 && bit<8) { - ram_data[address]|=(0x01<<bit); + memory->data[address]|=(0x01<<bit); return RAM_SUCCESS; } else return RAM_BAD_BIT; } -unsigned char ram_clear_bit(unsigned short int address, unsigned char bit) +unsigned char ram_clear_bit(TMemory *memory,unsigned short int address, unsigned char bit) { if(bit>=0 && bit<8) { - ram_data[address]&=(~(0x01<<bit)); + memory->data[address]&=(~(0x01<<bit)); return RAM_SUCCESS; } else return RAM_BAD_BIT; } -unsigned char ram_write_byte(unsigned short int address, unsigned char data) +unsigned char ram_write_byte(TMemory *memory,unsigned short int address, unsigned char data) { - ram_data[address]=data; + memory->data[address]=data; return RAM_SUCCESS; } -unsigned char ram_write_word(unsigned short int address, unsigned short int data) +unsigned char ram_write_word(TMemory *memory,unsigned short int address, unsigned short int data) { if(address < (RAM_SIZE-1)) { - ram_data[address]=data%256; - ram_data[address+1]=data/256; + memory->data[address]=data%256; + memory->data[address+1]=data/256; return RAM_SUCCESS; } @@ -76,14 +74,14 @@ unsigned char ram_write_word(unsigned short int address, unsigned short int data return RAM_BAD_ADDRESS; } -unsigned char ram_write_table(unsigned short int address, unsigned short int length,unsigned char *data) +unsigned char ram_write_table(TMemory *memory,unsigned short int address, unsigned short int length,unsigned char *data) { unsigned short int i; if((address+length)<RAM_SIZE) { for(i=0;i<length;i++) - ram_data[address+i]=data[i]; + memory->data[address+i]=data[i]; return RAM_SUCCESS; } else