Skip to content

Commit 2637583

Browse files
authored
Merge pull request #524 from paulfertser/fix-eeprom-ioctl
flash+eeprom: fix ioctl handling
2 parents ad45d47 + 4f5a7fa commit 2637583

File tree

5 files changed

+21
-12
lines changed

5 files changed

+21
-12
lines changed

simavr/sim/avr_eeprom.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ avr_eeprom_ioctl(
115115
memcpy(p->eeprom + desc->offset, desc->ee, desc->size);
116116
AVR_LOG(port->avr, LOG_TRACE, "EEPROM: %s: AVR_IOCTL_EEPROM_SET Loaded %d at offset %d\n",
117117
__FUNCTION__, desc->size, desc->offset);
118+
res = 0;
118119
} break;
119120
case AVR_IOCTL_EEPROM_GET: {
120121
avr_eeprom_desc_t * desc = (avr_eeprom_desc_t*)io_param;
@@ -127,6 +128,7 @@ avr_eeprom_ioctl(
127128
memcpy(desc->ee, p->eeprom + desc->offset, desc->size);
128129
else // allow to get access to the read data, for gdb support
129130
desc->ee = p->eeprom + desc->offset;
131+
res = 0;
130132
} break;
131133
}
132134

simavr/sim/avr_flash.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ avr_flash_ioctl(
7272
{
7373
avr_flash_t * p = (avr_flash_t *)port;
7474
avr_t * avr = p->io.avr;
75+
int res = -1;
7576

7677
avr_flashaddr_t z = avr->data[R_ZL] | (avr->data[R_ZH] << 8);
7778
if (avr->rampz)
@@ -85,24 +86,24 @@ avr_flash_ioctl(
8586
#endif
8687
switch (ctl) {
8788
case AVR_IOCTL_FLASH_LPM: {
88-
uint8_t *res = io_param;
89+
uint8_t *result = io_param;
8990
if (avr_regbit_get(avr, p->selfprgen)) {
9091
avr_cycle_timer_cancel(avr, avr_progen_clear, p);
9192
if (avr_regbit_get(avr, p->blbset)) {
9293
AVR_LOG(avr, LOG_TRACE, "FLASH: Reading fuse/lock byte %02x\n", z);
9394
switch (z) {
94-
case 0x0: *res = avr->fuse[0]; break; // LFuse
95-
case 0x1: *res = avr->lockbits; break; // lock bits
96-
case 0x2: *res = avr->fuse[2]; break; // EFuse
97-
case 0x3: *res = avr->fuse[1]; break; // HFuse
95+
case 0x0: *result = avr->fuse[0]; break; // LFuse
96+
case 0x1: *result = avr->lockbits; break; // lock bits
97+
case 0x2: *result = avr->fuse[2]; break; // EFuse
98+
case 0x3: *result = avr->fuse[1]; break; // HFuse
9899
}
99100
} else if (avr_regbit_get(avr, p->sigrd)) {
100101
AVR_LOG(avr, LOG_TRACE, "FLASH: Reading signature&serial byte %02x\n", z);
101102
switch (z) {
102-
case 0x00: *res = avr->signature[0]; break;
103-
case 0x02: *res = avr->signature[1]; break;
104-
case 0x04: *res = avr->signature[2]; break;
105-
case 0x01: *res = 0x55; break; // OSC Cal
103+
case 0x00: *result = avr->signature[0]; break;
104+
case 0x02: *result = avr->signature[1]; break;
105+
case 0x04: *result = avr->signature[2]; break;
106+
case 0x01: *result = 0x55; break; // OSC Cal
106107
/* serial# bytes are ordered bizarelly */
107108
/* NOTE: Not all AVR that have sigrd have a
108109
* serial number, currenly we return one anyway */
@@ -111,11 +112,12 @@ avr_flash_ioctl(
111112
1,0,3,2,5,4,0,6,7,8
112113
};
113114
z -= 0x0e;
114-
*res = avr->serial[idx[z]]; break;
115+
*result = avr->serial[idx[z]]; break;
115116
} break;
116117
}
117118
}
118119
}
120+
res = 0;
119121
} break;
120122
case AVR_IOCTL_FLASH_SPM: {
121123
uint16_t r01 = avr->data[0] | (avr->data[1] << 8);
@@ -150,12 +152,13 @@ avr_flash_ioctl(
150152
}
151153
}
152154
}
155+
res = 0;
153156
} break;
154157
default:
155158
return -1;
156159
}
157160
avr_regbit_clear(avr, p->selfprgen);
158-
return 0;
161+
return res;
159162
}
160163

161164
static void

simavr/sim/sim_elf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ avr_load_firmware(
174174
if (firmware->eeprom && firmware->eesize) {
175175
avr_eeprom_desc_t d = {
176176
.ee = firmware->eeprom,
177-
.offset = 0,
177+
.offset = firmware->eeprombase,
178178
.size = firmware->eesize
179179
};
180180
avr_ioctl(avr, AVR_IOCTL_EEPROM_SET, &d);
@@ -502,6 +502,7 @@ elf_read_firmware(
502502
if (elf_handle_segment(fd, php, &firmware->eeprom, "EEPROM"))
503503
continue;
504504
firmware->eesize = php->p_filesz;
505+
firmware->eeprombase = php->p_vaddr - 0x820000;
505506
} else if (php->p_vaddr < 0x830000) {
506507
/* Fuses. */
507508

simavr/sim/sim_elf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ typedef struct elf_firmware_t {
7171
uint32_t datasize;
7272
uint32_t bsssize;
7373
// read the .eeprom section of the elf, too
74+
uint32_t eeprombase;
7475
uint8_t * eeprom;
7576
uint32_t eesize;
7677
uint8_t * fuse;

simavr/sim/sim_hex.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ sim_setup_firmware(const char * filename, uint32_t loadBase,
251251
}
252252
fp->eeprom = chunk[ci].data;
253253
fp->eesize = chunk[ci].size;
254+
fp->eeprombase = chunk[ci].baseaddr + loadBase -
255+
AVR_SEGMENT_OFFSET_EEPROM;
254256
printf("Load HEX eeprom %08x, %d\n",
255257
chunk[ci].baseaddr, fp->eesize);
256258
}

0 commit comments

Comments
 (0)