From 0b3f845ebdd27625d985bdeabfcf40b783eec69c Mon Sep 17 00:00:00 2001 From: jhChun Date: Fri, 27 Mar 2026 16:47:46 +0900 Subject: [PATCH] =?UTF-8?q?=EC=96=91=EC=82=B0=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20BLE=20=EB=B3=B4=EC=95=88=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=B2=98=EB=A6=AC=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PM 핸들러 중복 호출 제거 - conn_sec_failed 재페어링 로직 일원화 - NRF_ERROR_BUSY 크래시 수정: 보안 실패 시 보드 리셋되는 현상 개선 --- pc_firm/ble_security/ble_quick_security.c | 22 +++++++++++++------ .../ble_app_bladder_patch/main.c | 18 ++++----------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/pc_firm/ble_security/ble_quick_security.c b/pc_firm/ble_security/ble_quick_security.c index aef3bd7..5441a43 100644 --- a/pc_firm/ble_security/ble_quick_security.c +++ b/pc_firm/ble_security/ble_quick_security.c @@ -97,9 +97,8 @@ void ble_security_quick_pm_handler(pm_evt_t const *p_evt) // Call standard handlers (required) pm_handler_on_pm_evt(p_evt); - pm_handler_disconnect_on_sec_failure(p_evt); pm_handler_flash_clean(p_evt); - + // Handle events switch (p_evt->evt_id) { case PM_EVT_CONN_SEC_SUCCEEDED: @@ -109,17 +108,26 @@ void ble_security_quick_pm_handler(pm_evt_t const *p_evt) DBG_PRINTF("PROD: Link secured (bonded)\r\n"); } break; - + case PM_EVT_CONN_SEC_FAILED: - DBG_PRINTF("Security failed: error=%d\r\n", + DBG_PRINTF("Security failed: error=%d\r\n", p_evt->params.conn_sec_failed.error); - - // Auto-retry if key missing + if (p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING) { + // Key missing: 재페어링 시도, 실패 시 disconnect로 폴백 err_code = pm_conn_secure(p_evt->conn_handle, true); - if (err_code != NRF_ERROR_INVALID_STATE) { + if (err_code != NRF_ERROR_INVALID_STATE && + err_code != NRF_ERROR_BUSY && + err_code != BLE_ERROR_INVALID_CONN_HANDLE) { APP_ERROR_CHECK(err_code); } + if (err_code != NRF_SUCCESS) { + // 재페어링 불가 → disconnect + pm_handler_disconnect_on_sec_failure(p_evt); + } + } else { + // 기타 보안 실패 → disconnect + pm_handler_disconnect_on_sec_failure(p_evt); } break; diff --git a/project/ble_peripheral/ble_app_bladder_patch/main.c b/project/ble_peripheral/ble_app_bladder_patch/main.c index bba86d3..3b538f8 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main.c +++ b/project/ble_peripheral/ble_app_bladder_patch/main.c @@ -121,7 +121,7 @@ * 빌드 설정 * DEBUG_MINIMAL_BOOT 삭제 26.03.26 jhChun *============================================================================*/ -#define BLE_DEV_MODE 1 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */ +#define BLE_DEV_MODE 0 /* 1: 개발 모드 (보안 없음), 0: 양산 모드 (패스키 필수) */ /*============================================================================== * 하드웨어 핀 정의 @@ -890,10 +890,7 @@ static void pm_evt_handler(pm_evt_t const * p_evt) uint32_t return_code; ret_code_t err_code; - /* SDK 기본 핸들러 체인 호출 */ - pm_handler_on_pm_evt(p_evt); - pm_handler_disconnect_on_sec_failure(p_evt); - pm_handler_flash_clean(p_evt); + /* SDK 기본 핸들러 + 보안 처리 (ble_quick_security 내부에서 SDK 핸들러 호출) */ ble_security_quick_pm_handler(p_evt); switch (p_evt->evt_id) @@ -924,21 +921,14 @@ static void pm_evt_handler(pm_evt_t const * p_evt) } break; - /* 보안 연결 실패 → PIN/키 누락 시 강제 재페어링 시도 */ + /* 보안 연결 실패 (retry/disconnect는 ble_quick_security에서 처리) */ case PM_EVT_CONN_SEC_FAILED: DBG_PRINTF("[PM] Sec failed\r\n"); - if (p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING) - { - err_code = pm_conn_secure(p_evt->conn_handle, true); - if (err_code != NRF_ERROR_INVALID_STATE) - { - APP_ERROR_CHECK(err_code); - } - } break; /* 모든 본딩 삭제 완료 → 광고 재시작 */ case PM_EVT_PEERS_DELETE_SUCCEEDED: + DBG_PRINTF("[PM] Bonds erased\r\n"); advertising_start(false); break;