diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj index f6120fe2..102cb701 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj @@ -166,11 +166,13 @@ xcopy /y /e "$(OutDir)*.*" "%TARGET_PATH%\" + + diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj.filters b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj.filters index 003672f7..a152724f 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj.filters +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/PMIC_Cmd_Tool.vcxproj.filters @@ -30,6 +30,9 @@ 헤더 파일 + + 헤더 파일 + @@ -38,5 +41,8 @@ 소스 파일 + + 소스 파일 + \ No newline at end of file diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Common_Include.h b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Common_Include.h index 59039ad2..e7500007 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Common_Include.h +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Common_Include.h @@ -1,4 +1,4 @@ -#ifndef PMIC_COMMON_INCLUDE_H // Header Guard: ߺ include Ǵ +#ifndef PMIC_COMMON_INCLUDE_H // Header Guard: 파일이 중복 include 되는 것을 방지 #define PMIC_COMMON_INCLUDE_H #include @@ -7,15 +7,15 @@ #include #include -// Լ ̿ +// 딜레이 함수 이용을 위해 #include -//Sleep(1); // 1ms -//Sleep(10); // 10ms -//Sleep(100); // 100ms -//Sleep(1000); // 1s -//Sleep(10000); // 10s +//Sleep(1); // 1ms 딜레이 +//Sleep(10); // 10ms 딜레이 +//Sleep(100); // 100ms 딜레이 +//Sleep(1000); // 1s 딜레이 +//Sleep(10000); // 10s 딜레이 -// FT4222 +// FT4222 헤더 #include "ftd2xx.h" #include "LibFT4222.h" diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_FT4222_Drv.h b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_FT4222_Drv.h new file mode 100644 index 00000000..d79ea008 --- /dev/null +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_FT4222_Drv.h @@ -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 diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Function.h b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Function.h index 7d85703a..a2aeebc6 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Function.h +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Function.h @@ -1,32 +1,33 @@ -#ifndef PMIC_FUNCTION_H // Header Guard: ߺ include Ǵ +#ifndef PMIC_FUNCTION_H // Header Guard: 파일이 중복 include 되는 것을 방지 #define PMIC_FUNCTION_H // PMIC Common Include #include "PMIC_Common_Include.h" -void toBinaryString(uint8_t val, char* outBuf); // 8Ʈ ͸ "0000_0000" ڿ ȯ -uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len); // CRC8 (׽ 0x07, ʱⰪ 0x00) -void currentPreciseTime(char* buf, size_t len); // (00) и(000) (: 45.123) -void currentTime(char* buf, size_t len); // ð "HH:MM:SS" buf -void logPacket(const char* dir, uint8_t* data, int size, int hasCrc); // α (Ŀ ) -int parseCommand(const char* dir); // ɾ Ǻ (I2C_WRITE/w, I2C_READ/r) +void toBinaryString(uint8_t val, char* outBuf); // 8비트 데이터를 "0000_0000" 형태의 문자열로 변환 +uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len); // CRC8 계산 (폴리놈 0x07, 초기값 0x00) +void currentPreciseTime(char* buf, size_t len); // 초(00)와 밀리초(000) 정밀시간 출력 (예: 45.123) +void currentTime(char* buf, size_t len); // 현재 시간을 "HH:MM:SS" 형식으로 buf에 저장 +void logPacket(const char* dir, uint8_t* data, int size, int hasCrc); // 로그 출력 (커맨드 형식) +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 1Ʈ Write with CRC, ׸ Address Readؼ Write -uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr); // Address 1Ʈ Read (CRC ) +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에서 1바이트 Read (CRC 포함) -bool Run_DebugMode_On(FT_HANDLE ftHandle); // Enter Debug Mode On -bool Run_DebugMode_Off(FT_HANDLE ftHandle); // Enter Debug Mode Off -void Run_CheckFaults(FT_HANDLE ftHandle); // Check All Fault Registers -void Run_ReadChipInfo(FT_HANDLE ftHandle); // Read Chip Information (OTP/Version) -void Irq_Clear(FT_HANDLE ftHandle); // PMIC Irq Clear -void Set_Reset(FT_HANDLE ftHandle); // PMIC Set Reset -void Set_Error(FT_HANDLE ftHandle); // PMIC Set Error -void Set_CRC_On(FT_HANDLE ftHandle); // PMIC Set CRC ON -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 Handle_ManualCommand(FT_HANDLE ftHandle, char* line); // Manual Command - +bool Run_DebugMode_On(FT_HANDLE ftHandle); // Enter Debug Mode On +bool Run_DebugMode_Off(FT_HANDLE ftHandle); // Enter Debug Mode Off +void Run_CheckFaults(FT_HANDLE ftHandle); // Check All Fault Registers +void Run_ReadChipInfo(FT_HANDLE ftHandle); // Read Chip Information (OTP/Version) +void Irq_Clear(FT_HANDLE ftHandle); // PMIC Irq Clear +void Set_Reset(FT_HANDLE ftHandle); // PMIC Set Reset +void Set_Error(FT_HANDLE ftHandle); // PMIC Set Error +void Set_CRC_On(FT_HANDLE ftHandle); // PMIC Set CRC ON +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 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 diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Reg_Map.h b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Reg_Map.h index ddec0e65..1c71a415 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Reg_Map.h +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/include/PMIC_Reg_Map.h @@ -1,5 +1,5 @@ //#pragma once -#ifndef PMIC_REG_MAP_H // Header Guard: ߺ include Ǵ +#ifndef PMIC_REG_MAP_H // Header Guard: 파일이 중복 include 되는 것을 방지 #define PMIC_REG_MAP_H //#include diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Cmd_Tool.cpp b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Cmd_Tool.cpp index 563322ed..c0bb3029 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Cmd_Tool.cpp +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Cmd_Tool.cpp @@ -1,9 +1,8 @@ - + #include "PMIC_Common_Include.h" +#include "PMIC_FT4222_Drv.h" #include "PMIC_Function.h" -// Function Prototypes -FT_HANDLE InitializeFT4222(); int main() { @@ -25,6 +24,8 @@ int main() printf(" 8. PMIC Set FLT_MASK_B\n"); printf(" 9. PMIC Set CRC ON\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(" W. Manual I2C Write (w [Addr] [Reg] [Val])\n"); @@ -108,6 +109,14 @@ int main() Set_CRC_Off(ftHandle); break; + case 11: + Set_SCIF_Mode_On(ftHandle); + break; + + case 12: + Set_SCIF_Mode_Off(ftHandle); + break; + default: printf("\n[ERROR] Menu number %d does not exist.\n", choice); break; @@ -136,78 +145,3 @@ int main() printf("Program terminated normally.\n"); 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 -} diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_FT4222_Drv.cpp b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_FT4222_Drv.cpp new file mode 100644 index 00000000..78de8895 --- /dev/null +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_FT4222_Drv.cpp @@ -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 +} + diff --git a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Function.cpp b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Function.cpp index 304a9587..df3a15c6 100644 --- a/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Function.cpp +++ b/Src/0_Tool/PMIC_Tool/PMIC_Cmd_Tool/src/PMIC_Function.cpp @@ -3,18 +3,21 @@ #include "PMIC_Reg_Map.h" #include "PMIC_Function.h" -// 8Ʈ ͸ "0000_0000" ڿ ȯ +FT_HANDLE g_ftHandle = NULL; +DWORD g_selectedLocId = 0; + +// 8비트 데이터를 "0000_0000" 형태의 문자열로 변환 void toBinaryString(uint8_t val, char* outBuf) { for (int i = 0; i < 8; i++) { - // Ʈ ˻Ͽ '1' Ǵ '0' ä + // 해당 비트값을 검사하여 '1' 또는 '0' 채움 outBuf[i + (i >= 4 ? 1 : 0)] = (val & (1 << (7 - i))) ? '1' : '0'; } - outBuf[4] = '_'; // - outBuf[9] = '\0'; // ڿ + outBuf[4] = '_'; // 4비트마다 언더바 삽입 + outBuf[9] = '\0'; // 문자열 끝 설정 } -// CRC8 (׽ 0x07, ʱⰪ 0x00) +// CRC8 계산 (폴리놈 0x07, 초기값 0x00) uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len) { uint8_t crc = 0x00; @@ -33,16 +36,16 @@ uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len) } -// (00) и(000) (: 45.123) +// 초(00)와 밀리초(000) 정밀시간 출력 (예: 45.123) void currentPreciseTime(char* buf, size_t len) { SYSTEMTIME st; - GetLocalTime(&st); // ý ð(и ) + GetLocalTime(&st); // 시스템의 현재 로컬 시간(밀리초 포함)을 가져옴 sprintf_s(buf, len, "%02d.%03d", st.wSecond, st.wMilliseconds); } -// ð "HH:MM:SS" buf +// 현재 시간을 "HH:MM:SS" 형식으로 buf에 저장 void currentTime(char* buf, size_t len) { if (buf == nullptr || len == 0) @@ -52,44 +55,44 @@ void currentTime(char* buf, size_t len) struct tm tm_buf; #ifdef _WIN32 - localtime_s(&tm_buf, &now); // Windows + localtime_s(&tm_buf, &now); /// Windows 환경 사용 #else - localtime_r(&now, &tm_buf); // Linux/Unix + localtime_r(&now, &tm_buf); // Linux/Unix 환경 사용 #endif strftime(buf, len, "%H:%M:%S", &tm_buf); } -// α (Ŀ ) +// 로그 출력 (커맨드 형식) void logPacket(const char* dir, uint8_t* data, int size, int hasCrc) { if (dir == nullptr || data == nullptr || size <= 0) return; - char timeBuf[16]; // ss.fff ̹Ƿ 16Ʈ մϴ. - currentPreciseTime(timeBuf, sizeof(timeBuf)); // ð Լ ȣ + char timeBuf[16]; // ss.fff 형식이므로 16바이트면 충분합니다. + currentPreciseTime(timeBuf, sizeof(timeBuf)); // 현재시간 함수 호출 //currentTime(timeBuf, sizeof(timeBuf)); - // 1. PMIC I2C WRITE ( RegAddr + Value + CRC ) + // 1. PMIC I2C WRITE (보통 RegAddr + Value + CRC 포함) if (strcmp(dir, "PMIC I2C WRITE") == 0 && size >= 3) { printf("[%s] [%s] [RegAddr: 0x%02X] [Value: 0x%02X] [CRC: 0x%02X]\n", timeBuf, dir, data[0], data[1], data[2]); return; } - - // 2. PMIC I2C READ ( Value + CRC ) + + // 2. PMIC I2C READ (보통 Value + CRC 포함) if (strcmp(dir, "PMIC I2C READ") == 0 && size >= 2) { printf("[%s] [%s] [Value: 0x%02X] [CRC: 0x%02X]\n", timeBuf, dir, data[0], data[1]); return; } - - // 3. ⺻ ( ǿ ش ʴ Ÿ Ŷ) + + // 3. 기본 출력 (위의 형식에 해당하지 않는 기타 패킷) printf("[%s] [%s] ", timeBuf, dir); for (int i = 0; i < size; i++) { if (hasCrc && i == size - 1) printf("[CRC: 0x%02X] ", data[i]); - else if (i == 0 && size > 1) // ù Ʈ Value + else if (i == 0 && size > 1) // 첫 번째 바이트는 Value로 간주 printf("[Value: 0x%02X] ", data[i]); else printf("0x%02X ", data[i]); @@ -99,7 +102,7 @@ void logPacket(const char* dir, uint8_t* data, int size, int hasCrc) } -// ɾ Ǻ (I2C_WRITE/w, I2C_READ/r) +// 명령어 구분 (I2C_WRITE/w, I2C_READ/r) int parseCommand(const char* dir) { if (strcmp(dir, "I2C_WRITE") == 0 || strcmp(dir, "W") == 0) @@ -109,17 +112,16 @@ int parseCommand(const char* dir) return 0; } -// Address 1Ʈ Write with CRC, ׸ Address Readؼ Write void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value) { uint8_t bytes[3]; int len = 0; - // Write Ŷ: [RegAddr] [Value] [CRC] + // Write 패킷: [RegAddr] [Value] [CRC] bytes[len++] = regAddr; bytes[len++] = value; - uint8_t addrWithRw = (slaveAddr << 1) | 0x00; // Write ּ + uint8_t addrWithRw = (slaveAddr << 1) | 0x00; // Write �ּ� uint8_t crc = calcCRC8(addrWithRw, bytes, len); 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); } - // Read ؼ ϱ OFF + // Read �ؼ� �� ���ϱ� OFF #if 0 - // Register Address ٽ Write (Read ġ ) + // Register Address �ٽ� Write (Read ���� ��ġ ����) uint8_t regOnly[1] = { regAddr }; st = FT4222_I2CMaster_Write(ftHandle, slaveAddr, regOnly, 1, &transferred); if (st != FT4222_OK) { - printf("Read Address Write Fail\n"); + printf("Read�� Address Write Fail\n"); return; } - // Register Address 2Ʈ Read + // Register Address���� 2����Ʈ Read uint8_t rx[2] = { 0 }; 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 { logPacket("PMIC I2C READ ", rx, transferred, 0); - // ù ° Ʈ Write + // ù ��° ����Ʈ�� Write �� �� if (rx[0] == value) { 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 1Ʈ Read (CRC ) +// Address���� 1����Ʈ Read (CRC ��� ����) uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr) { uint16 transferred = 0; FT4222_STATUS st; - uint8_t rx[2] = { 0xFF, 0xFF }; // ʱⰪ + uint8_t rx[2] = { 0xFF, 0xFF }; // 초기값 에러 방지 - // 1.Register Address Write (Read ġ ) + // 1. Register Address를 먼저 Write (Read 시작 위치 설정) uint8_t regOnly[1] = { regAddr }; 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; } - // 2.Register Address 2Ʈ Read (Value + CRC) + // 2. Register Address에서 2바이트 Read (Value + CRC) st = FT4222_I2CMaster_Read(ftHandle, slaveAddr, rx, 2, &transferred); if (st != FT4222_OK) { @@ -192,7 +194,7 @@ uint8_t PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr) return 0xFF; } else { - // 2 ȯ + // 2진수 변환 출력 준비 char binStr[10]; // "0000_0000" + null 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) { uint8_t readVal = 0; int retryCount = 0; - const int maxRetries = 300; // ݺ (50ȸ մϴ) + const int maxRetries = 300; // 최대 반복 횟수 (300회로 설정합니다) printf("\n[PROCESS] Checking PMIC Communication..."); - // ˻: (Ǵ Ư Ƚ) + // 통신 준비 검사: 디바이스 응답 확인 시까지 무한 루프 (또는 특정 횟수) while (1) { - readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read Ʈ 0x65 + readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read시 기본값 0x65 if (readVal != 0xFF) { printf("\n[SUCCESS] Device detected! (Current Reg 0x02: 0x%02X)\n", readVal); - break; // ˻ Ż + break; // 통신 성공 시 루프 탈출 } - printf("."); // ˸ ǥ - Sleep(1000); // 1 Ȯ + printf("."); // 통신 중임을 알리는 점 표시 + Sleep(1000); // 1초 대기하며 확인 - // Ⱑ ȴٸ ī͸ Ἥ break + // 통신 상태 확인이 안된다면 횟수를 카운트하여 break } - // + // 디버그 모드 진입 시도 시작 printf("[PROCESS] Attempting to Enter Debug Mode On\n"); do { retryCount++; - // Page01 + // Page01 설정 PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); - // (0x25) + // 디버그 모드 진입 설정 (0x25) PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x02, 0x25); //0x102 - IO_MODECTRL - // Ȯ (Verification) + // 결과값 재 확인 (Verification) Sleep(50); - // о Ȯ + // 값 읽어서 확인 readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); if (readVal == 0x25) { @@ -265,42 +267,42 @@ bool Run_DebugMode_On(FT_HANDLE ftHandle) { bool Run_DebugMode_Off(FT_HANDLE ftHandle) { uint8_t readVal = 0; int retryCount = 0; - const int maxRetries = 100; // ݺ (50ȸ մϴ) + const int maxRetries = 100; // 최대 반복 횟수 (100회로 설정합니다) printf("\n[PROCESS] Checking PMIC Communication..."); - // ˻: (Ǵ Ư Ƚ) + // 통신 준비 검사: 디바이스 응답 확인 시까지 무한 루프 (또는 특정 횟수) while (1) { - readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read Debug On 0x25 + readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); //0x102 - IO_MODECTRL Read시 Debug On일경우 0x25 if (readVal != 0xFF) { printf("\n[SUCCESS] Device detected! (Current Reg 0x02: 0x%02X)\n", readVal); - break; // ˻ Ż + break; // 통신 성공 시 루프 탈출 } - printf("."); // ˸ ǥ - Sleep(1000); // 1 Ȯ + printf("."); // 통신 중임을 알리는 점 표시 + Sleep(1000); // 1초 대기하며 확인 - // Ⱑ ȴٸ ī͸ Ἥ break + // 통신 상태 확인이 안된다면 횟수를 카운트하여 break } - // + // 디버그 모드 해제 시도 시작 printf("[PROCESS] Attempting to Enter Debug Mode Off...\n"); do { retryCount++; - // Page01 + // Page01 설정 PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x00, 0x01); - // (0x65) + // 디버그 모드 해제 설정 (0x65) PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROTECTION, 0x02, 0x65); //0x102 - IO_MODECTRL - // Ȯ (Verification) + // 결과값 재 확인 (Verification) Sleep(50); - // о Ȯ + // 값 읽어서 확인 readVal = PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROTECTION, 0x02); if (readVal == 0x65) { @@ -541,10 +543,77 @@ void Handle_ManualCommand(FT_HANDLE ftHandle, char* line) int command = parseCommand(token); // 1: WRITE, 2: READ if (command == 1 || command == 2) { printf("\n[MANUAL] Executing I2C %s...\n", (command == 1) ? "WRITE" : "READ"); - // ⿡ ۼϼ̴ w/r Ľ ø ˴ϴ. - // : ū ߶ ּҿ ͸ FT4222_I2CMaster_... ȣ + // 여기에 작성하시려는 w/r 파싱 후 실제 명령어에 해당하는 함수를 호출합니다. + // 예: 파싱된 슬레이브 주소와 데이터로 FT4222_I2CMaster_... 호출 } else { 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]); +}