TouchGFX 는 C++ 입니다. 임베디드는 C언어를 메인으로 사용하는 곳이 많기 때문에 TouchGFX (C++) 에서 기존 코드인 C언어의 함수를 콜해야 하는 경우가 많습니다. 

 

쉽게 알 수 있지만 한번 남겨 봅니다. 

C 언어에서 C++ 사용할 수 있게 설정 ]

#ifndef _API_CONSOLE_H_
#define _API_CONSOLE_H_

#ifdef __cplusplus
extern "C" {
#endif

extern tstate API_Display_SetBrightness(u32 u32_brightness);

#ifdef __cplusplus
}
#endif


#endif

TouchGFX C++]

extern "C" {
#include "api_data.h"
}

 

C Function Call]

void Menu_Display1View::setupScreen()
{
    Menu_Display1ViewBase::setupScreen();
    
    API_Display_SetBrightness(50);
}

 

API_Display_SetBrightness 처럼 바로 Call 하여 사용할 수 있습니다. 

 

 

Wildcard 정의 ] 

Use wildcard buffer Check 하여 Wildcard 넣습니다.

 

 

 

 

Wildcard naming]

 

 Wildcard 넣고 Code generation 합니다.

Wildcard ViewBase.hpp 정의 되어 있습니다.

Buffer 네이밍은 nameBuffer, Buffer size NAME_SIZE 정의 됩니다.

 

 

Tickhandler 정의]

 

handleTickEvent virtual 상위 클래스에 정의되어 있어서 상속 받아 정의 해야 합니다.

1 tick 마다 호출 되는 periodic 함수 입니다.

아래처럼 .hpp 정의 합니다.

 

.cpp Unicode::snprintf 등을 이용하여 버퍼에 내용을 넣습니다.

마지막에 invalidate() 화면을 업데이트 시켜줘야 화면이 나옵니다. (중요)

 

 

컴파일 실행하면 value 계속 올라가면서 display 되는 것을 있습니다.

 

 

 

UART 란 ]

Universal Asynchronous Receiver/Transmitter 로 굳이 해석하자면 범용 비동기식 수신기/송신기이다. 

 

 

HW 연결 예시 ]

  • 3 line 이 필요 (TX, RX, GND)
  • TX 는 상대의 RX 에, RX 는 상대의 TX 에 연결하며, GND 레벨을 맞추기 위해 GND 끼리 연결

HW 연결 예시

 

 

Signal ]

Signal 은 Start bit, Data bit, Parity bit, Stop bit 로 구성되어 있습니다. 

1 byte 를 보내는 예시는 아래와 같습니다. 

다만 여기에서 패리티 비트는 사용하지 않는 경우도 많습니다. 

 

 

UART signal 예시

 

 

설정 ]

아래는 Teraterm 의 설정 예시입니다. 포트 번호, 속도, 데이터, 패리티비트, 스탑비트, 흐름제어를 선택할 수 있습니다. 

속도는 bps 라서 만약 115200 을 선택한다면 115200 / 8 = 14400 byte/sec 

이는 약 14 kbytes/sec 입니다. 여기에서 start bit, stop bit 는 연속으로 보낼경우 큰 영향을 끼치지 않지만, Parity bit 를 넣는다면 / 9 를 해주어야 합니다. 

 

 

 

[ 1. WII 준비 ]

1.1 Version 확인 (4.3K)

WII의 버전이 4.3 K 인지 먼저 확인해야 합니다. 다른 버전도 가능하지만, 4.3K 는 만들어 놓은 하드로더가 있기 때문에 수월합니다. 

 

 

1.2 WII 인터넷 접속

무선 액세스 포인트로 인터넷 접속을 설정 합니다. 혹시나 4.3K 가 아니신 분들은 업데이트를 하여 4.3K 로 하시면 되고, 이미 4.3K 이신분들은 업데이트를 하지 않으셔도 됩니다. 추후에 표지 업데이트등에 필요하므로 인터넷접속은 꼭 설정하셔야 합니다. 

접속경로1, 2 아무거나 선택하면 됩니다. 
액세스 포인트를 검색 클릭 (AP)

 

본인의 공유기를 선택하시고 암호를 입력해 주세요.

 

1.3 WII MAC address 기록

LetterBomb 이 MAC address 마다 새롭게 발급이 되어야 합니다. MAC address 를 기록해 둡니다. 

MAC address 는 Wii 설정 -> Wii 본체 설정 -> 인터넷 -> 본체 정보에 있습니다. 

 

[ 2. SD 카드 준비하기 ]

이제 컴퓨터 작업을 해야 합니다. 

 

2.1 하드로더 파일 다운로드

하드로더 파일은 아래 링크를 통해 다운로드 받으세요. 

https://www.dropbox.com/s/nqzg191qibx659i/hardloader.zip?dl=0 

 

hardloader.zip

Dropbox를 통해 공유함

www.dropbox.com

 

 

2.2 MAC 에 맞는 LetterBomb 다운로드

MAC 주소에 맞는 SD 카드에 넣을 파일을 준비해야 합니다. 이 프로그램으로 각각의 wii 에 맞게 해킹을 해줍니다. 

https://please.hackmii.com/

 

아래 순서대로 정보를 입력해 주세요.

4.3K 클릭

MAC Address 넣기

I'm not a robot 클릭

Cut the blue wire 클릭 (Cut the red wire를 클릭해도 무관합니다)

 

LetterBomb 홈페이지

LetterBomb.zip 이 다운로드 됩니다. 

다운로드

LetterBomb.zip 압축을 풀면 여러 파일들이 나옵니다. 이중에서 private 폴더만 사용합니다. 

letterbomb.zip 파일 압축 해제

 

private 폴더를 copy 하여 하드로더 파일에 덮어 씌웁니다. 

 

private 폴더 덮어씌운 하드로더 파일들

 

 

2.3 SD 카드 FAT32 포맷

WII 는 하드로더를 FAT32 포맷으로만 가능합니다. 게임은 NTFS 에 넣어도 말이죠. 

SD 카드를 FAT32 로 포맷합니다. 

SD카드 FAT32 포맷

 

2.4 하드로더 + LetterBomb Copy to SD카드 

하드디스크의 하드로더 + LetterBomb (private) 폴더 복사된 파일들을 FAT32 로 포맷된 SD 카드로 복사 합니다. 

private 폴더 덮어씌운 하드로더 파일들

 

2.5 이제 SD 카드를 WII에 넣고 전원을 킵니다. 

 

[ 3. WII 하드로더 ]

이제 본격적으로 WII 에서 하드로더를 인스톨하고 설정할 차례입니다. 

 

 

3.1 폭탄메일 실행

폭탄메일을 실행 해야 합니다. 폭탄 메일은 위 실행 후 메일 박스에서 날짜를 이리저리 돌아보면 최근 것에 와 있습니다. 

 

메일 버튼 클릭
폭탄 메일 실행

 

폭탄 메일을 실행하면 아래와 같은 화면이 뜹니다. 

1을 눌러 continue 합니다. 

1을 누르면 이제 하드로더의 기본인 Homebrew 를 설치하는 화면으로 이동합니다. 

 

 

3.3 Homebrew 설치

Homebrew 를 설치합니다. 

 

3.3 Install BootMii as IOS

BootMii --> Install BootMii as IOS

 

 

3.4 Install BootMii/IOS now

Install BootMii/IOS now? Yes, continue

 

이후에 

Return to Mainmenu 로 돌아갑니다. 

 

4. Nand 백업

리모컨의 Home 버튼 누르고 Lunch Bootmii  선택 합니다. 

이때는 Wii 의 전원버튼이 이동, Reset 버튼이 선택이 됩니다. 

마지막 설정 아이콘으로 이동 합니다. 

리셋버튼으로 NAND backup 수행 합니다. 

꽤 오래 걸립니다. 

5. WII 에 IOS236 설치 

Homebrew 로 들어가서 IOS236 install 수행 (Load 를 누르시면 됩니다. )

 

 

6 Multi-Mod Manager 에서 WAD 파일들 설치 

3번째 WAD Manager 로 들어갑니다. 

모두 선택 (리모컨의 1번 버튼)

모두 설치 (리모컨의 A 버튼)

21 개의 WAD 파일들이 설치 됩니다. 

HOME 버튼을 눌러서 homebrew 로 빠져 나옵니다. 

7. Prilloader 설치 및 설정

리모컨으로 다음 화면으로 넘어가서 Prilloader 선택 후 Load 를 눌러서 설치합니다. 

+ 와 A 키를 이용하여 설치 합니다. 

홈버튼을 누르고 System 메뉴로 갑니다. 

 

 

Reset 버튼을 2~3초간 꾸욱 누르면 Prilloader 로 들어가집니다. 

 

 

 

꼭 해야 하는 Prilloader 설정 들입니다. 

Region Free Everything

Block disk updates

Region Free GC Games

Region Free Wii Games

Region Free Channels

Auto-Press A at Health Screen

Block Online Updates

 

Save 를 합니다. 

이제 Wii 의 설정이 모두 끝났습니다. 

 

 

8. CFG 로더 실행

바탕화면에서 하드디스크가 돌고 있는게 CFG 로더 입니다. 클릭합니다. 

다운로드 받은 게임들은 USB 의 wbfs 폴더안에 넣고 WII 를 뒤에서 봤을 때 오른쪽 포트에 꼽습니다. 

 

9. 표지 다운로드

이건 해도 되고 안해도 됩니다만 있으면 훨씬 보기 좋아서 하는걸 추천드려요. 

커서를 아래쪽으로 내리면 여러 버튼이 나오구요. 

설정을 클릭합니다. 왼쪽에 모든 커버 다운로드를 클릭합니다. 

인터넷에 접속해서 2D, 3D 등 여러 커버를 다운로드 합니다. 

나중에 보시면 예쁜 표지들이 잘 나오는걸 볼 수 있습니다. 

 

이제 즐기시면 됩니다. 

따라 하시느냐고 고생 많으셨습니다. :) 

 

[ 사용 환경 ]

IAR compiler 8.50.1

디버거 : I-Jet

MCU : ADuCM355

 

[ 이슈 ]

Interrupt Vector Table 위치를 옮기는 icf 파일 변경하는 구현 중 이상이 생겼었습니다. Compile 은 잘되는데, flash download 시  "The flash loader program reported an error" 팝업이 뜨면서 writing 이 안되는 문제. 

 

[ 결론 ]

Option -> Debugger -> Download -> "Use Flash loader(s)" 비활성화 (Uncheck) 

 

이후 download 잘되고, Download된 이후에 다시 Use Flash loader 를 체크해도 재 다운로드 잘됩니다. 

 

정확한 이유는 모르겠는데, Interrupt Vector Table 위치를 옮기는 icf 파일 변경하는 구현 중 이상이 생겼었습니다. 

 

구글링등으로 보아 J-Link 사용시 가끔씩 internal flash 설정이 잘못되면 뜨는것으로 예상됩니다.

<Uncheck "Use flash loader(s) >

 

[ Reference ]

https://ez.analog.com/analog-microcontrollers/ultra-low-power-microcontrollers/f/q-a/19447/error-the-flash-loader-program-reported-an-error

 

Error "The flash loader program reported an error" - Q&A - Ultra Low Power Microcontrollers - EngineerZone

 

ez.analog.com

 

[ 사용 환경 ]

IAR compiler 8.50.1

디버거 : I-Jet

MCU : ADuCM355

 

 

아래 Project option -> Debugger -> Download -> Verify downlaod 옵션 on 합니다.

 

 

 

 

Compile 잘되지만 Writing 시에 아래와 같이 에러와 워닝이 생깁니다.

 

 

디버그 로그는 아래와 같이 메모리를 잘못설정한것으로 나옵니다.

 

하지만 이게 Analog device 사에서 제공한 기본 프로젝트 입니다. 그래도 도움을 받아 .icf 파일을 수정하였습니다.

Warning 하나는 없어졌지만 빨간색 error 그대로 남아 있습니다.

물론 Option 에서 Verifiy download uncheck 하면 오류는 사라집니다. 다만, 브레이크 포인트를 제대로 사용할 수가 없습니다.

 

IAR 사에 문의하니 IDE 프로브의 버전이 맞지 않는 경우에도 위의 에러가 생길수도 있다고 답변을 받았습니다.

또한 에러가 나는 번지인 0x0000001 확인하라고 하였습니다.

 

우연히 Analog device 사의 데모 보드를 사용하면서 프로브(디버거) I-Jet 에서 J-Link 변경하였습니다.

위의 에러와 워닝이 모두 사라졌습니다. 브레이크 포인트도 사라졌습니다.

 

제가 사용한 환경에서는 J-Link 사용을 추천드립니다.

MISRA 보면 #, ## 매크로에서 2번쓰지 말라는 규칙이 있다. 그런지 궁금해서 찾아봤다.

 

 

Rule 요구사항과 Justification 영문은 이렇다.

There shall be at most one occurrence of the # or ## operators in a single macro definition

 

Because the evaluation order of # and ## are not specified, the results of using them both in the same macro could be unpredictable. Therefore macros should contain at most once instance of either # or ##.

 

 

해석해보니

"# ## 연산 순서가 지정되어 있지 않기 때문에 동일한 매크로에서 둘다 사용하는 경우에 결과를 정확히 예측할 없기 때문에 # 또는 ## 한번만 포함해야 한다 " 뜻이다.

 

 

[ 오류가 예상되는 예시 ]

#define NonCompliant(a, b)  # a ## b
int main() {
  std::cout << NonCompliant(Hello, World);
}

 

 

코드에서 컴파일러가 2가지 경우를 내보낼 있다.

  1. ## 먼저 연산할 경우 : HelloWorld
  1. # 먼저 연산할 경우 : *Hello "World *

나올 있다.

 

 

[ 규칙을 지킨 예시 ]

 

#define Stringfy(a) #a
#define Compliant(a, b)  Stringfy(a##b)

int main(){
  std::cout << Compliant(Hello, World);
}

 

이 경우에 정확히 HelloWorld 가 프린트 된다

 

[ Reference ]

 

MISRA C 2012, Rule 20.11

MISRA C 2004, Rule 19.12

1. Google 사이트 접속 (www.google.com)

 

2. 설정

 

3. 검색설정 --> 검색결과 여는 창 

 

 

 

+ Recent posts