RapidRoad
Dual high-speed USB module for Amiga computers
Contents |
Overview
This highspeed USB module RapidRoad provides two USB ports with up to 480MBit peak transfer rate using ST-Ericsson's isp1763 USB host controller chip. Power for both ports can be switched separately. The high-current switch can supply up to 1.5A of power per port. For this high power rating, separate power must be supplied through a 3.5-inch floppy power connector.
Dual interface design
The module can either be connected to the clockport of an A1200 using cables, or the local expansion port of the X-Surf-100 card. The latter will give you highest performance and is therefore the recommended method of connection. Only one interface can be used at a time. Switching between the interfaces is automatically done by the hardware. There is a lower-cost version available that has the clockport interface disabled.
Requirements
- 68020 or higher processor
- 2.5MByte free fastmem (recommended: 4Mbytes)
- free clockport or X-Surf-100 networking card
- installed MUI (magic user interface - free download from Aminet)
- OS3.0 or higher
- transfer method for large downloaded files to your Amiga (physical media is NOT included!)
USB stack software
A license of the USB stack "Poseidon" and corresponding drivers are included with the card. Product support is only done by individual Computers and our resellers. The original author of the Poseidon stack, Chris Hodges, will not do product support. Please do not eMail him.
short manuals
short manual for clockport version (German/English)
short manual for X-Surf-100 version (German/English)
installation pictures
Software download
Please install the hardware first, then install the software. This will let you skip the manual configuration of Poseidon; an automatic configuration can be created during the installation of Poseidon.
Poseidon V4.5 install archive including RapidRoad drivers
If you prefer a floppy disk for data transfer or you are a floppy emulator user, you may use the ADF image, which is a slightly-reduced version of the above archive:
Poseidon V4.5 ADF image including RapidRoad drivers
V1.7 of the RapidRoad devices fixes the Z3 problems that a few customers with 3640 and Cyberstorm accelerators have reported. Requires Thor's mmu.library to be installed. Copy the unpacked archive to your DEVS:USBHardware/ folder. RR drivers V1.7
Updated hid.class V4.4 fixes key repeat and mouse clicks from USB devices for OS3.1.4 and OS3.2: HIDclassV44.lha
Register level description
If you are not a programmer, you can stop reading here.
clockport mode
For this mode, the clockport of the A1200 computer, our Zorro cards, the A604(n) or the ACA500 can be used. Please note that the clockport interface is only enabled on the more expensive versions of the RapidRoad USB module. Although using RapidRoad on the ACA500's clockport is technically possible, it is not recommended - mainly because there's soldering required in order to get a power connector close enough to the clockport.
register overview
The following register numbers are to be added to the base offset of the clockport you want to access. Example: The A1200 clockport's base address is 0xd80001 and the A604n's secondary clockport address is 0xd90001. Please read the documentation of the board you want to target with your driver.
CP-Offset | register name | used bits (read) | used bits (write) | isp1763a register |
---|---|---|---|---|
0x00 | HighFive context A | ./.(*) | 0-4 | ./. |
0x04 | HighFive context B | ./.(*) | 0-4 | ./. |
0x08 | USB Int pending | 0 | ./. | ./. |
0x0c | context/IRQ Control | 0-1 | 0-1 | ./. |
0x10 | START_ADDR_MEM[7:0] | 0-7 | 0-7 | 0xc4 |
0x14 | START_ADDR_MEM[15:8] | 0-7 | 0-7 | 0xc5 |
0x18 | Data Port | 0-7 | 0-7 | 0xc6 |
0x1c | Data Port | 0-7 | 0-7 | 0xc6 |
0x20 | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3 |
0x24 | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+1 |
0x28 | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+2 |
0x2c | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+3 |
0x30 | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+4 |
0x34 | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+5 |
0x38 | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+6 |
0x3c | isp1763 banked reg | 0-7 | 0-7 | Highfive<<3+7 |
(*): Reading the HighFive registers is used for module identification (see further down).
IRQ handling
The USB module starts up with IRQ-passing disabled. This will ensure safe startup of the Amiga, even if the chip goes wild due to other drivers accessing random registers, trying to find other hardware on the clockport. Please note that the isp1763a supports edge-triggered and level-triggered IRQs, and it also supports active-high and active-low IRQs. You need to program the isp1763a to active-high level-triggered IRQs prior to enabling the IRQ pass-through to the Amiga. To activate IRQ-passing to the Amiga, set bit 0 in offset 0x0c. Reading this register bit will return the value of this enable-bit. The clockport module uses interrupt level 6.
IRQ checking
The status of the INT line of the isp1763a chip can always be checked by reading bit 1 of register offset 0x08. This value is always valid, no matter if you have activated passing IRQs to the Amiga or not: The bit being set means "INT from USB is pending", and the bit being 0 means "no INT pending". Bit 0 of register offset 0x08 will show the state of IRQ-passing: 1=enabled (this is a mirror of bit 0 in register offset 0x0c).
context switching
In order not to lose the currently set register bank, there are two banking registers for two software threads that access isp1763a registers, for example one for the main driver and another for the interrupt service routine. A write to one of the two HighFive registers will automatically switch the context bit to that banking register, so you can immediately access one of the registers at offset 0x20 and up. When the IRQ service routine returns, you can switch back the context bit in register offset 0x0c without losing the contents of any of the two HighFive registers. The context bit can be written in register offset 0x0c, bit 1: If this bit is written to 0, then banking register HighFive A is active. If this bit is set to 1, then banking register HighFive B is active.
clockport identification
Many expansions are available for the various clockports that can be found in different Amiga computers. However, no common hardware identification method has been specified for them, and "poking" around in registers that you assume are located in the hardware you expect might have undesired effects in other hardware. Our USB module therefore has an identification method that will work with read accesses only. This is assuming that no hardware will do undesired actions if you just read it's registers. This is not a guarantee, though, as some IO chips may still do trigger- or acknowledge actions if for example a status register is read. However, reducing the identification to read accesses only will reduce the probability of software incompatibility.
Identification mode is ON when IRQ passing to the Amiga is switched OFF (bit 0 in offset 0x0c is reset, which is the case after a fresh power-up or a reset). Since the isp1763a comes up in power-down mode, you need to wake it up first. This is done by a dummy read access from register offset 0x20. Dump the actual value that you have read - it's random and doesn't contain any information. Wait at least 10ms for the chip to power up, let the clock start to swing and the internal PLLs generate their high-speed clocks. After these 10ms, the first real actions can be made on the controller's bus.
Now read the Highfive A register at offset 0x00. This will return a binary value of %xxx10x00 (where x is random). You should mask out random bits and only check the 0- and 1-bits. Should any of the bits not match, quit the detection routine. Then read the HighFive B register at offset 0x04. This will return a random value that doesn't contain any information - dump that value. The USB module's hardware needs this read access to set the context bit to 1 and to set the HighFive B register to value 0x0e. Now you can read the ChipID register at offset 0x20 and higher. The return values should be (in ascending order): 0x20, 0x63, 0x17, 0x00. After you have found these values, it's safe to assume that you have found the USB module at the port offset you're probing, and you can start writing into registers. It is recommended to initialize the IRQ polarity first (register 0xb6 of the isp1763a) and then to enable IRQ passing to the Amiga. By enabling IRQ passing, you disable the clockport identification method described here, keeping other software from messing with the contents of the HighFive B register through an accidental read access.
This identification method can be repeated as many times as you like, so other software drivers that also look for clockport hardware may only mess with the identification method if they accidentally enable IRQ passing to the Amiga. A "forced probe" method where IRQ passing is switched off prior to the identification routine should therefore be offered to the user if no USB module has been found.
clockport mirror identification
Since multi-clockport adapters (such as the Z4 board) don't have an identification method either, you need a method to find out if the clockport area has been split into four 16k-areas (like the Z4 board does), or if it's in the original 64k size configuration. This can also be done purely with read-accesses while the clockport identification mode is active: By reading the HighFive A register at offset 0x00, you reset the context bit to 0, which will be represented in bit 1 of register offset 0x0c. By reading the HighFive B register at offset 0x04, you set the context bit to 1, which can also be verified in register offset 0x0c. This can be used to check if you're talking to one USB module, or to multiple modules.
Zorro mode
If connected to the expansion port of the X-Surf-100, you can find the isp1763a registers at offset 0x2800 with a register spacing of four bytes. This area is byte-swapped. To access the same registers without byte-swapping, please use offset 0x3800. For these two areas, only 16-bit accesses are allowed.
It is also possible to use 32-bit accesses, although the isp1763a is just a 16-bit wide chip. This is however only useful if you access the data port of the USB controller. The data port is located at host controller register 0xc6, which will be accessed two times in a row if you read or write X-Surf-100 register offset 0xab18 (byte-swapped) or 0xbb18 (not byte-swapped). You should only use this register with longword-accesses, because in Z3 mode, the X-Surf-100 hardware will always make two accesses to the data port register, which will advance the pointer by two words, no matter what size access you really make. See further down for high speed transfers using multiple 32-bit accesses.
There is no difference in these register offsets between Z2 and Z3 mode of the X-Surf-100. If your driver works with one mode of operation, the same driver will also work with the other. Only the speed will be different.
IRQ handling
The USB module starts up with IRQ-passing disabled. This will ensure safe startup of the Amiga, even if the chip goes wild due to faulty software. Please note that the isp1763a supports edge-triggered and level-triggered IRQs, and it also supports active-high and active-low IRQs. You need to program the isp1763a to active-high level-triggered IRQs prior to enabling the IRQ pass-through to the Amiga. To activate IRQ-passing to the Amiga, set bit 0 in X-Surf-100 register offset 0x4800. Note that this is a word-wide register, so bit 0 is actually located in address 0x4801. Reading this register bit will return the value of this enable-bit. The USB module uses interrupt level 6 on the X-Surf-100.
IRQ checking
The status of the INT line of the isp1763a chip can always be checked by reading bit 1 of X-Surf-100 register offset 0x4800. Note that this is a word-wide register, so bit 1 is actually located in address 0x4801. This value is always valid, no matter if you have activated passing IRQs to the Amiga or not: The bit being set means "INT from USB is pending", and the bit being 0 means "no INT pending". All other bits should be masked out, because they will carry random values.
In some cases, the Interrupt enable-bit gets trashed on a read from register 0x4801. It is therefore recommended to add a write access to offset 0x4801 after any read access from this register in order not to lose IRQs that occur later. Although the effect has only been observed with the X-Surf-100 in Z3 mode, it may also happen in Z2 mode, so this write-after-read is a general recommendation.
High speed transfer area
The highest transfer speeds for polled-IO transfers can be reached with the movem.l command. This requires a continuous set of registers, which the isp1763a normally does not provide. Our USB module makes use of the fact that controller registers 0x40 to 0x4f are not used at all, and re-maps accesses to these registers to the data port 0xc6. The inner copy-loop of the Zorro driver can use X-Surf-100 register 0ffset 0xa900 (byte-swapped) and 0xb900 (not byte-swapped) with the movem.l command so speed up transfers.
Shop
- Individual Computers' Shop (selected Products)
Resellers
This product is not officially available from resellers. Due to the extremely high cost of development, we need to recover all expenses of the development before we can give any reseller margin. You may still find this product at your local reseller, as we do ship to them at end customer price.