Здравствуйте! Нужен совет)
Пишу драйвер под 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 – это виртуальный, физический, или…???
Прошу помощи, если кто работал с этим.
Драйвер PCI на платформе MIPS
вроде же есть АВР студия для линукса. Или Пик студия.
Или то и то. Недавно смотрел сайт авр вроде такой софт у них был. С дровами.
Вы программировать МК собираетесь?
По сути да, всё сводится к микроконтроллеру. Просто пытаюсь понять принцип работы с адресацией)
Про АВР ранее не слышал, поищу их сайт, гляну =)
Стоп брат... ioremap не прокатывает - почему ?
Во вторых не забывай, что у Intel - Little Endian а - у MIPS Big Endian - и в ядре есть функция, которая при записи переворачивает байты как надо. PCI шина всегда работает в Little Endian то есть при записи из PCI в память ЭВМ и обратно по шине - данные нужно переворачивать.
Может поэтому и плата не отвечает что ей идут абсолютно другие данные ?
Стоп брат... ioremap не прокатывает - почему ?
Во вторых не забывай, что у Intel - Little Endian а - у MIPS Big Endian - и в ядре есть функция, которая при записи переворачивает байты как надо. PCI шина всегда работает в Little Endian то есть при записи из PCI в память ЭВМ и обратно по шине - данные нужно переворачивать.
Может поэтому и плата не отвечает что ей идут абсолютно другие данные ?
О, вполне может быть. Сталкивался с таким эффектом, но при обмене данными по слоту между Интелом и Мипсом. По шине, я полагал, без переворачивания байт идёт обмен. Пасиба ,непременно попробую!!