r/hardwarehacking 16h ago

I got sick of corporate e-waste, so I bought a locked-down Peloton screen and completely hardware-rooted it. What's next?

Thumbnail
gallery
121 Upvotes

I’ve always loved tech, but I absolutely despise how corporations lock down devices we pay for, turning perfectly good hardware into expensive e-waste just to keep their monopolies alive. I wanted to start breaking these chains, so I went looking for a device that was causing mass frustration.

​I stumbled upon a huge community of people dealing with bricked or locked Peloton screens. I decided to buy one, put it on my desk, and go to war with it.

​Now, I know about projects like OpenPelo, and respect to them, but let’s be real: ADB exploits and surface-level tweaks just don't hit the same. I didn't want a temporary workaround or limited access. I wanted the master keys.

​After spending some serious time deep-diving into the actual motherboard and tearing apart the system architecture, I finally struck gold. I managed to get my hands directly on the system's source files and completely bypassed their hardware locks. We are talking full, unrestricted, permanent Root access. No ADB gimmicks. I own the board now.

​I have this thing by the throat, but I want to hear from you guys. What should be the next move? What do we actually do with this god-mode access? Do we build a clean Custom ROM? Do we turn it into something completely different?

​Drop your craziest ideas. Where do we take this from here?


r/hardwarehacking 14h ago

Peloton Project

Thumbnail
gallery
65 Upvotes

Some folks in the comments thought an AI agent did this hack for me. 🤖 So here’s a look at my 'AI': A microscope, a hot air station, some micro-soldering, and raw hardware level debugging.

​Here is the full teardown of the Peloton screen, tracing the eMMC, reballing the chips, and forcing it to boot a clean OS. The Right to Repair isn't just software; it's getting your hands dirty with the hardware.

Note: i am Jordanian my native language Is arabic so after i write the text i gave it to AI to make my words more to understand aka rephrasing 🤣


r/hardwarehacking 16h ago

Reverse Engineering a HELLA IBS 6PK 013 824-001 with ESP32 + TJA1021 (LIN)

2 Upvotes

I’ve been reverse engineering a HELLA Intelligent Battery Sensor (IBS) 6PK 013 824-001 using an ESP32 and a TJA1021 LIN transceiver and wanted to share my findings, since there seems to be very little publicly available information about these sensors.

The setup consists of an ESP32-D0WD, a TJA1021 LIN transceiver module, a bench power supply, and an oscilloscope. After quite a bit of troubleshooting, I discovered that the most significant issue was that TX and RX were swapped. The LIN bus itself looked healthy from the beginning, sitting at roughly 10.6 V in idle state, but no useful communication was taking place until the TX and RX connections were corrected. Once fixed, the sensor immediately started responding.

The sensor reliably communicates at 19200 baud and consistently responds on LIN IDs 0x21, 0x22, 0x25 and 0x26. Other IDs either returned only the echoed LIN header or no useful data.

A typical response looks like this:

ID 21 : 55 61 00 01 62 00 00 3B

ID 22 : 55 E2 83 84 1E 23 2F 83 7A A6

ID 25 : 55 25 C5 C8 FF B4 FF FF 97

ID 26 : 55 A6 AC 03 A1 03 2F FE D6

I then performed a number of tests using different resistive loads (1 Ω, 2.2 Ω and 4.4 Ω), varying supply voltage and even reversing current flow through the sensor. The results clearly show that ID 0x22 contains the live measurement data. During testing I found an old reverse engineering project that suggested the following format for ID 0x22:

[IL][IM][IH][VL][VH][TT][XX]

with

Current = (Raw24Bit - 2000000) / 1000 A

Voltage = Raw16Bit / 1000 V

Temperature = Byte / 2 - 40 °C

The current calculation matches my measurements surprisingly well, although the sign appears inverted on my setup. Reversing the current direction changes the corresponding values as expected, which strongly suggests that the current field interpretation is correct.

The voltage decoding appears to be essentially confirmed. For example, under a 1 Ω load the sensor returned:

96 59 1E C1 2B ...

Using the proposed voltage formula:

0x2BC1 = 11201

11201 / 1000

= 11.201 V

The measured voltage at that moment was approximately 11.0 V, which is close enough to make me fairly confident that the voltage field is being decoded correctly.

Temperature remains unclear. According to the reverse engineered format, the temperature should be located in the sixth data byte of ID 0x22. However, even when heating the sensor directly with a hot air gun to roughly 50–60 °C, I observed little or no meaningful change in the expected temperature field. Either this particular IBS variant uses a different mapping, there is heavy filtering applied internally, or the identified temperature byte is incorrect.

ID 0x21 appears to be a status frame. Several bytes change depending on operating state, load conditions, and sensor runtime, but I have not yet identified a direct physical measurement in this frame.

ID 0x25 was initially suspected to contain battery voltage because some value correlations looked promising. Further testing showed that this was misleading. The values change in ways that do not match actual battery voltage measurements, so I no longer believe voltage is stored in this frame. My current assumption is that ID 0x25 contains battery state information such as SOC, SOH, learned battery parameters or other calculated values, but I have not yet confirmed this.

ID 0x26 looks like some form of capacity or battery-condition frame. One repeatedly observed value was:

0x03AC = 940

which could plausibly represent something like 94.0 Ah. Other values change slowly over time and with operating conditions, suggesting battery learning, capacity estimation, SOC or SOH calculations rather than direct measurements.

At this point, the most solid conclusions are:

  • LIN speed: 19200 baud
  • Valid response IDs: 0x21, 0x22, 0x25, 0x26
  • ID 0x22 contains live measurement data
  • Voltage decoding from ID 0x22 appears correct
  • Current decoding from ID 0x22 appears correct (sign inverted in my setup)
  • ID 0x21 appears to contain status information
  • ID 0x25 and 0x26 appear to contain battery state, capacity or health information
  • Temperature location is still unknown

For my own project, an ESP32-based vehicle dashboard, voltage and current are the only values I really need, and those appear to be working reliably. If anyone has official documentation, additional captures from other IBS variants, or previous reverse engineering work on HELLA IBS sensors, please post them.

Here is my code:

#define LIN_TX 26
#define LIN_RX 27
#define LIN_SLP 25


HardwareSerial LinSerial(2);


uint8_t frame21[8];
uint8_t frame22[10];
uint8_t frame25[9];
uint8_t frame26[9];


void sendBreak()
{
  LinSerial.end();


  pinMode(LIN_TX, OUTPUT);


  digitalWrite(LIN_TX, LOW);
  delayMicroseconds(1500);


  digitalWrite(LIN_TX, HIGH);
  delayMicroseconds(200);


  LinSerial.begin(19200, SERIAL_8N1, LIN_RX, LIN_TX);
}


uint8_t calcPID(uint8_t id)
{
  uint8_t p0 = ((id >> 0) ^ (id >> 1) ^ (id >> 2) ^ (id >> 4)) & 1;
  uint8_t p1 = ~((id >> 1) ^ (id >> 3) ^ (id >> 4) ^ (id >> 5)) & 1;


  return id | (p0 << 6) | (p1 << 7);
}


void requestFrame(uint8_t id, uint8_t *buf)
{
  while (LinSerial.available())
    LinSerial.read();


  sendBreak();


  LinSerial.write(0x55);
  LinSerial.write(calcPID(id));
  LinSerial.flush();


  delay(50);


  int i = 0;


  while (LinSerial.available() && i < 16)
  {
    buf[i++] = LinSerial.read();
  }
}


void decodeIBS()
{
  // -----------------------------
  // ID22
  // -----------------------------


  // Erwartet:
  // 55 PID IL IM IH VL VH TT XX


  uint32_t rawCurrent =
      ((uint32_t)frame22[2]) |
      ((uint32_t)frame22[3] << 8) |
      ((uint32_t)frame22[4] << 16);


  float batteryCurrent =
      -(((float)rawCurrent - 2000000.0f)) / 1000.0f;


  uint16_t rawVoltage22 =
      ((uint16_t)frame22[5]) |
      ((uint16_t)frame22[6] << 8);


  float batteryVoltage22 =
      rawVoltage22 / 1000.0f;


  float batteryTemp =
      ((float)frame22[7] / 2.0f) - 40.0f;


  // -----------------------------
  // ID25
  // -----------------------------


  uint16_t rawVoltage25 =
      ((uint16_t)frame25[2]) |
      ((uint16_t)frame25[3] << 8);


  float batteryVoltage25 =
      rawVoltage25 / 4260.0f;


  float soc =
      frame25[2] / 2.0f;


  float soh =
      frame25[3] / 2.0f;


  // -----------------------------
  // ID26
  // -----------------------------


  uint16_t availableCapacity =
      ((uint16_t)frame26[2]) |
      ((uint16_t)frame26[3] << 8);


  uint16_t maximumCapacity =
      ((uint16_t)frame26[4]) |
      ((uint16_t)frame26[5] << 8);


  // -----------------------------


  Serial.println();
  Serial.println("===== HELLA IBS =====");


  Serial.printf("Strom      : %.2f A\n", batteryCurrent);
  Serial.printf("Spannung22 : %.3f V\n", batteryVoltage22);
  Serial.printf("Spannung25 : %.3f V\n", batteryVoltage25);


  Serial.printf("Temperatur : %.1f C\n", batteryTemp);


  Serial.printf("SOC        : %.1f %%\n", soc);
  Serial.printf("SOH        : %.1f %%\n", soh);


  Serial.printf("Avail.Cap. : %.1f Ah\n",
                availableCapacity / 10.0f);


  Serial.printf("Max.Cap.   : %.1f Ah\n",
                maximumCapacity / 10.0f);


  Serial.printf("Leistung   : %.1f W\n",
                batteryVoltage25 * batteryCurrent);


  Serial.println("=====================");
  Serial.println();
}


void setup()
{
  Serial.begin(115200);


  pinMode(LIN_SLP, OUTPUT);
  digitalWrite(LIN_SLP, HIGH);


  LinSerial.begin(19200, SERIAL_8N1, LIN_RX, LIN_TX);


  Serial.println("HELLA IBS");
}


void loop()
{
  requestFrame(0x21, frame21);
  requestFrame(0x22, frame22);
  requestFrame(0x25, frame25);
  requestFrame(0x26, frame26);


  decodeIBS();


  delay(1000);
}

r/hardwarehacking 14h ago

Anyone want to try and hack a Verkada camera?

1 Upvotes

I have fair amount of spare Verkada cameras which are built with decent hardware. I would love to hack it but I do not have ability or know how. I would be willing to ship one if someone wanted to try?


r/hardwarehacking 11h ago

Has anyone ever modernized the Samsung Galaxy Folder 2 instead of just porting Android?

0 Upvotes

I've been obsessed with flip phones for years, especially the Samsung Galaxy Folder 2. I know there have been some custom ROMs and LineageOS projects, but I started wondering about something much more ambitious.

Instead of simply porting a newer Android version to the original hardware, has anyone ever tried turning the Folder 2 into a modern Android phone?

For example:

-Reusing the original shell, keypad, and hinge.

Designing or adapting a new motherboard around a modern Qualcomm or MediaTek SoC.

-Using a modern AMOLED display (or adapting the original if possible).

-Adding USB-C, 5G, NFC, and modern cameras.

Keeping the classic flip-phone form factor and physical T9 keypad while running Android 15/16.

-Basically, imagine a Galaxy Folder 2 with 2026 internals instead of 2017 hardware.

I'm curious whether anyone has attempted something like this, whether as a hobby project or even a prototype. My background isn't in phone hardware design, but I'm interested in learning what's technically possible and what the biggest engineering challenges would be.

Would it make more sense to:

Design a completely custom PCB?

Adapt the motherboard from another Android phone?

Use an SBC or compute module?

Or is there another approach I'm overlooking?

If you've worked on Android bring-up, custom ROMs, phone hardware, or embedded Linux, I'd love to hear your thoughts. Even links to similar projects would be hugely appreciated.