/* 0x40000000 - 0x41FFFFFF <--> 0xF2000000 - 0xF3FFFFFF */
struct map_desc standard_io_desc[] __initdata = {
{ .virtual = 0xF2000000,
.physical = 0x40000000,
.length = 0x02000000,
.type = MT_DEVICE,
};
#define io_p2v(x) (0xF2000000 + (x & 0x01FFFFFFF) + ((x & 0x1C000000) >> 1))
#define io_v2p(x) (0x3C000000 + (x & 0x01FFFFFFF) + ((x & 0x0E000000) << 1))
제 생각에는 0xF2000000 + (x & 0x01FFFFFFF) 로 충분할 거 같은데,
((x & 0x1C000000) >> 1) 를 더하는 이유를 모르겠습니다.
좀 갈켜주세요~~
댓글 4
-
원민수
2008.11.25 20:49
-
맥주
2008.11.26 16:16
ㅎㅎ 원민수님 말씀대로 정보가 부족하네요. 저도 혹시나 하고, 소스를 보니 주석에 나와 있는데요. 커널버젼이 다른것인가? 첫번째 메모리맵만 올려 주셨는데, 그것말고, 다른 맵핑도 있는데요. 다음 맵핑은 물리주소는 0x0400000 간격으로 증가하고, 가상주소는 0x02000000 간격으로 증가해서 하나의 define으로 다 사용하려고 하다보니 나온 코드 같습니다. 그 부분만 곱하기 2 , 나누기 2 .. -
태훈
2008.11.26 16:20
28 /*
29 * Intel PXA2xx internal register mapping:
30 *
31 * 0x40000000 - 0x41ffffff <--> 0xf2000000 - 0xf3ffffff
32 * 0x44000000 - 0x45ffffff <--> 0xf4000000 - 0xf5ffffff
33 * 0x48000000 - 0x49ffffff <--> 0xf6000000 - 0xf7ffffff
34 * 0x4c000000 - 0x4dffffff <--> 0xf8000000 - 0xf9ffffff
35 * 0x50000000 - 0x51ffffff <--> 0xfa000000 - 0xfbffffff
36 * 0x54000000 - 0x55ffffff <--> 0xfc000000 - 0xfdffffff
37 * 0x58000000 - 0x59ffffff <--> 0xfe000000 - 0xffffffff
38 *
39 * Note that not all PXA2xx chips implement all those addresses, and the
40 * kernel only maps the minimum needed range of this mapping.
41 */
include/asm-arm/arch-pxa/hardware.h 파일에 있습니다.
저대로 매핑 할려면, 위 매크로 처럼 연산을 해야 합니다. 계산해 보세요 ^^ -
이창만
2008.11.27 11:26
감솨~ 감솨~ 그러네요.
물리주소는 0x04000000 씩 증가하는데, 가상주소는 0x02000000 씩 증가
0xF2000000 + (((x) & 0x1C000000)>>1) + ((x) & 0x01FFFFFFF)
( base_addr + 2M 씩 주소 증가 + offset 주소 ) 가 되네요.
pxa2xx 에서 pxa3xx 로 넘어가던 중에 디바이스들이 많이 추가되었는데, pxa2xx 에서 메모리맵을 너무 넉넉히 사용해서 pxa3xx 의 디바이스 추가하기가 빡시네요. 역시 난 숫자에 약~해~~
그냥 __raw_readl, __raw_writel 로만 레지스터 접근하는게 속편할거 같기도 하네요.
암튼 친절하게 답변해주셔서 감사해요.
.
에고고.. 질문을 올리실 경우에는 좀더 자세한 정보를 주셔야 합니다. 현재 상태만의 정보라면 말씀하신 것처럼 뒤에 있는 정보는 필요가 없습니다.
너무 이상하길래 kernel을 찾아봤더니 pxa2xxx 보드 기반으로 찾아보시는 듯 하군요.. 지금 올려주신 정보는 devs의 memory map에서는 io_p2v, io_v2p에서 뒤 동작은 의미가 없습니다. 다만, memory map이 단순히 저렇게 끝나는 것이 아니라, 그 뒤에 LCD, MEM, USB 등 있잔아요? 이쪽에 대해서도 변환을 하기 위해서입니다. 즉 간단히 LCD에 대해서 적용해보면, base address가 0xf4000000이기 때문에 뒤 정보로 인해서 자동으로 0x02000000가 더해진다는 것이죠.
즉 아주 간단히 정리하면, 앞에는 length에 대해서 offset을 구하는 루틴이고, 뒤에는 base address에 대해서 devs 이상들에 대해서 구하는 루틴이라고 생각하시면 됩니다.