code runs until ohci_lowlevel_init() but can't continue since pci_get_resource() is not implemented yet

This commit is contained in:
Markus Fröschle
2013-11-03 11:20:39 +00:00
parent 459722216f
commit f36016f12d
11 changed files with 129 additions and 52 deletions

View File

@@ -10,7 +10,7 @@
# can be either "Y" or "N" (without quotes). "Y" for using the m68k-elf-, "N" for using the m68k-atari-mint # can be either "Y" or "N" (without quotes). "Y" for using the m68k-elf-, "N" for using the m68k-atari-mint
# toolchain # toolchain
COMPILE_ELF=N COMPILE_ELF=Y
ifeq (Y,$(COMPILE_ELF)) ifeq (Y,$(COMPILE_ELF))
TCPREFIX=m68k-elf- TCPREFIX=m68k-elf-
@@ -84,6 +84,7 @@ CSRCS= \
$(SRCDIR)/MCD_tasksInit.c \ $(SRCDIR)/MCD_tasksInit.c \
\ \
$(SRCDIR)/usb.c \ $(SRCDIR)/usb.c \
$(SRCDIR)/usb_mem.c \
$(SRCDIR)/ohci-hcd.c \ $(SRCDIR)/ohci-hcd.c \
$(SRCDIR)/ehci-hcd.c \ $(SRCDIR)/ehci-hcd.c \
\ \

View File

@@ -13,7 +13,7 @@ MEMORY
/* /*
* target to copy BaS data segment to. 20k should be enough for now * target to copy BaS data segment to. 20k should be enough for now
*/ */
bas_ram (WX) : ORIGIN = 0x1FFFB000, LENGTH = 0x005000 bas_ram (WX) : ORIGIN = 0x1FFFB000, LENGTH = 0x900000
} }
SECTIONS SECTIONS
@@ -35,6 +35,7 @@ SECTIONS
OBJDIR/mmu.o(.text) OBJDIR/mmu.o(.text)
OBJDIR/pci.o(.text) OBJDIR/pci.o(.text)
OBJDIR/usb.o(.text) OBJDIR/usb.o(.text)
OBJDIR/usb_mem.o(.text)
OBJDIR/ohci-hcd.o(.text) OBJDIR/ohci-hcd.o(.text)
OBJDIR/ehci-hcd.o(.text) OBJDIR/ehci-hcd.o(.text)
@@ -75,6 +76,9 @@ SECTIONS
*(.rodata) *(.rodata)
*(.rodata.*) *(.rodata.*)
#endif #endif
. = ALIGN(16);
_usb_buffer = .;
//. = . + USB_BUFFER_SIZE;
} > bas_rom } > bas_rom
#if (TARGET_ADDRESS == BOOTFLASH_BASE_ADDRESS) #if (TARGET_ADDRESS == BOOTFLASH_BASE_ADDRESS)
@@ -97,6 +101,8 @@ SECTIONS
* is a multiple of the following value. * is a multiple of the following value.
*/ */
. = ALIGN(16); . = ALIGN(16);
_usb_buffer = .;
//. = . + USB_BUFFER_SIZE;
} > bas_ram } > bas_ram
#endif #endif

View File

@@ -42,4 +42,6 @@
#define TARGET_ADDRESS BOOTFLASH_BASE_ADDRESS #define TARGET_ADDRESS BOOTFLASH_BASE_ADDRESS
#endif /* COMPILE_RAM */ #endif /* COMPILE_RAM */
#define USB_BUFFER_SIZE 0x80000
#endif /* _FIREBEE_H_ */ #endif /* _FIREBEE_H_ */

View File

@@ -16,4 +16,6 @@
#define TARGET_ADDRESS BOOTFLASH_BASE_ADDRESS #define TARGET_ADDRESS BOOTFLASH_BASE_ADDRESS
#endif /* COMPILE_RAM */ #endif /* COMPILE_RAM */
#define USB_BUFFER_SIZE 0x80000
#endif /* _M5484L_H_ */ #endif /* _M5484L_H_ */

View File

@@ -210,7 +210,7 @@ struct resource_descriptor
uint8_t private; uint8_t private;
} __attribute__ ((packed)); } __attribute__ ((packed));
extern uint16_t pci_find_device(uint16_t device_id, uint16_t vendor_id, int index); extern int16_t pci_find_device(uint16_t device_id, uint16_t vendor_id, int index);
extern uint32_t pci_read_config_longword(uint16_t handle, uint16_t offset); extern uint32_t pci_read_config_longword(uint16_t handle, uint16_t offset);
extern uint16_t pci_read_config_word(uint16_t handle, uint16_t offset); extern uint16_t pci_read_config_word(uint16_t handle, uint16_t offset);

View File

@@ -24,6 +24,7 @@
#include "util.h" /* for endian conversions */ #include "util.h" /* for endian conversions */
#include "wait.h" #include "wait.h"
#include "cache.h"
#include "usb.h" #include "usb.h"
#include "ehci.h" #include "ehci.h"
@@ -177,15 +178,7 @@ static struct ehci {
static void cache_qtd(struct qTD *qtd, int flush) static void cache_qtd(struct qTD *qtd, int flush)
{ {
uint32_t *ptr = (uint32_t *) swpl(qtd->qt_buffer[0]); flush_and_invalidate_caches();
int len = (qtd->qt_token & 0x7fff0000) >> 16;
flush_invalidate((uint32_t)qtd, sizeof(struct qTD), flush);
if((ptr != NULL) && len)
{
ptr += gehci.dma_offset;
flush_invalidate((uint32_t)ptr, len, flush);
}
} }
static inline struct QH *qh_addr(struct QH *qh) static inline struct QH *qh_addr(struct QH *qh)
@@ -201,7 +194,7 @@ static void cache_qh(struct QH *qh, int flush)
/* Walk the QH list and flush/invalidate all entries */ /* Walk the QH list and flush/invalidate all entries */
while(1) while(1)
{ {
flush_invalidate((uint32_t)qh_addr(qh), sizeof(struct QH), flush); flush_and_invalidate_caches();
if((uint32_t)qh & QH_LINK_TYPE_QH) if((uint32_t)qh & QH_LINK_TYPE_QH)
break; break;
qh = qh_addr(qh); qh = qh_addr(qh);
@@ -255,7 +248,7 @@ static int handshake(uint32_t *ptr, uint32_t mask, uint32_t done, int usec)
result &= mask; result &= mask;
if(result == done) if(result == done)
return 0; return 0;
udelay(1); wait(1);
usec--; usec--;
} }
while(usec > 0); while(usec > 0);

View File

@@ -64,6 +64,7 @@
#define MCF_PSC3_PSCTB_8BIT __MBAR+0x890C #define MCF_PSC3_PSCTB_8BIT __MBAR+0x890C
.global _vec_init .global _vec_init
.global _asm_set_ipl
// interrupt sources // interrupt sources
.equ INT_SOURCE_EPORT_EPF1,1 // edge port flag 1 .equ INT_SOURCE_EPORT_EPF1,1 // edge port flag 1

View File

@@ -78,10 +78,35 @@
#define min_t(type, x, y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; }) #define min_t(type, x, y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
struct pci_device_id ohci_usb_pci_table[] = { struct pci_device_id ohci_usb_pci_table[] =
{ PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5237, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_SERIAL_USB_OHCI, 0, 0 }, /* ULI1575 PCI OHCI module ids */ {
{ PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_USB, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_SERIAL_USB_OHCI, 0, 0 }, /* NEC PCI OHCI module ids */ {
{ PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_ISP1561, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_SERIAL_USB_OHCI, 0, 0 }, /* Philips 1561 PCI OHCI module ids */ PCI_VENDOR_ID_AL,
PCI_DEVICE_ID_AL_M5237,
PCI_ANY_ID,
PCI_ANY_ID,
PCI_CLASS_SERIAL_USB_OHCI,
0,
0
}, /* ULI1575 PCI OHCI module ids */
{
PCI_VENDOR_ID_NEC,
PCI_DEVICE_ID_NEC_USB,
PCI_ANY_ID,
PCI_ANY_ID,
PCI_CLASS_SERIAL_USB_OHCI,
0,
0
}, /* NEC PCI OHCI module ids */
{
PCI_VENDOR_ID_PHILIPS,
PCI_DEVICE_ID_PHILIPS_ISP1561,
PCI_ANY_ID,
PCI_ANY_ID,
PCI_CLASS_SERIAL_USB_OHCI,
0,
0
}, /* Philips 1561 PCI OHCI module ids */
/* Please add supported PCI OHCI controller ids here */ /* Please add supported PCI OHCI controller ids here */
{ 0, 0, 0, 0, 0, 0, 0 } { 0, 0, 0, 0, 0, 0, 0 }
}; };

View File

@@ -164,7 +164,7 @@ struct resource_descriptor *pci_get_resource(uint16_t handle)
return (struct resource_descriptor *) 0L; return (struct resource_descriptor *) 0L;
} }
uint16_t pci_find_device(uint16_t device_id, uint16_t vendor_id, int index) int16_t pci_find_device(uint16_t device_id, uint16_t vendor_id, int index)
{ {
uint16_t bus; uint16_t bus;
uint16_t slot; uint16_t slot;
@@ -184,16 +184,23 @@ uint16_t pci_find_device(uint16_t device_id, uint16_t vendor_id, int index)
value = pci_read_config_longword(handle, 0); value = pci_read_config_longword(handle, 0);
if (value != 0xffffffff) /* we have a device at this position */ if (value != 0xffffffff) /* we have a device at this position */
{ {
if (vendor_id == 0xffff) /* ignore vendor id */ if (vendor_id == 0xffff && pos == index) /* ignore device id */
{ {
return handle; return handle;
} }
else if (PCI_VENDOR_ID(value) == vendor_id && PCI_DEVICE_ID(value) == device_id) else
{
/* we found a match, but at wrong position */
pos++;
continue;
}
if (PCI_VENDOR_ID(value) == vendor_id && PCI_DEVICE_ID(value) == device_id)
{ {
if (pos == index) if (pos == index)
return handle; return handle;
pos++;
} }
else
pos++;
} }
} }
} }

View File

@@ -44,6 +44,10 @@
#include "m5484l.h" #include "m5484l.h"
#endif /* MACHINE_M5484LITE */ #endif /* MACHINE_M5484LITE */
#include "mod_devicetable.h"
#include "pci_ids.h"
#include "usb.h"
#define UNUSED(x) (void)(x) /* Unused variable */ #define UNUSED(x) (void)(x) /* Unused variable */
extern volatile long _VRAM; /* start address of video ram from linker script */ extern volatile long _VRAM; /* start address of video ram from linker script */
@@ -491,35 +495,71 @@ void init_video_ddr(void) {
/* /*
* probe for UPC720101 (USB) * probe for NEC compatible USB host controller and install if found
*/ */
void test_upd720101(void) void init_usb(void)
{ {
xprintf("UDP720101 USB controller initialization: "); extern struct pci_device_id ohci_usb_pci_table[];
extern struct pci_device_id ehci_usb_pci_table[];
struct pci_device_id *board;
int16_t handle;
uint16_t usb_found;
int index = 0;
/* select UPD720101 AD17 */ xprintf("USB controller initialization: ");
MCF_PCI_PCICAR = MCF_PCI_PCICAR_E +
MCF_PCI_PCICAR_DEVNUM(17) +
MCF_PCI_PCICAR_FUNCNUM(0) +
MCF_PCI_PCICAR_DWORD(0);
if (* (uint32_t *) PCI_IO_OFFSET == 0x33103500) do
{ {
MCF_PCI_PCICAR = MCF_PCI_PCICAR_E + handle = pci_find_device(0x0000, 0xffffL, index++);
MCF_PCI_PCICAR_DEVNUM(17) + xprintf("checking %d\r\n", handle);
MCF_PCI_PCICAR_FUNCNUM(0) + if (handle > 0)
MCF_PCI_PCICAR_DWORD(57); {
uint32_t id = 0;
uint32_t class = 0;
* (uint8_t *) PCI_IO_OFFSET = 0x20; xprintf("ckecking board #%d, handle %d\r\n", index, handle);
id = pci_read_config_longword(handle, PCIIDR);
class = pci_read_config_longword(handle, PCIREV);
if (class >> 16 == PCI_CLASS_SERIAL_USB)
{
xprintf("serial USB found at #%d\r\n", handle);
if (class >> 8 == PCI_CLASS_SERIAL_USB_EHCI)
{
board = ehci_usb_pci_table;
while (board->vendor)
{
xprintf("ckecking %x against %x\r\n", board->vendor, id & 0xffff);
if ((board->vendor == (id & 0xffff)) && board->device == (id >> 16))
{
xprintf("board match at handle %x\r\n", handle);
if (usb_init(handle, board) >= 0)
{
usb_found++;
} }
else
{
xprintf("NOT ");
MCF_PCI_PCICAR = MCF_PCI_PCICAR_DEVNUM(17) +
MCF_PCI_PCICAR_FUNCNUM(0) +
MCF_PCI_PCICAR_DWORD(57);
} }
board++;
}
}
if (class >> 8 == PCI_CLASS_SERIAL_USB_OHCI)
{
board = ohci_usb_pci_table;
while (board->vendor)
{
xprintf("ckecking %x against %x\r\n", board->vendor, id & 0xffff);
if ((board->vendor == (id & 0xffff)) && board->device == (id >> 16))
{
xprintf("board match at handle %x\r\n", handle);
if (usb_init(handle, board) >= 0)
usb_found++;
}
board++;
}
}
}
}
} while (handle >= 0);
xprintf("finished\r\n"); xprintf("finished\r\n");
} }
@@ -976,7 +1016,7 @@ void initialize_hardware(void)
init_video_ddr(); init_video_ddr();
dvi_on(); dvi_on();
#endif /* MACHINE_FIREBEE */ #endif /* MACHINE_FIREBEE */
test_upd720101(); init_usb();
//video_1280_1024(); //video_1280_1024();
#ifdef MACHINE_FIREBEE #ifdef MACHINE_FIREBEE
init_ac97(); init_ac97();

View File

@@ -150,25 +150,23 @@ int usb_init(long handle, const struct pci_device_id *ent)
return res; return res;
} }
usb_hub_reset(bus_index); usb_hub_reset(bus_index);
/* init low_level USB */ /* init low_level USB */
xprintf("USB: "); xprintf("USB: ");
switch(ent->class) switch(ent->class)
{ {
#ifdef CONFIG_USB_UHCI
case PCI_CLASS_SERIAL_USB_UHCI: case PCI_CLASS_SERIAL_USB_UHCI:
res = uhci_usb_lowlevel_init(handle, ent, &priv); //res = uhci_usb_lowlevel_init(handle, ent, &priv);
xprintf("sorry, no uhci driver available\r\n");
break; break;
#endif
#ifdef CONFIG_USB_OHCI
case PCI_CLASS_SERIAL_USB_OHCI: case PCI_CLASS_SERIAL_USB_OHCI:
xprintf("initialize ohci interface, ");
res = ohci_usb_lowlevel_init(handle, ent, &priv); res = ohci_usb_lowlevel_init(handle, ent, &priv);
break; break;
#endif
#ifdef CONFIG_USB_EHCI
case PCI_CLASS_SERIAL_USB_EHCI: case PCI_CLASS_SERIAL_USB_EHCI:
xprintf("initialize ehci interface, ");
res = ehci_usb_lowlevel_init(handle, ent, &priv); res = ehci_usb_lowlevel_init(handle, ent, &priv);
break; break;
#endif
default: res = -1; break; default: res = -1; break;
} }
if(!res) if(!res)
@@ -1087,6 +1085,7 @@ void usb_scan_devices(void *priv)
} }
{ {
/* insert "driver" if possible */ /* insert "driver" if possible */
#ifdef _NOT_USED_
if (drv_usb_kbd_init() < 0) if (drv_usb_kbd_init() < 0)
xprintf("No USB keyboard found\r\n"); xprintf("No USB keyboard found\r\n");
else else
@@ -1095,6 +1094,7 @@ void usb_scan_devices(void *priv)
xprintf("No USB mouse found\r\n"); xprintf("No USB mouse found\r\n");
else else
xprintf("USB HID mouse driver installed\r\n"); xprintf("USB HID mouse driver installed\r\n");
#endif /* _NOT_USED */
} }
xprintf("Scan end\r\n"); xprintf("Scan end\r\n");
} }