LinuxForum.Fans
Тема

Драйвер PCI на платформе MIPS

Автор: u_______9 5 сообщений 2260 просмотров
#32610

Здравствуйте! Нужен совет)
Пишу драйвер под 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 – это виртуальный, физический, или…???
Прошу помощи, если кто работал с этим.

#35187

вроде же есть АВР студия для линукса. Или Пик студия.
Или то и то. Недавно смотрел сайт авр вроде такой софт у них был. С дровами.
Вы программировать МК собираетесь?

#35287

По сути да, всё сводится к микроконтроллеру. Просто пытаюсь понять принцип работы с адресацией)
Про АВР ранее не слышал, поищу их сайт, гляну =)

#37145

Стоп брат... ioremap не прокатывает - почему ?
Во вторых не забывай, что у Intel - Little Endian а - у MIPS Big Endian - и в ядре есть функция, которая при записи переворачивает байты как надо. PCI шина всегда работает в Little Endian то есть при записи из PCI в память ЭВМ и обратно по шине - данные нужно переворачивать.

Может поэтому и плата не отвечает что ей идут абсолютно другие данные ?

#38811
Sunder написал:
Стоп брат... ioremap не прокатывает - почему ?
Во вторых не забывай, что у Intel - Little Endian а - у MIPS Big Endian - и в ядре есть функция, которая при записи переворачивает байты как надо. PCI шина всегда работает в Little Endian то есть при записи из PCI в память ЭВМ и обратно по шине - данные нужно переворачивать.

Может поэтому и плата не отвечает что ей идут абсолютно другие данные ?

О, вполне может быть. Сталкивался с таким эффектом, но при обмене данными по слоту между Интелом и Мипсом. По шине, я полагал, без переворачивания байт идёт обмен. Пасиба ,непременно попробую!!

Войдите или зарегистрируйтесь, чтобы ответить.