2015-03-11 10 views
1

Нужна помощь. Спасибо.

+0

https: //www.kernel.org/doc/htmldocs/deviceiobook/API-ioremap-nocache.html – Anshul

+0

@ Ansh..i прочитал эту ссылку. Но я не смог прийти к точному выводу, почему ioremap_nocache используется после pci_iomap? – RDX

ответ

1

pci_iomap() отображает ресурсы PCI, такие как IORESOURCE_MEM и IORESOURCE_IO (наследие). ioremap() делает физическое пространство адресов ввода-вывода применимым для IO-аксессуаров. ioremap() работает на любых устройствах независимо от того, к какой шине подключен и перечислит.

Чтобы ответить на ваш вопрос. ioremap_nochache() используется только в два места в драйвере. И каждый из них является обычным для некоторых аппаратных средств. Я подозреваю, что это произошло из-за хронологических изменений, поскольку 8250 является одним из самых старых драйверов в ядре.

+0

@ Andy..Means возвращает адрес 'pci_iomap()' это адрес, из которого драйвер может обращаться к данным так же, как непосредственно из пространства конфигурации в карточке pci. Правильно ли это? – RDX

+0

Посмотрите на прототипы. 'pci_iomap()' отображает регионы, но ничего не возвращает. – 0andriy

+0

@ Тип возвращаемого типа Andy..yes.its void. Но он выдает адрес '__iomem' на устройство BAR .. Если этот адрес используется в' ioread16 (адрес return from pci_iomap()) '(без смещения), то он дает Идентификатор класса и версии. [pci_iomap explain] (https://www.kernel.org/doc/htmldocs/deviceiobook/API-pci-iomap.html). Итак, функция 'pci_iomap()' отображает память с адреса, который показывает класс и rev id? – RDX

3

Способ доступа к памяти ввода/вывода зависит от архитектуры компьютера, шины и устройства, хотя принципы везде одинаковы. В зависимости от используемой компьютерной платформы и используемой шины память ввода/вывода может быть доступна или недоступна через таблицы страниц. Когда доступ проходит через таблицы страниц, ядро ​​должно сначала настроить, чтобы физический адрес был видимым из вашего драйвера, и это обычно означает, что вы должны вызывать ioremap перед выполнением каких-либо операций ввода-вывода. Если таблицы страниц не требуются, ячейки памяти ввода/вывода выглядят примерно так же, как порты ввода-вывода, и вы можете просто читать и писать с ними, используя надлежащие функции-обертки.

Распределение памяти ввода-вывода не является единственным необходимым шагом до того, как эта память может быть доступна. Вы также должны убедиться, что эта память ввода/вывода стала доступной для ядра. Получение памяти I/O - это не просто разглаживание указателя; на многих системах память ввода/вывода напрямую не доступна таким образом. Поэтому сначала нужно настроить сопоставление. Это роль функции ioremap. После установки ioremap (и iounmap) драйвер устройства может получить доступ к любому адресу памяти I/O, независимо от того, будет ли он непосредственно сопоставлен с виртуальным адресным пространством. Помните, однако, что адреса, возвращенные из ioremap, не должны быть разыменованы напрямую; вместо этого следует использовать функции доступа, предоставляемые ядром.

ioremap_nocache: Цитируя одного из заголовков ядра: «Это полезно, если некоторые регистры управления в такой области, и писать объединение или кэширования чтения не желательно»

Немногий из аксессора функций, читать из памяти ввода/вывода

unsigned int ioread8(void *addr); 
unsigned int ioread16(void *addr); 
unsigned int ioread32(void *addr); 

Здесь адр следует адрес, полученный от ioremap (возможно, с целым числом смещения); возвращаемое значение - это то, что было прочитано из данной памяти ввода/вывода.

Существует аналогичный набор функций для записи в память ввода/вывода:

void iowrite8(u8 value, void *addr); 
void iowrite16(u16 value, void *addr); 
void iowrite32(u32 value, void *addr);