diff options
| author | 1999-12-02 23:07:38 +0000 | |
|---|---|---|
| committer | 1999-12-02 23:07:38 +0000 | |
| commit | 0f5ef10baaba0890f7e9bed6545e0614b65e7884 (patch) | |
| tree | 115fc38dea3113e5937f33fba540764e0802c80b /src/readwrite.c | |
Initial revision
git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@1 53a565d1-3bb7-0310-b661-cf11e63c67ab
Diffstat (limited to 'src/readwrite.c')
| -rw-r--r-- | src/readwrite.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/readwrite.c b/src/readwrite.c new file mode 100644 index 0000000..37e9f71 --- /dev/null +++ b/src/readwrite.c @@ -0,0 +1,96 @@ + +#include <unistd.h> + +#include "raw1394.h" +#include "kernel-raw1394.h" +#include "raw1394_private.h" + + +struct sync_cb_data { + int done; + int errcode; +}; + +static int sync_cb(struct raw1394_handle *unused, + struct sync_cb_data *data, int error) +{ + data->errcode = error; + data->done = 1; + return 0; +} + + +int raw1394_start_read(struct raw1394_handle *handle, nodeid_t node, + nodeaddr_t addr, size_t length, quadlet_t *buffer, + unsigned long tag) +{ + struct raw1394_request *req = &handle->req; + + CLEAR_REQ(req); + + req->type = RAW1394_REQ_ASYNC_READ; + req->generation = handle->generation; + req->tag = tag; + + req->address = ((u_int64_t)node << 48) | addr; + req->length = length; + req->recvb = buffer; + + return (int)write(handle->fd, req, sizeof(*req)); +} + +int raw1394_start_write(struct raw1394_handle *handle, nodeid_t node, + nodeaddr_t addr, size_t length, quadlet_t *data, + unsigned long tag) +{ + struct raw1394_request *req = &handle->req; + + CLEAR_REQ(req); + + req->type = RAW1394_REQ_ASYNC_WRITE; + req->generation = handle->generation; + req->tag = tag; + + req->address = ((u_int64_t)node << 48) | addr; + req->length = length; + req->sendb = data; + + return (int)write(handle->fd, req, sizeof(*req)); +} + + + +#define SYNCFUNC_VARS \ + struct sync_cb_data sd = { 0, 0 }; \ + struct raw1394_reqhandle rh = { (req_callback_t)sync_cb, &sd }; \ + int err + +#define SYNCFUNC_BODY \ + if (err < 0) return err; \ + while (!sd.done) raw1394_loop_iterate(handle); \ + return sd.errcode + +int raw1394_read(struct raw1394_handle *handle, nodeid_t node, nodeaddr_t addr, + size_t length, quadlet_t *buffer) +{ + SYNCFUNC_VARS; + + err = raw1394_start_read(handle, node, addr, length, buffer, + (unsigned long)&rh); + + SYNCFUNC_BODY; +} + +int raw1394_write(struct raw1394_handle *handle, nodeid_t node, nodeaddr_t addr, + size_t length, quadlet_t *data) +{ + SYNCFUNC_VARS; + + err = raw1394_start_write(handle, node, addr, length, data, + (unsigned long)&rh); + + SYNCFUNC_BODY; +} + +#undef SYNCFUNC_VARS +#undef SYNCFUNC_BODY |
