This commit is contained in:
2026-07-03 23:04:13 +09:00
parent fdc26f8b45
commit cd0fe353c0
9 changed files with 267 additions and 167 deletions

View File

@@ -166,11 +166,13 @@ xcopy /y /e "$(OutDir)*.*" "%TARGET_PATH%\"</Command>
<ClInclude Include="external\FT4222\include\ftd2xx.h" /> <ClInclude Include="external\FT4222\include\ftd2xx.h" />
<ClInclude Include="external\FT4222\include\LibFT4222.h" /> <ClInclude Include="external\FT4222\include\LibFT4222.h" />
<ClInclude Include="include\PMIC_Common_Include.h" /> <ClInclude Include="include\PMIC_Common_Include.h" />
<ClInclude Include="include\PMIC_FT4222_Drv.h" />
<ClInclude Include="include\PMIC_Function.h" /> <ClInclude Include="include\PMIC_Function.h" />
<ClInclude Include="include\PMIC_Reg_Map.h" /> <ClInclude Include="include\PMIC_Reg_Map.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="src\PMIC_Cmd_Tool.cpp" /> <ClCompile Include="src\PMIC_Cmd_Tool.cpp" />
<ClCompile Include="src\PMIC_FT4222_Drv.cpp" />
<ClCompile Include="src\PMIC_Function.cpp" /> <ClCompile Include="src\PMIC_Function.cpp" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@@ -30,6 +30,9 @@
<ClInclude Include="include\PMIC_Common_Include.h"> <ClInclude Include="include\PMIC_Common_Include.h">
<Filter>헤더 파일</Filter> <Filter>헤더 파일</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="include\PMIC_FT4222_Drv.h">
<Filter>헤더 파일</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="src\PMIC_Cmd_Tool.cpp"> <ClCompile Include="src\PMIC_Cmd_Tool.cpp">
@@ -38,5 +41,8 @@
<ClCompile Include="src\PMIC_Function.cpp"> <ClCompile Include="src\PMIC_Function.cpp">
<Filter>소스 파일</Filter> <Filter>소스 파일</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\PMIC_FT4222_Drv.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,4 +1,4 @@
#ifndef PMIC_COMMON_INCLUDE_H // Header Guard: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD> include <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> #ifndef PMIC_COMMON_INCLUDE_H // Header Guard: 파일이 중복 include 되는 것을 방지
#define PMIC_COMMON_INCLUDE_H #define PMIC_COMMON_INCLUDE_H
#include <stdio.h> #include <stdio.h>
@@ -7,15 +7,15 @@
#include <time.h> #include <time.h>
#include <ctype.h> #include <ctype.h>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> // 딜레이 함수 이용을 위해
#include <windows.h> #include <windows.h>
//Sleep(1); // 1ms <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Sleep(1); // 1ms 딜레이
//Sleep(10); // 10ms <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Sleep(10); // 10ms 딜레이
//Sleep(100); // 100ms <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Sleep(100); // 100ms 딜레이
//Sleep(1000); // 1s <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Sleep(1000); // 1s 딜레이
//Sleep(10000); // 10s <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Sleep(10000); // 10s 딜레이
// FT4222 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // FT4222 헤더
#include "ftd2xx.h" #include "ftd2xx.h"
#include "LibFT4222.h" #include "LibFT4222.h"

View File

@@ -0,0 +1,10 @@
#ifndef PMIC_FT4222_DRV_H // Header Guard: 파일이 중복 include 되는 것을 방지
#define PMIC_FT4222_DRV_H
// PMIC Common Include
#include "PMIC_Common_Include.h"
// Function Prototypes
FT_HANDLE InitializeFT4222();
#endif // PMIC_FT4222_DRV_H

View File

@@ -1,19 +1,19 @@
#ifndef PMIC_FUNCTION_H // Header Guard: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD> include <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> #ifndef PMIC_FUNCTION_H // Header Guard: 파일이 중복 include 되는 것을 방지
#define PMIC_FUNCTION_H #define PMIC_FUNCTION_H
// PMIC Common Include // PMIC Common Include
#include "PMIC_Common_Include.h" #include "PMIC_Common_Include.h"
void toBinaryString(uint8_t val, char* outBuf); // 8<><38>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> "0000_0000" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ void toBinaryString(uint8_t val, char* outBuf); // 8비트 데이터를 "0000_0000" 형태의 문자열로 변환
uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len); // CRC8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>׽<EFBFBD> 0x07, <EFBFBD>ʱⰪ 0x00) uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len); // CRC8 계산 (폴리놈 0x07, 초기값 0x00)
void currentPreciseTime(char* buf, size_t len); // <EFBFBD><EFBFBD>(00)<EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD>(000) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><>: 45.123) void currentPreciseTime(char* buf, size_t len); // (00)와 밀리초(000) 정밀시간 출력 (예: 45.123)
void currentTime(char* buf, size_t len); // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> "HH:MM:SS" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> buf<75><66> <20><><EFBFBD><EFBFBD> void currentTime(char* buf, size_t len); // 현재 시간을 "HH:MM:SS" 형식으로 buf에 저장
void logPacket(const char* dir, uint8_t* data, int size, int hasCrc); // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> (Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) void logPacket(const char* dir, uint8_t* data, int size, int hasCrc); // 로그 출력 (커맨드 형식)
int parseCommand(const char* dir); // <20><><EFBFBD>ɾ<EFBFBD> <20>Ǻ<EFBFBD> (I2C_WRITE/w, I2C_READ/r) int parseCommand(const char* dir); // 명령어 구분 (I2C_WRITE/w, I2C_READ/r)
void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value); // Address<EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>Ʈ Write with CRC, <20>׸<EFBFBD><D7B8><EFBFBD> Address<73><73> Read<61>ؼ<EFBFBD> Write<74><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value); // Address에 1바이트 Write with CRC
uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr); // Address<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>Ʈ Read (CRC <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr); // Address에서 1바이트 Read (CRC 포함)
bool Run_DebugMode_On(FT_HANDLE ftHandle); // Enter Debug Mode On bool Run_DebugMode_On(FT_HANDLE ftHandle); // Enter Debug Mode On
@@ -27,6 +27,7 @@ void Set_CRC_On(FT_HANDLE ftHandle);
void Set_CRC_Off(FT_HANDLE ftHandle); // PMIC Set CRC OFF void Set_CRC_Off(FT_HANDLE ftHandle); // PMIC Set CRC OFF
void Set_FLT_MASK_B(FT_HANDLE ftHandle); // PMIC Set FLT_MASK_B void Set_FLT_MASK_B(FT_HANDLE ftHandle); // PMIC Set FLT_MASK_B
void Handle_ManualCommand(FT_HANDLE ftHandle, char* line); // Manual Command void Handle_ManualCommand(FT_HANDLE ftHandle, char* line); // Manual Command
void Set_SCIF_Mode_On(FT_HANDLE ftHandle);
void Set_SCIF_Mode_Off(FT_HANDLE ftHandle);
#endif // PMIC_FUNCTION_H #endif // PMIC_FUNCTION_H

View File

@@ -1,5 +1,5 @@
//#pragma once //#pragma once
#ifndef PMIC_REG_MAP_H // Header Guard: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD> include <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> #ifndef PMIC_REG_MAP_H // Header Guard: 파일이 중복 include 되는 것을 방지
#define PMIC_REG_MAP_H #define PMIC_REG_MAP_H
//#include <stdint.h> //#include <stdint.h>

View File

@@ -1,9 +1,8 @@

#include "PMIC_Common_Include.h" #include "PMIC_Common_Include.h"
#include "PMIC_FT4222_Drv.h"
#include "PMIC_Function.h" #include "PMIC_Function.h"
// Function Prototypes
FT_HANDLE InitializeFT4222();
int main() int main()
{ {
@@ -25,6 +24,8 @@ int main()
printf(" 8. PMIC Set FLT_MASK_B\n"); printf(" 8. PMIC Set FLT_MASK_B\n");
printf(" 9. PMIC Set CRC ON\n"); printf(" 9. PMIC Set CRC ON\n");
printf(" 10. PMIC Set CRC OFF\n"); printf(" 10. PMIC Set CRC OFF\n");
printf(" 11. Set SCIF Mode ON\n");
printf(" 12. Set SCIF Mode OFF\n");
printf(" \n"); printf(" \n");
printf(" W. Manual I2C Write (w [Addr] [Reg] [Val])\n"); printf(" W. Manual I2C Write (w [Addr] [Reg] [Val])\n");
@@ -108,6 +109,14 @@ int main()
Set_CRC_Off(ftHandle); Set_CRC_Off(ftHandle);
break; break;
case 11:
Set_SCIF_Mode_On(ftHandle);
break;
case 12:
Set_SCIF_Mode_Off(ftHandle);
break;
default: default:
printf("\n[ERROR] Menu number %d does not exist.\n", choice); printf("\n[ERROR] Menu number %d does not exist.\n", choice);
break; break;
@@ -136,78 +145,3 @@ int main()
printf("Program terminated normally.\n"); printf("Program terminated normally.\n");
return 0; return 0;
} }
FT_HANDLE InitializeFT4222() {
#if 0
FT_HANDLE handle = NULL;
DWORD numDevs = 0;
// 연결된 장치 리스트 확인
if (FT_CreateDeviceInfoList(&numDevs) != FT_OK || numDevs == 0) {
printf("오류: 연결된 FT4222 장치를 찾을 수 없습니다.\n");
return NULL;
}
// 0번 인덱스 장치 열기
if (FT_Open(0, &handle) != FT_OK) {
printf("Error: Device open fail.\n");
return NULL;
}
// I2C 마스터 모드 초기화 (400kHz 주파수 설정)
if (FT4222_I2CMaster_Init(handle, 400) != FT4222_OK) {
printf("Error: I2C 마스터 초기화 실패.\n");
FT_Close(handle);
return NULL;
}
return handle;
#else
FT_HANDLE handle = NULL;
DWORD numDevs = 0;
FT_STATUS ftStatus;
// 1. 장치 검색
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus != FT_OK || numDevs == 0) return NULL;
FT_DEVICE_LIST_INFO_NODE* devInfoList = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE) * numDevs);
if (!devInfoList) return NULL;
FT_GetDeviceInfoList(devInfoList, &numDevs);
int targetIndex = -1;
for (DWORD i = 0; i < numDevs; i++) {
if (strstr(devInfoList[i].Description, "FT4222") != NULL) {
if (!(devInfoList[i].Flags & FT_FLAGS_OPENED)) {
targetIndex = (int)i;
break;
}
}
}
free(devInfoList);
if (targetIndex == -1) return NULL;
// 2. 장치 오픈
if (FT_Open(targetIndex, &handle) != FT_OK) return NULL;
// 💡 [수정] 헤더 파일 119라인 enum 정의에 맞게 SYS_CLK_60 적용
FT4222_SetClock(handle, SYS_CLK_60);
// 💡 [수정] 구형 헤더에 없는 FT4222_SetMode/SetDataType 계열은 과감히 생략
// (I2CMaster_Init 호출 시 드라이버 내부에서 핀 맵 자동 전환됨)
// 3. 통신 타임아웃 및 버퍼 청소 (드라이버 레벨에서 1초 타임아웃 보장)
FT_SetTimeouts(handle, 1000, 1000);
FT_Purge(handle, FT_PURGE_RX | FT_PURGE_TX);
// 4. I2C 마스터 모드 초기화 (400kHz 주파수 설정)
if (FT4222_I2CMaster_Init(handle, 400) != FT4222_OK) {
printf("[ERROR] FT4222_I2CMaster_Init fail.\n");
FT_Close(handle);
return NULL;
}
return handle;
#endif
}

View File

@@ -0,0 +1,78 @@
#include "PMIC_FT4222_Drv.h"
FT_HANDLE InitializeFT4222() {
#if 0
FT_HANDLE handle = NULL;
DWORD numDevs = 0;
// 연결된 장치 리스트 확인
if (FT_CreateDeviceInfoList(&numDevs) != FT_OK || numDevs == 0) {
printf("오류: 연결된 FT4222 장치를 찾을 수 없습니다.\n");
return NULL;
}
// 0번 인덱스 장치 열기
if (FT_Open(0, &handle) != FT_OK) {
printf("Error: Device open fail.\n");
return NULL;
}
// I2C 마스터 모드 초기화 (400kHz 주파수 설정)
if (FT4222_I2CMaster_Init(handle, 400) != FT4222_OK) {
printf("Error: I2C 마스터 초기화 실패.\n");
FT_Close(handle);
return NULL;
}
return handle;
#else
FT_HANDLE handle = NULL;
DWORD numDevs = 0;
FT_STATUS ftStatus;
// 1. 장치 검색
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus != FT_OK || numDevs == 0) return NULL;
FT_DEVICE_LIST_INFO_NODE* devInfoList = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE) * numDevs);
if (!devInfoList) return NULL;
FT_GetDeviceInfoList(devInfoList, &numDevs);
int targetIndex = -1;
for (DWORD i = 0; i < numDevs; i++) {
if (strstr(devInfoList[i].Description, "FT4222") != NULL) {
if (!(devInfoList[i].Flags & FT_FLAGS_OPENED)) {
targetIndex = (int)i;
break;
}
}
}
free(devInfoList);
if (targetIndex == -1) return NULL;
// 2. 장치 오픈
if (FT_Open(targetIndex, &handle) != FT_OK) return NULL;
// 💡 [수정] 헤더 파일 119라인 enum 정의에 맞게 SYS_CLK_60 적용
FT4222_SetClock(handle, SYS_CLK_60);
// 💡 [수정] 구형 헤더에 없는 FT4222_SetMode/SetDataType 계열은 과감히 생략
// (I2CMaster_Init 호출 시 드라이버 내부에서 핀 맵 자동 전환됨)
// 3. 통신 타임아웃 및 버퍼 청소 (드라이버 레벨에서 1초 타임아웃 보장)
FT_SetTimeouts(handle, 1000, 1000);
FT_Purge(handle, FT_PURGE_RX | FT_PURGE_TX);
// 4. I2C 마스터 모드 초기화 (400kHz 주파수 설정)
if (FT4222_I2CMaster_Init(handle, 400) != FT4222_OK) {
printf("[ERROR] FT4222_I2CMaster_Init fail.\n");
FT_Close(handle);
return NULL;
}
return handle;
#endif
}

View File

@@ -3,18 +3,21 @@
#include "PMIC_Reg_Map.h" #include "PMIC_Reg_Map.h"
#include "PMIC_Function.h" #include "PMIC_Function.h"
// 8<><38>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> "0000_0000" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ FT_HANDLE g_ftHandle = NULL;
DWORD g_selectedLocId = 0;
// 8비트 데이터를 "0000_0000" 형태의 문자열로 변환
void toBinaryString(uint8_t val, char* outBuf) void toBinaryString(uint8_t val, char* outBuf)
{ {
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ͽ<EFBFBD> '1' <EFBFBD>Ǵ<EFBFBD> '0' ä<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 해당 비트값을 검사하여 '1' 또는 '0' 채움
outBuf[i + (i >= 4 ? 1 : 0)] = (val & (1 << (7 - i))) ? '1' : '0'; outBuf[i + (i >= 4 ? 1 : 0)] = (val & (1 << (7 - i))) ? '1' : '0';
} }
outBuf[4] = '_'; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> outBuf[4] = '_'; // 4비트마다 언더바 삽입
outBuf[9] = '\0'; // <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> outBuf[9] = '\0'; // 문자열 끝 설정
} }
// CRC8 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD>׽<EFBFBD> 0x07, <EFBFBD>ʱⰪ 0x00) // CRC8 계산 (폴리놈 0x07, 초기값 0x00)
uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len) uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len)
{ {
uint8_t crc = 0x00; uint8_t crc = 0x00;
@@ -33,16 +36,16 @@ uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len)
} }
// <EFBFBD><EFBFBD>(00)<EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD>(000) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><>: 45.123) // (00)와 밀리초(000) 정밀시간 출력 (예: 45.123)
void currentPreciseTime(char* buf, size_t len) void currentPreciseTime(char* buf, size_t len)
{ {
SYSTEMTIME st; SYSTEMTIME st;
GetLocalTime(&st); // <EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>(<28>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD>)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetLocalTime(&st); // 시스템의 현재 로컬 시간(밀리초 포함)을 가져옴
sprintf_s(buf, len, "%02d.%03d", st.wSecond, st.wMilliseconds); sprintf_s(buf, len, "%02d.%03d", st.wSecond, st.wMilliseconds);
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> "HH:MM:SS" <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> buf<75><66> <20><><EFBFBD><EFBFBD> // 현재 시간을 "HH:MM:SS" 형식으로 buf에 저장
void currentTime(char* buf, size_t len) void currentTime(char* buf, size_t len)
{ {
if (buf == nullptr || len == 0) if (buf == nullptr || len == 0)
@@ -52,44 +55,44 @@ void currentTime(char* buf, size_t len)
struct tm tm_buf; struct tm tm_buf;
#ifdef _WIN32 #ifdef _WIN32
localtime_s(&tm_buf, &now); // Windows <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> localtime_s(&tm_buf, &now); /// Windows 환경 사용
#else #else
localtime_r(&now, &tm_buf); // Linux/Unix <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> localtime_r(&now, &tm_buf); // Linux/Unix 환경 사용
#endif #endif
strftime(buf, len, "%H:%M:%S", &tm_buf); strftime(buf, len, "%H:%M:%S", &tm_buf);
} }
// <EFBFBD>α<EFBFBD> <20><><EFBFBD><EFBFBD> (Ŀ<><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) // 로그 출력 (커맨드 형식)
void logPacket(const char* dir, uint8_t* data, int size, int hasCrc) void logPacket(const char* dir, uint8_t* data, int size, int hasCrc)
{ {
if (dir == nullptr || data == nullptr || size <= 0) if (dir == nullptr || data == nullptr || size <= 0)
return; return;
char timeBuf[16]; // ss.fff <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<EFBFBD> 16<31><36><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. char timeBuf[16]; // ss.fff 형식이므로 16바이트면 충분합니다.
currentPreciseTime(timeBuf, sizeof(timeBuf)); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3> currentPreciseTime(timeBuf, sizeof(timeBuf)); // 현재시간 함수 호출
//currentTime(timeBuf, sizeof(timeBuf)); //currentTime(timeBuf, sizeof(timeBuf));
// 1. PMIC I2C WRITE (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RegAddr + Value + CRC <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // 1. PMIC I2C WRITE (보통 RegAddr + Value + CRC 포함)
if (strcmp(dir, "PMIC I2C WRITE") == 0 && size >= 3) { if (strcmp(dir, "PMIC I2C WRITE") == 0 && size >= 3) {
printf("[%s] [%s] [RegAddr: 0x%02X] [Value: 0x%02X] [CRC: 0x%02X]\n", printf("[%s] [%s] [RegAddr: 0x%02X] [Value: 0x%02X] [CRC: 0x%02X]\n",
timeBuf, dir, data[0], data[1], data[2]); timeBuf, dir, data[0], data[1], data[2]);
return; return;
} }
// 2. PMIC I2C READ (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Value + CRC <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // 2. PMIC I2C READ (보통 Value + CRC 포함)
if (strcmp(dir, "PMIC I2C READ") == 0 && size >= 2) { if (strcmp(dir, "PMIC I2C READ") == 0 && size >= 2) {
printf("[%s] [%s] [Value: 0x%02X] [CRC: 0x%02X]\n", printf("[%s] [%s] [Value: 0x%02X] [CRC: 0x%02X]\n",
timeBuf, dir, data[0], data[1]); timeBuf, dir, data[0], data[1]);
return; return;
} }
// 3. <EFBFBD><20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD> <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>Ÿ <20><>Ŷ) // 3. 기본 출력 (위의 형식에 해당하지 않는 기타 패킷)
printf("[%s] [%s] ", timeBuf, dir); printf("[%s] [%s] ", timeBuf, dir);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
if (hasCrc && i == size - 1) if (hasCrc && i == size - 1)
printf("[CRC: 0x%02X] ", data[i]); printf("[CRC: 0x%02X] ", data[i]);
else if (i == 0 && size > 1) // ù <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Value<75><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> else if (i == 0 && size > 1) // 첫 번째 바이트는 Value로 간주
printf("[Value: 0x%02X] ", data[i]); printf("[Value: 0x%02X] ", data[i]);
else else
printf("0x%02X ", data[i]); printf("0x%02X ", data[i]);
@@ -99,7 +102,7 @@ void logPacket(const char* dir, uint8_t* data, int size, int hasCrc)
} }
// <EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20>Ǻ<EFBFBD> (I2C_WRITE/w, I2C_READ/r) // 명령어 구분 (I2C_WRITE/w, I2C_READ/r)
int parseCommand(const char* dir) int parseCommand(const char* dir)
{ {
if (strcmp(dir, "I2C_WRITE") == 0 || strcmp(dir, "W") == 0) if (strcmp(dir, "I2C_WRITE") == 0 || strcmp(dir, "W") == 0)
@@ -109,17 +112,16 @@ int parseCommand(const char* dir)
return 0; return 0;
} }
// Address<73><73> 1<><31><EFBFBD><EFBFBD>Ʈ Write with CRC, <20>׸<EFBFBD><D7B8><EFBFBD> Address<73><73> Read<61>ؼ<EFBFBD> Write<74><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value) void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value)
{ {
uint8_t bytes[3]; uint8_t bytes[3];
int len = 0; int len = 0;
// Write <EFBFBD><EFBFBD>Ŷ: [RegAddr] [Value] [CRC] // Write 패킷: [RegAddr] [Value] [CRC]
bytes[len++] = regAddr; bytes[len++] = regAddr;
bytes[len++] = value; bytes[len++] = value;
uint8_t addrWithRw = (slaveAddr << 1) | 0x00; // Write <20>ּ<EFBFBD> uint8_t addrWithRw = (slaveAddr << 1) | 0x00; // Write <20>ּ<EFBFBD>
uint8_t crc = calcCRC8(addrWithRw, bytes, len); uint8_t crc = calcCRC8(addrWithRw, bytes, len);
bytes[len++] = crc; bytes[len++] = crc;
@@ -134,18 +136,18 @@ void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint
//logPacket("PMIC I2C WRITE", bytes, len, 1); //logPacket("PMIC I2C WRITE", bytes, len, 1);
} }
// Read <20>ؼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> OFF // Read <20>ؼ<EFBFBD> <20><> <20><><EFBFBD>ϱ<EFBFBD> OFF
#if 0 #if 0
// Register Address <20>ٽ<EFBFBD> Write (Read <20><><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>) // Register Address <20>ٽ<EFBFBD> Write (Read <20><><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>)
uint8_t regOnly[1] = { regAddr }; uint8_t regOnly[1] = { regAddr };
st = FT4222_I2CMaster_Write(ftHandle, slaveAddr, regOnly, 1, &transferred); st = FT4222_I2CMaster_Write(ftHandle, slaveAddr, regOnly, 1, &transferred);
if (st != FT4222_OK) { if (st != FT4222_OK) {
printf("Read<61><64> Address Write Fail\n"); printf("Read<61><64> Address Write Fail\n");
return; return;
} }
// Register Address<73><73><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD>Ʈ Read // Register Address<73><73><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD>Ʈ Read
uint8_t rx[2] = { 0 }; uint8_t rx[2] = { 0 };
st = FT4222_I2CMaster_Read(ftHandle, slaveAddr, rx, 2, &transferred); st = FT4222_I2CMaster_Read(ftHandle, slaveAddr, rx, 2, &transferred);
@@ -156,7 +158,7 @@ void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint
else { else {
logPacket("PMIC I2C READ ", rx, transferred, 0); logPacket("PMIC I2C READ ", rx, transferred, 0);
// ù <20><>° <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Write <20><> <20><><EFBFBD><EFBFBD> // ù <20><>° <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Write <20><> <20><>
if (rx[0] == value) { if (rx[0] == value) {
printf("OK Pass: [Write Value = 0x%02X], [Read Value = 0x%02X]\n", value, rx[0]); printf("OK Pass: [Write Value = 0x%02X], [Read Value = 0x%02X]\n", value, rx[0]);
} }
@@ -168,14 +170,14 @@ void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint
} }
// Address<73><73><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>Ʈ Read (CRC <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>) // Address<73><73><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>Ʈ Read (CRC <20><><EFBFBD> <20><><EFBFBD><EFBFBD>)
uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr) uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
{ {
uint16 transferred = 0; uint16 transferred = 0;
FT4222_STATUS st; FT4222_STATUS st;
uint8_t rx[2] = { 0xFF, 0xFF }; // <EFBFBD>ʱⰪ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> uint8_t rx[2] = { 0xFF, 0xFF }; // 초기값 에러 방지
// 1.Register Address<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Write (Read <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><><EFBFBD><EFBFBD>) // 1. Register Address를 먼저 Write (Read 시작 위치 설정)
uint8_t regOnly[1] = { regAddr }; uint8_t regOnly[1] = { regAddr };
st = FT4222_I2CMaster_Write(ftHandle, slaveAddr, regOnly, 1, &transferred); st = FT4222_I2CMaster_Write(ftHandle, slaveAddr, regOnly, 1, &transferred);
@@ -184,7 +186,7 @@ uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
return 0xFF; return 0xFF;
} }
// 2.Register Address<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD>Ʈ Read (Value + CRC) // 2. Register Address에서 2바이트 Read (Value + CRC)
st = FT4222_I2CMaster_Read(ftHandle, slaveAddr, rx, 2, &transferred); st = FT4222_I2CMaster_Read(ftHandle, slaveAddr, rx, 2, &transferred);
if (st != FT4222_OK) { if (st != FT4222_OK) {
@@ -192,7 +194,7 @@ uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
return 0xFF; return 0xFF;
} }
else { else {
// 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 2진수 변환 출력 준비
char binStr[10]; // "0000_0000" + null char binStr[10]; // "0000_0000" + null
toBinaryString(rx[0], binStr); toBinaryString(rx[0], binStr);
@@ -207,42 +209,42 @@ uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
bool Run_DebugMode_On(FT_HANDLE ftHandle) { bool Run_DebugMode_On(FT_HANDLE ftHandle) {
uint8_t readVal = 0; uint8_t readVal = 0;
int retryCount = 0; int retryCount = 0;
const int maxRetries = 300; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݺ<EFBFBD> <20><><EFBFBD><EFBFBD> (50ȸ<30><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>) const int maxRetries = 300; // 최대 반복 횟수 (300회로 설정합니다)
printf("\n[PROCESS] Checking PMIC Communication..."); printf("\n[PROCESS] Checking PMIC Communication...");
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>Ǵ<EFBFBD> Ư<><C6AF> Ƚ<><C8BD>) // 통신 준비 검사: 디바이스 응답 확인 시까지 무한 루프 (또는 특정 횟수)
while (1) { while (1) {
readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ 0x65 readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read시 기본값 0x65
if (readVal != 0xFF) { if (readVal != 0xFF) {
printf("\n[SUCCESS] Device detected! (Current Reg 0x02: 0x%02X)\n", readVal); printf("\n[SUCCESS] Device detected! (Current Reg 0x02: 0x%02X)\n", readVal);
break; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB> break; // 통신 성공 시 루프 탈출
} }
printf("."); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><> ǥ<><C7A5> printf("."); // 통신 중임을 알리는 점 표시
Sleep(1000); // 1<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> Sleep(1000); // 1초 대기하며 확인
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>ȴٸ<C8B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD>͸<EFBFBD> <20> break // 통신 상태 확인이 안된다면 횟수를 카운트하여 break
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 디버그 모드 진입 시도 시작
printf("[PROCESS] Attempting to Enter Debug Mode On\n"); printf("[PROCESS] Attempting to Enter Debug Mode On\n");
do { do {
retryCount++; retryCount++;
// Page01 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Page01 설정
PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (0x25) // 디버그 모드 진입 설정 (0x25)
PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x02, 0x25); //0x102 - IO_MODECTRL PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x02, 0x25); //0x102 - IO_MODECTRL
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ȯ<><C8AE> (Verification) // 결과값 재 확인 (Verification)
Sleep(50); Sleep(50);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о Ȯ<><C8AE> // 값 읽어서 확인
readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02);
if (readVal == 0x25) { if (readVal == 0x25) {
@@ -265,42 +267,42 @@ bool Run_DebugMode_On(FT_HANDLE ftHandle) {
bool Run_DebugMode_Off(FT_HANDLE ftHandle) { bool Run_DebugMode_Off(FT_HANDLE ftHandle) {
uint8_t readVal = 0; uint8_t readVal = 0;
int retryCount = 0; int retryCount = 0;
const int maxRetries = 100; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݺ<EFBFBD> <20><><EFBFBD><EFBFBD> (50ȸ<30><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>) const int maxRetries = 100; // 최대 반복 횟수 (100회로 설정합니다)
printf("\n[PROCESS] Checking PMIC Communication..."); printf("\n[PROCESS] Checking PMIC Communication...");
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>Ǵ<EFBFBD> Ư<><C6AF> Ƚ<><C8BD>) // 통신 준비 검사: 디바이스 응답 확인 시까지 무한 루프 (또는 특정 횟수)
while (1) { while (1) {
readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read<EFBFBD><EFBFBD> Debug On<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x25 readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read Debug On일경우 0x25
if (readVal != 0xFF) { if (readVal != 0xFF) {
printf("\n[SUCCESS] Device detected! (Current Reg 0x02: 0x%02X)\n", readVal); printf("\n[SUCCESS] Device detected! (Current Reg 0x02: 0x%02X)\n", readVal);
break; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB> break; // 통신 성공 시 루프 탈출
} }
printf("."); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><> ǥ<><C7A5> printf("."); // 통신 중임을 알리는 점 표시
Sleep(1000); // 1<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE> Sleep(1000); // 1초 대기하며 확인
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>ȴٸ<C8B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD>͸<EFBFBD> <20> break // 통신 상태 확인이 안된다면 횟수를 카운트하여 break
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 디버그 모드 해제 시도 시작
printf("[PROCESS] Attempting to Enter Debug Mode Off...\n"); printf("[PROCESS] Attempting to Enter Debug Mode Off...\n");
do { do {
retryCount++; retryCount++;
// Page01 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Page01 설정
PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (0x65) // 디버그 모드 해제 설정 (0x65)
PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x02, 0x65); //0x102 - IO_MODECTRL PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x02, 0x65); //0x102 - IO_MODECTRL
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ȯ<><C8AE> (Verification) // 결과값 재 확인 (Verification)
Sleep(50); Sleep(50);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о Ȯ<><C8AE> // 값 읽어서 확인
readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02);
if (readVal == 0x65) { if (readVal == 0x65) {
@@ -541,10 +543,77 @@ void Handle_ManualCommand(FT_HANDLE ftHandle, char* line)
int command = parseCommand(token); // 1: WRITE, 2: READ int command = parseCommand(token); // 1: WRITE, 2: READ
if (command == 1 || command == 2) { if (command == 1 || command == 2) {
printf("\n[MANUAL] Executing I2C %s...\n", (command == 1) ? "WRITE" : "READ"); printf("\n[MANUAL] Executing I2C %s...\n", (command == 1) ? "WRITE" : "READ");
// <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD><DBBC>ϼ̴<CFBC> w/r <20>Ľ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD> <20>˴ϴ<CBB4>. // 여기에 작성하시려는 w/r 파싱 후 실제 명령어에 해당하는 함수를 호출합니다.
// <EFBFBD><EFBFBD>: <20><>ū<EFBFBD><C5AB> <20><><EFBFBD><EFBFBD> <20>߶<EFBFBD><DFB6><EFBFBD> <20>ּҿ<D6BC> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> FT4222_I2CMaster_... ȣ<EFBFBD><EFBFBD> // 예: 파싱된 슬레이브 주소와 데이터로 FT4222_I2CMaster_... 호출
} }
else { else {
printf("\n[ERROR] Invalid command or menu number. Please try again.\n"); printf("\n[ERROR] Invalid command or menu number. Please try again.\n");
} }
} }
void Set_SCIF_Mode_On(FT_HANDLE ftHandle)
{
}
void Set_SCIF_Mode_Off(FT_HANDLE ftHandle)
{
}
// Scan: C 스타일의 문자열 비교 (strstr 사용)
void ScanDevices()
{
#if 0
DWORD num = 0;
FT_CreateDeviceInfoList(&num);
printf("\n--- Available FT4222 'A' Channels ---\n");
for (DWORD i = 0; i < num; i++) {
FT_DEVICE_LIST_INFO_NODE node;
memset(&node, 0, sizeof(node));
FT_GetDeviceInfoDetail(i, NULL, NULL, NULL, &node.LocId, NULL, node.Description, NULL);
if (strstr(node.Description, "FT4222 A") != NULL && node.LocId != 0) {
printf("[%d] LocID: 0x%X, Desc: %s\n", (int)i, (unsigned int)node.LocId, node.Description);
}
}
#endif
}
// Connect: C 스타일로 리턴값과 에러 처리
int ConnectDevice(int index)
{
#if 0
FT_DEVICE_LIST_INFO_NODE node;
memset(&node, 0, sizeof(node));
FT_GetDeviceInfoDetail(index, NULL, NULL, NULL, &g_selectedLocId, NULL, NULL, NULL);
if (FT_OpenEx((PVOID)(uintptr_t)g_selectedLocId, FT_OPEN_BY_LOCATION, &g_ftHandle) != FT_OK) return 0;
FT4222_UnInitialize(g_ftHandle);
FT4222_SetClock(g_ftHandle, SYS_CLK_60);
// I2C 보호용 초기화
FT4222_I2CMaster_Init(g_ftHandle, 100);
GPIO_Dir dirs[4] = { GPIO_INPUT, GPIO_INPUT, GPIO_OUTPUT, GPIO_OUTPUT };
FT4222_GPIO_Init(g_ftHandle, dirs);
printf("[CONN] I2C Protection Active. GPIO 2,3 Ready.\n");
#endif
return 1;
}
// SetBits: 문자열 포인터를 사용한 비트 제어
void SetBits(const char* bits)
{
if (!g_ftHandle) { printf("[ERROR] Connect first!\n"); return; }
BOOL p2 = (bits[0] == '1');
BOOL p3 = (bits[1] == '1');
FT4222_GPIO_Write(g_ftHandle, GPIO_PORT2, p2);
FT4222_GPIO_Write(g_ftHandle, GPIO_PORT3, p3);
printf("[EXEC] GPIO2:%c, GPIO3:%c (0,1 Protected)\n", bits[0], bits[1]);
}