f531bf3e55
- board_config.h: add PLIP_SLIC_RM=18, FR=5, SHK=23, PD=19 (A1S KEY3-6 repurposed)
- slic.c/slic.h: new ESP-IDF module porting Ks0835SlicController:
* slic_init(): RM/FR output LOW, SHK input+pullup, PD open-drain HIGH (power-up)
* slic_is_offhook(): reads SHK GPIO23, HIGH = off-hook (active-high, matches A252ConfigStore default)
* slic_ring_start/stop(): RM HIGH + FreeRTOS task toggles FR at 25 Hz (20 ms period)
- CMakeLists.txt: add slic.c to SRCS, esp_driver_gpio to PRIV_REQUIRES
- Kconfig: PLIP_HOOK_GPIO default 4→23, add PLIP_HOOK_ACTIVE_HIGH (default y)
- phone.c: hook reads SHK GPIO23 via HOOK_OFFHOOK_LEVEL/HOOK_PULSE_OPEN macros (active-HIGH);
phone_ring_start/stop() now drives slic_ring_start/stop() for physical bell + audio tone
- main.c: slic_init() called early in boot_task before audio_init
Root cause fixed: SLIC was never powered (PD never released from reset state).
Hook was read on wrong GPIO (4) with wrong polarity. Ring drove only audio, not bell.
60 lines
1.6 KiB
C
60 lines
1.6 KiB
C
/*
|
|
* slic.h — K50835F / AG1171-class SLIC control (ESP-IDF port of Ks0835SlicController).
|
|
*
|
|
* Pins (A1S board, from board_config.h):
|
|
* RM GPIO18 Ring Mode output — HIGH = ring burst active
|
|
* FR GPIO5 Forward/Reverse out — toggled at ~25 Hz during ring to drive bell
|
|
* SHK GPIO23 Switch Hook input — HIGH = off-hook (active-high)
|
|
* PD GPIO19 Power Down (OD) — HIGH = SLIC powered (released open-drain)
|
|
*
|
|
* Power-up: PD is open-drain, written HIGH → high-impedance → SLIC active.
|
|
* Power-down: PD driven LOW → SLIC off (no audio, no hook sense).
|
|
*
|
|
* Ring: slic_ring_start() sets RM=1 and spawns/enables a 20 ms FR-toggle task.
|
|
* slic_ring_stop() clears RM=0, FR=0, pauses the toggle task.
|
|
*
|
|
* Hook: slic_is_offhook() reads SHK; HIGH = off-hook (matches A252ConfigStore default).
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include "esp_err.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* Initialise SLIC GPIO and power up the SLIC.
|
|
* Must be called early in boot, before audio init.
|
|
* Returns ESP_OK on success.
|
|
*/
|
|
esp_err_t slic_init(void);
|
|
|
|
/**
|
|
* Returns true when the handset is off-hook (SHK GPIO23 HIGH).
|
|
*/
|
|
bool slic_is_offhook(void);
|
|
|
|
/**
|
|
* Activate ringing: RM=HIGH + FR toggles at ~25 Hz (20 ms period).
|
|
* No-op if already ringing.
|
|
*/
|
|
void slic_ring_start(void);
|
|
|
|
/**
|
|
* Stop ringing: RM=LOW, FR=LOW, FR toggle suspended.
|
|
* No-op if not ringing.
|
|
*/
|
|
void slic_ring_stop(void);
|
|
|
|
/**
|
|
* Returns true if slic_ring_start() was called and not yet stopped.
|
|
*/
|
|
bool slic_is_ringing(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|