PMIC Tool 경로 정리

This commit is contained in:
2026-01-16 11:29:55 +09:00
parent d0b4af0a92
commit 9cc338c122
8 changed files with 384 additions and 328 deletions

View File

@@ -9,12 +9,394 @@
//Sleep(1); // 1ms 딜레이 //Sleep(1); // 1ms 딜레이
//Sleep(10); // 10ms 딜레이 //Sleep(10); // 10ms 딜레이
//Sleep(100); // 100ms 딜레이 //Sleep(100); // 100ms 딜레이
//Sleep(1000); // 1s 딜레이
//Sleep(10000); // 10s 딜레이
// FT4222 헤더 // FT4222 헤더
#include "ftd2xx.h" #include "ftd2xx.h"
#include "LibFT4222.h" #include "LibFT4222.h"
uint8_t PMIC_I2C_SLAVE_ADDR = 0x55; // PMIC Register Map
#include "PMIC_Reg_Map.h"
// Function Prototypes
void currentTime(char* buf, size_t len);
void logPacket(const char* dir, uint8_t* data, int size, int hasCrc);
uint8_t calcCRC8(uint8_t addrWithRw, uint8_t* data, int len);
int parseCommand(const char* dir);
void PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value);
void PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr);
int main()
{
// 1. DLL 탐색 경로에 하위 폴더 'dll' 추가
// 이 설정은 이 함수 호출 이후에 로드되는 모든 DLL에 적용됩니다.
if (!SetDllDirectoryA("./dll")) {
printf("DLL 경로 설정 실패 (에러 코드: %lu)\n", GetLastError());
return -1;
}
printf("PMIC I2C Packet Logger with FT4222\n \n");
char addrInput[16];
unsigned int tempAddr = 0;
uint8_t I2C_SLAVE_ADDR = 0;
unsigned long log_counter = 0;
char timeStr[16]; // 시간을 저장할 버퍼 (HH:MM:SS면 9바이트면 충분)
currentTime(timeStr, sizeof(timeStr));
//printf("현재 시간: %s\n", timeStr);
#if 0
printf("I2C Address\n Regulation Register is 0x54\n Protection Register is 0x55\n \nEnter 7-bit I2C Slave Address (hex): ");
if (scanf_s("%15s", addrInput, (unsigned)_countof(addrInput)) != 1) {
printf("입력 오류\n");
return -1;
}
if (sscanf_s(addrInput, "%x", &tempAddr) != 1) {
printf("잘못된 주소 입력\n");
return -1;
}
I2C_SLAVE_ADDR = (uint8_t)tempAddr;
printf("슬레이브 주소 설정됨: 0x%02X\n", I2C_SLAVE_ADDR);
getchar(); // 버퍼 클리어
printf("사용법: I2C_WRITE <data...> 또는 w <data...>\n");
printf(" I2C_READ (항상 2바이트 읽음) 또는 r\n");
printf("exit 또틑 e 입력 시 종료\n");
#endif
printf("Read Regulation 0x54, Page 0x02, Address 0x23 : 0x66 이면 OK\n ");
FT_HANDLE ftHandle = NULL;
FT_STATUS ftStatus;
DWORD numDevs = 0;
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus != FT_OK || numDevs == 0) {
printf("FT4222 장치를 찾을 수 없습니다.\n");
return -1;
}
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK) {
printf("FT4222 장치 열기 실패\n");
return -1;
}
FT4222_STATUS ft4222Status = FT4222_I2CMaster_Init(ftHandle, 400); // 400kHz
if (ft4222Status != FT4222_OK) {
printf("I2C Master 초기화 실패\n");
FT_Close(ftHandle);
return -1;
}
/* Fault register data: Protection Register, Address 0x010 ~0x014, 0x019 ~0x021
0x010 - FUSA_STATUS_1
0x011 - FUSA_STATUS_2
0x012 - FUSA_STATUS_2A
0x013 - FUSA_STATUS_3
0x014 - FUSA_STATUS_4
0x019 - FLT_RECORD_A
0x01A - FLT_RECORD_B
0x01B - FLT_RECORD_GND_AVIN
0x01C - FLT_RECORD_BG_Temp
0x01D - FLT_RECORD_IntLDOs
0x01E - FLT_RECORD_ExtLDOs
0x01F - FLT_RECORD_BUCKS_B
0x020 - FLT_RECORD_BUCKS_A
0x021 - FLT_RECORD_ExtINPs_7_0
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x10); //0x010 - FUSA_STATUS_1
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x11); //0x011 - FUSA_STATUS_2
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x12); //0x012 - FUSA_STATUS_2A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x13); //0x013 - FUSA_STATUS_3
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x14); //0x014 - FUSA_STATUS_4
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x19); //0x019 - FLT_RECORD_A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1A); //0x01A - FLT_RECORD_B
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1B); //0x01B - FLT_RECORD_GND_AVIN
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1C); //0x01C - FLT_RECORD_BG_Temp
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1D); //0x01D - FLT_RECORD_IntLDOs
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1E); //0x01E - FLT_RECORD_ExtLDOs
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1F); //0x01F - FLT_RECORD_BUCKS_B
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x20); //0x01E - FLT_RECORD_BUCKS_A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x21); //0x01F - FLT_RECORD_ExtINPs_7_0
*/
//printf("=================================================================================\n");
/********************************************************************************************
I2C Write
PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value)
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0xAA, 0xBB);
********************************************************************************************/
//printf("=================================================================================\n");
/********************************************************************************************
I2C Read
PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0xAA);
********************************************************************************************/
//for (int i = 0; i < 10000000; i++) {
//while (1) {
//}
//for (int i = 0; i < 10000000; i++) {
//while (log_counter < 10 ){
// 예: 10번 while에 한 번만 실행
//if (log_counter % 10 == 0) {
// 30ms 딜레이
//Sleep(30);
printf("실행하려면 Enter 키를 누르세요...\n");
getchar();
//Regulation Register
// Page00
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x00);
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x00);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x00); //0x000 - IO_PAGE_REGU
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x01); //0x001 - IO_CHIPNAME_REGU
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x02); //0x002 - IO_CHIPVERSION_REGU
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x03); //0x003 - IO_DIEID3_REGU
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x04); //0x004
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x05); //0x005
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x02);
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x02);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x23);
// 30ms 딜레이
//Sleep(30);
// Page02
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x02);
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x02);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x20);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x21);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x22); //0x222 - I_OTP_VERSION
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x23); //0x223 - I_OTP_INTERNALVERSION
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x24);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x25);
// 30ms 딜레이
//Sleep(30);
//Protection Register
// Read FLT Register
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x10); //0x010 - FUSA_STATUS_1
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x11); //0x011 - FUSA_STATUS_2
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x12); //0x012 - FUSA_STATUS_2A
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x13); //0x013 - FUSA_STATUS_3
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x14); //0x014 - FUSA_STATUS_4
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x19); //0x019 - FLT_RECORD_A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1A); //0x01A - FLT_RECORD_B
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1B); //0x01B - FLT_RECORD_GND_AVIN
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1C); //0x01C - FLT_RECORD_BG_Temp
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1D); //0x01D - FLT_RECORD_IntLDOs
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1E); //0x01E - FLT_RECORD_ExtLDOs
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1F); //0x01F - FLT_RECORD_BUCKS_B
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x20); //0x01E - FLT_RECORD_BUCKS_A
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x21); //0x01F - FLT_RECORD_ExtINPs_7_0
// PMIC Debug Mode
// Page01
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROT, 0x00, 0x01);
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROT, 0x00, 0x01);
//PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x02); //0x102 - IO_MODECTRL Read시 디폴트 0x65
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROT, 0x02, 0x25); //0x102 - IO_MODECTRL
// 10s 딜레이
//Sleep(10000);
//PMIC_I2C_Write(ftHandle, PMIC_ADDR_PROT, 0x02, 0x65); //0x102 - IO_MODECTRL
//}
//log_counter++;
//}
#if 0
//Regulation Register
printf("[Page-0]=================================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x00);
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x00);
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x00); //0x000 - IO_PAGE_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x01); //0x001 - IO_CHIPNAME_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x02); //0x002 - IO_CHIPVERSION_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x03); //0x003 - IO_DIEID3_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x04); //0x004 - IO_DIEID2_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x05); //0x005 - IO_DIEID1_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x06); //0x006 - IO_DIEID0_REGU
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x0A); //0x00A - OTP_VERSION_REGU
//Fault register data: Protection Register, Address 0x010 ~0x014, 0x019 ~0x021
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x10); //0x010 - FUSA_STATUS_1
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x11); //0x011 - FUSA_STATUS_2
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x12); //0x012 - FUSA_STATUS_2A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x13); //0x013 - FUSA_STATUS_3
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x14); //0x014 - FUSA_STATUS_4
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x19); //0x019 - FLT_RECORD_A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1A); //0x01A - FLT_RECORD_B
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1B); //0x01B - FLT_RECORD_GND_AVIN
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1C); //0x01C - FLT_RECORD_BG_Temp
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1D); //0x01D - FLT_RECORD_IntLDOs
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1E); //0x01E - FLT_RECORD_ExtLDOs
PMIC_I2C_Read(ftHandle, PMIC_ADDR_PROT, 0x1F); //0x01F - FLT_RECORD_BUCKS_B
printf("[Page-1]=================================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x01);
printf("[Page-2]=================================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x02);
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x02);
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x20); //0x020 - FLT_RECORD_BUCKS_A
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x21); //0x021 - FLT_RECORD_ExtINPs_7_0
printf("[PMIC_RAA271005_INIT]====================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, PMIC_ADDR_REGU, 0x00, 0x01);
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x07); //0x107 - WDT_CFG0 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x08); //0x108 - WDT_CFG1 (OTP) //WDT_ULCNT, WDT_LLCNT
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x09); //0x109 - WDT_CFG2 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x16); //0x116 - FUSA_TIMER_1 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x17); //0x117 - FUSA_TIMER_2 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_ADDR_REGU, 0x2C); //0x12C - FLT_MASK_B (OTP)
//Protection Register
#endif
char line[256];
while (1) {
printf("> ");
if (!fgets(line, sizeof(line), stdin)) break;
line[strcspn(line, "\r\n")] = 0; // 개행 제거
if (strcmp(line, "exit") == 0) break;
if (strcmp(line, "e") == 0) break;
if (strlen(line) == 0) continue;
char* context = NULL;
char* token = strtok_s(line, " ", &context);
if (!token) continue;
for (char* p = token; *p; p++) *p = toupper(*p);
int command = parseCommand(token);
if (command == 1) { // I2C_WRITE
uint8_t bytes[256];
int len = 0;
while ((token = strtok_s(NULL, " ", &context)) != NULL) {
unsigned int val;
if (sscanf_s(token, "%x", &val) == 1) {
bytes[len++] = (uint8_t)val;
}
else {
printf("잘못된 HEX 값: %s\n", token);
}
}
if (len == 0) {
printf("전송할 데이터가 없습니다.\n");
continue;
}
uint8_t addrWithRw = (I2C_SLAVE_ADDR << 1) | 0x00;
uint8_t crc = calcCRC8(addrWithRw, bytes, len);
bytes[len++] = crc;
uint16 transferred = 0;
ft4222Status = FT4222_I2CMaster_Write(ftHandle,
I2C_SLAVE_ADDR,
bytes,
(uint16)len,
&transferred);
if (ft4222Status != FT4222_OK) {
printf("I2C Write 실패\n");
}
else {
logPacket("I2C_WRITE", bytes, len, 1);
}
}
else if (command == 2) { // I2C_READ
uint8_t bytes[256];
uint16 transferred = 0;
FT4222_STATUS st;
int len = 0;
while ((token = strtok_s(NULL, " ", &context)) != NULL) {
unsigned int val;
if (sscanf_s(token, "%x", &val) == 1) {
bytes[len++] = (uint8_t)val;
}
else {
printf("잘못된 HEX 값: %s\n", token);
}
}
if (len == 0) {
printf("전송할 데이터가 없습니다.\n");
continue;
}
uint8_t addrWithRw = (I2C_SLAVE_ADDR << 1) | 0x00;
uint8_t crc = calcCRC8(addrWithRw, bytes, len);
bytes[len++] = crc;
st = FT4222_I2CMaster_Write(ftHandle,
I2C_SLAVE_ADDR,
bytes,
(uint16)len,
&transferred);
if (st != FT4222_OK) {
printf("Read용 Address Write 실패\n");
return 0;
}
// 🔹 Register Address에서 2바이트 Read (Value + CRC)
uint8_t rx[2] = { 0 };
st = FT4222_I2CMaster_Read(ftHandle,
I2C_SLAVE_ADDR,
rx,
2,
&transferred);
if (st != FT4222_OK) {
printf("I2C Read 실패\n");
return 0;
}
else {
printf("Read 결과: [Address = 0x%02X], [Value = 0x%02X], [CRC = 0x%02X]\n",
bytes[0], rx[0], rx[1]);
}
}
else {
printf("첫 단어는 I2C_WRITE(w) 또는 I2C_READ(r) 여야 합니다.\n");
}
}
FT_Close(ftHandle);
return 0;
}
// 현재 시간을 "HH:MM:SS" 형식으로 buf에 저장 // 현재 시간을 "HH:MM:SS" 형식으로 buf에 저장
void currentTime(char* buf, size_t len) void currentTime(char* buf, size_t len)
@@ -202,330 +584,4 @@ void PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
printf("Read 결과: [Address = 0x%02X], [Value = 0x%02X], [CRC = 0x%02X]\n", printf("Read 결과: [Address = 0x%02X], [Value = 0x%02X], [CRC = 0x%02X]\n",
regAddr, rx[0], rx[1]); regAddr, rx[0], rx[1]);
} }
} }
int main()
{
printf("PMIC I2C Packet Logger with FT4222\n \n");
char addrInput[16];
unsigned int tempAddr = 0;
uint8_t I2C_SLAVE_ADDR = 0;
unsigned long log_counter = 0;
char timeStr[16]; // 시간을 저장할 버퍼 (HH:MM:SS면 9바이트면 충분)
currentTime(timeStr, sizeof(timeStr));
//printf("현재 시간: %s\n", timeStr);
#if 0
printf("I2C Address\n Regulation Register is 0x54\n Protection Register is 0x55\n \nEnter 7-bit I2C Slave Address (hex): ");
if (scanf_s("%15s", addrInput, (unsigned)_countof(addrInput)) != 1) {
printf("입력 오류\n");
return -1;
}
if (sscanf_s(addrInput, "%x", &tempAddr) != 1) {
printf("잘못된 주소 입력\n");
return -1;
}
I2C_SLAVE_ADDR = (uint8_t)tempAddr;
printf("슬레이브 주소 설정됨: 0x%02X\n", I2C_SLAVE_ADDR);
getchar(); // 버퍼 클리어
printf("사용법: I2C_WRITE <data...> 또는 w <data...>\n");
printf(" I2C_READ (항상 2바이트 읽음) 또는 r\n");
printf("exit 또틑 e 입력 시 종료\n");
#endif
printf("Read Regulation 0x54, Page 0x02, Address 0x23 : 0x66 이면 OK\n ");
FT_HANDLE ftHandle = NULL;
FT_STATUS ftStatus;
DWORD numDevs = 0;
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus != FT_OK || numDevs == 0) {
printf("FT4222 장치를 찾을 수 없습니다.\n");
return -1;
}
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK) {
printf("FT4222 장치 열기 실패\n");
return -1;
}
FT4222_STATUS ft4222Status = FT4222_I2CMaster_Init(ftHandle, 400); // 400kHz
if (ft4222Status != FT4222_OK) {
printf("I2C Master 초기화 실패\n");
FT_Close(ftHandle);
return -1;
}
//Fault register data: 0x010 ~0x014, 0x019 ~0x021
//0x010 - FUSA_STATUS_1
//0x011 - FUSA_STATUS_2
//0x012 - FUSA_STATUS_2A
//0x013 - FUSA_STATUS_3
//0x014 - FUSA_STATUS_4
//0x019 - FLT_RECORD_A
//0x01A - FLT_RECORD_B
//0x01B - FLT_RECORD_GND_AVIN
//0x01C - FLT_RECORD_BG_Temp
//0x01D - FLT_RECORD_IntLDOs
//0x01E - FLT_RECORD_ExtLDOs
//0x01F - FLT_RECORD_BUCKS_B
//0x020 - FLT_RECORD_BUCKS_A
//0x021 - FLT_RECORD_ExtINPs_7_0
//printf("=================================================================================\n");
/********************************************************************************************
I2C Write
PMIC_I2C_Write(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr, uint8_t value)
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0xAA, 0xBB);
********************************************************************************************/
//printf("=================================================================================\n");
/********************************************************************************************
I2C Read
PMIC_I2C_Read(FT_HANDLE ftHandle, uint8_t slaveAddr, uint8_t regAddr)
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0xAA);
********************************************************************************************/
//for (int i = 0; i < 10000000; i++) {
//while (1) {
//}
//for (int i = 0; i < 10000000; i++) {
//while (log_counter < 10 ){
// 예: 10번 while에 한 번만 실행
//if (log_counter % 10 == 0) {
// 30ms 딜레이
//Sleep(30);
printf("실행하려면 Enter 키를 누르세요...\n");
getchar();
//Regulation Register
// Page00
PMIC_I2C_Write(ftHandle, 0x54, 0x00, 0x00);
PMIC_I2C_Write(ftHandle, 0x54, 0x00, 0x00);
PMIC_I2C_Read(ftHandle, 0x54, 0x00); //0x000 - IO_PAGE_REGU
PMIC_I2C_Read(ftHandle, 0x54, 0x01); //0x001 - IO_CHIPNAME_REGU
PMIC_I2C_Read(ftHandle, 0x54, 0x02); //0x002 - IO_CHIPVERSION_REGU
PMIC_I2C_Read(ftHandle, 0x54, 0x03); //0x003 - IO_DIEID3_REGU
//PMIC_I2C_Read(ftHandle, 0x54, 0x04); //0x004
//PMIC_I2C_Read(ftHandle, 0x54, 0x05); //0x005
//PMIC_I2C_Write(ftHandle, 0x54, 0x00, 0x02);
//PMIC_I2C_Write(ftHandle, 0x54, 0x00, 0x02);
//PMIC_I2C_Read(ftHandle, 0x54, 0x23);
// 30ms 딜레이
//Sleep(30);
// Page02
PMIC_I2C_Write(ftHandle, 0x54, 0x00, 0x02);
PMIC_I2C_Write(ftHandle, 0x54, 0x00, 0x02);
//PMIC_I2C_Read(ftHandle, 0x54, 0x20);
//PMIC_I2C_Read(ftHandle, 0x54, 0x21);
PMIC_I2C_Read(ftHandle, 0x54, 0x22); //0x222 - I_OTP_VERSION
PMIC_I2C_Read(ftHandle, 0x54, 0x23); //0x223 - I_OTP_INTERNALVERSION
//PMIC_I2C_Read(ftHandle, 0x54, 0x24);
//PMIC_I2C_Read(ftHandle, 0x54, 0x25);
// 30ms 딜레이
//Sleep(30);
//Protection Register
// Page01
PMIC_I2C_Write(ftHandle, 0x55, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, 0x55, 0x00, 0x01);
PMIC_I2C_Read(ftHandle, 0x55, 0x02); //0x102 - IO_MODECTRL Read시 디폴트 0x65
PMIC_I2C_Write(ftHandle, 0x55, 0x02, 0x25); //0x102 - IO_MODECTRL
// 10s 딜레이
Sleep(10000);
PMIC_I2C_Write(ftHandle, 0x55, 0x02, 0x65); //0x102 - IO_MODECTRL
//}
//log_counter++;
//}
#if 0
//Protection Register
//Regulation Register
printf("[Page-0]=================================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x00);
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x00);
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00); //0x000 - IO_PAGE_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x01); //0x001 - IO_CHIPNAME_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x02); //0x002 - IO_CHIPVERSION_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x03); //0x003 - IO_DIEID3_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x04); //0x004 - IO_DIEID2_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x05); //0x005 - IO_DIEID1_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x06); //0x006 - IO_DIEID0_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x0A); //0x00A - OTP_VERSION_REGU
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x10); //0x010 - FUSA_STATUS_1
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x11); //0x011 - FUSA_STATUS_2
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x12); //0x012 - FUSA_STATUS_2A
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x13); //0x013 - FUSA_STATUS_3
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x14); //0x014 - FUSA_STATUS_4
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x19); //0x019 - FLT_RECORD_A
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x1A); //0x01A - FLT_RECORD_B
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x1B); //0x01B - FLT_RECORD_GND_AVIN
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x1C); //0x01C - FLT_RECORD_BG_Temp
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x1D); //0x01D - FLT_RECORD_IntLDOs
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x1E); //0x01E - FLT_RECORD_ExtLDOs
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x1F); //0x01F - FLT_RECORD_BUCKS_B
printf("[Page-1]=================================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x01);
printf("[Page-2]=================================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x02);
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x02);
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x20); //0x020 - FLT_RECORD_BUCKS_A
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x21); //0x021 - FLT_RECORD_ExtINPs_7_0
printf("[PMIC_RAA271005_INIT]====================================================================\n");
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x01);
PMIC_I2C_Write(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x00, 0x01);
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x07); //0x107 - WDT_CFG0 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x08); //0x108 - WDT_CFG1 (OTP) //WDT_ULCNT, WDT_LLCNT
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x09); //0x109 - WDT_CFG2 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x16); //0x116 - FUSA_TIMER_1 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x17); //0x117 - FUSA_TIMER_2 (OTP)
PMIC_I2C_Read(ftHandle, PMIC_I2C_SLAVE_ADDR, 0x2C); //0x12C - FLT_MASK_B (OTP)
#endif
char line[256];
while (1) {
printf("> ");
if (!fgets(line, sizeof(line), stdin)) break;
line[strcspn(line, "\r\n")] = 0; // 개행 제거
if (strcmp(line, "exit") == 0) break;
if (strcmp(line, "e") == 0) break;
if (strlen(line) == 0) continue;
char* context = NULL;
char* token = strtok_s(line, " ", &context);
if (!token) continue;
for (char* p = token; *p; p++) *p = toupper(*p);
int command = parseCommand(token);
if (command == 1) { // I2C_WRITE
uint8_t bytes[256];
int len = 0;
while ((token = strtok_s(NULL, " ", &context)) != NULL) {
unsigned int val;
if (sscanf_s(token, "%x", &val) == 1) {
bytes[len++] = (uint8_t)val;
}
else {
printf("잘못된 HEX 값: %s\n", token);
}
}
if (len == 0) {
printf("전송할 데이터가 없습니다.\n");
continue;
}
uint8_t addrWithRw = (I2C_SLAVE_ADDR << 1) | 0x00;
uint8_t crc = calcCRC8(addrWithRw, bytes, len);
bytes[len++] = crc;
uint16 transferred = 0;
ft4222Status = FT4222_I2CMaster_Write(ftHandle,
I2C_SLAVE_ADDR,
bytes,
(uint16)len,
&transferred);
if (ft4222Status != FT4222_OK) {
printf("I2C Write 실패\n");
}
else {
logPacket("I2C_WRITE", bytes, len, 1);
}
}
else if (command == 2) { // I2C_READ
uint8_t bytes[256];
uint16 transferred = 0;
FT4222_STATUS st;
int len = 0;
while ((token = strtok_s(NULL, " ", &context)) != NULL) {
unsigned int val;
if (sscanf_s(token, "%x", &val) == 1) {
bytes[len++] = (uint8_t)val;
}
else {
printf("잘못된 HEX 값: %s\n", token);
}
}
if (len == 0) {
printf("전송할 데이터가 없습니다.\n");
continue;
}
uint8_t addrWithRw = (I2C_SLAVE_ADDR << 1) | 0x00;
uint8_t crc = calcCRC8(addrWithRw, bytes, len);
bytes[len++] = crc;
st = FT4222_I2CMaster_Write(ftHandle,
I2C_SLAVE_ADDR,
bytes,
(uint16)len,
&transferred);
if (st != FT4222_OK) {
printf("Read용 Address Write 실패\n");
return 0;
}
// 🔹 Register Address에서 2바이트 Read (Value + CRC)
uint8_t rx[2] = { 0 };
st = FT4222_I2CMaster_Read(ftHandle,
I2C_SLAVE_ADDR,
rx,
2,
&transferred);
if (st != FT4222_OK) {
printf("I2C Read 실패\n");
return 0;
}
else {
printf("Read 결과: [Address = 0x%02X], [Value = 0x%02X], [CRC = 0x%02X]\n",
bytes[0], rx[0], rx[1]);
}
}
else {
printf("첫 단어는 I2C_WRITE(w) 또는 I2C_READ(r) 여야 합니다.\n");
}
}
FT_Close(ftHandle);
return 0;
}