Added write support.
This commit is contained in:
parent
7195c000e4
commit
1eedd33b5d
@ -73,6 +73,7 @@ struct oceanic_atom2_device_t {
|
||||
|
||||
static device_status_t oceanic_atom2_device_version (device_t *abstract, unsigned char data[], unsigned int size);
|
||||
static device_status_t oceanic_atom2_device_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size);
|
||||
static device_status_t oceanic_atom2_device_write (device_t *abstract, unsigned int address, const unsigned char data[], unsigned int size);
|
||||
static device_status_t oceanic_atom2_device_dump (device_t *abstract, unsigned char data[], unsigned int size, unsigned int *result);
|
||||
static device_status_t oceanic_atom2_device_foreach (device_t *abstract, dive_callback_t callback, void *userdata);
|
||||
static device_status_t oceanic_atom2_device_close (device_t *abstract);
|
||||
@ -82,7 +83,7 @@ static const device_backend_t oceanic_atom2_device_backend = {
|
||||
NULL, /* handshake */
|
||||
oceanic_atom2_device_version, /* version */
|
||||
oceanic_atom2_device_read, /* read */
|
||||
NULL, /* write */
|
||||
oceanic_atom2_device_write, /* write */
|
||||
oceanic_atom2_device_dump, /* dump */
|
||||
oceanic_atom2_device_foreach, /* foreach */
|
||||
oceanic_atom2_device_close /* close */
|
||||
@ -406,6 +407,61 @@ oceanic_atom2_device_read (device_t *abstract, unsigned int address, unsigned ch
|
||||
}
|
||||
|
||||
|
||||
static device_status_t
|
||||
oceanic_atom2_device_write (device_t *abstract, unsigned int address, const unsigned char data[], unsigned int size)
|
||||
{
|
||||
oceanic_atom2_device_t *device = (oceanic_atom2_device_t*) abstract;
|
||||
|
||||
if (! device_is_oceanic_atom2 (abstract))
|
||||
return DEVICE_STATUS_TYPE_MISMATCH;
|
||||
|
||||
assert (address % OCEANIC_ATOM2_PACKET_SIZE == 0);
|
||||
assert (size % OCEANIC_ATOM2_PACKET_SIZE == 0);
|
||||
|
||||
// The data transmission is split in packages
|
||||
// of maximum $OCEANIC_ATOM2_PACKET_SIZE bytes.
|
||||
|
||||
unsigned int nbytes = 0;
|
||||
while (nbytes < size) {
|
||||
// Prepare to write the package.
|
||||
unsigned int number = address / OCEANIC_ATOM2_PACKET_SIZE;
|
||||
unsigned char prepare[4] = {0xB2,
|
||||
(number >> 8) & 0xFF, // high
|
||||
(number ) & 0xFF, // low
|
||||
0x00};
|
||||
device_status_t rc = oceanic_atom2_transfer (device, prepare, sizeof (prepare), NULL, 0);
|
||||
if (rc != DEVICE_STATUS_SUCCESS)
|
||||
return rc;
|
||||
|
||||
#ifndef NDEBUG
|
||||
message ("ATOM2PrepareWrite(0x%04x,%d)\n", address, OCEANIC_ATOM2_PACKET_SIZE);
|
||||
#endif
|
||||
|
||||
// Write the package.
|
||||
unsigned char command[OCEANIC_ATOM2_PACKET_SIZE + 2] = {0};
|
||||
memcpy (command, data, OCEANIC_ATOM2_PACKET_SIZE);
|
||||
command[OCEANIC_ATOM2_PACKET_SIZE] = checksum_add_uint8 (command, OCEANIC_ATOM2_PACKET_SIZE, 0x00);
|
||||
rc = oceanic_atom2_transfer (device, command, sizeof (command), NULL, 0);
|
||||
if (rc != DEVICE_STATUS_SUCCESS)
|
||||
return rc;
|
||||
|
||||
#ifndef NDEBUG
|
||||
message ("ATOM2Write(0x%04x,%d)=\"", address, OCEANIC_ATOM2_PACKET_SIZE);
|
||||
for (unsigned int i = 0; i < OCEANIC_ATOM2_PACKET_SIZE; ++i) {
|
||||
message("%02x", data[i]);
|
||||
}
|
||||
message("\"\n");
|
||||
#endif
|
||||
|
||||
nbytes += OCEANIC_ATOM2_PACKET_SIZE;
|
||||
address += OCEANIC_ATOM2_PACKET_SIZE;
|
||||
data += OCEANIC_ATOM2_PACKET_SIZE;
|
||||
}
|
||||
|
||||
return DEVICE_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static device_status_t
|
||||
oceanic_atom2_read_ringbuffer (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size, unsigned int begin, unsigned int end)
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user