Здравствуйте! Нужен совет) Пишу драйвер под Linux (точнее, под отечественную линуксоподобную поделку МСВС) для платы, подключенной к PCI-Compact. Из конфигурационного пространства получаю базовые адреса, отведенные системой для взаимодействия с этой платой. На платформе Intel: в драйвере преобразовываю полученные адреса (точнее, BAR2 согласно протоколу на плату) с помощью ioremap(), и затем оперирую с преобразованным адресом и смещениями при обмене данными (writel/readl для обмена 32-битным словом, и memcpy_toio/memcpy_from_io для обмена несколькими 32-битными словами). Взаимодействие между пользовательским приложением и драйвером – посредством put_user/get_user. Всё работает отлично, плата получает все данные, реагирует согласно протоколу.
Теперь возникла необходимость адаптировать этот же драйвер под MIPS-платформу (RM7000A). Из конфигурационного пространства: BAR2=0x20500000. Ioremap() не прокатывает. Прочёл про «прямой доступ к памяти» - обращения типа writel(0x20500000, (unsigned int) data) тоже не прокатывают (“unable to page request…”). Поигрался с функцией phys_to_virt() – вроде бы всё красиво получается, данные в преобразованный адрес вроде пишутся, и потом оттуда же считываются. Но… плата молчит))) В общем, вероятно, я неверно преобразовываю исходный адрес BAR2. Не могу понять механизм преобразования адресов в MIPS((( Из руководства к RM7000A:
Figure 6 Kernel Mode Virtual Addressing (32-bit) 0xFFFFFFFF Kernel virtual address space (kseg3) 0xE0000000 Mapped, 0.5GB
0xDFFFFFFF Supervisor virtual address space (ksseg) 0xC0000000 Mapped, 0.5GB
0xBFFFFFFF Uncached kernel physical address space (kseg1) 0xA0000000 Unmapped, 0.5GB
0x9FFFFFFF Cached kernel physical address space (kseg0) 0x80000000 Unmapped, 0.5GB
0x7FFFFFFF User virtual address space (kuseg) Mapped, 2.0GB
Что-то я откровенно запутался во всяческих типах адресов)) 0х20500000 – это виртуальный, физический, или…??? Прошу помощи, если кто работал с этим.