기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

리눅스 말고 


그냥 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를 걸어두네요. 

https://github.com/hardkernel/u-boot/blob/odroid-v2012.07/board/samsung/smdk4x12/lowlevel_init.S#L306


그런데 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);

와 같이 HW적인 리셋을 다시 하도록 되어 있는 것 같은데
그럼 u-boot에서는 처음 부팅됐을 때 secondary는 어디서 뭐하고 있는 걸까요.

ARM example은 전원이 인가되면 4코어 모두 동작을 시작해서 cpu id 확인하는 부분부터 서로 다른 부분으로
분기하도록 되어 있는데,

u-boot의 WFE호출 직전에  코드를 넣어보면 아무 반응이 없고. 

리눅스 없이 secondary 코어 깨우는법 조금이라도 아시는분 힌트 부탁드려요.

유희재

2014.09.10 21:07:56
*.32.72.57

 ldr  r1, =START_ADDR  

@exynos는 다른 코어들이 iRom에서 Exception Entry 값을 받을때 까지 루프로 돌고 있었던걸로 기억합니다.

ldr  r0, =V_ADDR  

@Exception Entry 넣어 주시면 됩니다. 값을 넣어주면 분기 해서 실행 될껍니다.

 STR  r0, [r1]
 SEV


List of Articles
번호 제목 글쓴이 날짜 조회 수

사용자 로그인