I don't know when to quit! But I know when do I quit!

Diy -자작

리버스 엔지니어링을 하는 과정들... 2/n

dudals_jung 2023. 1. 21. 10:35

리버스 엔지니어링 대상 제품은 바로...

https://www.clien.net/service/board/use/16440744

사진 왼쪽의 이쁘장하게 생긴 차량용 그래픽 LCD OBD2 속도계입니다.

 

왜 하려고 하느냐?

첫번째 문제는

이 제품은 OBD2 단자에서 전원과 통신을 받아옵니다.

OBD2 단자는 12v 상시 전원이 연결되어 있습니다.

즉 시동을 꺼도 제품은 켜져 있습니다. 배터리 방전의 원인이 되죠.

그래서 이 제품은 이런 방식으로 배터리 방전을 보호합니다.

차량 RPM 신호와 속도가 0이면 차량이 주차되어 시동을 끈 상태로 인식을 하고 제품이 꺼집니다.

일반 내연기관 차량에서는 뭐 괜찮은 방법입니다.

근데 하이브리드 차량에서는 배터리 운행 중 신호에 걸려 주차를 하게 되는 상황에서 시동이 꺼진 것으로 인식을 하고 그냥 꺼진다는거죠.

 

두번째 문제는

그러면 시동을 걸면, 또는 RPM 과 속도가 움직이면 켜지느냐?

그것도 아니라는거죠.

옆에 스위치를 조작해서 켜줘야 합니다.

 

아~ 불편합니다.

 

그래서 뜯어봅니다.

원형 디스플레이쪽 보드와 아래 통신 및 전원 보드로 나뉘어져 있습니다.

 

 

 

디스플레이쪽 보드

CPU는 STM32429ITG 를 사용하고 QSPI Flash 와 SDRAM으로 확장을 했습니다.

원형 디스플레이를 동작을 시키고요.

 

여기서 1차 분석..

STM32 에 QSPI 와 SDRAM 를 확장시켜 LCD 를 동작시키는 것으로 봐서 사용된 GUI 라이브러리는 TouchGFX 를 사용한 것같습닏.

TouchGFX  는 상용 라이브러리지만 ST에서 인수해서 자기네들 칩 사용시에는 무료로 사용 할 수 있도록 풀었습니다.

이 라이브러리의 문제는 모든게 이미지라는 겁니다. 이미지 처리기 때문에 이쁘기는하지만 용량이 문제입니다.

버튼도, 글자도.. 같은 버튼 이미지에 OK, YES, CANCLE등이 적힌 버튼이 필요하다면 1개의 버튼당 4개씩 총 12개의 이미지가 필요합니다.

정상, 눌렀을 때, 비활성화시등등과 OK, YES, Cancel 등등.

그래서 확장 메모리를 필수로 합니다.

LCD 쪽 동작을 시키기 위한 LTDC 에 램 확장도 필요하기도 합니다.

 

 

원형 LCD 데이터시트입니다.

겨우 저거 하나만 구했습니다. 핀맵도 블러 처리가 되어 있습니다.

최소 300개 이상시만 구매가 가능하다고 하네요.

 

디스플레이 보드에는 전원과 통신선만 있습니다.

STM32가 사용하는 3.3v 레귤레이터가 없는 것으로 보아 아래 보드에서 12v -> 3.3v 로 변환 후 그냥 제공만 하네요.

통신은 일반 시리얼 통신이 STM32에 그대로 물려 있습니다.

 

그러면 통신은 2가지 방식 중에 하나로 보여집니다.

디스플레이 보드가 CAN 관련 PID(OBD2 명령)를 요청해서 전달받거나 아래 보드에서 다 처리 후 전달하는 방식이거나..

이건 통신을 찍어봐야겠죠.

 

LCD 핀맵이나 타이밍은 로직 아날라이져를 이용하거나 해상도 기준 (480*480)으로 대략 산출을 해도 되겠지만..

개인적으로 TouchGFX 사용 하는 것을 별로 좋아하지 않습니다.

더구나 개발을 위한 Jtag 이나 swd 단자가 나와있지 않습니다.

아마 FW 다운로드 지그를 이용해서 생산을 하지 않았을까 합니다.

 

그리고 개발자가 화면 디자인하면... 촌스러움의 극치를 달리지요.

 

그래서 디스플레이 보드 FW 손을 보는 것은 안 할렵니다.

 

제가 원하는 것은 2가지입니다.

RPM과 속도가 0이라도 꺼지지 않는 것.

시동을 켜면 자동으로 켜지는 것.

제품 자체가 시계 기능과 속도에 대한 보정비등을 저장을 하도록 되어 있습니다.

현재 니로 하이브리드의 경우 속도 데이터에 1.08을 해야 계기판 속도가 나옵니다.

근데 전원 리셋을 하면 초기화 됩니다. 별도로 i2c 메모리 등이 없어서요.

디스플레이 보드는 전원 선만 연결이 되어 있기 때문에 

RTC 시간과 몇가지 설정 정보는 아래 통신 보드 쪽에서 저장을 하고 있는 것으로 보입니다.

아래는 상시 정원으로 동작 중인 상태이니까요.

그래서 이 부분도 포인트 중에 하나입니다.

 

이것을 구현하기 위한 방법들은 이런게 있습니다.

1. 디스플레이보드와 통신 보드 FW를 모두 교체하는 방법 

아마도 통신 보드만 FW를 교체를 해도 될 듯 하기는 합니다. 전원 제어를 통신 보드에서 하는 것으로 보이니까요.

 

2. OBD 컨버터를 만들어서 차에서 RPM 속도가 0으로 응답하는 것을 1로 응답을 하는 것처럼 조작을 해서 전달하는 겁니다.

그러면 정차 중에 꺼지지는 않겠죠.

대신 시동을 켰을 때 켜는 동작은 안됩니다.

 

3. 통신 보드를 대체하는 보드를 만드는 겁니다.

전원과 OBD 통신을 처리하는거죠.

이렇게 하려면 통신 보드와 디스플레이 보드의 시리얼 통신을 분석해서 그대로 구현을 해야겠죠.

 

아무래도 제가 원하는 2가지 개선 사항을 위해서는 저 3번이 가장 나아 보입니다.

 

이제 제가 할 것은 통신 보드의 시리얼 통신과 OBD 통신 간의 관계성에 대한 분석을 진행해야 합니다.

남는 CPU 보드나 부품을 사용할 예정이라 저 제품의 통신 보드쪽에 들어갈 크기가 나오지는 않겠지만.. 그래도 원하는 결과물은 나오겠죠.

 

통신 관련해서 분석하는 방법과 내용들은 다음 편에 적어 보겠습니다.