New version from Hytec

This commit is contained in:
MarkRivers
2012-02-29 18:53:00 +00:00
parent 285dd4a1c3
commit 054a97a44c
+173 -88
View File
@@ -5,7 +5,11 @@ Author: Jim Chen, Hytec Electronics Ltd
jim.chen@hytec-electronics.co.uk
First Initial: 12/NOV/2010
Last updated: 05/MAY/2011
Last updated: 29/FEB/2012
Modification note:
22/FEB/2012 - corrected memory offset calculation errors reported by Ernest Williams SLAC.
29/FEB/2012 - added coverage for all cases when setting up the MEMOFFS for 8002 carrier.
This driver is based on "model 3" motor asyn driver defined by Mark Rivers.
***********************************************************************************
@@ -33,107 +37,188 @@ Support modules
Hytec 8002/8003/8004 carrier card configuration
===============================================
This board is a 6U VME64x carrier card. It provides four single size IP slots and
is configurable for many parameters. It supports interrupt level from 0 to 7. Any
IP cards can be enabled/disabled interrupt. The clock can be set to either 8MHz or
32MHz. For IPAC Memory space if required, the base address can be defined automatically
by geographical addressing when VME64x crate is used. For other type of crates,
the base address can be set by configuring a series of jumpers on the board or by
passing parameter to the memory offset register in the ipacAddCarrier call.
The IPAC Carrier Driver for this board is found in the file drvHy8002.c which
implements two commands ipacAddHy8002 and Hy8002CarrierInfo. The ipacAddHy8002
command is used to add a Hytec 8002/8003 board to the system. The Hy8002CarrierInfo
reports hardware information for a specified board or all boards in the system if
the parameter passed down is 0xFFFF. These commands are registered by the registrar
routine Hy8002Registrar to add them to the iocsh and link the driver into a final
IOC executable, for which it must be listed in the IOC's .dbd file thus:
registrar(Hy8002Registrar)
This board is a 6U VME64x carrier card. It provides four single size IP slots and
is configurable for many parameters. It supports interrupt level from 0 to 7. Any
IP cards can be enabled/disabled interrupt. The clock can be set to either 8MHz or
32MHz. For IPAC Memory space if required, the base address can be defined automatically
by geographical addressing when VME64x crate is used. For other type of crates,
the base address can be set by configuring a series of jumpers on the board or by
passing parameter to the memory offset register in the ipacAddCarrier call.
The IPAC Carrier Driver for this board is found in the file drvHy8002.c which
implements two commands ipacAddHy8002 and Hy8002CarrierInfo. The ipacAddHy8002
command is used to add a Hytec 8002/8003 board to the system. The Hy8002CarrierInfo
reports hardware information for a specified board or all boards in the system if
the parameter passed down is 0xFFFF. These commands are registered by the registrar
routine Hy8002Registrar to add them to the iocsh and link the driver into a final
IOC executable, for which it must be listed in the IOC's .dbd file thus:
registrar(Hy8002Registrar)
1). Configuration Command and Parameter
--------------------------------------
--------------------------------------
- int ipacAddHYy8002(const char *cardParams);
The parameter string should comprise two (2) to six (6) parameters which are comma
separated. The first two are mandate and have to be separated only by one comma.
The others are key/value pairs and are optional as per the conditions of the operating
system used. The format is defined as
s,i,IPMEM=d,IPCLCK=d,ROAK=d,MEMOFFS=d
where d is a decimal integer number.
s defines the VME slot number of the carrier card. Valid number is 2 ~ 21.
this number MUST be the same as the VME slot number where the carrier
card is plugged in.
i defines the interrupt level. Valid number is 0 ~ 7.
IPMEM=d defines the maximum memory size of the IP module. The valid values are 1, 2,
4 or 8 that represent 1MB, 2MB, 4MB or 8MB respectively. Default is 1. For
majority Hytec ADCs, DACs such as 8401, 8414, 8417, 8402 and 8415 etc, they
all have 2MB on board. The user can choose to use either 1MB or 2MB. None of
the Hytec IPs has more than 2MB on board memory. Other vendors might have.
IPCLCK=d defines the clock that its value has to be either 8 for 8MHz or 32 for
32Mhz. Default is 8.
ROAK=d if d =1, it defines carrier card to release the interrupt upon the
acknowledgment. If d=0, the interrupt is released by user interrupt
service routine. Default is 0.
MEMOFFS=d this parameter defines the A32 memory access base address. "d" is a decimal
number that represents the offset (the upper WORD) of the A32 base address.
It is needed when any of the two statements below is true:
- int ipacAddHYy8002(const char *cardParams);
A. The operating system either VxWorks or RTEMS has defined a non-zero
VME_A32_MSTR_LOCAL macro in the system config.h file.
The parameter string should comprise two (2) to six (6) parameters which are comma
separated. The first two are mandate and have to be separated only by one comma.
The others are key/value pairs and are optional. The format is defined as
B. The VME crate is not geographical addressing facilitated. In such a system,
user must use this to set up base address for A32.
For a VME crate that is geographical addressing facilitated, and the system
defines a non-zero VME_A32_MSTR_LOCAL macro, then it is needed. But if
VME_A32_MSTR_LOCAL macro is defined as 0, then this is optional. Setting this
the driver will turn off the carrier card geographical addressing by setting
a bit in the CSR.
Note: MEMOFFS has nothing to do with A16 base address formation. A16 base address
is determined either by geographical addressing or by carrier board on board
jumpers settings. For VME crate that is not geographical addressing facilitated,
both 8002 and 8004 carriers need to use on board jumpers (J6~J10) to set up
(On 8004 carrier, moving the jumpers to "manual" positions). When the VME
crate is geographical addressing facilitated, for 8002 carrier, A16 base
address is determined by the crate geographical addressing facility, i.e.
determined automatically by the slot number where the carrier is plugged in
(the actually A16 base address is determined as vmeslotnumber << 11). But for
8004 carrier, user can have a choice to either use the on board jumpers to
manually set up (moving jumpers J6~J10 away from "auto" to "manual" positions)
or let the the geographical addressing to determine it (keep all J6 ~ J10 to
"auto" position).
Calcualtion of MEMOFFS:
s,i,IPMEM=d,IPCLCK=d,ROAK=d,MEMOFFS=d
As mentioned above, MEMOFFS setting represents the upper WORD of A32 VME address. Two
things need to be considered when doing the calculation: IPMEM setting and the the
VME_A32_MSTR_LOCAL macro definition in the config.h file of the BSP.
where d is a decimal integer number.
s defines the VME slot number of the carrier card. Valid number is 2 ~ 21 if
1MB memory space is specified or 2~15 if 2MB memory space is specified
i defines the interrupt level. Valid number is 0 ~ 7.
IPMEM=d defines the maximum memory size of the IP module. The value d has to be 1, 2,
4 or 8 that represent 1MB, 2MB, 4MB or 8MB respectively. Default is 1.
IPCLCK=d defines the clock that its value has to be either 8 for 8MHz or 32 for
32Mhz. Default is 8.
ROAK=d if d =1, it defines carrier card to release the interrupt upon the
acknowledgment. If d=0, the interrupt is released by user interrupt
service routine. Default is 0.
MEMOFFS=d this is used to define the A32 memory space base address when geographic
addressing is not preferred. The value of MEMOFFS defines A16 ~ A31 of
the base address as shown below. It is derived from the VME slot number
of the carrier card plus the VME_A32_MSTR_LOCAL defined in the config.h
file of the BSP.
IPMEM defines the memory size per IP card. Either 8002 or 8004 has up to 4 IPs so
the carrier memory size is 4 times of the IP memory. The minimum size of an IP, which
is also the default setting (if IPMEM is not defined), is 1MB. Hence the MEMOFFS
should start from address line A22 as shown below
D15 D14 D13 D12 D11 D10 D09 D08 D07 D06 D05 D04 D03 D02 D01 D00
A31 A30 A29 A28 A27 A26 A25 A24 A23 A22 x x x x x x
MEMOFFS BIT 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
A31 A30 A29 A28 A27 A26 A25 A24 A23 A22 0 0 0 0 0 0
X= don't care, normally 0. So the actual meaningful bit starts from A22.
The MEMOFFS must be defined such that any two carriers in the same crate shuoldn't
have overlapped memory area. So when IPMEM changes, the starting address line for
calculating MEMOFFS changes as well as illustrated below:
The reason it starts from A22 is that the minimum VME carrier memory assignment is
4MB, i.e. each IP card has 1MB as defined by the IPMEM=1. As such, a carrier in
slot 1 would have base address 0x00400000 plus the VME_A32_MSTR_LOCAL define.
Of course slot 1 is occupied by processor. So for slot 2, the base address is 0x00800000
and for slot 3, the base address is 0x00C00000 and so forth.
IPMEM memory per IP carrier memory size starting address line
1 1MB 4MB A22
2 2MB 8MB A23
4 4MB 16MB A24
8 8MB 32MB A25
If the VME_A32_MSTR_LOCAL is defined as 0x20000000, then for slot 3, the derived base
address is 0x00C00000 + 0x20000000 = 0x200C00000. Hence the MEMOFFS = 8204 (decimal, i.e. 0x200C).
For slot 5, the derived base address will be 0x01400000 + 0x20000000 = 0x21400000.
Hence the MEMOFFS = 8512 (decimal, i.e. 0x2140). And so forth.
all address lines below this starting address must be 0.
- int Hy8002CarrierInfo(int carrier);
VME_A32_MSTR_LOCAL macro is the system base and it just needs to be added on to the
calculation.
where 'carrier' is the registered carrier number in the system. If it is specified,
this function prints out the specified carrier hardware information. If carrier = 0xFFFF,
then all carriers' hardware information will be printed out.
In principle, calculating MEMOFFS doesn't have to correspond it to VME slot number
that the carrier is plugged in. The only thing matters is as said that any two MEMOFFS
settings for any two carriers in the same crate should not overlap. Yet associating
the VME slot number in the calculation just makes better logical sense and fits the
natual of human being's thinking. Some examples are shown below.
Let's assume IPMEM=1 (the default setting), this gives 4MB memory space for a 8002
carrier so starting address line is A22. The remaining must be 0.
MEMOFFS BIT 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
A31 A30 A29 A28 A27 A26 A25 A24 A23 A22 0 0 0 0 0 0
For a carrier in VME slot 2, we can define its A32 base address as 0x00400000,
plus VME_A32_MSTR_LOCAL. For VME slot 3, it could be 0x00800000 plus VME_A32_MSTR_LOCAL
and for VME slot 4, it could be 0x00C00000 plus VME_A32_MSTR_LOCAL and so forth.
Assuming VME_A32_MSTR_LOCAL is 0x20000000, then for VME slot 4, the calculated base
address should be 0x00C00000 + 0x20000000 = 0x20C000000. Hence the MEMOFFS = 8384
(decimal, i.e. 0x20C0). For slot 5, the derived base address could be 0x01000000 +
0x20000000 = 0x21000000. Hence the MEMOFFS = 8448 (decimal, i.e. 0x2100) and so forth.
Now if IPMEM=2, this gives 8MB memory space for each 8002 carrier so the starting address
line is A23. The remaining must be 0.
MEMOFFS BIT 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
A31 A30 A29 A28 A27 A26 A25 A24 A23 0 0 0 0 0 0 0
For a carrier in VME slot 2, we could define its A32 base address as 0x00800000
plus VME_A32_MSTR_LOCAL. For VME slot 3, the base address could be 0x01000000 plus
VME_A32_MSTR_LOCAL and for VME slot 4, the base address could be 0x01800000 plus
VME_A32_MSTR_LOCALand so forth.
Assuming VME_A32_MSTR_LOCAL is still 0x20000000, then for VME slot 4, the calculated
base address should be 0x01800000 + 0x20000000 = 0x218000000. Hence the MEMOFFS = 8576
(decimal, i.e. 0x2180). For slot 5, the derived base address could be 0x02000000 +
0x20000000 = 0x22000000. Hence the MEMOFFS = 8704 (decimal, i.e. 0x2200) and so forth.
- int Hy8002CarrierInfo(int carrier);
where 'carrier' is the registered carrier number in the system. If it is specified,
this function prints out the specified carrier hardware information. If carrier = 0xFFFF,
then all carriers' hardware information will be printed out.
2). Configuration Examples
-------------------------
ipacAddHy8002("3,2")
This indicates that the carrier is in slot 3 and the interrupt level is set to 2.
IP memory uses default 1MB. Clock uses default 8MHz. RORA as default. use geographical
addressing etc.
ipacAddHy8002("5,4,IPMEM=1,IPCLCK=8,ROAK=1,MEMOFFS=192 ")
Here the slot is 5, interrupt level is 4. IP memory size is 1MB, clock uses 8MHz.
Use ROAK but not using geographic addressing. The memory offset is 192 which means its
base address is 0x00C00000 assuming the VME_A32_MSTR_LOCAL is set to 0x00000000.
-------------------------
ipacAddHy8002("3,2")
This indicates that the carrier is in slot 3 and the interrupt level is set to 2.
IP memory uses default 1MB. Clock uses default 8MHz. RORA as default. use geographical
addressing etc.
ipacAddHy8002("5,4,IPMEM=1,IPCLCK=8,ROAK=1,MEMOFFS=256 ")
Here the slot is 5, interrupt level is 4. IP memory size is 1MB, clock uses 8MHz.
Use ROAK but not using geographic addressing. The memory offset is 256 which means its
base address is 0x01000000 assuming the VME_A32_MSTR_LOCAL is set to 0x00000000.
3). Interrupt Commands Supported
-------------------------------
The interrupt level can be set by the second parameter of the ipacAddHy8002 routine.
Individual IP module can be set to generate interrupt or not. The commands supported
for ipmIrqCmd are illustrated below.
cmd Value Returned
ipac_irqGetLevel Carrier interrupt level (0 ~ 7)
ipac_irqEnable 0 = OK
ipac_irqDisable 0 = OK
ipac_irqPoll >0 if the interrupt line is active, else 0
(other commands) S_IPAC_notImplemented
-------------------------------
The interrupt level can be set by the second parameter of the ipacAddHy8002 routine.
Individual IP module can be set to generate interrupt or not. The commands supported
for ipmIrqCmd are illustrated below.
cmd Value Returned
ipac_irqGetLevel Carrier interrupt level (0 ~ 7)
ipac_irqEnable 0 = OK
ipac_irqDisable 0 = OK
ipac_irqPoll >0 if the interrupt line is active, else 0
(other commands) S_IPAC_notImplemented
Hy8601 IP Asyn Driver Usage
============================
@@ -422,4 +507,4 @@ The following example is for an IOC that uses RTEMS R4.9.4, MVME5500 processor b