USB, to add ohci/ehci. Make fifo comply with iorec

This commit is contained in:
Ørn E. Hansen
2013-04-21 21:28:45 +00:00
parent e842b2fdcd
commit d7d3b396d0
7 changed files with 46 additions and 53 deletions

View File

@@ -78,7 +78,9 @@ CSRCS= \
$(SRCDIR)/usb_kbd.c \ $(SRCDIR)/usb_kbd.c \
$(SRCDIR)/usb_mem.c \ $(SRCDIR)/usb_mem.c \
$(SRCDIR)/usb_mouse.c \ $(SRCDIR)/usb_mouse.c \
$(SRCDIR)/usb_storage.c $(SRCDIR)/usb_storage.c \
$(SRCDIR)/ehci-hcd.c \
$(SRCDIR)/ohci-hcd.c
ASRCS= \ ASRCS= \
$(SRCDIR)/startcf.S \ $(SRCDIR)/startcf.S \

View File

@@ -1,6 +1,10 @@
#ifndef _CONFIG_H_ #ifndef _CONFIG_H_
#define _CONFIG_H_ #define _CONFIG_H_
#ifndef COLDFIRE
#define COLDFIRE
#endif
/* DEBUG */ /* DEBUG */
#define DEBUG #define DEBUG

View File

@@ -12,16 +12,31 @@
#include <inttypes.h> #include <inttypes.h>
/*
* FIFO
*
* Make this look exactly like IOREC, so that
* we can interchange the two. But ignore the
* low, high watermarks. For now.
*
* in IOREC, the notion of head/tail is opposite
* to ours. So we place our head/tail, in the
* equivalent positions as TOS use is. So
* we can use this structure, intermittantly
* with TOS.
*/
typedef struct typedef struct
{ {
char * buf; char * buf;
int head; int16_t size;
int tail; int16_t tail;
int size; int16_t head;
int16_t low;
int16_t high;
} fifo_t; } fifo_t;
void fifo_init(fifo_t*, char*, int); void fifo_init(fifo_t*, char*, int16_t);
void fifo_advance(fifo_t*, int*); void fifo_advance(fifo_t*, int16_t*);
uint8_t fifo_get(fifo_t*); uint8_t fifo_get(fifo_t*);
void fifo_put(fifo_t*, uint8_t); void fifo_put(fifo_t*, uint8_t);
@@ -34,7 +49,7 @@ int fifo_unused(fifo_t*);
int fifo_full(fifo_t*); int fifo_full(fifo_t*);
int fifo_empty(fifo_t*); int fifo_empty(fifo_t*);
int fifo_read(fifo_t*, unsigned char *, int); int fifo_read(fifo_t*, unsigned char *, int16_t);
int fifo_write(fifo_t*, const unsigned char*, int); int fifo_write(fifo_t*, const unsigned char*, int16_t);
#endif #endif

View File

@@ -28,13 +28,6 @@
#include "usb.h" #include "usb.h"
#include "ehci.h" #include "ehci.h"
#if defined(COLDFIRE) && defined(NETWORK) && defined(LWIP)
#include "../freertos/FreeRTOS.h"
#include "../freertos/queue.h"
extern xQueueHandle queue_poll_hub;
#define USB_POLL_HUB
#endif
#undef DEBUG #undef DEBUG
#undef SHOW_INFO #undef SHOW_INFO

View File

@@ -8,12 +8,14 @@
#include <fifo.h> #include <fifo.h>
//This initializes the FIFO structure with the given buffer and size //This initializes the FIFO structure with the given buffer and size
void fifo_init(fifo_t * f, char * buf, int size) void fifo_init(fifo_t * f, char * buf, int16_t size)
{ {
f->head = 0; f->head = 0;
f->tail = 0; f->tail = 0;
f->size = size; f->size = size;
f->buf = buf; f->buf = buf;
f->low = 0;
f->high = 0;
} }
// Get one byte from the fifo buffer // Get one byte from the fifo buffer
@@ -21,11 +23,10 @@ uint8_t fifo_get(fifo_t *f)
{ {
uint8_t ch = 0; uint8_t ch = 0;
if( f->tail != f->head && f->tail < f->size ) if( !fifo_empty(f) )
{ {
ch = f->buf[f->tail++]; fifo_advance(f,&f->tail);
if( f->tail >= f->size ) ch = f->buf[f->tail];
f->tail = 0;
} }
return ch; return ch;
@@ -34,10 +35,10 @@ uint8_t fifo_get(fifo_t *f)
// Put one byte into the buffer // Put one byte into the buffer
void fifo_put(fifo_t *f, uint8_t byte) void fifo_put(fifo_t *f, uint8_t byte)
{ {
if( f->head == f->tail || f->head >= f->size ) if( fifo_unused(f) <= 0 )
return; return;
f->buf[f->head] = byte;
fifo_advance(f,&f->head); fifo_advance(f,&f->head);
f->buf[f->head] = byte;
} }
void fifo_clear(fifo_t *f) void fifo_clear(fifo_t *f)
@@ -71,7 +72,7 @@ int fifo_empty(fifo_t *f)
return (f->head == f->tail); return (f->head == f->tail);
} }
void fifo_advance(fifo_t *f, int *ix) void fifo_advance(fifo_t *f, int16_t *ix)
{ {
if( ++*ix > f->size ) if( ++*ix > f->size )
*ix=0; *ix=0;
@@ -79,14 +80,13 @@ void fifo_advance(fifo_t *f, int *ix)
//This reads at most nbytes bytes from the FIFO //This reads at most nbytes bytes from the FIFO
//The number of bytes read is returned //The number of bytes read is returned
int fifo_read(fifo_t *f, unsigned char *buf, int nbytes){ int fifo_read(fifo_t *f, unsigned char *buf, int16_t nbytes){
int n = 0; int n = 0;
while( n < nbytes && !fifo_empty(f) ) while( n < nbytes && !fifo_empty(f) )
{ {
n++; n++;
*buf++ = f->buf[f->tail]; *buf++ = fifo_get(f);
fifo_advance(f,&f->tail);
} }
return n; return n;
@@ -95,13 +95,12 @@ int fifo_read(fifo_t *f, unsigned char *buf, int nbytes){
//This writes up to nbytes bytes to the FIFO //This writes up to nbytes bytes to the FIFO
//If the head runs in to the tail, not all bytes are written //If the head runs in to the tail, not all bytes are written
//The number of bytes written is returned //The number of bytes written is returned
int fifo_write(fifo_t *f, const unsigned char *buf, int nbytes){ int fifo_write(fifo_t *f, const unsigned char *buf, int16_t nbytes){
int n = 0; int n = 0;
while( n < nbytes && !fifo_full(f) ) while( n < nbytes && !fifo_full(f) )
{ {
f->buf[f->head] = *buf++; fifo_put(f,*buf++);
fifo_advance(f,&f->head);
n++; n++;
} }

View File

@@ -49,14 +49,6 @@
#include "usb.h" #include "usb.h"
#include "ohci.h" #include "ohci.h"
#if defined(COLDFIRE) && defined(NETWORK) && defined(LWIP)
#include "../freertos/FreeRTOS.h"
#include "../freertos/queue.h"
extern xQueueHandle queue_poll_hub;
#define USB_POLL_HUB
#endif
#undef OHCI_USE_NPS /* force NoPowerSwitching mode */ #undef OHCI_USE_NPS /* force NoPowerSwitching mode */
#undef OHCI_VERBOSE_DEBUG /* not always helpful */ #undef OHCI_VERBOSE_DEBUG /* not always helpful */

View File

@@ -48,18 +48,6 @@
#include "config.h" #include "config.h"
#include "usb.h" #include "usb.h"
#if defined(COLDFIRE) && defined(NETWORK) && defined(LWIP)
#include "../freertos/FreeRTOS.h"
#include "../freertos/task.h"
#include "../freertos/queue.h"
#include "../freertos/semphr.h"
#define USB_POLL_HUB
#ifdef CONFIG_USB_STORAGE
extern int usb_stor_curr_dev;
extern unsigned long usb_1st_disk_drive;
#endif
#endif
#if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || defined(CONFIG_USB_EHCI) #if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || defined(CONFIG_USB_EHCI)
#undef USB_DEBUG #undef USB_DEBUG
@@ -1181,7 +1169,7 @@ void usb_scan_devices(void *priv)
dev = usb_alloc_new_device(bus_index, priv); dev = usb_alloc_new_device(bus_index, priv);
if (usb_new_device(dev)) if (usb_new_device(dev))
{ {
Cconws("No USB Device found\r\n"); xprintf("No USB Device found\r\n");
USB_PRINTF("No USB Device found\r\n"); USB_PRINTF("No USB Device found\r\n");
if (dev != NULL ) if (dev != NULL )
dev_index[bus_index]--; dev_index[bus_index]--;
@@ -1197,13 +1185,13 @@ void usb_scan_devices(void *priv)
if (drv_usb_kbd_init() < 0) if (drv_usb_kbd_init() < 0)
USB_PRINTF("No USB keyboard found\r\n"); USB_PRINTF("No USB keyboard found\r\n");
else else
Cconws("USB HID keyboard driver installed\r\n"); xprintf("USB HID keyboard driver installed\r\n");
#endif /* CONFIG_USB_KEYBOARD */ #endif /* CONFIG_USB_KEYBOARD */
#ifdef CONFIG_USB_MOUSE #ifdef CONFIG_USB_MOUSE
if (drv_usb_mouse_init() < 0) if (drv_usb_mouse_init() < 0)
USB_PRINTF("No USB mouse found\r\n"); USB_PRINTF("No USB mouse found\r\n");
else else
Cconws("USB HID mouse driver installed\r\n"); xprintf("USB HID mouse driver installed\r\n");
#endif /* CONFIG_USB_MOUSE */ #endif /* CONFIG_USB_MOUSE */
#endif #endif
USB_PRINTF("Scan end\r\n"); USB_PRINTF("Scan end\r\n");