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 };