도와주세요!!
static struct map_desc ez_x5_io_desc[] __initdata = {
// virtual physical length domain
{ 0xf0000000, 0x00000000 +0x000000, 0x00400000, MT_DEVICE }, // nCS0 Boot Flash -- slow RD/WR
{ 0xf1000000, 0x00000000 +0x400000, 0x00100000, MT_DEVICE }, // nCS0 CS8900 -- slow RD/WR
{ 0xf1500000, PXA_CS1_PHYS+0x800000, 0x00100000, MT_DEVICE }, // nCS1 REV -- fast RD/WR CPLD.REV2
{ 0xf1600000, PXA_CS1_PHYS+0xC00000, 0x00100000, MT_DEVICE }, // nCS1 REV -- fast RD/WR CPLD.REV2
};
ez_x5.c파일에서 위와같이 정의된 가상주소table을
device driver에서 접근하려면 0xF0000000과 같은 가상주소를 알고 그 주소를 활용하는데요.
매크로나 함수를 사용하여 가상매핑된 구조체블럭의 가상주소 및 영역크기, 속성등을
읽어낼 수 있다면 가상주소base만 갖고서 매크로를 사용하여 더 편하게 가상주소테이블을
만들 수 있을텐데요.
혹시 그런 함수나 매크로가 있는지 궁금합니다.
아래는 at91 이 예제로 아래와같이 되어있는데 excel로 계산하여 가상주소를 알아냈습니다 T_T;;;
30 static struct map_desc at91cap9_io_desc[] __initdata = {
31 { // cap9's SYSC part mapping...
32 .virtual = AT91_VA_BASE_SYS,
33 .pfn = __phys_to_pfn(AT91_BASE_SYS),
34 .length = SZ_16K,
35 .type = MT_DEVICE,
36 },
37
38 {// cap9's internal SRAM mapping...
39 .virtual = AT91_IO_VIRT_BASE - AT91CAP9_SRAM_SIZE,
40 .pfn = __phys_to_pfn(AT91CAP9_SRAM_BASE),
41 .length = AT91CAP9_SRAM_SIZE,
42 .type = MT_DEVICE,
43 },
44
45 {// cap9's internal MPBLOCK slave mapping...
46 .virtual = AT91_IO_VIRT_BASE - AT91CAP9_SRAM_SIZE - SZ_16M,
47 .pfn = __phys_to_pfn(AT91CAP9_BASE_MPBSLAVE3_CS0),
48 .length = SZ_16M,
49 .type = MT_DEVICE,
50 },
51 };
[자답]
ioremap이었네요.
너무 쉬워서 답글이 없었나보네요 T_T
kernel의 map_desc 를 건들필요없이.
virtual address = ioremap(물리주소,영역크기);
이렇게하니 되네요.
주의사항은 물리주소든 영역크기든 0x1000 으로 나누어 떨어지는 값을 넣어야한다는거....^^
map_desc 파일에 직접등록하더라도 ioremap으로 받으면 커널에서 새로운 주소를 주네요.
물론 둘 다 access됩니다.