| 349 | // ============================================================================ |
| 350 | |
| 351 | bool LpcSctRxChannel::begin(const RxConfig& config) FL_NOEXCEPT { |
| 352 | mFinished = false; |
| 353 | mCapacity = config.buffer_size > 0 ? config.buffer_size : 4096u; |
| 354 | mPrevTick = 0; |
| 355 | mPrevSeen = false; |
| 356 | mLastRising = false; |
| 357 | mEdges.clear(); |
| 358 | mEdges.reserve(mCapacity); |
| 359 | |
| 360 | #if defined(FASTLED_LPC_RX_SCT) && defined(FL_IS_ARM_LPC_845) |
| 361 | // ---- 1. Power up SCT + SWM (and DMA when the DMA path is opted in), |
| 362 | // then pulse their resets. ---- |
| 363 | reg(kSysconBase, kOffSYSAHBCLKCTRL0) |= (kClkSCT | kClkSWM |
| 364 | #if defined(FASTLED_LPC_RX_SCT_DMA) |
| 365 | | kClkDMA |
| 366 | #endif |
| 367 | ); |
| 368 | volatile fl::u32& presetctrl = reg(kSysconBase, kOffPRESETCTRL0); |
| 369 | presetctrl &= ~(kRstSCT | kRstSWM |
| 370 | #if defined(FASTLED_LPC_RX_SCT_DMA) |
| 371 | | kRstDMA |
| 372 | #endif |
| 373 | ); // assert reset (low pulse) |
| 374 | presetctrl |= (kRstSCT | kRstSWM |
| 375 | #if defined(FASTLED_LPC_RX_SCT_DMA) |
| 376 | | kRstDMA |
| 377 | #endif |
| 378 | ); // release reset |
| 379 | |
| 380 | // ---- 2. Route mPin -> SCT input 0 via SWM PINASSIGN6 byte[31:24]. ---- |
| 381 | swmAssignSctInput0(static_cast<fl::u8>(mPin & 0xFFu)); |
| 382 | |
| 383 | // ---- 3. Configure SCT: UNIFY counter + INSYNC for input 0. ---- |
| 384 | // The 2-clock synchronizer adds ~67 ns of capture jitter at F_CPU=30 MHz, |
| 385 | // well below the WS2812 T0H/T1H discrimination window (~500 ns margin). |
| 386 | sct(kOffCTRL) = kCtrlHaltL | kCtrlClrCtrL; // halted, counter zeroed |
| 387 | sct(kOffCONFIG) = kCfgUnify | kCfgInsync0; |
| 388 | sct(kOffLIMIT) = 0u; // free-running counter |
| 389 | sct(kOffCOUNT) = 0u; |
| 390 | |
| 391 | // ---- 4. Mark register slots 0 + 1 as CAPTURE (REGMODE bits 0,1 = 1). ---- |
| 392 | sct(kOffREGMODE) = (1u << 0) | (1u << 1); |
| 393 | |
| 394 | // ---- 5. Event 0 → rising edge on SCT input 0 → captures into CAP[0]. |
| 395 | // Event 1 → falling edge on SCT input 0 → captures into CAP[1]. |
| 396 | sct_ev_state(0) = 0x1u; // active in STATE 0 |
| 397 | sct_ev_ctrl (0) = evCtrlInputCapture(0u, kIoCondRise); |
| 398 | sct_ev_state(1) = 0x1u; |
| 399 | sct_ev_ctrl (1) = evCtrlInputCapture(0u, kIoCondFall); |
| 400 | |
| 401 | sct_capctrl(0) = (1u << 0); // EV0 loads CAP[0] |
| 402 | sct_capctrl(1) = (1u << 1); // EV1 loads CAP[1] |
| 403 | |
| 404 | sct(kOffEVEN) = 0u; // polling mode — IRQs off |
| 405 | sct(kOffEVFLAG) = 0xFFu; // clear any stale flags |
| 406 | |
| 407 | #if defined(FASTLED_LPC_RX_SCT_DMA) |
| 408 | // ---- 6. SCT → DMA wiring. ---- |
nothing calls this directly
no test coverage detected