Posts

Showing posts from August, 2026

XPM52C PD/QC charging module overview

Image
Today I want to review and test a simple PD/QC charging module. It is built on the XPM52C chip — a synchronous buck converter that promises to deliver up to 65W at the output (we’ll check this a bit later). This module is unbranded, but very similar ones labeled CKCS U1E can also be found, which feature a higher-quality PCB and convenient mounting slots. The chip supports a wide range of protocols, including USB PD 3.1, Qualcomm QC 2.0/3.0/3.0+, Huawei FCP/SCP, Samsung AFC, VOOC 2.0/4.0, and others, ensuring universal compatibility. Key features include support for an input voltage up to 31V, an output voltage range of 3.3–21V, built-in XPD-LINK™ technology for intelligent power management, and a full suite of protection mechanisms (overvoltage, short circuit, overheating, etc.). Thanks to its specifications, the XPM52C serves as a comprehensive solution for car chargers, portable equipment, and smart sockets, supplied in a compact QFN4x4-16L package. On the tester, I see the fol...

How Flash Memory Partitioning Works in ESP32

Image
The organization of Flash memory in the ESP32 strongly reminds me of how hard drives on PCs worked during the MBR era. There is also a bootloader, a partition table, and, of course, the data partitions themselves. And regardless of the flash size, the partitioning rules remain the same. Usually, the partition table starts at the address 0x8000 and takes up 4 KB. However, in some cases, a larger bootloader might be needed, which requires shifting the partition table further down. The structure of a single entry in the partition table looks like this: struct PartitionEntry { uint8_t magic ; // Magic number for entry validation uint8_t type ; // Partition type uint8_t subtype ; // Partition subtype uint8_t reserved ; // Reserved uint32_t offset ; // Partition offset in flash memory uint32_t size ; // Partition size char name [ 16 ]; // Partition name uint32_t flags ; // ...