mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-09-02 15:02:51 +08:00
Merge upstream/main into the Spanning Tree branch
Only httpd.c conflicted: main added the buffered configuration upload next to the pointers this branch had moved into xdata to free internal RAM. Both belong, so the new globals sit above declarations that keep their storage class.
This commit is contained in:
@@ -1,6 +1,11 @@
|
||||
#include "rtl837x_pins.h"
|
||||
#include "rtl837x_common.h"
|
||||
#include "rtl837x_sfr.h"
|
||||
#include "rtl837x_regs.h"
|
||||
#include "machine.h"
|
||||
|
||||
extern __code const struct machine machine;
|
||||
extern __xdata uint8_t sfr_data[4];
|
||||
|
||||
|
||||
uint8_t i2c_bus_from_sda_pin(uint8_t sda_pin) __banked {
|
||||
@@ -119,3 +124,56 @@ void gpio_output_setup(uint8_t pin, __xdata uint8_t initial_val) __banked{
|
||||
|
||||
reg_bit_set(gpio_direction_reg(pin), (pin % 32));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Read up to 16 consecutive registers of the EEPROM via I2C into sfp_buf
|
||||
*/
|
||||
bool sfp_read_block(uint8_t slot, uint8_t reg, uint8_t len) __banked __reentrant
|
||||
{
|
||||
uint8_t dev;
|
||||
uint8_t val;
|
||||
|
||||
len--;
|
||||
if (len > 15)
|
||||
return false;
|
||||
|
||||
dev = (reg & 0x80) ? 0x51 : 0x50; // 0x51 holds the diagnostics, 0x50 the module data
|
||||
reg &= 0x7f;
|
||||
|
||||
REG_WRITE(RTL837X_REG_I2C_IN, 0, 0, 0, reg);
|
||||
|
||||
REG_WRITE(RTL837X_REG_I2C_CTRL, 0x00,
|
||||
0x1 << (I2C_MEM_ADDR_WIDTH - 16) | len,
|
||||
(dev >> 5) | i2c_bus_from_scl_pin(machine.sfp_port[slot].i2c.scl) << 5
|
||||
| i2c_bus_from_sda_pin(machine.sfp_port[slot].i2c.sda) << 2,
|
||||
((dev << 3) & 0xff) | 0x1);
|
||||
|
||||
do {
|
||||
reg_read(RTL837X_REG_I2C_CTRL);
|
||||
} while (SFR_DATA_0 & 0x1);
|
||||
|
||||
if (SFR_DATA_0 & 0x2)
|
||||
return false;
|
||||
|
||||
for (uint8_t i = 0; i <= len; i++) {
|
||||
switch (i & 0x3) {
|
||||
case 0:
|
||||
reg_read(RTL837X_REG_I2C_OUT + i);
|
||||
val = SFR_DATA_0;
|
||||
break;
|
||||
case 1:
|
||||
val = SFR_DATA_8;
|
||||
break;
|
||||
case 2:
|
||||
val = SFR_DATA_16;
|
||||
break;
|
||||
default:
|
||||
val = SFR_DATA_24;
|
||||
break;
|
||||
}
|
||||
sfp_buf[i] = val;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user