diff --git a/tools/include/atspi.h b/tools/include/atspi.h index a1fdadd..8782e79 100644 --- a/tools/include/atspi.h +++ b/tools/include/atspi.h @@ -14,22 +14,24 @@ #define ATSPI_H #include -#include + + +struct atspi_dsc; int atspi_error(void); int atspi_clear_error(void); -usb_dev_handle *atspi_open(void); -void atspi_close(usb_dev_handle *dev); +struct atspi_dsc *atspi_open(void); +void atspi_close(struct atspi_dsc *dsc); -void atspi_reset(usb_dev_handle *dev); -void atspi_reset_rf(usb_dev_handle *dev); +void atspi_reset(struct atspi_dsc *dsc); +void atspi_reset_rf(struct atspi_dsc *dsc); -void atspi_reg_write(usb_dev_handle *dev, uint8_t reg, uint8_t value); -uint8_t atspi_reg_read(usb_dev_handle *dev, uint8_t reg); +void atspi_reg_write(struct atspi_dsc *dsc, uint8_t reg, uint8_t value); +uint8_t atspi_reg_read(struct atspi_dsc *dsc, uint8_t reg); -void atspi_buf_write(usb_dev_handle *dev, const void *buf, int size); -int atspi_buf_read(usb_dev_handle *dev, void *buf, int size); +void atspi_buf_write(struct atspi_dsc *dsc, const void *buf, int size); +int atspi_buf_read(struct atspi_dsc *dsc, void *buf, int size); #endif /* !ATSPI_H */ diff --git a/tools/lib/Makefile b/tools/lib/Makefile index 07b5913..e102e7b 100644 --- a/tools/lib/Makefile +++ b/tools/lib/Makefile @@ -16,7 +16,7 @@ F32XBASE = ../../../f32xbase LIB = libatspi.a CFLAGS = -Wall -I$(F32XBASE)/include -I../../atrf/fw/include -I../include -OBJS = $(F32XBASE)/lib/usb.o atspi.o +OBJS = $(F32XBASE)/lib/usb.o atspi.o atusb.o .PHONY: all clean spotless diff --git a/tools/lib/atspi.c b/tools/lib/atspi.c index 1b3a0de..9debd04 100644 --- a/tools/lib/atspi.c +++ b/tools/lib/atspi.c @@ -11,171 +11,83 @@ */ +#include #include -#include - -#include "f32xbase/usb.h" -#include "atspi/ep0.h" -#include "atspi/usb-ids.h" +#include "driver.h" #include "atspi.h" -#define FROM_DEV ATSPI_FROM_DEV(0) -#define TO_DEV ATSPI_TO_DEV(0) +extern struct atspi_driver atusb_driver; -/* ----- error handling ---------------------------------------------------- */ +struct atspi_dsc { + struct atspi_driver *driver; + void *handle; +}; -static int error; - - -int atspi_error(void) +struct atspi_dsc *atspi_open(void) { - return error; -} + struct atspi_dsc *dsc; + struct atspi_driver *driver; + void *handle; - -int atspi_clear_error(void) -{ - int ret; - - ret = error; - error = 0; - return ret; -} - - -/* ----- open/close -------------------------------------------------------- */ - - -usb_dev_handle *atspi_open(void) -{ - usb_dev_handle *dev; - - dev = open_usb(USB_VENDOR, USB_PRODUCT); - if (dev) { - error = 0; - } else { - fprintf(stderr, ":-(\n"); - error = 1; + driver = &atusb_driver; + handle = driver->open(); + if (!handle) + return NULL; + dsc = malloc(sizeof(*dsc)); + if (!dsc) { + perror("malloc"); + exit(1); } - return dev; + dsc->driver = driver; + dsc->handle = handle; + return dsc; } -void atspi_close(usb_dev_handle *dev) +void atspi_close(struct atspi_dsc *dsc) { - /* to do */ + if (dsc->driver->close) + dsc->driver->close(dsc->handle); + free(dsc); } -/* ----- device mode ------------------------------------------------------- */ - - -void atspi_reset(usb_dev_handle *dev) +void atspi_reset(struct atspi_dsc *dsc) { - int res; - - if (error) - return; - - res = - usb_control_msg(dev, TO_DEV, ATSPI_RESET, 0, 0, NULL, 0, 1000); - if (res < 0) { - fprintf(stderr, "ATSPI_RESET: %d\n", res); - error = 1; - } + if (dsc->driver->reset) + dsc->driver->reset(dsc->handle); } -void atspi_reset_rf(usb_dev_handle *dev) +void atspi_reset_rf(struct atspi_dsc *dsc) { - int res; - - if (error) - return; - - res = - usb_control_msg(dev, TO_DEV, ATSPI_RF_RESET, 0, 0, NULL, 0, 1000); - if (res < 0) { - fprintf(stderr, "ATSPI_RF_RESET: %d\n", res); - error = 1; - } + dsc->driver->reset_rf(dsc->handle); } -/* ----- register access --------------------------------------------------- */ - - -void atspi_reg_write(usb_dev_handle *dev, uint8_t reg, uint8_t value) +void atspi_reg_write(struct atspi_dsc *dsc, uint8_t reg, uint8_t value) { - int res; - - if (error) - return; - - res = usb_control_msg(dev, TO_DEV, ATSPI_REG_WRITE, value, reg, - NULL, 0, 1000); - if (res < 0) { - fprintf(stderr, "ATSPI_REG_WRITE: %d\n", res); - error = 1; - } + dsc->driver->reg_write(dsc->handle, reg, value); } -uint8_t atspi_reg_read(usb_dev_handle *dev, uint8_t reg) +uint8_t atspi_reg_read(struct atspi_dsc *dsc, uint8_t reg) { - uint8_t value = 0; - int res; - - if (error) - return 0; - - res = usb_control_msg(dev, FROM_DEV, ATSPI_REG_READ, 0, reg, - (void *) &value, 1, 1000); - if (res < 0) { - fprintf(stderr, "ATSPI_REG_READ: %d\n", res); - error = 1; - } - return value; + return dsc->driver->reg_read(dsc->handle, reg); } -/* ----- frame buffer access ----------------------------------------------- */ - - -void atspi_buf_write(usb_dev_handle *dev, const void *buf, int size) +void atspi_buf_write(struct atspi_dsc *dsc, const void *buf, int size) { - int res; - - if (error) - return; - - res = usb_control_msg(dev, TO_DEV, ATSPI_BUF_WRITE, 0, 0, - (void *) buf, size, 1000); - if (res < 0) { - fprintf(stderr, "ATSPI_BUF_WRITE: %d\n", res); - error = 1; - } - + dsc->driver->buf_write(dsc->handle, buf, size); } -int atspi_buf_read(usb_dev_handle *dev, void *buf, int size) +int atspi_buf_read(struct atspi_dsc *dsc, void *buf, int size) { - int res; - - if (error) - return -1; - - res = usb_control_msg(dev, FROM_DEV, ATSPI_BUF_READ, 0, 0, - buf, size, 1000); - if (res < 0) { - fprintf(stderr, "ATSPI_BUF_READ: %d\n", res); - error = 1; - } - - return res; + return dsc->driver->buf_read(dsc->handle, buf, size); } diff --git a/tools/lib/atusb.c b/tools/lib/atusb.c new file mode 100644 index 0000000..ceb4f2b --- /dev/null +++ b/tools/lib/atusb.c @@ -0,0 +1,203 @@ +/* + * lib/atusb.c - ATSPI access functions library (USB version) + * + * Written 2010 by Werner Almesberger + * Copyright 2010 Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + + +#include +#include + +#include "f32xbase/usb.h" +#include "atspi/ep0.h" +#include "atspi/usb-ids.h" + +#include "driver.h" + + +#define FROM_DEV ATSPI_FROM_DEV(0) +#define TO_DEV ATSPI_TO_DEV(0) + + +/* ----- error handling ---------------------------------------------------- */ + + +static int error; + + +int atusb_error(void) +{ + return error; +} + + +int atusb_clear_error(void) +{ + int ret; + + ret = error; + error = 0; + return ret; +} + + +/* ----- open/close -------------------------------------------------------- */ + + +static void *atusb_open(void) +{ + usb_dev_handle *dev; + + dev = open_usb(USB_VENDOR, USB_PRODUCT); + if (dev) { + error = 0; + } else { + fprintf(stderr, ":-(\n"); + error = 1; + } + return dev; +} + + +static void atusb_close(void *dsc) +{ + /* to do */ +} + + +/* ----- device mode ------------------------------------------------------- */ + + +static void atusb_reset(void *dsc) +{ + usb_dev_handle *dev = dsc; + int res; + + if (error) + return; + + res = + usb_control_msg(dev, TO_DEV, ATSPI_RESET, 0, 0, NULL, 0, 1000); + if (res < 0) { + fprintf(stderr, "ATSPI_RESET: %d\n", res); + error = 1; + } +} + + +static void atusb_reset_rf(void *dsc) +{ + usb_dev_handle *dev = dsc; + int res; + + if (error) + return; + + res = + usb_control_msg(dev, TO_DEV, ATSPI_RF_RESET, 0, 0, NULL, 0, 1000); + if (res < 0) { + fprintf(stderr, "ATSPI_RF_RESET: %d\n", res); + error = 1; + } +} + + +/* ----- register access --------------------------------------------------- */ + + +static void atusb_reg_write(void *dsc, uint8_t reg, uint8_t value) +{ + usb_dev_handle *dev = dsc; + int res; + + if (error) + return; + + res = usb_control_msg(dev, TO_DEV, ATSPI_REG_WRITE, value, reg, + NULL, 0, 1000); + if (res < 0) { + fprintf(stderr, "ATSPI_REG_WRITE: %d\n", res); + error = 1; + } +} + + +static uint8_t atusb_reg_read(void *dsc, uint8_t reg) +{ + usb_dev_handle *dev = dsc; + uint8_t value = 0; + int res; + + if (error) + return 0; + + res = usb_control_msg(dev, FROM_DEV, ATSPI_REG_READ, 0, reg, + (void *) &value, 1, 1000); + if (res < 0) { + fprintf(stderr, "ATSPI_REG_READ: %d\n", res); + error = 1; + } + return value; +} + + +/* ----- frame buffer access ----------------------------------------------- */ + + +static void atusb_buf_write(void *dsc, const void *buf, int size) +{ + usb_dev_handle *dev = dsc; + int res; + + if (error) + return; + + res = usb_control_msg(dev, TO_DEV, ATSPI_BUF_WRITE, 0, 0, + (void *) buf, size, 1000); + if (res < 0) { + fprintf(stderr, "ATSPI_BUF_WRITE: %d\n", res); + error = 1; + } + +} + + +static int atusb_buf_read(void *dsc, void *buf, int size) +{ + usb_dev_handle *dev = dsc; + int res; + + if (error) + return -1; + + res = usb_control_msg(dev, FROM_DEV, ATSPI_BUF_READ, 0, 0, + buf, size, 1000); + if (res < 0) { + fprintf(stderr, "ATSPI_BUF_READ: %d\n", res); + error = 1; + } + + return res; +} + + +/* ----- driver interface -------------------------------------------------- */ + + +struct atspi_driver atusb_driver = { + .name = "atusb", + .open = atusb_open, + .close = atusb_close, + .reset = atusb_reset, + .reset_rf = atusb_reset_rf, + .reg_write = atusb_reg_write, + .reg_read = atusb_reg_read, + .buf_write = atusb_buf_write, + .buf_read = atusb_buf_read, +}; diff --git a/tools/lib/driver.h b/tools/lib/driver.h new file mode 100644 index 0000000..b788814 --- /dev/null +++ b/tools/lib/driver.h @@ -0,0 +1,32 @@ +/* + * lib/driver.h - ATSPI driver API + * + * Written 2010 by Werner Almesberger + * Copyright 2010 Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + + +#ifndef DRIVER_H +#define DRIVER_H + +#include + + +struct atspi_driver { + const char *name; + void *(*open)(void); + void (*close)(void *dsc); + void (*reset)(void *dsc); + void (*reset_rf)(void *dsc); + void (*reg_write)(void *dsc, uint8_t reg, uint8_t value); + uint8_t (*reg_read)(void *dsc, uint8_t reg); + void (*buf_write)(void *dsc, const void *buf, int size); + int (*buf_read)(void *dsc, void *buf, int size); +}; + +#endif /* !DRIVER_H */