임베디드 리눅스 uart, can의 iomem 맵핑 질문입니다.
글쓴이: sjj1507 / 작성시간: 월, 2016/04/18 - 6:23오전
임베디드 장비에 uart와 can을 올려보니
하드웨어적으로 uart는 e0001000에 can은 e0008000 등록되고
커널상에서는 uart는 e0001000에 정상적으로 맵핑되고
can은 e083e000에 맵핑되는것을 확인했습니다.
can은 ioremap을 통해 하드웨어주소->가상주소로 매핑되는것 으로 판단했는데
uart와 can은 같은 페리페럴이라고 생각이 드는데
uart는 하드웨어주소와 커널주소가 같고
can은 하드웨어주소와 커널주소가 같은지 이해가안되어 질문올립니다.
Forums:
문의하신게 /proc/iomem에 나와있는 can,
문의하신게 /proc/iomem에 나와있는 can, uart address랑
ioremap 을 통해 얻은 kernel virtual address랑 같다는 말씀이신가요?
저도 잘 모르는데 답을 달아서 죄송합니다
틀린 내용일 수도 있으니 양해 부탁드립니다
커널 소스를 보니
arch/arm/include/asm/io.h
#define ioremap(cookie, size) __arm_ioremap((cookie), (size), MT_DEVICE)
arch/arm/mm/nommu.c
void __iomem *__arm_ioremap(phys_addr_t phys_addr, size_t size, unsigned int mtype)
{
return (void __iomem *) phys_addr;
}
이렇게 되어있더라구요
no mmu 상황에서는 가능한거 같습니다
mmu 있는 상황에서는 아시는 것 처럼 변환이 일어나구요
같을 수도 있고 다를 수도 있습니다. 같아도 상관없고
같을 수도 있고 다를 수도 있습니다.
같아도 상관없고 달라도 상관없기 때문에요.
같아지는 경우가 굉장히 희귀하지만,
우연히 그렇게 된 게 아니라면... 일부러 그렇게 만들어 버린 이유로 들 수 있는 것은 단 한 개 뿐입니다.
마땅한 디버깅 장비도 없이 커널을 특정 CPU 혹은 보드에 포팅하다보면 그나마 좀 쉽게 기댈 수 있는게 UART 뿐입니다.
assembly 코드로 문자 혹은 문자열을 찍게 만들어서 원하는대로 진행되는지 보게 되는데,
MMU 켜기 전과 후의 주소가 달라지는 것을 고려해서 만들어야하죠.
댓글 달기