Description
The ADSL PHY is a separate Mips System with its memory mapped into the host address space, but can also access the host's RAM. The ADSL PHY Firmwares can be used on any SoC with the same ADSL PHY Version.
ADSL PHY Version |
DSL Standard |
Used in SoC |
A |
ADSL2 |
BCM6345 (BCM6335?) |
B |
ADSL2+ |
BCM6338, BCM6348, BCM6358 |
C |
ADSL2+, VDSL2 |
BCM6368 |
D |
ADSL2+ |
BCM6328, BCM6362 |
F |
ADSL2+, VDSL2 |
BCM63168 |
Memory Access
The adsl phy local memory is accessible at the following range:
chip |
host |
phy |
size |
BCM6338 |
0xfff00000 |
0x19000000 |
256k? |
BCM6328 |
0xb0d80000 |
0x19000000 |
? |
BCM6368 |
0xb0f80000 |
0x19000000 |
? |
BCM63168 |
0xb0780000 |
0x19000000 |
? |
To access the host's ram, the adsl phy maps a 2 MiB (BCM6345: 512KiB) block of ram containing the Firmware into its own address space at 0x10000000.
Adsl Phy Firmware
The Adsl Phy requires a separate firmware for the Adsl Mips core. It consists of two parts, a smaller one loaded into the memory of the Adsl Mips core, and a bigger one loaded into the uppermost part of the host system ram. There are separate firmwares for different annexes.
File Header
Each adsl_phy.bin has a 32 byte long header:
offset |
size |
usage |
Notes |
0x00 |
32 bit |
header |
always 0x41200000 ('A \0\0') |
0x04 |
32 bit |
lmemImageOffset |
offset of the adsl mips part in the file |
0x08 |
32 bit |
lmemImageLen |
length of the adsl mips part |
0x0c |
32 bit |
sdramImageOffset |
offset of the shared part in the file |
0x10 |
32 bit |
sdramImageLength |
length of the shared part |
0x14 - 0x1f |
??? |
seems to be always zero. |
Communicating with the Phy
The adsl phy provides an interface for sending and receiving messages. All pointers are assumed to be phy local, not host local, so need to be converted when accessing. The interface is located at the following offset in the LMEM:
chip |
offset |
BCM6345 |
0x17f90 |
BCM6338 |
0x21f90 |
BCM6368 |
0x5ff90 |
Interface Layout
offset |
size |
usage |
Notes |
0x00 |
6 * 32 bit |
Status Buffer Pointers |
used for receiving status updates |
0x18 |
6 * 32 bit |
Command Buffer Pointers |
used for sending commands |
0x30 |
15 * 32 bit |
GFC Table |
|
0x6c |
32 bit |
Sdram Base |
points to the beginning of the reserved RAM in KSEG1 |
Buffer Pointer Layout
All pointers are 32 bit big and in Adsl Phy address space.
offset |
usage |
Notes |
0x00 |
start |
start of the buffer |
0x04 |
end |
end of the regular buffer |
0x08 |
extra end |
end of the additional buffer space |
0x0c |
stretch end |
current usage of the additional buffer space |
0x10 |
read |
current read pointer |
0x14 |
write |
current write pointer |
Messages
All Messages exchanged are aligned to 4 byte (filled to a multiple of 4 if necessary), and are followed by the sequence 0x55aa1234. All messages are at least 8 byte long, excluding the magic value at the end. Essentially it is:
<MessageType> |
<Content>+ |
0x55aa1234 |
Checking for available Messages
if (write >= read)
(write - read) bytes available
- else
(stretch end - read) bytes available
Receiving Messages
- read message until magic value was read
if (new read position >= stretch end)
reset read to start
- else
set read to new read position
Sending Messages
- check for available space
- write message
- write magic value
if (new write position >= end)
if (read != start)
set stretch end to new write position
set write to start
- else
set write to new write position
See PhyMessages for all known messages.