기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
리눅스 말고
그냥 bare-metal 코드로요. 보드는 exynos4412에요.
지금 u-boot에서 리눅스 대신 main()만 만들어두고 그리로 PC값 점프시켜서 printf 출력되게 해놨거든요.
MMU설정은 u-boot의 설정을 그대로 쓰고 있어요.
ARM공식 싸이트 예제 보면 bare-metal code로 secondary cpu를 WFI 걸어두고 CPU0가 main()에서
send_sgi로 깨우더라구여. 그런데 u-boot는 secondary cpu들을 부팅시킨 후
lowlevel_init.S 파일의 "nscode_base"로 오게해서 WFE를 걸어두네요.
그런데 ARM 문서를 보면 리셋시에는 모든 코어가 0번지 부터 fetch를 시작하는 것으로 나오고 예제를 봐도 HW reset이 되면 일단 모든 코어가 reset벡터부터 실행되다가 cpu id를 읽고나서 자신이
secondary면 WFI를 걸고 대기하도록 되어 있는데요.
그래서 일단 secondary core가 살아났는지 확인하려고 u-boot에서 secondary가 WFE를 거는 인스트럭션 실행하기 바로 전에 보드의 LED를 off하는 코드를 심어봤는데 LED반응이 없네요. 이부분에 전역변수 넣고 +1 하게 한 뒤 u-boot 프롬포트가 떴을 때 내장 명령어 추가로 해당 변수값 출력해봐도 system.map상의 변수 주소는 일치하는데 값은 0이에요.
---------------------
ldr r1,=0x11400080
mov r2,#0x3
str r2,[r1]
WFE
---------------------
linux 의 boot_secondary 함수를 보면
198 #ifdef CONFIG_ARM_TRUSTZONE
199 if (soc_is_exynos4412())
200 exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
ldr r1, =START_ADDR
@exynos는 다른 코어들이 iRom에서 Exception Entry 값을 받을때 까지 루프로 돌고 있었던걸로 기억합니다.
ldr r0, =V_ADDR
@Exception Entry 넣어 주시면 됩니다. 값을 넣어주면 분기 해서 실행 될껍니다.
STR r0, [r1]
SEV