The transmit modify engine is used by the firmware to modify the pending frame that is ready for transmission inside the serializer. Up to 64 bytes of the original frame can be modified.
For example, let's say that you want to change the 802.11 "Address 1" header field: to do that you can simply write the value into the "Template fill value", set the corresponding bit of the "Template fill mask" and enable the modification with TXE_WMx.
It's important remember that TXE_WM0 + TXE_WM1 are 32 bits long (16 + 16). So if you put TXE_WM0 = 0x1 you enable byte 0 and byte 1 modification. If you want to modify only byte 0 you have to put the corresponding mask equal to 0x00FF. The modification of the "Address 1" to AA:BB:CC:DD:EE:FF will become:
SPR_TME_VAL10 = 0xBBAA
SPR_TME_VAL12 = 0xDDCC
SPR_TME_VAL14 = 0xFFEE
SPR_TME_MASK10 = 0xFFFF
SPR_TME_MASK12 = 0xFFFF
SPR_TME_MASK14 = 0xFFFF
SPR_TXE_WM0 = 0x00E0 (bit 5-6-7 set)
The register SPR_TXE0_CTL contains indication for the tx engine, and has different values for different frames. As long as we can see the SPR_TXE0_CTL has these values:
- 0x4d95 for Beacon frames, that tells the TXE to use a PIFS
- 0x4021 for ACK frames, that tells the TXE to use a SIFS
- 0x4c1d for Data frames, that tells the TXE to use a DIFS
The tx engine can perform different operations on the frame into the FIFO queues. The number of the FIFO from where the frame must be picked and the operation that must be performed on that frame were stored on FIFO command register. There are at least 2 operations that can be performed:
- SPR_TXE0_FIFO_CMD = SHM_TXFCUR | 0x2000 -> flush the frame in the queue indicated by SHM_TXFCUR
- SPR_TXE0_FIFO_CMD = SHM_TXFCUR | 0x4000 -> transmit the frame in the queue indicated by SHM_TXFCUR
This register tells the TXE from which source it has to pick data and where it has to put it. It is possible to specify the length of data that TXE will take. The informations about this register were still incomplete. Below there are some indications about the possible bits meaning: values are relatives to the bit mask following reported.
* 0xE000: Unknown meaning (3 bits)
* 0x1F00: Copy source (5 bits)
- 8: Template RAM
- 0-7: Fifos
* 0x0060: Length (2 bits)
- 1: as specified in SPR_TXE0_TX_COUNT
* 0x001c: Destinaiton (3 bits)
- 1: Serializer
- 5: SHM
* 0x0002: Generate EOF (flag)
* 0x0001: ??