기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
linux/arch/arm/mach-at91/ 폴더에 있는 board-sam9m10g45ek.c 파일은 무엇에 쓰이는 함수들인가요?
제가 이 위치에 있는 board-sam9m10g45ek.c 를 함 살펴보니..
왠지 펌웨어 하던 시절에 제가 짰던 시작 코드 부분인듯해서요...왠지 죽 흘터보니..보드의 설정등에 쓰이는 함수들의
모임인듯 한데요...여기에 있는 함수들이 보드 셋업 부분이 맞나요?
그리고 만약 셋업 부분이라면 이 함수들을 어딘가에서는 사용해야 할 텐데 어디서 어떤 함수에서 사용되는 것인가요?
* 잘못된 내용이 포함되었을 수 있습니다. 참고만 하세요.
살펴보신 바와 같이 해당 보드에 대한 설정(레지스터 세팅 등)을 해주는 부분입니다.
호출과정의 실마리를 찾기 위해서는 파일 가장 아래의 다음 부분을 보셔야 합니다.
MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")
/* Maintainer: Atmel */
.timer = &at91sam926x_timer,
.map_io = at91_map_io,
.init_early = ek_init_early,
.init_irq = at91_init_irq_default,
.init_machine = ek_board_init,
MACHINE_END
MACHINE_START, MACHINE_END는 arch/arm/include/asm/mach/arch.h에 선언된 매크로로,
struct machine_desc 구조체 변수를 선언해 .arch.info.init 영역(arch/arm/kernel/vmlinux.lds.S)에 저장해 줍니다.
(struct machine_desc 구조체의 선언은 arch/arm/include/asm/mach/arch.h에 있습니다)
부팅 과정에서 이 구조체의 멤버 변수로 등록된 함수 포인터를 따라가 함수를 실행시켜 주는 형태인데,
예를 들어 보면
.init_early = ek_init_early,에서 .init_early에 등록한 함수 포인터는
arch/arm/kernel/setup.c의 setup_arch에서 호출해주고,
setup_arch는 init/main.c의 start_kernel에서 호출해 줍니다.
start_kernel은 arch/arm/kernel/head-common.S에서 호출해 주고요.
장황하게 설명했는데 정리하면
'매크로 확장이 되면 함수 포인터 등을 멤버로 하는 구조체 변수가 선언되고,
이렇게 등록된 함수들은 초기화 과정(init/main.c)에서 초기화 함수에 의해 각각 호출되어 해당 보드의 특성에 맞는 초기화를 수행한다'
입니다.