1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-19 07:48:06 +02:00

Made the libatspi API driver-agnostic.

- tools/include/atspi.h: API is now driver-independent
- tools/lib/driver.h: API between driver and frontend
- tools/lib/atspi.c: renamed to atusb.c and updated for driver API
- tools/lib/atspi.c: frontend functions for the driver API
- tools/lib/Makefile: added atusb.o
This commit is contained in:
Werner Almesberger 2010-09-05 18:59:42 -03:00
parent 36e73c4abb
commit e2b2df2e31
5 changed files with 286 additions and 137 deletions

View File

@ -14,22 +14,24 @@
#define ATSPI_H #define ATSPI_H
#include <stdint.h> #include <stdint.h>
#include <usb.h>
struct atspi_dsc;
int atspi_error(void); int atspi_error(void);
int atspi_clear_error(void); int atspi_clear_error(void);
usb_dev_handle *atspi_open(void); struct atspi_dsc *atspi_open(void);
void atspi_close(usb_dev_handle *dev); void atspi_close(struct atspi_dsc *dsc);
void atspi_reset(usb_dev_handle *dev); void atspi_reset(struct atspi_dsc *dsc);
void atspi_reset_rf(usb_dev_handle *dev); void atspi_reset_rf(struct atspi_dsc *dsc);
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);
uint8_t atspi_reg_read(usb_dev_handle *dev, uint8_t reg); 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); void atspi_buf_write(struct atspi_dsc *dsc, const void *buf, int 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);
#endif /* !ATSPI_H */ #endif /* !ATSPI_H */

View File

@ -16,7 +16,7 @@ F32XBASE = ../../../f32xbase
LIB = libatspi.a LIB = libatspi.a
CFLAGS = -Wall -I$(F32XBASE)/include -I../../atrf/fw/include -I../include 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 .PHONY: all clean spotless

View File

@ -11,171 +11,83 @@
*/ */
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <usb.h>
#include "f32xbase/usb.h"
#include "atspi/ep0.h"
#include "atspi/usb-ids.h"
#include "driver.h"
#include "atspi.h" #include "atspi.h"
#define FROM_DEV ATSPI_FROM_DEV(0) extern struct atspi_driver atusb_driver;
#define TO_DEV ATSPI_TO_DEV(0)
/* ----- error handling ---------------------------------------------------- */ struct atspi_dsc {
struct atspi_driver *driver;
void *handle;
};
static int error; struct atspi_dsc *atspi_open(void)
int atspi_error(void)
{ {
return error; struct atspi_dsc *dsc;
} struct atspi_driver *driver;
void *handle;
driver = &atusb_driver;
int atspi_clear_error(void) handle = driver->open();
{ if (!handle)
int ret; return NULL;
dsc = malloc(sizeof(*dsc));
ret = error; if (!dsc) {
error = 0; perror("malloc");
return ret; exit(1);
}
/* ----- 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;
} }
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(struct atspi_dsc *dsc)
void atspi_reset(usb_dev_handle *dev)
{ {
int res; if (dsc->driver->reset)
dsc->driver->reset(dsc->handle);
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;
}
} }
void atspi_reset_rf(usb_dev_handle *dev) void atspi_reset_rf(struct atspi_dsc *dsc)
{ {
int res; dsc->driver->reset_rf(dsc->handle);
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 --------------------------------------------------- */ void atspi_reg_write(struct atspi_dsc *dsc, uint8_t reg, uint8_t value)
void atspi_reg_write(usb_dev_handle *dev, uint8_t reg, uint8_t value)
{ {
int res; dsc->driver->reg_write(dsc->handle, reg, value);
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;
}
} }
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; return dsc->driver->reg_read(dsc->handle, reg);
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 ----------------------------------------------- */ void atspi_buf_write(struct atspi_dsc *dsc, const void *buf, int size)
void atspi_buf_write(usb_dev_handle *dev, const void *buf, int size)
{ {
int res; dsc->driver->buf_write(dsc->handle, buf, size);
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;
}
} }
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; return dsc->driver->buf_read(dsc->handle, buf, size);
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;
} }

203
tools/lib/atusb.c Normal file
View File

@ -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 <stdio.h>
#include <usb.h>
#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,
};

32
tools/lib/driver.h Normal file
View File

@ -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 <stdint.h>
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 */