|
|
For now this is a scratch space for defining how the extensions will be
|
|
|
structured.
|
|
|
|
|
|
Part of the code should be contained in one or more separate submodules,
|
|
|
to make it modular
|
|
|
|
|
|
## Software modules
|
|
|
|
|
|
There are a number of identifiable software parts. Some of or more of
|
|
|
these are part of a hardware abstraction layer.
|
|
|
|
|
|
<table>
|
|
|
<tbody>
|
|
|
<tr class="odd">
|
|
|
<td><strong>Section</strong></td>
|
|
|
<td><strong>Name</strong></td>
|
|
|
<td><strong>Usage</strong></td>
|
|
|
<td><strong>Description</strong></td>
|
|
|
<td><strong>Type</strong></td>
|
|
|
<td><strong>Location</strong></td>
|
|
|
</tr>
|
|
|
<tr class="even">
|
|
|
<td>A</td>
|
|
|
<td>Low level peripheral drivers</td>
|
|
|
<td>Optional</td>
|
|
|
<td>Providers architecture independent I2C and GPIO access.</td>
|
|
|
<td>PERIPERAL DRIVER</td>
|
|
|
<td>?</td>
|
|
|
</tr>
|
|
|
<tr class="odd">
|
|
|
<td>B</td>
|
|
|
<td>Low level component drivers</td>
|
|
|
<td>Optional</td>
|
|
|
<td>Providers component drivers for I2C, EEPROM.</td>
|
|
|
<td>COMPONENT DRIVER</td>
|
|
|
<td>?</td>
|
|
|
</tr>
|
|
|
<tr class="even">
|
|
|
<td>C</td>
|
|
|
<td>Low level SFP abstraction</td>
|
|
|
<td>Required</td>
|
|
|
<td>Provides a facade for accessing SFP transceivers</td>
|
|
|
<td>COMPLEX DRIVER</td>
|
|
|
<td>?</td>
|
|
|
</tr>
|
|
|
<tr class="odd">
|
|
|
<td>D</td>
|
|
|
<td>High level SFP access</td>
|
|
|
<td>Required</td>
|
|
|
<td>Provides access to specific data-types within the SFP memory space</td>
|
|
|
<td>SERVICE</td>
|
|
|
<td>?</td>
|
|
|
</tr>
|
|
|
<tr class="even">
|
|
|
<td>E</td>
|
|
|
<td>SFP+ applications</td>
|
|
|
<td>Required</td>
|
|
|
<td>Uses the SFP abstraction for controlling WRPC</td>
|
|
|
<td>APPLICATION</td>
|
|
|
<td>Integrated in WRPC SW PTP Core</td>
|
|
|
</tr>
|
|
|
</tbody>
|
|
|
</table>
|
|
|
|
|
|
### A - Low level peripheral drivers
|
|
|
|
|
|
These drivers provide functions for iterating the I2C peripherals on the
|
|
|
device, and doing I2C transactions.
|
|
|
Since SFP transceivers also have GPIO signals like TX\_FAULT and
|
|
|
RX\_LOSS, so a GPIO abstraction should also be required.
|
|
|
This layer knows nothing specific about SFP modules. Its just an
|
|
|
I2C/GPIO abstraction. It also knows nothing about other I2C components.
|
|
|
|
|
|
### B - Low level component drivers
|
|
|
|
|
|
This is optional since we could do without. I2C access for SFP modules
|
|
|
is not that complex. This modules would only make sense if we would
|
|
|
create a soft of generic hardware abstraction layer.
|
|
|
|
|
|
### C - Low level SFP abstraction
|
|
|
|
|
|
This layer provides read/write access to the SFP transceiver, and status
|
|
|
access with only minimal exposure to the I2C/GPIO interface specifics.
|
|
|
Address spaces can be accessed through generic enumerated type, like:
|
|
|
|
|
|
typdef enum sfp_as_s {
|
|
|
SFP_AS_A0, // Address space 0xA0, address 0-255
|
|
|
SFP_AS_A2_LO,
|
|
|
SFP_AS_A2_PAGE0, // page 0 of address space 0xA2, address 128-255
|
|
|
SFP_AS_A2_PAGE2, // page 2 of address space 0xA2, address 128-255
|
|
|
SFP_AS_A2_PAGE3 // page 3 of address space 0xA2, address 128-255
|
|
|
} sfp_as_t;
|
|
|
|
|
|
// read operation may look like this
|
|
|
status_t sfp_mod_read(sfp_mod_t * mod, sfp_as_t as, uint8_t offset, uint16_t length);
|
|
|
|
|
|
Write operations transparently take the 8 byte pages into account. I.e.
|
|
|
a write operation may start at any index in the address space. When B
|
|
|
has been implemented this may call EEPROM read/write operations from
|
|
|
module B.
|
|
|
|
|
|
Reading of the SFP IO lines is done by querying the status, like this:
|
|
|
|
|
|
#define SFP_STATUS_PRESENT 0x01
|
|
|
#define SFP_STATUS_RX_LOSS 0x02
|
|
|
#define SFP_STATUS_TX_FAULT 0x04
|
|
|
sfp_mod_status_flags_t sfpmod_status(sfp_mod_t * mod)
|
|
|
|
|
|
.h3 D - High level SFP access
|
|
|
|
|
|
Provides access on a high level to the SFP module. Either data can be
|
|
|
accessed directly though functions:
|
|
|
|
|
|
sfp_set_wavelength(sfpmod_t * mod, uint32_t);
|
|
|
|
|
|
Or generic control functions are provided:
|
|
|
|
|
|
uint32_t sfp_get_u32(sfpmod_t * mod, SFP_PARAM_WAVELENGTH);
|
|
|
|
|
|
Note that this may not be very efficient for reading the entire EEPROM.
|
|
|
|
|
|
.h3. E - Application
|
|
|
|
|
|
TODO
|
|
|
|