[PATCH 08/11] Add code to write rom of the OSTC3
Anton Lundin
glance at acc.umu.se
Tue Dec 16 11:06:17 PST 2014
On 16 December, 2014 - Jef Driesen wrote:
> On 2014-11-21 21:28, Anton Lundin wrote:
> >+static dc_status_t
> >+hw_ostc3_device_write_block (dc_device_t *abstract, unsigned int
> >addr, unsigned char block[], unsigned int block_size)
> >+{
> >+ dc_status_t rc = DC_STATUS_SUCCESS;
> >+ hw_ostc3_device_t *device = (hw_ostc3_device_t *) abstract;
> >+ dc_context_t *context = (abstract ? abstract->context : NULL);
> >+#if 0
> >+ // FIXME: This variant doens't work
> >+ // Things doesn't get written to memory. Timing issues?
> >+ // Version below works, serial_sleep (2) is probably the thing.
> >+ unsigned char buffer[4 + block_size];
> >+ buffer[0] = WRITE_BLOCK;
> >+ uint24_be_array(addr, buffer + 1);
> >+ memcpy(buffer + 4, block, block_size);
> >+
> >+ rc = hw_ostc3_transfer(device, NULL, WRITE_BLOCK, buffer,
> >sizeof(buffer), NULL, 0);
> >+ serial_sleep (device->port, 1100);
> >+ return rc;
> >+#else
...
>
> With the exception of those sleep calls, that's identical to the
> hw_ostc3_transfer() function. Notice how your code is missing the read of
> the echo. I'm pretty sure that got lost due to the flushing. So this
> probably works correctly only by accident.
>
> The reason why hw_ostc3_transfer doesn't work for you, might be because you
> include the WRITE_BLOCK byte in the input buffer. That causes it to send
> twice. The ostc probably doesn't like that. Can you have a look at this? I
> have the feeling that we can use hw_ostc3_transfer here after all. Worst
> case we may need to add those sleep calls there, wrapped in a "if (cmd ==
> WRITE_BLOCK)".
>
> >+ n = serial_read (device->port, &response, sizeof (response));
> >+ if (n != sizeof (response) || response != S_READY)
> >+ return EXITCODE (n);
>
> You should split those checks in two parts. Right now you'll return
> DC_STATUS_TIMEOUT when response!=S_READY, and that's misleading. If we can
> re-use hw_ostc3_transfer, then this is no longer an issue.
>
After i started to rewrite the code for like the .. 7th time i spotted
the bug in the hw_ostc3_transfer-based variant, and indeed it was the
extra WRITE_BLOCK i never spotted.
Now the hw_ostc3_device_write_block-helper looks like this:
static dc_status_t
hw_ostc3_device_write_block (hw_ostc3_device_t *device, unsigned int addr, unsigned char block[], unsigned int block_size)
{
unsigned char buffer[3 + block_size];
array_uint24_be_set(buffer, addr);
memcpy(buffer + 3, block, block_size);
return hw_ostc3_transfer(device, NULL, WRITE_BLOCK, buffer, sizeof(buffer), NULL, 0);
}
Just like hw_ostc3_device_read_block, and works just fine.
//Anton
--
Anton Lundin +46702-161604
More information about the devel
mailing list